From 2f53512e4d3f3ef6451eb09cabb2206d4ad1c2e8 Mon Sep 17 00:00:00 2001 From: User Date: Sun, 27 Sep 2026 00:41:37 +0200 Subject: [PATCH] docs: record server release and hand off remaining acceptance checks --- PROJECT_STATE.md | 8 +- ...026-09-14-server-embedded-omics-release.md | 165 ++++++++++ .../2026-09-26-server-release-execution.md | 142 +++++++++ .../2026-09-26-server-release-handoff.md | 246 +++++++++++++++ .../reports/2026-09-26-server-release-plan.md | 184 +++++++++++ .../2026-09-26-server-release-preflight.md | 285 ++++++++++++++++++ .../2026-09-27-server-acceptance-handoff.md | 90 ++++++ 7 files changed, 1119 insertions(+), 1 deletion(-) create mode 100644 docs/reports/2026-09-14-server-embedded-omics-release.md create mode 100644 docs/reports/2026-09-26-server-release-execution.md create mode 100644 docs/reports/2026-09-26-server-release-handoff.md create mode 100644 docs/reports/2026-09-26-server-release-plan.md create mode 100644 docs/reports/2026-09-26-server-release-preflight.md create mode 100644 docs/reports/2026-09-27-server-acceptance-handoff.md diff --git a/PROJECT_STATE.md b/PROJECT_STATE.md index ce318f62..074db634 100644 --- a/PROJECT_STATE.md +++ b/PROJECT_STATE.md @@ -1,6 +1,6 @@ # Project state -Updated: 2026-09-15. This is a current snapshot, not a release diary. Stable commands +Updated: 2026-09-27. This is a current snapshot, not a release diary. Stable commands and invariants are in [AGENTS.md](AGENTS.md); prior snapshots remain in Git. ## Current contracts @@ -56,6 +56,12 @@ embedded/upstream identity, not another ThothII OIDC login. Read Last recorded application deliveries (not a fresh runtime attestation): +- [Coordinated ThothII/Omics release](docs/reports/2026-09-26-server-release-execution.md): + core/frontend `497ab840-preflight`, Omics proxy fix `928f7e9f` with existing web + image retained. Automated acceptance passed; on September 27 the operator confirmed + browser access, UI controls and session start/stop/resume. Functional browser + acceptance passed; remaining extended checks are handed off in the + [server acceptance follow-up](docs/reports/2026-09-27-server-acceptance-handoff.md). - [Session dialogs](docs/reports/2026-09-14-session-dialogs-release.md): `b1723c34-session-dialogs-20260914`, frontend-only. - [Session layout/Memory fix](docs/reports/2026-09-14-session-layout-memory-fix.md): diff --git a/docs/reports/2026-09-14-server-embedded-omics-release.md b/docs/reports/2026-09-14-server-embedded-omics-release.md new file mode 100644 index 00000000..8a1bb1cd --- /dev/null +++ b/docs/reports/2026-09-14-server-embedded-omics-release.md @@ -0,0 +1,165 @@ +# Rilascio server ThothII embedded in Omics — 2026-09-14 + +## Esito + +Il rilascio tecnico è stato eseguito il 2026-09-14 e i controlli automatici e +server-side descritti sotto sono superati. L'accettazione funzionale non è ancora +chiusa: lingua, tema, fullscreen, logout, ruoli e continuità SSE devono essere +provati da browser con account Omics autorizzati. + +Finestra autorizzata dall'operatore e conclusa alle 16:17 CEST. Le ammissioni +ThothII sono state riaperte dopo il collaudo (`active: false`, `admissions: 0`). + +## Revisioni e immagini distribuite + +- ThothII, checkout operativo `/srv/thothii-v2/source/ThothII`: + `49333a2d35664b7237c3ddc2a9f10a605dcc84ce`, branch `main`, pulito e allineato + a `origin/main`. +- Omics Portal, checkout `/home/chirone/omics_portal`: + `fca10901a73666ca257d8f4cc4b77066295c400a`, branch `master`, pulito e due + commit avanti a `origin/master`. Include la consegna funzionale + `95154e179144e2453b37ef2a63a65d6f377e4cf8`. +- CLI nativo `/usr/local/bin/tht`: commit + `49333a2d35664b7237c3ddc2a9f10a605dcc84ce`, build + `2026-09-14T15:08:47+02:00`, `linux/amd64`. +- Core: `thothii-v2-core:49333a2d`, image ID + `sha256:d62bf17dd1345e6a459edabe4b559333b396ef30c523dedf1b842506c147efbd`. +- Frontend: `thothii-v2-frontend:49333a2d`, image ID + `sha256:dd57745143fc282562ec6d4c2cd8fc493eb2078494eeb17099d49bea8eae218b`. +- Omics web: `omics_portal-web`, image ID + `sha256:11e99905c41b38cd68d0e726f25a4174b8eb65db27fb1d887238a7bd255074da`. +- Nginx: image invariata `sha256:b3c656d55d7ad751196f21b7fd2e8d4da9cb430e32f646adcf92441b72f82b14`. + +## Configurazioni modificate + +- `deploy/psd-server-v2/thothii-installation.yaml`: Installation Model Catalog + schema v2; shell `embedded`, locale predefinito `en`, adapter `omics-portal`; + provider DeepSeek unificato e default interaction `zai/glm-5.3`. Percorsi, + profilo server, workspace, DWH e provider reali del server sono stati + preservati. +- `/srv/thothii-v2/operator/compose.portal-upstream.yaml`: `AUTH_MODE=upstream`, + alias `thothii-core` e `thothii-frontend` sulla rete Omics; eliminato il mount + della copia manuale di `config.js`. Nessun `auth.yaml` e nessuna runtime auth + projection. +- `/srv/thothii-v2/operator/operator.env`: tag applicativo aggiornato a + `49333a2d`; nessun valore segreto copiato dal Mac o riportato in questo report. +- `deploy/psd-server-v2/generated/`: proiezioni rigenerate dal descriptor. Il + frontend riceve in sola lettura `generated/frontend/config.js`, che espone + soltanto `backendBaseUrl: /api` e il contratto shell embedded. +- Omics: integrati template embedded, lingua Django, topbar/fullscreen, adapter + JavaScript, traduzioni e test della consegna GitHub. +- `nginx/nginx.conf`: non modificato. La configurazione già presente conteneva + l'`auth_request` Django, derivazione server-side degli header `X-Thoth-*`, + rimozione di cookie/Authorization/header client, origin esatta e SSE senza + buffering. + +Configurazione risolta verificata: + +- core e frontend usano le immagini `49333a2d`; +- `AUTH_MODE=upstream`; +- core senza porta host pubblicata; +- frontend pubblicato soltanto su `127.0.0.1:18020`; +- alias Omics risolti rispettivamente a `thothii-core` e `thothii-frontend`; +- `config.js` generated montato read-only; +- `THOTH_PUBLIC_EXPOSURE=false` e storage sessioni locale, preservando la + topologia server già approvata. + +## Backup e rollback + +Backup protetto: +`/srv/thothii-v2/backups/20260914-pre-embedded-release`, directory `0700`, tutti +i file `0600` e owner `root:root`. + +Contiene: + +- immagini applicative precedenti core/frontend/Omics; +- binario CLI precedente; +- descriptor, override, config manuale e proiezioni precedenti; +- bind `data`, `workspace-registry`, `pi-state`, `operator` e `secrets`; +- snapshot raw dei volumi catalogo, Qdrant ed embedding; +- dump logico PostgreSQL del catalogo ThothII; +- dump logico PostgreSQL del database usato da Omics; +- snapshot dei volumi statici e media Omics; +- `SHA256SUMS`. + +Tutti i checksum sono risultati validi. Gli archivi tar sono stati elencati +integralmente senza errori e i due dump sono stati validati con +`pg_restore --list`. Le vecchie immagini restano disponibili; Omics precedente +è inoltre etichettata `omics_portal-web:pre-fca1090-aff75817`. + +Non sono state eseguite migrazioni ThothII: tra `82e2c91f` e `49333a2d` non +esistono nuove migrazioni catalogo, Memory o sessioni. L'entrypoint Omics ha +eseguito `migrate` con risultato `No migrations to apply`. Il rollback normale +è quindi applicativo e non richiede ripristino dati; dump e snapshot raw sono +conservati per un recupero separato solo in presenza di corruzione accertata. + +## Verifiche superate + +### Prima del rilascio + +- frontend ThothII: 768/768 test; +- backend auth/config/session/model: 205/205 test mirati; +- estensione Pi, lingua e ripresa: 7/7; +- harness lingua sessione e repository PostgreSQL: 24/24; +- CLI Go: tutte le package superate; +- Omics embedded shell isolata: 15/15; +- build delle tre immagini candidate completata; +- generazione delle proiezioni validata prima in staging isolato; +- build documentale strict completata dopo la scrittura di questo report. + +### Sul server distribuito + +- `tht status`: exit 0; +- `tht doctor --json`: `ok: true`, 13/13 controlli superati, inclusi descriptor, + proiezioni, permessi, Docker/Compose, autenticazione, health, HTTP, registry, + workflow e Pi; +- core, frontend, catalog-db, Qdrant, embedding e Omics web in stato healthy; +- `nginx -t` superato prima e dopo la ricreazione; +- catalogo Superset Omics valido: 32 dashboard; +- `migrate --check` post-rilascio: exit 0; +- nessun traceback, fatal, panic, HTTP 500 o errore nginx nei log recenti; +- pagina senza sessione: `302` verso `/accounts/login/`; +- `/datamart-builder/api/me` senza sessione: `403`; +- richiesta pubblica con header principal/admin falsificati: ancora `403`; +- `config.js`: `200`, `Cache-Control: no-store`, contenuto embedded corretto; +- manifest Vite risolto da Django: 368 entry; entrypoint corrente + `index-ktEFlKPi.js` e stylesheet `index-BtNkA4QL.css`; +- asset JavaScript attraverso `/datamart-builder/assets/`: `200` e cache + `public, immutable`; +- il core non ascolta sulla porta host 8787; dalla rete interna senza principal + risponde `401`; +- nginx risolve i nuovi indirizzi degli alias, senza dipendere dai precedenti IP + Docker. + +Il probe HTTPS verso l'hostname pubblico, eseguito dal server stesso, è andato +in timeout prima della connessione (`HTTP 000`): è un limite di raggiungibilità +hairpin/rete e non viene contato come verifica superata. I probe equivalenti +attraverso nginx locale con Host e forwarded protocol reali sono invece passati. + +È rimasto intenzionalmente intatto il container orphan storico +`omics_portal-web-run-a0bc36025e52`, creato circa tre mesi prima del rilascio ed +exited da due settimane; non è stato rimosso perché estraneo alla consegna. + +## Prove manuali ancora necessarie + +Usare account di prova autorizzati e dati non operativi: + +1. utente Omics autorizzato apre Datamart Builder senza secondo login e vede un + solo header, quello Omics; +2. `/datamart-builder/api/me` restituisce issuer `portal`, subject Django stabile, + ruoli corretti e `session`/`csrfToken` null; +3. confronto utente normale/amministratore e rifiuto utente senza capability; +4. IT/EN prima dell'apertura e cambio tramite form Omics, senza tradurre SQL o + contenuti authored; +5. light/dark con popup, menu e griglia aperti; +6. ingresso/uscita fullscreen, compresa uscita con Esc e rifiuto browser; +7. logout Omics, seconda scheda e nuova verifica `/me`; +8. nuova sessione, flusso SSE, riconnessione dopo scadenza, reload senza avvio + automatico e ripresa con `interaction_language` invariata; +9. richiesta cross-origin autenticata su operazione fittizia e comportamento + distinto di un singolo `403` operativo; +10. accesso HTTPS reale da una postazione client, perché il server non raggiunge + l'hostname pubblico in hairpin. + +L'installazione non va dichiarata funzionalmente accettata finché questa matrice +manuale non è stata eseguita e registrata. diff --git a/docs/reports/2026-09-26-server-release-execution.md b/docs/reports/2026-09-26-server-release-execution.md new file mode 100644 index 00000000..b1d8c068 --- /dev/null +++ b/docs/reports/2026-09-26-server-release-execution.md @@ -0,0 +1,142 @@ +# Rilascio coordinato ThothII / Omics — 26 settembre 2026 + +**Distribuito; accettazione automatica superata. Collaudo browser positivo per accesso, interfaccia e avvio/interruzione/ripresa sessione; prove estese residue sotto.** +Finestra esplicitamente confermata dall’utente in chat («confermo»), avvio alle +19:28 Europe/Rome. Riferimento: [piano approvato](2026-09-26-server-release-plan.md). +Maintenance disattivata alle **19:35:27** dopo tutti i controlli automatici. + +## Versioni e stato finale + +| Componente | Risultato | +| --- | --- | +| ThothII sorgente | Main `497ab84031e285464fdbb73e6e0ce9252687e3ab`, checkout pulito in `/srv/thothii-v2/releases/497ab84031e285464fdbb73e6e0ce9252687e3ab` | +| Core | `thothii-v2-core:497ab840-preflight`, ID `sha256:182f4e0d63404cb7ed6a0e272441e9c55ed27e2bb16fdbf4d7162f892ac76dc7`, healthy | +| Frontend | `thothii-v2-frontend:497ab840-preflight`, ID `sha256:5f5a4f81139432d0ac41025c3006edaf1258b623ce388242700b1b20fcce6421`, healthy | +| Omics checkout | Fast-forward a `928f7e9fff2aba895416776fecf5668ee957d237`; nessuna modifica tracciata, file locali preservati | +| Omics web | Stesso container e immagine `sha256:27aa100690b110bf596322b1b0a31acc178ca9d1c709bc10382cbeecbfb5aeca`, riavviato e healthy; risposta HTTP Django verificata | +| Omics nginx | Ricreato col fix asset e immagine precedente fissata `sha256:b3c656d55d7ad751196f21b7fd2e8d4da9cb430e32f646adcf92441b72f82b14`; `nginx -t` positivo | +| Supporti | Catalogo PostgreSQL, Qdrant e Ollama healthy; immagini e volumi invariati | +| CLI host | `/usr/local/bin/tht` aggiornato; SHA256 `0d39a93fb0a3b2147541a746c75832db20302f3a604bf6510da69d3731bcd783` | +| Maintenance / Pi | Maintenance inattiva, zero processi Pi RPC al controllo finale delle 19:36 | + +Descrittore mantenuto nel percorso originale: +`/srv/thothii-v2/source/ThothII/deploy/psd-server-v2/thothii-installation.yaml`. +Project Compose sempre `thothii-7f901b48fe35`; shell embedded/en/omics-portal, +auth upstream e storage locale invariati. Cambiati solo projectDirectory e +percorso dell’overlay git-ssh nel descrittore, tag immagini in env/overlay. +Proiezioni rigenerate col nuovo CLI e UID 10001. Descriptor/env 10001:10001 0600; +overlay 1013:1014 0640; CLI root:root 0755. + +Il vecchio checkout ThothII dirty resta al suo posto per rollback. Nessun reset, +force push, eliminazione di volumi, cambio identità, credenziali, DWH o Authentik. +Nessun push Omics eseguito. Nessuna nuova migrazione applicata; i controlli Django +prima e dopo il riavvio non rilevano migrazioni o modifiche dei modelli pendenti. +L’entrypoint web ha rieseguito i normali comandi di startup, statici e traduzioni. + +## Backup ed esecuzione + +Backup protetto root 0700: +`/srv/thothii-v2/backups/20260926-coordinated-release`. +Completato e **VERIFIED alle 19:31:57**, circa **2,89 GiB**, **23 checksum**, +archivi tar leggibili e indici dei dump verificati. Non è una prova di restore. + +Include configurazioni/CLI/generated, sorgenti e Git con file locali, +immagini precedenti, bind data/registry/Evidence/Pi/segreti, volumi +catalogo/Qdrant/Ollama/static/media, dump catalogo e dump PostgreSQL condiviso. +Il DB condiviso è rimasto operativo: il suo dump è una snapshot transazionale, +non un backup raw del database fermo. Il volume raw del catalogo ThothII è stato +archiviato a servizio fermo. Nessun restore dati eseguito. + +Cronologia Europe/Rome: + +- 19:28: controllo del piano approvato positivo; riserva 20,9 GiB, liberi 27,8 GiB. +- 19:29:21: configurazione di rollback salvata e verificata prima delle mutazioni. +- 19:29:42: maintenance e chiusura nginx Omics; due controlli Pi negativi. +- 19:30:03: applicazioni ferme; dump, fermo supporti e archiviazione dati. +- 19:31:57: backup verificato. +- 19:32:10: deploy avviato; core 19:32:17, frontend 19:32:23, + web Omics 19:32:29, nginx 19:32:36. +- 19:35:27: accettazione automatica completata e maintenance disattivata. + +Il periodo tra chiusura e riavvio nginx è stato circa tre minuti; le nuove +ammissioni sessione sono rimaste bloccate fino al completamento dei controlli. + +## Correzione del controllo durante il rilascio + +L’accettazione iniziale si è fermata su un falso negativo nello script: +`config.js` invia due header `Cache-Control`, `no-cache` e `no-store`; il controllo +leggeva solo il primo. Configurazione e risposta HTTP erano corrette. + +Riproduzione isolata rossa, correzione di una riga con `get_all`, **16 test verdi**, +compreso il rifiuto quando `no-store` manca davvero. Nessuna modifica applicativa +necessaria. Maintenance mantenuta attiva fino alla ripetizione completa +dell’accettazione. Non sono stati ripetuti backup, fast-forward o ricreazione. + +Directory script/evidenze: +`/srv/thothii-v2/operator/releases/20260926-coordinated/reviewed/`. + +- Script inizialmente approvato conservato in `release.approved.py`, SHA256 + `eb2c677c8adbee0c9febf919001f654c8535e71f064d9fb7c7883afd02383a41`. +- Script corretto `release.py`, SHA256 + `20314e68a6a42701456d454d2a0881652cfdbe5e00e9a912a22df9e78129aa00`. +- Test di regressione: `test_release_reviewed.py`, `reviewed-tests-cache-fix.log`. +- Stato finale filtrato: `deployed-evidence.json`; avanzamento nel + `journal.jsonl` del backup. Manifest degli artefatti aggiornato, originale conservato. + +## Accettazione automatica + +| Verifica | Esito | +| --- | --- | +| Digest reali dei container, readiness, doctor | Positivi | +| Alias Docker | Univoci e risolti ai container attuali; manifest raggiungibile da Omics | +| API senza cookie e con principal falsificati | 403 su HTTP e HTTPS locale verificato | +| Bypass asset e traversal codificati | Negati; `/datamart-builder/assets/api/me` restituisce 404 | +| Config | 200, embedded e no-store su entrambi i percorsi | +| Asset | Tutti i file elencati dal manifest disponibili su HTTP/HTTPS | +| Esposizione core | Nessuna porta pubblicata sull’host | +| Modelli, Pi e credenziali | Hash invariati rispetto alla baseline | +| Documenti persistiti | 2 manifest sessione, 51 file sessione/artifact e 221 file workspace/Evidence confrontati col backup: nessuna differenza | +| Migrazioni e catalogo Omics | Nessuna migrazione pendente; catalogo Superset valido | +| Log startup | Zero occorrenze nelle categorie fatal/config/auth/permessi controllate; nessun contenuto sensibile riportato | + +Le prove HTTPS usano la CA interna e risoluzione locale del nome pubblico; +non sostituiscono il collaudo dalla postazione esterna. Il controllo degli hash +riguarda i file elencati, non certifica da solo l’intera semantica degli archivi. + +## Rollback disponibile + +Usare lo script corretto, dopo controllo di eventuali sessioni Pi attive: + +```bash +sudo -n python3 /srv/thothii-v2/operator/releases/20260926-coordinated/reviewed/release.py rollback --window-confirmed +``` + +Il rollback previsto dalla finestra approvata ripristina CLI/config/proiezioni e +immagini ThothII precedenti, mantiene il fix proxy Omics, riavvia e verifica le +applicazioni. Conserva dati e volumi; nessun restore del DB condiviso, reset Git +o ritorno al nginx vulnerabile. Se l’utente ha avviato sessioni, prima salvarle e +fermarle. Il rollback non è stato necessario né eseguito durante questo rilascio. + +## Collaudo browser — aggiornamento 27 settembre 2026 + +Conferme dell’utente: + +- Omics → Datamart Builder si carica senza problemi, in risposta alla prova di + apertura senza secondo login. +- Il 27 settembre: «tutto bene, compreso l’avvio e l’interruzione di una sessione». + Nel contesto dei controlli richiesti, registrato esito positivo per IT/EN, + tema, fullscreen/Esc e per avvio/interruzione di una sessione. +- Successivamente, sempre il 27 settembre: «ho anche ripreso una sessione interrotta. + tutto ok». Confermata anche la ripresa riuscita; il ciclo funzionale + avvio → interruzione → ripresa è collaudato dall’utente. + +Il collaudo funzionale richiesto ha esito positivo. Su richiesta dell’utente, +le verifiche estese sono trasferite a un’attività successiva nel +[handoff del 27 settembre](2026-09-27-server-acceptance-handoff.md): lingua +persistita, identità/ruoli, logout, origine delle scritture, amministrazione, +reload e HTTPS esterno. Il documento contiene passi, responsabili, risultati +attesi e registro delle prove; nessuno di questi casi è dichiarato già superato. + +La [matrice di accettazione](../testing/authentication-manual-acceptance.md) +resta il riferimento. Nessuna ulteriore modifica ai servizi è stata eseguita +per registrare il collaudo o preparare l’handoff del 27 settembre. diff --git a/docs/reports/2026-09-26-server-release-handoff.md b/docs/reports/2026-09-26-server-release-handoff.md new file mode 100644 index 00000000..d477e7b4 --- /dev/null +++ b/docs/reports/2026-09-26-server-release-handoff.md @@ -0,0 +1,246 @@ +# Handoff — rilascio coordinato ThothII / Omics + +**Rilasciato il 26 settembre 2026; accettazione automatica superata alle 19:35 Europe/Rome.** +Per riprendere, leggere il [report di esecuzione](2026-09-26-server-release-execution.md): +servizi avviati, maintenance inattiva, backup verificato e rollback disponibile. +La finestra era stata confermata esplicitamente dall’utente; non richiederla di +nuovo per completare il collaudo già autorizzato. Il 27 settembre l’utente ha +confermato accesso, controlli dell’interfaccia e avvio/interruzione/ripresa di una +sessione: collaudo funzionale positivo. Per le verifiche residue usare il +[nuovo handoff del 27 settembre](2026-09-27-server-acceptance-handoff.md), con +passi e registro delle prove. L’utente le ha affidate a un’attività successiva. + +Usare lo script corretto documentato nel report: durante il rilascio è stata +corretta soltanto la lettura degli header Cache-Control ripetuti nel controllo. +Non rieseguire le fasi pre-deploy sullo stato già rilasciato. + +## Snapshot storico della sospensione delle 17:40 + +Il resto di questo file conserva lo stato precedente alla ripresa e al rilascio. +Il report di esecuzione sostituisce le indicazioni operative e le attività residue +qui sotto; il [piano approvato](2026-09-26-server-release-plan.md) descrive le scelte. + +## Prima azione alla ripresa + +Leggere questo handoff, quindi `AGENTS.md`, `PROJECT_STATE.md`, +`docs/operations/server-codex-handoff.md`, `docs/install/authentication-upstream.md` +e `docs/testing/authentication-manual-acceptance.md`. Per l'inventario completo +e i digest delle immagini operative, leggere +`docs/reports/2026-09-26-server-release-preflight.md`. +Quel preflight è storico: la correzione proxy allora mancante è ora preparata e +testata **soltanto in isolamento**, come descritto sotto. + +La prossima attività è **revisionare e completare lo script di rilascio in bozza**, +validare il piano senza mutazioni operative e presentarlo all'utente con backup +e rollback. Solo dopo la sua conferma eseguire le fasi operative e il collaudo. + +## Richiesta dell'utente e confini + +- Aggiornare ThothII e Omics secondo il runbook, preservando dati, workspace, + Pi, provider, modelli e credenziali già presenti sul server. +- Usare main ThothII includente `497ab84031e285464fdbb73e6e0ce9252687e3ab`; + conservare i progressi server Omics successivi alla consegna GitHub `fca10901…`. +- Conservare checkout sporchi e file locali. Nessun reset, force push, rimozione + volumi o `tht setup --complete`; non usare `codex/guided-standalone-install`. +- L'utente ha autorizzato preparazione, correzione e test isolati. Prima del + fermo/proxy/migrazioni/recreate operativi vuole vedere il piano risolto e + confermare la finestra. Il suo «procediamo, fai la tua parte» ha avviato la + preparazione, non approvato uno script ancora inesistente/incompleto. +- L'utente può fare il collaudo da browser: avvisarlo quando sarà il momento + e fornire prove precise. Non chiedergli password in chat. +- Ha autorizzato a cercare credenziali di `akadmin` / `mpancotti`: trovata solo + la presenza di `AUTHENTIK_BOOTSTRAP_PASSWORD` in + `/home/chirone/chirone-authentik/docker/.env`. Valore non mostrato, non copiato, + **nessun login tentato e validità attuale non verificata**. Nessuna password + mpancotti trovata. I due utenti sono locali Authentik, non LDAP. + +## Stato operativo, invariato + +- Checkout di lavoro `/home/chirone/Thoth`: main `497ab840…`, allineata Gitea; + il report `2026-09-14-server-embedded-omics-release.md` era già non tracciato. + Sono stati aggiunti solo i report locali di questa attività. +- Checkout ThothII operativo `/srv/thothii-v2/source/ThothII`: main + `b1723c34c467980d007094af078d966d460cde2b`, 30 file modificati + due non tracciati, + preservato integralmente. Le modifiche sono già recepite dalla nuova main, + che contiene anche le correzioni successive. +- Omics operativo `/home/chirone/omics_portal`: master pulito + `1cf7ea90a669a26bf3bc51749eab4d07981da472`. Comprende la consegna shell GitHub + `fca10901a73666ca257d8f4cc4b77066295c400a` e la correzione Superset successiva. + **Non ripetere l'integrazione e non tornare a fca10901.** +- Core ancora `thothii-v2-core:49333a2d-session-memory-fix`; frontend ancora + `thothii-v2-frontend:b1723c34-session-dialogs-20260914`; Omics web ancora + `omics_portal-web` image ID `sha256:27aa100690b110bf596322b1b0a31acc178ca9d1c709bc10382cbeecbfb5aeca`. +- Ultimo controllo: zero processi Pi RPC, maintenance `active=false`, admissions 0. + Ricontrollare alla ripresa e prima del fermo. +- Backup nuovo `/srv/thothii-v2/backups/20260926-coordinated-release` **non esiste**. + Backup storico 14 settembre verificato (14 checksum, tar e indici dump), non + un backup dello stato odierno, nessuna prova di restore eseguita. + +## Installazione e preservazione comprovata + +Descrittore effettivo, il cui **percorso va mantenuto** per preservare project identity: +`/srv/thothii-v2/source/ThothII/deploy/psd-server-v2/thothii-installation.yaml`. +Project `thothii-7f901b48fe35`, schema 2, profile server, embedded/en/omics-portal, +upstream, session storage local, `THOTH_PUBLIC_EXPOSURE=false` già preesistente. +Non cambiare modalità auth o disattivare controlli per far partire l'app. + +Preservati e confrontati: + +- default interaction `zai/glm-5.3`; +- `deepseek/deepseek-v4-pro`, `deepseek/deepseek-v4-flash`; +- `local-qwen/qwen3.6-35b-a3b`; +- embedding `ollama/qwen3-embedding:0.6b`, dimensione 1024; +- `catalog.json`, `pi/models.json`, `pi/settings.json`, `frontend/config.js`: + proiezioni nuove **identiche byte per byte** a quelle operative; +- Compose candidato: environment, reti, porte, secret/config mount e mount + persistenti uguali. Solo due bind di script versionati identici cambiano + percorso seguendo il nuovo checkout (`catalog-db-init.sql`, `embedding-model-init.sh`). + +Il CLI rifiuta correttamente i segreti se eseguito da UID diverso da 10001. +Per diagnostica usare UID 10001 con gruppi operator/Docker e DOCKER_CONFIG +leggibile; non cambiare ownership dei segreti. Esempio verificato: + +```bash +sudo -n setpriv --reuid=10001 --regid=10001 --groups=1014,988 \ + env DOCKER_CONFIG=/srv/thothii-v2/operator/releases/20260926-coordinated/docker-config \ + /usr/local/bin/tht \ + --installation /srv/thothii-v2/source/ThothII/deploy/psd-server-v2/thothii-installation.yaml \ + doctor --json +``` + +## Correzione proxy pronta, non applicata + +Il proxy operativo è ancora vulnerabile: senza cookie, +`/datamart-builder/assets/api/me` con header `X-Thoth-Trusted-*` inventati +restituisce 200 e principal sintetico. API canonica restituisce 403. +Confermato anche via nginx HTTPS host con CA verificata e DNS locale. +Il test ha usato un soggetto inesistente, nessun dato reale o scrittura. + +Causa: il prefisso pubblico degli asset inoltra alla radice del frontend, +che espone `/api/` e converte gli header Trusted in principal del core. + +Correzione candidata Omics: + +- branch `codex/thothii-assets-proxy-isolation`; +- commit locale **`928f7e9fff2aba895416776fecf5668ee957d237`**; +- parte da `1cf7ea90…`, nessun push eseguito; +- checkout stabile pulito: + `/srv/thothii-v2/releases/omics-928f7e9fff2aba895416776fecf5668ee957d237`; +- clone di lavoro: `/tmp/thothii-release-20260926/omics-source`; +- sei file cambiati: nginx, test statico, tre file di test dinamico, docs integrazione. + +Il filtro accetta solo file Vite con hash ed estensioni previste, alla radice +o sotto `assets/` per compatibilità. Le route pubbliche config/asset rimuovono +Cookie, Authorization e tutte le famiglie di header identità; solo GET/HEAD. +Il frontend attuale emette file alla **radice**, non tutti in `assets/`: +il primo filtro eccessivamente stretto è stato corretto grazie al test reale. + +Test completati: + +- test dinamico nuovo riproduceva il difetto prima della correzione; +- **6/6** test della catena nginx Omics → nginx frontend reale → core/Django + sintetici, rete Docker interna, senza porte host o volumi operativi; +- verificati traversal codificati, canonical auth, Origin esatta, config, + tutti i file del manifest reale, diniego scritture alle route statiche; +- gli stessi **6/6** passano anche con l'immagine frontend precedente: + il rollback può e deve mantenere la correzione del proxy; +- suite Omics shell/auth/nginx/Superset **28/28** dopo la modifica; +- nessun container/rete `omics-proxy-check-*` rimasto al momento della sospensione. + +Esecuzione test ripetibile, solo se necessaria per nuove modifiche: + +```bash +cd /srv/thothii-v2/releases/omics-928f7e9fff2aba895416776fecf5668ee957d237 +THOTHII_TEST_FRONTEND_IMAGE=thothii-v2-frontend:497ab840-preflight \ +OMICS_TEST_IMAGE=omics-portal:proxy-isolation-tests \ +OMICS_TEST_NGINX_IMAGE=sha256:b3c656d55d7ad751196f21b7fd2e8d4da9cb430e32f646adcf92441b72f82b14 \ +python3 test_support/thothii/run_proxy_integration.py +``` + +## Artefatti pronti e bozza da revisionare + +Directory stabile: `/srv/thothii-v2/operator/releases/20260926-coordinated`. +Contiene: + +- `descriptor.next.yaml`: cambia soltanto projectDirectory verso la nuova main + e il percorso del suo overlay git-ssh; modelCatalog/auth/shell/workspace invariati. +- `operator.next.env`: cambia soltanto tag immagini in `497ab840-preflight`. +- `compose.portal-upstream.next.yaml`: aggiorna anche il tag frontend letterale, + che non seguiva la variabile del core. +- `baseline.json`: hash protetti dei file operativi per rilevare drift prima + della finestra; non contiene valori segreti. +- `compose-preservation.json`: esito positivo del confronto Compose candidato. +- `tht.next`: nuovo binario non installato; SHA256 + `0d39a93fb0a3b2147541a746c75832db20302f3a604bf6510da69d3731bcd783`. +- `nginx.safe.conf`: copia della configurazione candidata testata. +- `proxy-green.log`, `proxy-rollback-test.log`, `omics-proxy-tests.log`. +- **`release.DRAFT.py`**: bozza appena scritta, **non revisionata, non compilata, + non eseguita neppure in modalità check**. Non lanciarla prima di una revisione + completa e della conferma della finestra per le fasi mutanti. + +Originale della bozza: `/tmp/thothii-release-20260926/release.py`. +Non trattare il flag `--window-confirmed` come un'approvazione dell'utente. + +Sorgenti ThothII pronti, main pulita e fetch Gitea con divergenza 0/0: +`/srv/thothii-v2/releases/497ab84031e285464fdbb73e6e0ce9252687e3ab`. +Vecchio checkout dirty lasciato al suo posto per rollback. + +Immagini candidate già costruite, non distribuite: + +- core `thothii-v2-core:497ab840-preflight`, + `sha256:182f4e0d63404cb7ed6a0e272441e9c55ed27e2bb16fdbf4d7162f892ac76dc7`; +- frontend `thothii-v2-frontend:497ab840-preflight`, + `sha256:5f5a4f81139432d0ac41025c3006edaf1258b623ce388242700b1b20fcce6421`. + +Test ThothII già superati: 782 frontend, 152 backend su Node 24.16, 31 browser, +build/typecheck core/frontend, build CLI e generazione isolata, doctor attuale 13/13. +Log in `/tmp/thothii-release-20260926`. La sottodirectory `generation` contiene +copie sensibili protette root:root 0600 sotto directory 0700: non pubblicarla. + +## Lavoro residuo e criteri per avanzare + +1. **Revalidare solo ciò che può essere cambiato** durante la pausa: immagini, + SHA/stato checkout operativo, configurazioni contro baseline, processi Pi, + migrazioni Omics pendenti e raggiungibilità. Se c'è drift, preservarlo e + aggiornare il piano prima di proseguire. +2. **Revisionare lo script DRAFT**, inclusi escaping del controllo processi Pi, + gestione errori/parzialità backup, health/readiness reale Omics (il suo + healthcheck verifica solo catalogo, non Gunicorn), generazione con UID corretto, + digest image vs container, conservazione proprietari e dati, rollout/rollback + della correzione proxy. Validare sintassi e fase read-only solo dopo revisione. + Aggiungere prove HTTPS locali, risoluzione alias dopo recreate e controllo + log redatto: la bozza non copre ancora integralmente il runbook. +3. **Finalizzare scelta lifecycle Omics.** La bozza mantiene l'esatta immagine + web operativa perché l'unica modifica applicabile è nginx (shell/Superset + già presenti); fa fast-forward del checkout al fix, stop/start web per backup + consistente e recreate nginx. Lo start riesegue il suo entrypoint, compresi + migrate/compilemessages/collectstatic. Spiegare questa scelta nel piano finale. + Se si decide di ricostruire web, il suo `.dockerignore` è minimale: creare un + contesto pulito, aggiungere il catalogo Superset reale valido, escludere segreti. +4. **Finalizzare backup odierno.** La bozza salva immagini/code/config, ferma + ingressi e applicativi dopo maintenance e controllo Pi, crea dump catalogo + e PostgreSQL Omics condiviso, ferma supporti ThothII per snapshot raw coerenti, + archivia bind/volumi e verifica checksum/tar/indici dump. Valutare spazio e + interruzioni; il vecchio backup verificato non basta. Il DB Omics è condiviso + (`postgres` su `supabase-db`, app in `kokoro`, metadata in `chirone_meta`): + un restore dell'intero DB non fa parte del rollback ordinario. +5. **Presentare piano risolto, comandi, backup e rollback all'utente**, chiedendo + conferma della finestra. Solo allora installare CLI/config, generare proiezioni, + ricreare le app e applicare nginx. Nessuna migrazione nuova rilevata finora. +6. **Collaudare e poi coinvolgere l'utente.** Login unico, `/me` e ruoli, + IT/EN, tema/fullscreen, logout/seconda scheda, sessione fittizia con Pi/SSE, + stop/save/ripresa e lingua immutabile, diniego cross-origin autenticato, + Database/Memory/Evidence e accesso HTTPS da postazione esterna. + +Rollback: ripristinare immagini ThothII, CLI, descriptor/env/override e +proiezioni salvati; preservare dati e **mantenere il fix proxy**, già testato +col frontend precedente. Ripristinare il vecchio nginx riaprirebbe il bypass. +Nessun restore dati automatico, reset Git o eliminazione volumi. + +## Ambiente strumenti + +La sandbox exec fallisce prima dell'avvio (`bwrap: loopback … Operation not +permitted`): i comandi sono stati eseguiti con `require_escalated` e motivazione. +Auto-review li ha consentiti; nessun rifiuto pendente. Non sono stati usati +subagenti. Skill applicate: `diagnosing-bugs`, `writing-for-agents` per questo handoff. +Nessun goal formale attivo. Per lo stato successivo alla ripresa, usare il piano revisionato collegato in apertura. diff --git a/docs/reports/2026-09-26-server-release-plan.md b/docs/reports/2026-09-26-server-release-plan.md new file mode 100644 index 00000000..6bf2b998 --- /dev/null +++ b/docs/reports/2026-09-26-server-release-plan.md @@ -0,0 +1,184 @@ +# Piano eseguibile — rilascio coordinato ThothII / Omics + +Data: 26 settembre 2026. Ripresa del [passaggio di consegne](2026-09-26-server-release-handoff.md). +**Piano approvato dall’utente; esecuzione avviata il 26 settembre 2026 alle 19:28 Europe/Rome.** +Stato operativo e risultati successivi nel [report di esecuzione](2026-09-26-server-release-execution.md). +Il testo seguente registra la preparazione precedente alla conferma. +Nessun fermo, modifica di configurazione operativa, migrazione, ricreazione, +login di prova o cambio credenziali eseguito durante questa ripresa. + +## Risultato proposto + +- ThothII: distribuire core/frontend già costruiti dalla main + `497ab84031e285464fdbb73e6e0ce9252687e3ab`, conservando percorso del descrittore, + project identity, dati e configurazione server. +- Omics: fast-forward da `1cf7ea90a669a26bf3bc51749eab4d07981da472` al commit locale + `928f7e9fff2aba895416776fecf5668ee957d237`, che aggiunge il filtro proxy degli asset. + Conservare la stessa immagine e lo stesso container web: shell embedded e fix + Superset sono già operativi. Riavviare web dopo il backup e ricreare soltanto + nginx Omics, fissandone l'immagine all'ID esistente. +- Mantenere il fix proxy anche nel rollback: la configurazione precedente consente + il bypass documentato nell'handoff e non deve essere ripristinata. + +L'entrypoint web rieseguirà `makemigrations`, `migrate`, controllo superuser, +`compilemessages` e `collectstatic`. Verificati `makemigrations --check --dry-run` +e `migrate --check`: nessuna modifica o migrazione pendente. L'utente che lo +script creerebbe automaticamente esiste già. Questi controlli saranno ripetuti +prima del fermo. Nessuna nuova migrazione di catalogo, Memory o sessioni emerge +anche dal confronto ThothII `49333a2d..497ab840`; nessun job di migrazione è previsto. + +## Rivalidazione alla ripresa + +| Controllo | Esito | +| --- | --- | +| Immagini/container operativi | Stessi ID e date di avvio registrati nell'handoff | +| Baseline descriptor/env/override/Pi/modelli/segreti | Tutti gli hash invariati | +| Checkout ThothII candidato e Omics candidato | SHA attesi, puliti | +| Checkout ThothII operativo | Sempre dirty; preservato, 30 modifiche e due file non tracciati | +| Checkout Omics operativo | Tracciati invariati; nuovi file locali sotto `docs/prd/.claude/`, preservati | +| Checkout di lavoro ThothII | Nuova directory locale `.claude/`, estranea al rilascio e preservata | +| Pi RPC | Zero processi, rilevamento effettivo in `/proc` | +| Maintenance | Inattiva; il contatore `admissions` del CLI è locale a quel processo e non certifica il drenaggio del server | +| Doctor | Positivo con UID 10001 e gruppi operator/Docker | +| Omics | Gunicorn/Django rispondono; catalogo Superset valido; nessuna migrazione pendente | +| HTTPS locale | Certificato verificato con CA interna e risoluzione del nome a 127.0.0.1; config 200, API anonima 403 | +| Alias Docker | Univoci; nginx risolve core/frontend/web; Omics legge il manifest | +| Compose candidato | Environment, reti, porte, mount persistenti/segreti invariati; cambiano immagini, contesti build e due script con contenuto identico | +| Descrittore candidato | Cambiano solo `projectDirectory` e il percorso dell'overlay git-ssh | +| Spazio | 27,8 GiB liberi; stima non compressa 12,6 GiB; riserva richiesta 20,9 GiB | + +Il bypass asset operativo non è stato ritestato in questa ripresa: resta quello +accertato nell'handoff; il fix resta non distribuito. Le prove HTTPS locali non +sostituiscono l'accesso da una postazione esterna o un login reale. + +## Script revisionato e verifiche + +Percorso definitivo di preparazione: +`/srv/thothii-v2/operator/releases/20260926-coordinated/reviewed/release.py`. +SHA256: `eb2c677c8adbee0c9febf919001f654c8535e71f064d9fb7c7883afd02383a41`. +La precedente `release.DRAFT.py` resta conservata e non va eseguita. + +Correzioni principali: + +- Parsing NUL degli argomenti Pi, rilevamento `--mode rpc` e `--mode=rpc`, esclusione + del processo di controllo; test reale in container isolato. +- Gate espliciti anche con Python ottimizzato; lock tra esecuzioni; controllo + dei digest dei tag, dei container e degli artefatti preparati. +- Baseline estesa a CLI, configurazione Omics, CA/proxy host e file locali. +- Checksum dedicati della configurazione di rollback, creati prima delle mutazioni; + journal delle fasi, file parziali conservati e nessun marker VERIFIED su errore. +- Preservazione proprietari/permessi, `.git`, file ignorati/non tracciati, ACL/xattr + negli archivi. Solo cache dipendenze ricostruibili escluse. +- Readiness HTTP di Omics, alias dopo ricreazione, controlli HTTPS con CA, + tutti gli asset del manifest e riepilogo log per categorie senza contenuti sensibili. +- Recupero `reopen` per rendere nuovamente raggiungibile una sessione Pi comparsa + durante il drenaggio: riapre solo nginx con il fix, senza fermare web/core/Pi. + +Validazione: sintassi Python, **14 test isolati**, fase `check` read-only positiva. +I test coprono anche conferma mancante, backup parziale/corrotto, checksum con +path traversal, ownership, readiness HTTP e recupero senza stop di Pi. +Le fasi mutanti non sono state eseguite né rappresentano un restore provato. + +Evidenze in `/srv/thothii-v2/operator/releases/20260926-coordinated/reviewed/`: +`reviewed-tests.log`, `reviewed-check.log`, script e test; manifest protetti +`artifacts.json`, `baseline-extra.json`, `source-state.json`. +Restano valide le prove precedenti: 6/6 proxy con ciascun frontend nuovo/vecchio, +28/28 Omics, 782 frontend, 152 backend e 31 browser; nessuna modifica a quelle +implementazioni durante questa ripresa. + +## Comandi risolti per la finestra + +Riservare indicativamente **30–45 minuti**, da confermare dall'operatore: la durata +reale dipende soprattutto dal dump del database condiviso. L'interruzione interessa +Omics e ThothII; non vengono fermati Authentik, il database condiviso o il DWH. +La prima parte del backup (codice/config/immagini) avviene con le app ancora attive. + +Eseguire ciascun comando solo dopo exit 0 del precedente, nella finestra approvata: + +```bash +sudo -n python3 /srv/thothii-v2/operator/releases/20260926-coordinated/reviewed/release.py check +sudo -n python3 /srv/thothii-v2/operator/releases/20260926-coordinated/reviewed/release.py backup --window-confirmed +sudo -n python3 /srv/thothii-v2/operator/releases/20260926-coordinated/reviewed/release.py deploy --window-confirmed +``` + +`--window-confirmed` registra l'intenzione del comando, **non sostituisce il consenso**. +Lo script contiene tutti i percorsi/ID e l'ordine Compose risolti; non usa pull, +build implicite, setup completo, reset o cancellazione volumi. + +Sequenza concreta: + +1. Rivalidare baseline, assenza Pi e spazio. Salvare e verificare configurazioni, + CLI, sorgenti e immagini correnti. +2. Attivare maintenance, chiudere nginx Omics, attendere e controllare due volte + Pi. In caso di sessioni attive fermare la procedura senza ucciderle. +3. Fermare Omics web/core/frontend, creare i dump, fermare i soli supporti ThothII, + archiviare bind e volumi. Verificare checksum, lettura tar e indici dump. +4. Solo con backup VERIFIED: fast-forward Omics; aggiornare descriptor/env/overlay; + installare CLI verificato e generare proiezioni con UID 10001. Controllare che + modelli, Pi, shell e credenziali restino identici. +5. Riavviare supporti; ricreare core/frontend con stesso progetto + `thothii-7f901b48fe35`; avviare lo stesso web Omics; ricreare nginx col fix e + immagine fissata. `--no-build --pull never --no-deps` limita il lifecycle. +6. Verificare health/HTTP, DNS, `nginx -t`, attendere 31 secondi, eseguire prove + automatiche HTTP/HTTPS e log. Disattivare maintenance solo dopo esito positivo. + +## Backup e gestione delle interruzioni + +Destinazione nuova, protetta root 0700: +`/srv/thothii-v2/backups/20260926-coordinated-release`. +**Non esiste ancora**: verrà creata nella finestra. Se esiste già, lo script si +ferma senza riutilizzare o cancellare il contenuto. + +Contiene CLI/descriptor/env/override/generated, sorgenti e Git, configurazioni +Omics e proxy, immagini per ID, bind data/registry/Evidence/Pi/segreti, +volumi catalogo/Qdrant/Ollama/static/media, dump catalogo e dump PostgreSQL condiviso. +Il dump condiviso è una snapshot transazionale coerente mentre gli altri servizi +che usano quel DB continuano a operare; non è un backup raw a database fermo. +Il volume raw del catalogo ThothII viene copiato solo dopo averlo fermato. + +Su errore: niente retry cieco né prosecuzione verso deploy. Leggere journal e stato +container. Prima di una mutazione ai servizi, questi restano operativi; dopo la +quiescenza possono rimanere fermi. Il manifest `rollback-config.json` permette +il rollback applicativo anche quando il backup dati è incompleto. Nessun restore +automatico dei dati; nessuna prova di restore dichiarata. + +Se Pi compare dopo chiusura ingressi e prima del fermo applicativo: + +```bash +sudo -n python3 /srv/thothii-v2/operator/releases/20260926-coordinated/reviewed/release.py reopen --window-confirmed +``` + +Questo applica il solo proxy sicuro, mantiene le applicazioni e Pi accesi e lascia +maintenance attiva: l'utente può salvare/fermare la sessione. La procedura si arresta +poi per rivalutare backup parziale e baseline; non tenta automaticamente un nuovo +backup o deploy. + +## Rollback applicativo + +Se la nuova applicazione o i controlli falliscono, e non ci sono Pi da salvare: + +```bash +sudo -n python3 /srv/thothii-v2/operator/releases/20260926-coordinated/reviewed/release.py rollback --window-confirmed +``` + +Ripristina configurazioni/CLI/generated e immagini core/frontend precedenti, +riavvia lo stesso web Omics, mantiene il commit e il proxy corretto, quindi ripete +il collaudo automatico. Ripristina UID/GID/mode originali. Non sovrascrive dati, +non ripristina l'intero DB condiviso e non torna al nginx vulnerabile. Non fa reset +Git. Rifiuta di interrompere Pi attivi. Dopo un backup parziale conserva gli +artefatti per analisi: non li presenta come backup completo. + +## Collaudo dell'operatore dopo il rilascio + +Avvisare l'utente quando i controlli automatici saranno verdi, poi verificare +con account autorizzati e dati fittizi: + +1. Login unico Omics → Datamart Builder, `/me` con identità/ruoli corretti, + nessun secondo login; utente normale e admin coerenti. +2. IT/EN, tema, fullscreen/Esc e persistenza dopo reload. +3. Sessione di prova, eventi SSE, stop/save/ripresa e lingua immutabile. +4. Logout e seconda scheda; diniego cross-origin autenticato su risorse di prova. +5. Database/Memory/Evidence leggibili, layout previsto, HTTPS da client esterno. + +Queste prove restano aperte e sono necessarie prima di dichiarare concluso il +rilascio, secondo la [matrice di accettazione](../testing/authentication-manual-acceptance.md). diff --git a/docs/reports/2026-09-26-server-release-preflight.md b/docs/reports/2026-09-26-server-release-preflight.md new file mode 100644 index 00000000..33b61ebc --- /dev/null +++ b/docs/reports/2026-09-26-server-release-preflight.md @@ -0,0 +1,285 @@ +# ThothII / Omics — preflight server del 26 settembre 2026 + +Stato: **rilascio fermo al gate di isolamento del proxy**. Nessuna finestra +richiesta o autorizzata; nessun servizio fermato, ricreato o aggiornato, nessuna +migrazione e nessuna modifica di proxy, descrittore, credenziali, DWH o IdP. +Questo documento è un inventario e piano parziale, **non un piano eseguibile +di rilascio approvato**. Applicare il runbook `docs/operations/server-codex-handoff.md`. + +## Blocco verificato + +Senza cookie/sessione Omics: + +| Ingresso | Richiesta | Risultato | +| --- | --- | --- | +| Nginx Omics, localhost:8080 con Host pubblico | `/datamart-builder/api/me` | 403 | +| Stesso ingresso, principal normalizzato inventato | `/datamart-builder/api/me` | 403 | +| Stesso ingresso, header `X-Thoth-Trusted-*` sintetici | `/datamart-builder/assets/api/me` | **200, JSON `/me` con identità sintetica e permesso** | +| Nginx TLS host, HTTPS con CA verificata e DNS locale | API canonica / percorso alternativo | 403 / **200** | + +Il soggetto di prova era `release-probe-nonexistent`, con flag admin falso; +non sono stati usati utenti reali o richieste di scrittura. La risposta alternativa +conteneva issuer/subject, ruoli, permessi e session/CSRF null: non era il fallback HTML. + +Causa circoscritta: la location pubblica `/datamart-builder/assets/` inoltra +qualsiasi suffisso alla radice del frontend. Il suffisso `api/me` raggiunge quindi +`/api/me` del frontend, che converte gli header Trusted in principal del core. +Quel percorso non attraversa `auth_request`. La configurazione Omics operativa e +quella della consegna mantengono questo percorso; la nuova immagine frontend +conserva l'endpoint `/api/`. Un aggiornamento di ThothII da solo non corregge il difetto. + +Riproduzione non mutante, exit 1 sul difetto: + +```bash +python3 /tmp/thothii-release-20260926/evidence/check-proxy.py +``` + +Serve una revisione candidata Omics del proxy che impedisca l'accesso alle API +attraverso gli asset e rimuova gli header di fiducia dai percorsi pubblici. +Va preparata dal codice server `1cf7ea90…`, collaudata in isolamento includendo +varianti dei percorsi, asset/manifest/config e dinieghi, quindi inclusa nel piano +da approvare **prima** del reload operativo. Nessuna correzione è stata applicata. +Non indebolire auth o Origin, né cambiare le identità degli utenti. + +L'origine pubblica via DNS, dal server, va in timeout (HTTP 000, curl exit 28). +Il probe TLS con `--resolve …:443:127.0.0.1` è invece riuscito. Resta da verificare +il percorso completo dal client esterno/bilanciatore; non è attestato dal probe locale. + +## Revisioni e conservazione delle modifiche + +- Checkout di consegna `/home/chirone/Thoth`: branch `main`, HEAD e `origin/main` + `497ab84031e285464fdbb73e6e0ce9252687e3ab`, fetch Gitea eseguito, divergenza `0 0`; + entrambi gli ancestor richiesti (`497ab840…`, `0d2e573e`) presenti. +- All'inizio non era pulito: solo `docs/reports/2026-09-14-server-embedded-omics-release.md` + non tracciato. Quel file è stato conservato. Questo report è un ulteriore output locale. +- Copia pulita per test `/tmp/thothii-release-20260926/source`, branch `main`, stesso SHA; + clone locale senza hardlink e senza importare il report non tracciato. +- Checkout ThothII operativo `/srv/thothii-v2/source/ThothII`: branch `main`, + HEAD `b1723c34c467980d007094af078d966d460cde2b`, 30 file modificati e due file + non tracciati. Nessun aggiornamento/reset/stash eseguito in questo checkout. + Dei 32 file locali, 29 sono identici alla main approvata; le differenze negli + altri tre sono le nuove correzioni di main a `AppShell.tsx`, al suo test di + gestione sessioni e al test visuale dello scroll. Non occorre ricostruirle a mano. +- Omics `/home/chirone/omics_portal`: `master`, pulito e coincidente col riferimento + locale `origin/master`, HEAD `1cf7ea90a669a26bf3bc51749eab4d07981da472`. + Non è stato eseguito fetch di master: questa coincidenza non attesta il master remoto attuale. +- Fetch esplicito del branch GitHub `codex/thothii-embedded-shell`: esattamente + `fca10901a73666ca257d8f4cc4b77066295c400a`; contiene `95154e179144e2453b37ef2a63a65d6f377e4cf8` + ed è già antenato di HEAD Omics. **Non ripetere il merge e non tornare a fca10901.** + Il commit successivo corregge la risoluzione delle dashboard Superset rispetto + alla lingua. Gli 11 file verificati nel container (shell/auth e correzione + Superset) hanno hash uguali al checkout operativo. +- Il branch incompleto `codex/guided-standalone-install` non è stato usato; + `tht setup --complete` non è stato eseguito. + +## Immagini effettivamente operative, non candidate + +| Servizio | Tag | Image ID | +| --- | --- | --- | +| core | `thothii-v2-core:49333a2d-session-memory-fix` | `sha256:ff4c435abd67c57e1e91e6e560dae73e67350ca499a5aedca3ffa517b9f59ee0` | +| frontend | `thothii-v2-frontend:b1723c34-session-dialogs-20260914` | `sha256:d2ed3dec42f8a56536ebbc8d74f13892d4c42c9a7f2fb67c476ff39f43fe7af9` | +| Omics web | `omics_portal-web` | `sha256:27aa100690b110bf596322b1b0a31acc178ca9d1c709bc10382cbeecbfb5aeca` | +| Omics nginx | `nginx:alpine` | `sha256:b3c656d55d7ad751196f21b7fd2e8d4da9cb430e32f646adcf92441b72f82b14` | +| catalog-db | PostgreSQL 17.6 bookworm | `sha256:f3bd19c606e442c3d7bdfa8002e03fe260a1023351e0ea4598032022b68dd6e3` | +| qdrant | v1.18.2 | `sha256:75eab8c4ba42096724fdcfde8b4de0b5713d529dde32f285a1f86fdcb2c9e50c` | +| embedding | Ollama 0.32.0 | `sha256:57f573b47f1f71ebb445789f279fe3e596a8beab182f7cf486db9205bad87c5a` | + +Il frontend dichiara revision `b1723c34-working-tree`; core e Omics non hanno +label OCI revision. Perciò lo SHA esatto del sorgente baked del core non può +essere certificato dalla sola immagine: tag, ID e checkout sono evidenze distinte. +CLI operativo `/usr/local/bin/tht`, binario root:root 0755; non sostituito. + +## Installazione, Compose e persistenza + +Descrittore invariato: +`/srv/thothii-v2/source/ThothII/deploy/psd-server-v2/thothii-installation.yaml`. +Schema 2, profile server, file 0600 owner UID/GID 10001, projectDirectory +`/srv/thothii-v2/source/ThothII`, envFile `/srv/thothii-v2/operator/operator.env`. +Shell già `embedded/en/omics-portal`. Project Compose `thothii-7f901b48fe35`. +Ordine dei file applicativi, ricavato dalle label dei container: + +1. `/srv/thothii-v2/source/ThothII/compose.yaml` +2. `/srv/thothii-v2/source/ThothII/deploy/compose.server.yaml` +3. `/srv/thothii-v2/source/ThothII/deploy/compose.git-ssh.yaml` +4. `/srv/thothii-v2/operator/compose.portal-upstream.yaml` +5. `/srv/thothii-v2/source/ThothII/deploy/psd-server-v2/generated/compose.models.yaml` + +I supporti sono stati creati con i primi quattro file. Il percorso del descrittore +determina l'identità Compose nel CLI: mantenerlo anche usando in futuro una +directory sorgente pulita distinta. Non spostare il descrittore in un nuovo checkout. +L'override contiene un tag frontend letterale: il solo cambio di +`THTII_RELEASE_IMAGE_TAG` non aggiorna entrambe le immagini. + +Core: `AUTH_MODE=upstream`, `THT_AUTH_CONFIG_FILE=/run/thothii-auth/upstream-disabled.yaml`, +nessuno dei due file auth (`auth.yaml`, `upstream-disabled.yaml`) presente; +directory host `/srv/thothii-v2/operator/auth`, nessuna runtime auth projection. +`THOTH_PUBLIC_EXPOSURE=false`, `THT_SESSION_STORAGE=local`: configurazione +preesistente, non modificata. Non è una prova di isolamento: il gate proxy è fallito. +Se si decide di impostare public exposure true, serve prima un piano separato +per storage sessioni PostgreSQL; non attivare l'overlay come falsa migrazione automatica. + +Bind e archivi: + +- `/srv/thothii-v2/data` → `/data`: settings, sessioni, artifact, indici e workspace secrets. +- Sessioni PSD: `/data/sessions/psd-clinical/{sessions,artifacts,indexes,memory}`; + snapshot catalogo `/data/sessions/psd-clinical/preprocessing/catalog-metadata.json`. +- `/srv/thothii-v2/workspace-registry` → `/data/workspace-registry`; workspace + `psd-clinical`, installation ID `psd-server-v2`. Evidence local archive + `/data/workspace-registry/repo/psd-clinical`. +- `/srv/thothii-v2/pi-state` → `/home/thoth/.pi`; auth provider read-only + `/srv/thothii-v2/secrets/pi-auth.json` → `/home/thoth/.pi/agent/auth.json`. +- Bundle `/srv/thothii-v2/secrets/thothii.secrets`; chiavi workspace SSH, + known-hosts e password catalogo in `/srv/thothii-v2/secrets/`, valori mai riportati. +- Generated catalog/Pi/frontend sotto il descrittore; `config.js` montato read-only. +- Catalogo e Memory autorevoli PostgreSQL nel volume + `thothii-7f901b48fe35_catalog-data`; indici derivati + `thothii-7f901b48fe35_qdrant-data`; modelli `thothii-7f901b48fe35_embedding-models`. +- Binding DWH diretto già operativo verso `host.docker.internal:5438`, utente + read-only `thoth_dwh_reader`. Nessuna query DWH o sincronizzazione avviata. + +Omics: project `omics_portal`, file ordinati +`/home/chirone/omics_portal/docker-compose.yml`, +`/home/chirone/omics_portal/docker-compose.override.yml`, env `.env.docker`. +Volumi `omics_portal_static_volume` e `omics_portal_media_volume`; mount CA +`/etc/nginx/ssl/policlinicosandonato.it.fullchain.crt` read-only. +Database portale: `supabase-db`, database `postgres`, search_path `kokoro,public`, +endpoint host 5438. Non confonderlo con il DWH o col catalogo ThothII. +Il server PostgreSQL è condiviso: un eventuale restore dell'intero database +non è un rollback ordinario di Omics e richiede un piano separato. + +Reti: core su `thothii-7f901b48fe35_thothii`, `omics_portal_omics_network` +(alias `thothii-core`) e `localllm_default`; frontend su prime due reti (alias +`thothii-frontend`). Nessuna porta host core; frontend `127.0.0.1:18020`. +Omics web solo porta interna 8000; nginx `0.0.0.0:8080`. TLS host nginx su 443 +per `https://aritmolab.policlinicosandonato.it`, poi localhost:8080. +File host `/etc/nginx/sites-available/policlinicosandonato`, collegato in sites-enabled; +SSE canonico con buffering disabilitato e timeout 86400 su entrambi gli nginx. +La mappa Origin esatta HTTPS→HTTP è presente. Il tratto esterno non è verificato. + +Inventario JSON filtrato completo (label, mount, reti, porte): +`/tmp/thothii-release-20260926/inventory.json`. + +## Verifiche eseguite e candidati + +- ThothII frontend: **782/782** test, build/typecheck riusciti. +- Browser isolato: **31/31** scenari visuali Playwright riusciti. Il primo + tentativo non aveva il binario Chromium; installato soltanto nello staging + `/tmp/thothii-release-20260926/browsers`, quindi suite rieseguita con successo. +- Backend: build/typecheck riusciti; **152/152** test mirati su Node 24.16 in + container senza rete o dati operativi. I tentativi host Node 23 fallivano + per Argon2 non disponibile; i primi container di test avevano UID/mount + incompleti. Il risultato valido è `backend-node24-tests.log`. +- Omics shell/auth/nginx isolati: **15/15**; regressioni Superset: **12/12**, + entrambe le esecuzioni con `--network none`, SQLite in-memory, nessun volume operativo. +- Omics operativo: `migrate --check` exit 0, catalogo Superset valido (32 dashboard), + `nginx -t` exit 0. Warning allauth deprecati presenti. +- CLI corrente: status exit 0, doctor **13/13**, maintenance `active=false`, admissions 0. + Il primo tentativo con sudo/root era rifiutato dal controllo ownership dei segreti. + Con UID 10001 e gruppi 1014,988, più DOCKER_CONFIG leggibile, nessun errore: + non mancavano credenziali e non sono stati cambiati permessi. +- CLI aggiornato costruito in `/tmp/thothii-release-20260926/cli/tht-linux-amd64`; + generazione riuscita su copie root:root 0600 in directory 0700 + `/tmp/thothii-release-20260926/generation` (contiene copie sensibili, non pubblicare). + Proiezione frontend `/api`, shell embedded/en/omics-portal corretta. +- Immagine core candidata `thothii-v2-core:497ab840-preflight`: + `sha256:182f4e0d63404cb7ed6a0e272441e9c55ed27e2bb16fdbf4d7162f892ac76dc7`. +- Immagine frontend candidata `thothii-v2-frontend:497ab840-preflight`: + `sha256:5f5a4f81139432d0ac41025c3006edaf1258b623ce388242700b1b20fcce6421`. + Entrambe portano la revision OCI `497ab84031e285464fdbb73e6e0ce9252687e3ab`. + **Costruite, non distribuite**. Non è stata costruita una nuova immagine Omics operativa. + +Log dei test e build in `/tmp/thothii-release-20260926/`; log Omics +`/tmp/omics-release-tests-20260926.log` e `/tmp/omics-release-superset-tests-20260926.log`. +Log browser: `/tmp/thothii-release-20260926/browser-tests.log`. + +## Backup e rollback: stato e vincoli + +Backup storico `/srv/thothii-v2/backups/20260914-pre-embedded-release`: +directory root:root 0700, file 0600. Verificati **14 checksum**, leggibilità di +sette archivi tar.gz e indice dei due dump con `pg_restore --list`: tutto exit 0. +**Non è stata eseguita una prova di restore e non è un backup dello stato odierno.** +Contiene anche dati condivisi/sensibili: accesso protetto, nessun contenuto mostrato. +Altri backup presenti: `20260914-session-memory-fix`, `20260914-session-dialogs`, +`memory-evidence-20260910`; non attestati dai controlli del primo backup. + +Il nuovo punto di rollback andrà creato nella finestra, dopo gestione delle +sessioni in corso e quiescenza delle scritture dei due applicativi. Percorso +previsto `/srv/thothii-v2/backups/20260926-coordinated-release` (non creato). +Deve includere: + +1. Binario CLI, descriptor/env/override/generated, checkout operativo dirty + completo o bundle Git + patch + file non tracciati, configurazioni Omics, + catalogo Superset runtime e configurazione nginx host; proprietari/permessi preservati. +2. Immagini attuali core/frontend/web/nginx per ID e checksum dell'archivio. +3. Bind data, registry, Evidence, Pi, secrets/settings e volumi static/media Omics. +4. Dump coerente del catalogo e backup portale con ambito esplicito rispetto + al database PostgreSQL condiviso; snapshot Qdrant/Ollama e, se richiesto, + snapshot raw catalogo **solo a database fermo**. Non archiviare un PGDATA live + come se fosse un backup consistente. +5. SHA256SUMS, elenco integrale archivi senza errori, `pg_restore --list` e + restore isolato prima di eventuali migrazioni non reversibili. + +Fra il riferimento operativo core `49333a2d` e la main approvata non risultano +nuove migrazioni catalogo/sessioni; Omics `migrate --check` non segnala pendenti. +Rivalutare dopo l'eventuale nuova revisione proxy: nessuna migrazione autorizzata ora. +L'entrypoint Omics esegue anche `makemigrations`, `migrate`, creazione superuser, +`compilemessages`, `collectstatic`: non usarlo come test preliminare su dati operativi. +Il `.dockerignore` Omics è minimale: preparare un contesto di build pulito che +includa il catalogo valido ed escluda env/backup/segreti prima della build operativa. + +Rollback applicativo previsto: ripristino della coppia core/frontend e Omics +sopra registrata, del CLI e dei file di configurazione/proiezione salvati, +con gli stessi project name, bind e volumi; ricreazione mirata delle sole app, +`nginx -t`, aggiornamento DNS/reload del proxy e collaudo accesso/manifest/SSE. +Non fare downgrade dati, restore dell'intero Supabase o cancellazioni di volumi. +**Il ritorno alla vecchia configurazione proxy ripristinerebbe il bypass noto:** +il rollback approvato deve conservare una chiusura di sicurezza verificata, +oppure mantenere indisponibile Datamart Builder fino alla correzione. + +## Comandi ricostruiti e piano da completare + +Queste funzioni ricostruiscono il lifecycle corrente; non sono state usate per mutazioni: + +```bash +thoth_compose() { + sudo -n docker compose --project-name thothii-7f901b48fe35 \ + --project-directory /srv/thothii-v2/source/ThothII \ + --env-file /srv/thothii-v2/operator/operator.env \ + -f /srv/thothii-v2/source/ThothII/compose.yaml \ + -f /srv/thothii-v2/source/ThothII/deploy/compose.server.yaml \ + -f /srv/thothii-v2/source/ThothII/deploy/compose.git-ssh.yaml \ + -f /srv/thothii-v2/operator/compose.portal-upstream.yaml \ + -f /srv/thothii-v2/source/ThothII/deploy/psd-server-v2/generated/compose.models.yaml "$@" +} +omics_compose() { + docker compose --project-name omics_portal \ + --project-directory /home/chirone/omics_portal \ + -f /home/chirone/omics_portal/docker-compose.yml \ + -f /home/chirone/omics_portal/docker-compose.override.yml "$@" +} +# Sola diagnostica, con identità del proprietario dei file protetti: +sudo -n setpriv --reuid=10001 --regid=10001 --groups=1014,988 \ + env DOCKER_CONFIG=/tmp/thothii-release-20260926/docker-config \ + /usr/local/bin/tht \ + --installation /srv/thothii-v2/source/ThothII/deploy/psd-server-v2/thothii-installation.yaml \ + doctor --json +``` + +Prima di chiedere la finestra occorre risolvere il gate proxy, selezionare la +nuova revisione Omics, completare il contesto di build e il backup odierno, +e verificare il rollback che non riapra il bypass. La revisione ThothII pulita +può essere collocata in `/srv/thothii-v2/releases/497ab84031e285464fdbb73e6e0ce9252687e3ab` +senza modificare il checkout dirty; mantenendo invariato il percorso del +descrittore, il project name CLI resta uguale. Questo trasferimento e gli +aggiornamenti del descriptor/override non sono stati eseguiti. + +Solo dopo questi prerequisiti presentare comandi finali risolti (nuovo CLI, +generazione, build/up mirati, proxy, verifiche e rollback) e chiedere conferma +della finestra. La sospensione attuale deriva dall'istruzione dell'operatore +e dal runbook: «Ferma il passaggio interessato se manca … un prerequisito; +non aggirare i controlli» e «Nessuna route diretta aggira il proxy». + +Restano aperti tutti i gate reali con account Omics autorizzati: login unico, +ruoli/capability, tema/IT-EN/fullscreen, logout e seconda scheda, sessione di +prova e SSE/ripresa, rifiuto cross-origin autenticato, lettura amministrazione +e accesso HTTPS da client esterno. I test isolati non li sostituiscono. diff --git a/docs/reports/2026-09-27-server-acceptance-handoff.md b/docs/reports/2026-09-27-server-acceptance-handoff.md new file mode 100644 index 00000000..d7baf63f --- /dev/null +++ b/docs/reports/2026-09-27-server-acceptance-handoff.md @@ -0,0 +1,90 @@ +# Handoff — verifiche estese ThothII / Omics + +Aggiornato il 27 settembre 2026. L’utente ha chiesto di affidare a un’attività +successiva le verifiche residue e di pubblicare la documentazione del rilascio. +**Aggiornamento e collaudo funzionale conclusi con successo; matrice estesa aperta.** +Questo documento è il punto di ripresa per le sole prove ancora da registrare. + +## Stato acquisito e confini + +Leggere [PROJECT_STATE.md](../../PROJECT_STATE.md), il +[report del rilascio](2026-09-26-server-release-execution.md), la +[matrice di accettazione](../testing/authentication-manual-acceptance.md) e il +[contratto upstream](../install/authentication-upstream.md). + +Il 26 settembre sono stati distribuiti ThothII `497ab840` e il fix proxy Omics +`928f7e9f`, conservando l’immagine web Omics. Backup verificato e rollback sono +registrati nel report. L’utente ha confermato accesso senza secondo login, +controlli IT/EN, tema, fullscreen/Esc e avvio → interruzione → ripresa di una +sessione. Le prove automatiche di health, proxy anonimo/header falsificati, +asset, TLS locale e preservazione dati/configurazioni sono passate. + +Queste sono evidenze del rilascio, non una nuova attestazione dello stato live. +Non ripetere backup/deploy né attivare maintenance per questo collaudo. Usare +account autorizzati e sessioni fittizie; DWH read-only. Non modificare ruoli, +Authentik, credenziali, modelli, archivi o configurazioni per far passare una prova. +Un problema che richieda un nuovo rilascio va prima diagnosticato e pianificato. + +## Prima azione alla ripresa + +1. Rileggere le conferme nel report: non chiedere all’utente di ripetere il ciclo + funzionale già riuscito, salvo regressioni o cambio di versione. +2. Verificare in sola lettura revisioni/container e stato dell’installazione. + Distinguere eventuale drift dalla baseline pubblicata; preservare il lavoro + e le sessioni in corso. Il `check` dello script di rilascio si aspetta lo stato + **precedente** al deploy: non usarlo come controllo corrente. +3. Concordare con l’operatore browser e account già disponibili: autorizzato, + normale, amministratore e, se disponibile, senza capability Datamart Builder. + Accedere dal normale login Omics; non chiedere password/cookie/token in chat. + Se manca un profilo, registrare quel caso come non eseguito senza crearne uno. + +**Completato quando:** sono registrati data, revisioni effettive, modalità +embedded/upstream, browser e disponibilità dei profili, senza dati personali. +L’agente può proseguire con le letture tecniche mentre attende l’operatore. + +## Prove residue + +Tutti i casi sotto partono da **non eseguito**. La colonna “chi” indica chi compie +la parte principale; l’agente prepara i controlli tecnici e registra i risultati. + +| ID | Chi | Azione concreta | Risultato necessario | +| --- | --- | --- | --- | +| V1 — lingua persistita | Operatore + agente | Creare una sessione fittizia con UI italiana, annotarne `interaction_language` tramite il normale stato sessione, interromperla, cambiare UI in inglese e riprendere **la stessa** sessione. | UI inglese, lingua della sessione ancora italiana; domande/scelte nella lingua persistita, SQL e contenuti authored invariati. La ripresa generica già provata non chiude questo caso. | +| V2 — identità e ruoli | Operatore + agente | Aprire `/datamart-builder/api/me` dalla sessione Omics autenticata; confrontare profilo normale e admin con le capability attese. Provare una richiesta amministrativa di sola lettura con il profilo normale. Se disponibile, provare pagina/API con un account senza capability. | Issuer `portal`, subject Django stabile, ruoli coerenti, `session` e `csrfToken` null. Profilo normale senza accesso amministrativo anche lato server; account senza capability rifiutato. Registrare solo esiti e codici, non identità o payload completi. | +| V3 — logout e riconnessione | Operatore | Aprire due schede Omics/Datamart Builder con una sessione fittizia; fare logout in una, tornare nell’altra e provocare un ricontrollo con reload/riconnessione. Rientrare attraverso Omics. | La nuova richiesta `/me` e le nuove aperture SSE non riusano l’accesso scaduto; UI protetta rimossa al ricontrollo. Non richiedere la chiusura istantanea di uno stream già aperto: non è il contratto. | +| V4 — origine delle scritture | Agente, con login dell’operatore | Preparare una coppia di richieste autenticate equivalenti su una risorsa fittizia autorizzata: prima same-origin, poi con origine estranea, attraversando il proxy pubblico. Confrontare lo stato della risorsa prima/dopo. Usare un harness HTTP locale con credenziali solo in memoria o file protetto; non affidarsi a `fetch` per impostare manualmente `Origin`. | La scrittura same-origin riesce e quella cross-origin è negata senza mutazioni. Dimostrare che la seconda richiesta è autenticata: un 403 dovuto alla sola assenza di cookie non prova la difesa Origin. I test isolati già verdi sono evidenza complementare, non sostituiscono questo caso. | +| V5 — lettura amministrazione | Operatore autorizzato | Aprire Database, Memory ed Evidence e controllare disponibilità dei dati preesistenti, selezione, pannelli e scroll. | Viste leggibili, nessun errore e nessuna scrittura/sincronizzazione necessaria per aprirle. Annotare quale area è stata verificata senza copiare contenuti clinici. | +| V6 — reload e preferenze | Operatore | Con sessione selezionata e Pi fermo, scegliere lingua e tema dal portale e ricaricare. | Preferenze e selezione coerenti; i documenti si riaprono senza avviare automaticamente Pi o una nuova generazione. La lingua persistita della sessione resta quella originale. | +| V7 — HTTPS esterno | Operatore | Confermare se le prove precedenti sono state svolte da una postazione esterna al server. Se non attestato, aprire il portale dal client abituale attraverso il nome pubblico e verificare config, asset e connessione eventi. | Accesso HTTPS senza avvisi di certificato, mixed content o errori di rete. Annotare browser e tipo di accesso, senza IP personali. Il curl locale con CA e risoluzione a 127.0.0.1 non chiude questo caso. | + +Per V4 preparare e rendere verificabile il probe prima di eseguirlo: deve agire +solo sulla risorsa di prova concordata e controllare l’assenza di mutazioni nel +caso negato. In assenza di credenziali utilizzabili localmente, lasciare il caso +non eseguito; non estrarre sessioni di altri utenti o cambiare le regole Origin. +I comandi e gli endpoint concreti vanno derivati dalla versione effettivamente +installata, non inventati a partire da questo elenco. + +## Registrazione e criterio di chiusura + +Aggiornare questa tabella dopo ogni prova, collegando evidenze redatte o una +conferma esplicita dell’operatore. Un caso parziale resta aperto per i profili o +scenari mancanti. In caso di difetto, annotare riproduzione, atteso/ottenuto e +revisione; correggere e riprovare il caso interessato prima di dichiararlo superato. + +| Caso | Stato iniziale | Data / versione / evidenza | +| --- | --- | --- | +| V1 | Non eseguito | — | +| V2 | Non eseguito | — | +| V3 | Non eseguito | — | +| V4 | Non eseguito | — | +| V5 | Non eseguito | — | +| V6 | Non eseguito | — | +| V7 | Non eseguito | — | + +**Chiusura delle verifiche residue:** ogni caso V1–V7 ha esito e prova registrati; +per dichiarare la matrice estesa superata devono essere tutti verdi. Un rinvio +esplicito o un prerequisito mancante va riportato come tale, non come successo. +Aggiornare quindi report di rilascio, questo handoff e PROJECT_STATE.md. + +L’aggiornamento applicativo e il collaudo funzionale già confermati restano conclusi; +questo follow-up non richiede di reinstallare né di ripetere il rilascio.