Files
ThothII/docs/operations/psd-server-survey-remediation-checklist.md
T

23 KiB
Raw Blame History

PSD Server Survey — Remediation Checklist

Purpose and authority

Questo documento permette al proprietario e a Sol di discutere, decidere e chiudere uno alla volta i blocker emersi dal survey read-only del server PSD. È il punto di ripresa operativo tra sessioni: registra soltanto fatti sanitizzati, decisioni, responsabili e riferimenti a evidenze protette.

Fonti normative:

  • docs/operations/psd-server-sol-orchestration-prompt.md
  • docs/plans/2026-08-20-psd-server-deployment-program.md
  • docs/plans/2026-08-20-psd-server-survey.md
  • docs/superpowers/specs/2026-08-20-psd-survey-remediation-checklist-design.md

Questo documento non autorizza modifiche a server, servizi, database, Nginx, load balancer, Authentik, Aritmolab o repository esterni.

Program gate

  • Program result: SURVEY_NO_GO
  • Survey report: /var/tmp/thothii-psd-survey.fJh7DS/survey-report.md
  • Survey report SHA-256: 36461b6c7d1e44d055f24d6919e892b7017352ac9eb99ac67b9ae62f0614f8e7
  • Legacy stack: deve restare acceso e invariato durante la discussione di questa lista
  • Project A remains forbidden fino a un nuovo SURVEY_GO e all'approvazione esplicita del proprietario
  • Project B remains forbidden fino ai PASS automatico, umano e del proprietario per Project A

Current activity and resume point

  • Current activity: 1
  • Title: Rotate or revoke the exposed DWH credential safely
  • Resume from: Activity 1, review the written per-installation authentication design, then prepare its executable implementation and rotation plan
  • Discussion rule: una sola attività può essere IN_DISCUSSION
  • Allowed states: PENDING, IN_DISCUSSION, BLOCKED, PASS

How to use this checklist

  1. Leggere Current activity e Resume from.
  2. Discutere soltanto l'attività corrente.
  3. Non inserire password, token, cookie, chiavi private, stringhe di connessione, claim grezzi o valori di secret.
  4. Registrare solo percorsi protetti, owner, mode, timestamp, nomi o ID di oggetti, checksum ed esiti sanitizzati.
  5. Alla fine della discussione aggiornare stato, note, decisione, evidenze, blocker e prossimo passo.
  6. Spostare Current activity solo quando il gate dell'attività corrente è soddisfatto oppure il proprietario decide esplicitamente di parcheggiarla come BLOCKED.
  7. Non riaprire un'attività PASS salvo nuova evidenza che ne invalidi la decisione.

Activity summary

ID Attività Stato Responsabile Prossimo gate
1 Rotazione controllata della credenziale DWH esposta IN_DISCUSSION Proprietario del progetto Revisionare la specifica scritta e approvare il piano eseguibile
2 Assegnazione dei responsabili dei componenti condivisi PENDING Unassigned Elenco owner confermato
3 Risoluzione del dominio pubblico .it oppure .com PENDING Unassigned Origine autorevole documentata
4 Topologia e responsabilità del load balancer PENDING Unassigned Route, health, TLS, rollback e allowlist verificati
5 Accesso read-only protetto ad Authentik PENDING Unassigned Inventario API autorizzato e redatto
6 Accesso catalog-only protetto a PostgreSQL PENDING Unassigned Catalogo, grant e PostgREST verificati
7 Backup e rollback del vecchio ThothII PENDING Unassigned Backup verificabile e restart recipe completa
8 Accesso Git read-only al workspace PSD PENDING Unassigned SHA, descriptor e deploy key verificati
9 Metadati Pi e LLM verificabili PENDING Unassigned Versione, policy e reachability redatte
10 Conservazione evidenze e nuovo survey bounded PENDING Unassigned Nuovo report e decisione proprietario

