docs: record server release and hand off remaining acceptance checks
Publish documentation / publish (push) Successful in 32s

This commit is contained in:
User
2026-09-27 00:41:37 +02:00
parent 497ab84031
commit 2f53512e4d
7 changed files with 1119 additions and 1 deletions
+7 -1
View File
@@ -1,6 +1,6 @@
# Project state # 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. and invariants are in [AGENTS.md](AGENTS.md); prior snapshots remain in Git.
## Current contracts ## Current contracts
@@ -56,6 +56,12 @@ embedded/upstream identity, not another ThothII OIDC login. Read
Last recorded application deliveries (not a fresh runtime attestation): 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): - [Session dialogs](docs/reports/2026-09-14-session-dialogs-release.md):
`b1723c34-session-dialogs-20260914`, frontend-only. `b1723c34-session-dialogs-20260914`, frontend-only.
- [Session layout/Memory fix](docs/reports/2026-09-14-session-layout-memory-fix.md): - [Session layout/Memory fix](docs/reports/2026-09-14-session-layout-memory-fix.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.
@@ -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.
@@ -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.
@@ -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).
@@ -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.
@@ -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.