19 KiB
Metadata Catalog di ThothII: ricognizione ThothAI e percorso incrementale
Data: 2026-08-26 Stato: ricognizione completata; step 1 implementato; scelte tecnologiche degli step successivi deliberatamente rinviate.
Obiettivo
ThothII deve introdurre un contesto amministrativo separato, il Metadata Catalog, per gestire
il database associato a ciascun workspace, la sua struttura fisica introspezionata e i metadati
semantici oggi rappresentati da schema/annotations.yaml.
Il programma procede per step indipendenti. Il primo step aggiunge soltanto l'accesso dalla sidebar destra a una superficie centrale vuota. Non introduce PostgreSQL, API CRUD, introspezione o integrazioni con il workflow core.
Questa analisi usa come riferimento il working tree legacy osservato in
Thoth/ThothAI. Non è stato verificato che quel contenuto corrisponda a una release o a un tag
canonico; i percorsi e i comportamenti descrivono il sorgente disponibile il 2026-08-26.
Decisioni già confermate
- Ogni workspace è associato a un solo Workspace Database e ogni Workspace Database appartiene a un solo workspace.
- Il CRUD non crea né rinomina workspace. Identità e lista ordinata dei workspace restano
autorevoli in
thoth-workspaces.yaml; il catalogo conserva il loro identificatore stabile. - La struttura fisica viene acquisita interrogando il database esterno tramite i dati di connessione registrati per il Workspace Database.
- I contenuti semantici equivalenti a
annotations.yamlvengono generati con l'AI e conservati nel PostgreSQL interno. - Per PSD è prevista l'importazione delle annotations esistenti. Gli altri database partiranno dalla struttura introspezionata e genereranno i metadati semantici da zero.
annotations.yamlsarà sostituito anche come input del core in uno step futuro. Il repository è in fase di test e non è richiesta la conservazione delle sessioni esistenti durante il cutover.- La gestione catalogo resta una superficie separata dal processo NL→SQL. La futura integrazione deve essere esplicita e non deve modificare fasi, gate o semantica del workflow.
- Il link iniziale è visibile agli utenti con
workspace.manage, usa stato React locale e non introduce un router. - La pagina iniziale è vuota, segue il tema, nasconde l'intera colonna core e non interrompe una sessione live. Le azioni di apertura, resume o creazione sessione riportano al core.
Correzione del modello mentale corrente
schema/annotations.yaml non contiene l'intero schema del database.
physical.yamlè un artefatto derivato dall'introspezione. Contiene database, schema, timestamp, tabelle, colonne, tipi, nullability, default, primary key, commenti sorgente, esempi, foreign key fisiche e indici.annotations.yamlcontiene metadati curati: descrizioni e concetti delle tabelle; descrizioni, sinonimi, concetti, evidence, note e overrideeligibledelle colonne; foreign key logiche.- Il rendering M-Schema fonde questi due input. Le annotations prevalgono sui commenti sorgente e le relazioni logiche vengono unite alle foreign key fisiche.
La sostituzione del solo file annotations non elimina automaticamente l'introspezione fisica. Il nuovo catalogo dovrà conservare una distinzione esplicita fra fatti osservati nel database e contenuto semantico modificabile.
Architettura ThothII rilevante
Autorità e revisionamento attuali
Il repository dei workspace contiene:
thoth-workspaces.yaml
<workspace-id>/workspace.yaml
<workspace-id>/schema/annotations.yaml
<workspace-id>/evidence/**
Il backend legge descriptor e annotations allo stesso commit Git. Durante l'attivazione valida il blob, lo copia atomicamente nello snapshot immutabile della revisione e registra commit, blob ID e digest. Le nuove sessioni vengono legate a quella revisione; resume e SQL salvato riaprono lo stesso snapshot.
Punti principali:
backend/src/workspaces/schema.ts: descriptor v3 e singolodwh.database/dwh.schema;backend/src/workspaces/git-repository.ts: lettura sicura del blob annotations al commit;backend/src/workspaces/registry.ts: validazione e attivazione atomica;backend/src/workspaces/annotations-sync.ts: materializzazione revision-qualified;backend/src/workspaces/runtime-config-lease.ts: binding dello snapshot al runtime;harness/tht/mschema/models.py: contrattiPhysicalSchemaeAnnotations;harness/tht/mschema/render.py: fusione fisico/semantico;harness/tht/cli/vector_cmd.py: indicizzazione schema in Qdrant.
Consumatori da preservare al cutover futuro
Le annotations incidono oggi su:
- override
eligibleprima del campionamento LSH; - suggerimento, controllo e accettazione delle foreign key logiche;
- descrizioni, concetti e sinonimi dei record schema in Qdrant;
- retrieval delle tabelle e colonne candidate;
- rendering M-Schema usato dal gate F4 e dalla generazione SQL;
- digest della revisione accettata durante il preprocessing.
Il futuro cutover non potrà limitarsi a rimuovere il file: dovrà fornire al core lo stesso contenuto effettivo, con un'identità coerente e test di equivalenza. Poiché non occorre preservare le sessioni di test esistenti, non serve progettare compatibilità con i vecchi manifest, ma resta necessario evitare letture parziali o semanticamente incoerenti.
Inventario ThothAI
Modelli legacy
I modelli sono definiti in Thoth/ThothAI/backend/thoth_core/models.py.
SqlDb
Campi di connessione osservati:
name;db_host,db_port;db_type;db_name,schema;user_name,password;db_mode;- configurazione SSH e Informix opzionale.
Il modello contiene anche scope, JSON dello scope, ERD, direttive, campi GDPR, collegamento a
VectorDb e numerosi campi di stato/task/log per lavori AI asincroni.
I tipi legacy dichiarati sono Informix, MariaDB, MySQL, Oracle, PostgreSQL, SQL Server e SQLite. Questo elenco non costituisce automaticamente un requisito per ThothII: il core corrente supporta PostgreSQL e l'estensione ad altri dialetti dovrà essere decisa separatamente.
SqlTable
name;description;generated_comment;- foreign key obbligatoria a
SqlDb, con cancellazione cascade.
SqlColumn
original_column_namee aliascolumn_name;data_formatnormalizzato;column_description;generated_comment;value_description;- stringhe denormalizzate
pk_fieldefk_field; - foreign key obbligatoria a
SqlTable, con cancellazione cascade.
Relationship
Contiene quattro foreign key obbligatorie:
source_tableesource_column;target_tableetarget_column.
Il form admin verifica che le tabelle appartengano allo stesso database e che ogni colonna appartenga alla tabella selezionata. Il database non impone però gli stessi check.
Workspace
ThothAI usa Workspace.sql_db come foreign key nullable verso SqlDb: un workspace seleziona un
solo DB, mentre lo stesso DB può essere riusato da più workspace. ThothII adotterà invece una
relazione uno-a-uno: workspace_id deve essere unico nel catalogo.
Lacune dei constraint legacy
Non risultano constraint database-level per:
- unicità del nome database nel workspace;
- unicità
(database, table name); - unicità
(table, column name); - unicità degli estremi di una relationship;
- appartenenza degli estremi della relationship allo stesso database;
- corrispondenza fra colonna e tabella dichiarata.
ThothII deve applicare queste invarianti sia nel database interno sia nel servizio applicativo. La sola validazione del form non è sufficiente perché API, import e job la possono aggirare.
Django Admin e UX da replicare concettualmente
ThothAI espone il CRUD tramite il Django Admin standard, registrato da
backend/thoth_core/admin.py e pubblicato su /admin/.
Capacità utili:
- lista database con ricerca per nome, host, tipo, database e schema;
- fieldset separati per identità, connessione, autenticazione, SSH e stato;
- lista tabelle filtrabile per database;
- lista colonne filtrabile in cascata per database e tabella;
- lista relazioni con estremi leggibili e filtri per database e tabelle;
- form relazione con dropdown dipendenti database → tabella → colonna;
- validazione degli estremi prima del salvataggio;
- azioni separate per test connessione, introspezione, import/export e generazione AI;
- azioni bulk sulle righe selezionate.
ThothII deve replicare i contratti di interazione e validazione, non il rendering server-side o i template Django.
Introspezione legacy
Thoth/ThothAI/backend/thoth_core/dbmanagement.py usa thoth-dbmanager per:
- costruire l'adapter del dialetto;
- acquisire tabelle;
- acquisire e normalizzare colonne e tipi;
- acquisire relazioni;
- creare le eventuali colonne mancanti necessarie alle relazioni;
- aggiornare i campi PK/FK denormalizzati.
Il comportamento è principalmente additivo: usa get_or_create o controlli exists, aggiorna
alcuni commenti, ma non riconcilia in modo completo rename, rimozioni o drift. Non va copiato così
com'è. Il futuro processo ThothII dovrà almeno distinguere scansione, differenze osservate e
applicazione della nuova snapshot.
Generazione AI legacy
ThothAI dispone di azioni e workflow per:
- commenti delle tabelle;
- commenti delle colonne;
- scope del database;
- ERD Mermaid;
- documentazione del database;
- analisi GDPR.
Per il requisito attuale sono direttamente rilevanti descrizioni di tabelle e colonne, scope e metadati semantici. ERD, documentazione aggregata e GDPR sono estensioni future, non prerequisiti del CRUD iniziale.
La separazione description/generated_comment del legacy non offre versioning o approvazione
robusti. Nei passi successivi andrà deciso se l'output AI è una proposta revisionabile o diventa
immediatamente il valore editabile corrente.
Import ed export legacy
ThothAI offre:
- CSV di database, tabelle, colonne e relazioni;
- export di struttura per workspace;
- import mediante
import_db_structure; - script SQL dei commenti per più dialetti;
- aggiornamento delle descrizioni colonna da CSV.
Il futuro import PSD dovrà leggere il contratto YAML corrente e convertirlo su chiavi naturali, non riutilizzare gli ID numerici Django. Deve essere idempotente e produrre un report di elementi creati, aggiornati, ignorati o non risolti.
Comandi osservati in ThothAI
Backend locale
Eseguiti da Thoth/ThothAI/backend:
uv sync
uv run python manage.py migrate
uv run python manage.py createsuperuser
uv run python manage.py runserver 8200
uv run pytest
Import catalogo legacy:
uv run python manage.py import_db_structure --source local
uv run python manage.py load_defaults --only-level 4 --source local
Test mirati rilevanti:
uv run pytest tests/test_relational_database_operations.py -v
uv run pytest tests/test_ssh_tunnel_configuration.py -v
Stack Docker legacy
ThothAI dichiara postgres:16-alpine nel profilo internal-db, con volume persistente e
healthcheck pg_isready.
docker compose --profile internal-db up --build
Il wrapper legacy abilita lo stesso profilo quando POSTGRES_INTERNAL=true:
POSTGRES_INTERNAL=true ./docker-up.sh
Questi comandi documentano il riferimento osservato; non sono comandi di installazione per ThothII.
Cosa copiare in ThothII
Parità necessaria
- gerarchia Workspace Database → Table → Column;
- relazione strutturale fra colonne sorgente e destinazione;
- navigazione e filtri dipendenti workspace/database/tabella;
- test di connessione separato dal salvataggio;
- introspezione esplicita e ripetibile;
- descrizioni generate dall'AI ma modificabili dall'utente;
- validazione cross-entity delle relazioni;
- azioni di import/export senza segreti;
- stato leggibile dei job lunghi;
- PostgreSQL interno persistente con migrazioni esplicite;
- test di CRUD, cardinalità, cascade/restrict, isolamento per workspace e idempotenza.
Parità semantica con annotations.yaml
Il modello futuro deve poter rappresentare almeno:
- descrizione, concetti e note per tabella;
- descrizione, sinonimi, concetti, evidence, note ed
eligibleper colonna; - foreign key logiche;
- distinzione fra commento fisico osservato e descrizione curata;
- provenienza del contenuto importato o generato.
L'eventuale esclusione di uno di questi campi deve essere una decisione esplicita perché cambia rendering, retrieval, LSH o SQL generation.
Vincoli minimi da progettare
workspace_idunico sul Workspace Database;- nome tabella unico nel database e schema appropriato;
- nome colonna unico nella tabella;
- relationship unica secondo il modello, anche per chiavi composite;
- estremi della relationship nello stesso Workspace Database;
- appartenenza certa della colonna alla tabella;
- mutazioni aggregate transazionali;
- gestione esplicita di concorrenza fra CRUD e introspezione.
Cosa non copiare
- Django, Django Admin, Django ORM, DRF, template admin e frontend Next;
- modello Workspace legacy e condivisione dello stesso DB fra più workspace;
- password o passphrase come normali campi testuali;
- password incluse in CSV o export completi;
- token SSO inseriti nella query string;
- migrazioni generate automaticamente all'avvio;
- validazioni presenti soltanto nel form;
pk_fieldefk_fieldtestuali come fonte di verità;- duplicazione di tabella e colonna negli estremi senza constraint coerenti;
- introspezione additiva che non segnala rename, delete o drift;
- azioni admin che possono mostrare successo dopo output AI non valido;
- dipendenza del workflow core dalla disponibilità della UI o del PostgreSQL amministrativo.
Aspetti di sicurezza da non ereditare
L'export legacy della struttura include username e password in chiaro. Il modello conserva inoltre
password, passphrase SSH e altri segreti in CharField; non è stata trovata cifratura applicativa,
nonostante un testo admin affermi il contrario.
Per ThothII resta da decidere nello step infrastrutturale quali dati di connessione siano normali metadati e quali siano secret reference. In ogni caso:
- nessun endpoint o export deve restituire segreti;
- log ed errori devono sanificare DSN e credenziali;
- le credenziali di migrazione non devono essere disponibili al runtime CRUD;
- il catalogo non deve riusare credenziali del DWH, delle sessioni o di Qdrant;
- test connessione e introspezione devono usare timeout e privilegi read-only.
Percorso incrementale
Step 1: accesso alla superficie vuota
Implementato in questo worktree:
- pulsante
Database managementnella sidebar destra; - visibilità legata a
workspace.manage; - superficie centrale React separata e vuota;
- nessun router, endpoint, fetch o stato catalogo;
- sessione e SSE conservati in background;
- ritorno al core tramite creazione, apertura o resume di una sessione;
- test frontend dedicati.
Comandi di verifica:
cd frontend
npx vitest run src/shell/AppShell.database-management.test.tsx
npx vitest run src/shell/AppShell.new-session.test.tsx \
src/shell/AppShell.session-target.test.tsx \
src/shell/AppShell.session-mgmt.test.tsx
npx tsc -b
Step 2: contratto di dominio e schema relazionale
Da progettare con un nuovo round decisionale: campi, secret reference, dialetti supportati, namespace/schema, snapshot fisiche, relazioni fisiche/logiche e lifecycle dell'output AI. Nessuna tecnologia ORM o migration tool è stata scelta in questo documento.
Step 3: PostgreSQL interno e migrazioni
Da progettare separatamente dal core: servizio, volume, ruoli runtime/migrator/backup, health e
readiness dedicati, backup/restore e diagnostica. La sua indisponibilità non dovrà cambiare
core /health o interrompere una sessione.
Step 4: API CRUD
Contratti HTTP, autorizzazione, paginazione, filtri, errori, optimistic concurrency e transazioni. Gli endpoint dovranno vivere sotto un namespace catalogo e non riutilizzare le route sessione.
Step 5: UI CRUD
Liste e form per Workspace Database, tabelle, colonne e relazioni, costruiti con React/Vite e il design system ThothII. La gerarchia e i filtri ThothAI sono il riferimento funzionale; Django Admin non è il riferimento tecnologico o visuale.
Step 6: introspezione
Connessione read-only, preview delle differenze, acquisizione di una Physical Schema Snapshot, policy per rename/rimozioni e stato del job. Nessuna chiamata lunga dovrà mantenere aperta una transazione CRUD.
Step 7: generazione AI dei metadati
Generazione di descrizioni e altri campi equivalenti alle annotations, editing umano e gestione esplicita di errori o output non validi. Approvazione/versioning saranno decisi in questo step.
Step 8: migrazione PSD
Import idempotente delle annotations PSD, riconciliazione contro la struttura introspezionata, report degli orfani e confronto semantico con il rendering corrente. Gli altri workspace non ricevono import legacy.
Step 9: sostituzione dell'input core
Rimuovere la dipendenza da annotations.yaml soltanto dopo avere un contratto equivalente,
test di rendering/search/Qdrant e una policy di disponibilità. Le sessioni di test esistenti
possono essere eliminate, ma le nuove sessioni non devono osservare aggiornamenti parziali.
Step 10: operazioni e accettazione
Backup/restore reale, diagnostica, metriche, audit, permessi definitivi, hardening degli export e test di failure isolation fra catalogo e workflow.
Verifiche del core da conservare per il cutover
Comandi attuali rilevanti:
tht --installation <absolute>/thothii-installation.yaml workspace preprocess dwh \
--workspace <id> --json
tht --installation <absolute>/thothii-installation.yaml workspace schema suggest-fks \
--workspace <id> --json
tht --installation <absolute>/thothii-installation.yaml workspace schema check \
--workspace <id> --json
tht --installation <absolute>/thothii-installation.yaml workspace schema accept \
--workspace <id> --run <run-id> --yes --json
tht --installation <absolute>/thothii-installation.yaml workspace index-schema \
--workspace <id> --json
Suite che documentano il comportamento da preservare:
cd backend
npx vitest run test/workspaces-git-annotations.test.ts \
test/registry-annotations.test.ts \
test/annotations-sync.test.ts \
test/workspace-runtime-config-lease.test.ts \
test/workspace-preprocessing-service.test.ts
npx tsc --noEmit -p .
cd ../harness
.venv/bin/pytest -q \
tests/test_annotations_root.py \
tests/test_schema_fk_annotations.py \
tests/test_mschema_render.py \
tests/test_qdrant_cli_commands.py
Questi test non implicano che la futura implementazione debba continuare a usare file YAML. Definiscono gli effetti semantici e le guardie da mantenere o sostituire consapevolmente.
Decisioni rinviate
Le seguenti scelte non appartengono allo step 1:
- framework del servizio catalogo e libreria di accesso PostgreSQL;
- collocazione e protezione delle credenziali dei Workspace Database;
- supporto iniziale di dialetti diversi da PostgreSQL;
- uno o più schema namespace per database;
- policy di reconciliation per rename e delete;
- modello delle foreign key composite;
- distinzione persistente fra relationship fisiche e logiche;
- lifecycle draft/review/approval dell'output AI;
- versionamento, audit e rollback;
- formato e momento del cutover dal file al database interno;
- permission definitiva separata da
workspace.manage.
Ognuna sarà affrontata nel relativo step, senza anticipare scelte tecnologiche nel presente documento.