Activity 1: Rotate or revoke the exposed DWH credential safely

  • Status: IN_DISCUSSION
  • Accountable owner: Proprietario del progetto (confermato dall'utente)
  • Objective: sostituire o revocare in modo controllato la credenziale DWH comparsa nell'output interno del survey, senza interrompere consumer legittimi e senza esporne nuovamente il valore.
  • Why this is required: la credenziale deve essere considerata compromessa; non può essere usata come base affidabile per completare il survey o iniziare Project A.
  • Ordered actions:
    1. identificare il team che gestisce la route DWH, il suo meccanismo di autenticazione e la custodia del secret;
    2. determinare il tipo di credenziale senza leggerla o copiarla in questa checklist;
    3. inventariare i consumer tramite riferimenti di configurazione e secret object;
    4. scegliere una transizione a doppia credenziale oppure una finestra atomica con rollback;
    5. generare e distribuire il nuovo secret attraverso il meccanismo protetto approvato;
    6. verificare i consumer autorizzati, l'assenza del nuovo valore nei log e la continuità del vecchio stack;
    7. revocare la vecchia credenziale e provare che non venga più accettata;
    8. registrare soltanto evidenze redatte.
  • Required redacted evidence:
    • owner e autorizzazione della rotazione;
    • tipo e identificatore non sensibile della credenziale;
    • percorso protetto o secret object, senza contenuto;
    • elenco dei consumer aggiornati;
    • timestamp e risultati dei test positivi e negativi;
    • conferma di revoca della credenziale precedente;
    • procedura di rollback e relativo esito.
  • Discussion notes:
    • la credenziale osservata è stata identificata, senza rileggerne il valore, come chiave statica X-API-Key applicata da Nginx alla route DWH REST /dwh/; è distinta dalle password PostgreSQL;
    • /home/chirone/chirone/etl documenta PostgREST come integrazione HTTP esterna, mentre i processi ETL e Superset usano PostgreSQL diretto;
    • il vecchio ThothII e Chirone WP3 usano PostgreSQL diretto nei profili locali/server; Supabase Studio è un pannello amministrativo e non appartiene al data-plane applicativo;
    • il design approvato resta invariato: il Mac usa rest_api, il nuovo ThothII sul server PSD usa postgres_direct con ruolo DWH dedicato e realmente read-only;
    • la ricognizione dei repository ha rilevato materiale sensibile hardcoded in file tracciati, senza riportarne i valori. La bonifica e la rotazione dei segreti coinvolti restano obbligatorie.
    • il censimento statico non trova consumer /dwh/ in ETL, Superset o nel Chirone WP3 attivo: usano PostgreSQL diretto. Il vecchio container thothii-core-1 è configurato con transport: direct; i due ThothII restano comunque tecnicamente capaci di usare REST;
    • i log Nginx redatti provano 18.523 richieste /dwh/ dal 23 luglio al 19 agosto 2026: 18.481 hanno user-agent classificato python-requests e gli endpoint RPC corrispondono prevalentemente a introspezione e campionamento Thoth. La sorgente è una sola, privata e compatibile con un proxy/load balancer; non prova che esista un solo client finale;
    • l'ipotesi che il traffico sia generato dal job ETL delle 03:00 è smentita: nella finestra 02:30–03:30 Europe/Rome non compare nessuna richiesta /dwh/. Il 99,37% del traffico è concentrato il 13 agosto tra le 17:38 e le 20:03;
    • la firma del 13 agosto corrisponde a undici preprocessing Thoth: undici list_tables, e per ciascuna esecuzione 163 chiamate a ognuno dei tre RPC per-tabella più 1.180 top_values, cioè 1.670 richieste per ciclo. PROJECT_STATE.md registra proprio il preprocessing PSD live del 13 agosto su 163 tabelle, con più rerun e correzioni emerse durante l'esecuzione;
    • il DAG ETL nightly_etl_orchestrator è schedulato con 0 3 * * *, ma scrive il DWH tramite PostgreSQL/psycopg2 diretto. Nel codice tracciato non chiama /dwh/, gli RPC Thoth o tht workspace preprocess, né emerge un trigger indiretto verso Thoth;
    • la configurazione Nginx nominalmente attiva accetta una sola chiave tramite confronto letterale in un endpoint auth_request. Non esiste una mappa a più chiavi: la doppia credenziale richiede un refactor, backup, nginx -t, reload e rollback in una fase di mutazione autorizzata.
    • il proprietario conferma che il ThothII sul Mac deve continuare a usare REST e che sono previste molte altre installazioni remote, senza tunnel SSH verso Supabase. /dwh/ è quindi un'interfaccia remota stabile e multi-client, non una compatibilità temporanea.
    • il proprietario decide di mantenere il certificato TLS corrente. L'endpoint esterno REST presenta lo stesso certificato self-issued di Nginx, valido fino al 21 giugno 2027 e con SAN per supabase-aritmolab.policlinicosandonato.it; non copre un eventuale dominio .com;
    • il manuale di installazione deve trattare TLS_CA_FILE come necessario per ogni client che non abbia già quel certificato nel proprio trust store, spiegando consegna affidabile, verifica del fingerprint, rinnovo e aggiornamento coordinato delle installazioni;
    • non esiste un ambiente di test. La rotazione dovrà quindi usare una verifica production-safe: backup, finestra dual-key, RPC ping senza dati clinici, test positivo/negativo e rollback.
    • il proprietario approva un componente dwh-auth riutilizzabile ma opzionale, incluso nel repository senza modificare il protocollo dei client portabili o il CLI tht;
    • su PSD dwh-auth avrà un lifecycle systemd indipendente dallo stack ThothII e comunicherà con Nginx tramite socket Unix. Lo stop o la sostituzione di ThothII non dovrà interrompere i client REST;
    • il registro sarà composto da file protetti, versionati e aggiornati atomicamente, con un file per generazione della chiave. Conterrà digest SHA-256 di segreti casuali da almeno 256 bit e metadati non sensibili, senza SQLite o nuove dipendenze runtime;
    • le chiavi saranno assegnate alle installazioni, non alle persone. Saranno prive di scadenza predefinita, con scadenza opzionale e revoca manuale;
    • creazione e import leggeranno o scriveranno soltanto file protetti. Nessun segreto sarà accettato come argomento, stampato o inserito in log, JSON, documenti o repository;
    • la gestione sarà fail-closed: credenziali non valide riceveranno 401, mentre guasti del servizio o del registro saranno mappati a 503 senza fallback permissivo;
    • il proprietario conferma che le sessioni, gli indici e le cache del vecchio ThothII erano solo test e non richiedono migrazione o attività di salvaguardia dedicate. Restano necessari il rollback della route DWH condivisa e il rispetto del gate esplicito prima di fermare lo stack;
    • il design approvato è scritto in docs/superpowers/specs/2026-08-20-dwh-rest-per-installation-auth-design.md e richiede una revisione del proprietario prima del piano di implementazione.
  • Decision: il nuovo ThothII server userà PostgreSQL diretto; il Mac e le future installazioni remote useranno REST. La chiave condivisa corrente non è un modello finale accettabile: la rotazione esposta userà una transizione a doppia credenziale e l'architettura target assegnerà un'identità revocabile distinta a ogni installazione. Supabase Studio non sarà usato come trasporto. Il proprietario del progetto è accountable per coordinare la rotazione. Il meccanismo target è il servizio server-only dwh-auth, indipendente dallo stack ThothII, con registro a file e una chiave revocabile per installazione.
  • Blockers: la specifica scritta attende la revisione del proprietario; mancano ancora il piano eseguibile, la sorgente protetta per importare la chiave legacy, la procedura realizzata di aggiornamento/verifica del Mac, la documentazione TLS completa, l'autorizzazione alla mutazione e la revoca provata della vecchia chiave.
  • Next step: dopo l'approvazione della specifica scritta, preparare il piano eseguibile di implementazione e rotazione dual-key con test automatici, aggiornamento Mac, prova positiva/negativa e rollback. Nessuna modifica Nginx avviene durante questa discussione.

Activity 2: Identify accountable owners for shared components

  • Status: PENDING
  • Accountable owner: Unassigned
  • Objective: associare ogni componente condiviso a una persona o a un team con autorità di lettura, modifica, approvazione e rollback.
  • Why this is required: la leggibilità di una configurazione non implica autorità a modificarla.
  • Ordered actions:
    1. identificare gli owner di DNS/load balancer, Nginx/certificati, Authentik, Supabase/PostgreSQL, Aritmolab, workspace Git e backup legacy;
    2. registrare il canale di approvazione e la procedura di escalation;
    3. confermare separatamente chi può autorizzare Project A e Project B.
  • Required redacted evidence: nomi dei team, ruoli, canali operativi e conferme di responsabilità; nessun contatto personale sensibile.
  • Discussion notes: Not discussed
  • Decision: No decision recorded
  • Blockers: nessun owner condiviso è stato ancora formalmente confermato.
  • Next step: compilare la matrice owner/componente dopo la chiusura dell'Activity 1.

Activity 3: Resolve the authoritative public origin

  • Status: PENDING
  • Accountable owner: Unassigned
  • Objective: scegliere sulla base di evidenze l'unica origine pubblica finale tra il dominio .it osservato e il dominio .com riportato nel piano.
  • Why this is required: callback OIDC, certificato, cookie, Nginx, load balancer e sidebar devono concordare sulla stessa origine HTTPS.
  • Ordered actions:
    1. ottenere la dichiarazione autorevole dell'owner DNS/load balancer;
    2. verificare record DNS, route, backend, certificato e redirect;
    3. confrontare l'origine con la configurazione e la sidebar di Aritmolab;
    4. registrare l'origine approvata e le discrepanze da correggere in Project B.
  • Required redacted evidence: hostname finale, record/route sanitizzati, SAN del certificato, destinazione sidebar e approvazione dell'owner.
  • Discussion notes: il survey ha osservato .it; il piano cita .com. La discrepanza è aperta.
  • Decision: No decision recorded
  • Blockers: owner DNS/load balancer non identificato e origine browser-visible non provata.
  • Next step: ottenere la dichiarazione autorevole dopo l'assegnazione degli owner.

Activity 4: Establish the load-balancer contract

  • Status: PENDING
  • Accountable owner: Unassigned
  • Objective: documentare il confine effettivo del load balancer e la procedura reversibile per le route temporanea e finale.
  • Why this is required: il survey locale non ha potuto provare owner, backend, health check, TLS, source range o allowlist.
  • Ordered actions:
    1. identificare superficie di configurazione e owner;
    2. registrare backend, porta, health check, punto TLS e source range verso Nginx;
    3. documentare deploy, validazione e rollback;
    4. stabilire se una route temporanea può essere limitata agli operatori;
    5. definire una prova positiva e una negativa dell'allowlist senza creare ancora la route.
  • Required redacted evidence: nomi/ID delle route, backend e health check sanitizzati, ownership, capacità di allowlist e procedura di rollback.
  • Discussion notes: Not discussed
  • Decision: No decision recorded
  • Blockers: il load balancer non è ispezionabile dalla superficie locale autorizzata.
  • Next step: coinvolgere l'owner identificato nell'Activity 2.

Activity 5: Provide protected read-only Authentik survey access

  • Status: PENDING
  • Accountable owner: Unassigned
  • Objective: permettere un inventario Authentik bounded e read-only della versione installata.
  • Why this is required: applicazioni, provider, flow, mapping, gruppi, service account, permessi API e procedura di export non sono stati verificati.
  • Ordered actions:
    1. identificare l'owner Authentik e la procedura di backup/export;
    2. predisporre una credenziale read-only o un'esecuzione assistita dall'owner;
    3. comunicare solo percorso, owner, mode e usabilità del secret;
    4. inventariare nomi/ID e convenzioni senza recuperare secret write-only;
    5. confrontare il comportamento con OpenAPI e documentazione della release installata.
  • Required redacted evidence: versione, nomi/ID degli oggetti, permission set della credenziale, riferimento all'export e risultati sanitizzati.
  • Discussion notes: Not discussed
  • Decision: No decision recorded
  • Blockers: nessuna credenziale amministrativa/API utilizzabile è stata stabilita.
  • Next step: ottenere dall'owner un meccanismo protetto post-rotazione.

Activity 6: Provide protected catalog-only PostgreSQL survey access

  • Status: PENDING
  • Accountable owner: Unassigned
  • Objective: verificare database, schemi, ruoli, grant, migrazioni e PostgREST con sole query di catalogo.
  • Why this is required: il runtime DWH read-only, lo stato di thoth_sessions e i confini Supabase non sono provati.
  • Ordered actions:
    1. identificare DBA e procedura protetta di connessione;
    2. verificare database, utente corrente, schemi e owner;
    3. verificare i grant sullo schema datawarehouse senza write probe clinici;
    4. verificare stato di thoth_sessions e migration records;
    5. verificare gli schemi esposti da PostgREST;
    6. registrare TLS/CA, backup e convenzioni per ruoli migrator/runtime.
  • Required redacted evidence: risultati catalogici bounded, nomi dei ruoli, attributi e grant, schemi PostgREST, riferimento a backup e TLS; nessuna stringa di connessione.
  • Discussion notes: Not discussed
  • Decision: No decision recorded
  • Blockers: non esiste ancora un meccanismo psql approvato post-rotazione.
  • Next step: far predisporre dal DBA l'accesso catalog-only.

Activity 7: Prove legacy backup and rollback

  • Status: PENDING
  • Accountable owner: Unassigned
  • Objective: dimostrare che il vecchio ThothII possa essere preservato e ripristinato prima di qualsiasi stop.
  • Why this is required: source, container, bind e network sono inventariati, ma backup verificato, controller e restart recipe non sono disponibili.
  • Ordered actions:
    1. identificare owner e meccanismo lifecycle compatibile;
    2. confermare assenza di lavoro utente da preservare;
    3. definire contenuti, destinazione e protezione del backup;
    4. definire checksum e verifica di leggibilità;
    5. scrivere comandi esatti di stop/start e ordine di chiusura/ripristino route;
    6. eseguire il backup soltanto nella successiva fase autorizzata, prima dello stop.
  • Required redacted evidence: inventario, percorso backup, checksum, owner, restart recipe e rollback route; nessun contenuto di secret.
  • Discussion notes: il legacy stack è ancora attivo e invariato.
  • Decision: No decision recorded
  • Blockers: lifecycle supportato, backup owner e comandi esatti non stabiliti.
  • Next step: approvare la procedura senza eseguirla durante la discussione.

Activity 8: Provide read-only PSD workspace Git access

  • Status: PENDING
  • Accountable owner: Unassigned
  • Objective: verificare il repository remoto condiviso e il suo stato corrente dal server senza capacità di push.
  • Why this is required: SHA, descriptor, trasporti, Evidence, annotazioni e scope della deploy key non sono stati osservati dal server.
  • Ordered actions:
    1. identificare curator e owner della deploy key;
    2. fornire un riferimento protetto alla chiave server read-only;
    3. verificare remote, branch e SHA con modalità non interattiva;
    4. verificare catalogo, schema v3, trasporti, Evidence e annotazioni;
    5. provare che la credenziale server non possa effettuare push.
  • Required redacted evidence: remote, branch, SHA, descriptor blob, stato Evidence/annotations e attestazione read-only della deploy key.
  • Discussion notes: Not discussed
  • Decision: No decision recorded
  • Blockers: nessun checkout workspace o deploy credential utilizzabile è stato localizzato.
  • Next step: coinvolgere il curator e predisporre l'accesso server read-only.

Activity 9: Make Pi and LLM metadata verifiable

  • Status: PENDING
  • Accountable owner: Unassigned
  • Objective: verificare versione Pi, provider, modello, thinking level, riferimento credenziale e reachability LLM senza esporre il secret.
  • Why this is required: la root Pi legacy non è attraversabile dall'operatore del survey e i default del nuovo source non provano la configurazione in esecuzione.
  • Ordered actions:
    1. identificare owner della configurazione Pi/LLM;
    2. scegliere tra esecuzione assistita dall'owner e accesso read-only allowlisted;
    3. estrarre esclusivamente metadati non sensibili;
    4. eseguire un controllo bounded di reachability senza stampare credenziali;
    5. registrare anche il mismatch NVML/GPU come rischio separato, non come blocker CPU.
  • Required redacted evidence: versione, provider, model ID, thinking level, endpoint sanitizzato, percorso/mode della credenziale e risultato di reachability.
  • Discussion notes: host x86_64; due GPU NVIDIA osservate, ma nvidia-smi non è utilizzabile per mismatch driver/libreria NVML. Il deployment CPU resta da valutare con le immagini pinned.
  • Decision: No decision recorded
  • Blockers: configurazione Pi protetta non leggibile e nessun endpoint LLM credential-free noto.
  • Next step: ottenere un controllo assistito o permessi read-only mirati.

Activity 10: Retain evidence and run the missing bounded survey checks

  • Status: PENDING
  • Accountable owner: Unassigned
  • Objective: conservare le evidenze protette, ripetere soltanto i controlli mancanti e produrre una nuova decisione verificabile.
  • Why this is required: il report corrente è SURVEY_NO_GO e non può essere promosso per inferenza.
  • Ordered actions:
    1. scegliere il protected evidence root definitivo;
    2. trasferire la directory del survey senza modificarne i contenuti e verificare il digest;
    3. confermare che le Activity 1–9 siano PASS oppure abbiano una risoluzione proprietario esplicitamente accettata;
    4. eseguire solo i controlli bounded mancanti del piano survey;
    5. aggiornare il report e verificarne checksum e secret hygiene;
    6. chiedere la decisione esplicita del proprietario.
  • Required redacted evidence: percorso finale, digest, matrice Activity 1–9, nuovi risultati bounded, report aggiornato e decisione firmata.
  • Discussion notes: Not discussed
  • Decision: No decision recorded
  • Blockers: dipende dalla chiusura delle Activity 1–9 e dall'approvazione del retention root.
  • Next step: avviare soltanto dopo la chiusura dei blocker precedenti.

Fresh survey and owner gate

Un nuovo SURVEY_GO richiede contemporaneamente:

  • credenziale DWH precedente revocata e rotazione verificata;
  • owner e autorità di modifica/rollback identificati;
  • origine pubblica unica e load-balancer contract provati;
  • accessi read-only Authentik, PostgreSQL, workspace Git e Pi/LLM verificati;
  • identità DWH dimostrata read-only;
  • backup e restart recipe legacy verificabili;
  • risorse e percorsi della nuova installazione approvati;
  • report redatto, secret-scan valido e checksum verificato;
  • approvazione esplicita del proprietario.

Il PASS tecnico del survey non autorizza automaticamente Project A. L'autorizzazione deve essere registrata separatamente.

Change log

Data Attività Modifica Autore
2026-08-20 Initial Creata checklist; Activity 1 aperta, Activity 2–10 pending Sol