Merge remote-tracking branch 'origin/main'
# Conflicts: # mkdocs.yml
This commit is contained in:
@@ -0,0 +1,492 @@
|
||||
# Progetto: Evidence management
|
||||
|
||||
Data: 2026-09-08. Stato: archivio locale Markdown, editor esterni e consolidamento
|
||||
manuale con commit/push dell'operatore accettati per la release 0;
|
||||
restanti semplificazioni confermate, con chiarimenti su impatto core e controllo Git;
|
||||
E1, E2, E3 e il collegamento ai gate X1 implementati il 2026-09-09.
|
||||
Il contratto X1 è in [Session corrections](../contracts/archive-repair.md). Risultati e limiti in
|
||||
[E1 — validazione](2026-09-09-evidence-e1-validation.md) e
|
||||
[E2 — validazione](2026-09-09-evidence-e2-validation.md) e
|
||||
[E3 — validazione](2026-09-09-evidence-e3-validation.md).
|
||||
|
||||
La [revisione di semplicità](2026-09-08-memory-evidence-simplification-review.md)
|
||||
registra il riesame di Q1–Q15. Il flusso principale è draft scritta dallo specialista
|
||||
indipendentemente dall'installazione, raffinamento da parte del sistema e
|
||||
conservazione locale per uso e manutenzione. La proposta tecnica aggiornata
|
||||
distingue le fonti esterne dall'archivio canonico locale, evita PostgreSQL per le
|
||||
Evidence e toglie commit/push dal normale CRUD. La contemporaneità con attività core
|
||||
durante l'amministrazione non è più un requisito da supportare.
|
||||
|
||||
Il progetto rende consultabili le Evidence dall'applicazione e modificabili nei
|
||||
file locali tramite l'editor scelto dall'operatore.
|
||||
Segue le [decisioni comuni di Administration](2026-09-08-memory-evidence-administration.md)
|
||||
ed è consegnabile separatamente da [Memory management](2026-09-08-memory-management.md).
|
||||
|
||||
## Risultato richiesto
|
||||
|
||||
Un amministratore apre Evidence management direttamente da Administration, cerca e
|
||||
filtra le Evidence registrate, consulta il documento completo e trova il percorso
|
||||
del file Markdown da modificare con un editor esterno. La voce segue Memory management e si trova allo stesso
|
||||
livello di Database management, senza appartenere alle sue funzionalità.
|
||||
|
||||
La consultazione è indipendente da una sessione e dalla disponibilità dell'indice
|
||||
semantico. Mostra le Evidence Unit complete, senza limitarsi ai frammenti o ai
|
||||
risultati più simili restituiti dal recall.
|
||||
|
||||
## Accesso e modifica nella release 0
|
||||
|
||||
Il proprietario richiede file facilmente raggiungibili e modificabili anche da uno
|
||||
specialista non tecnico, con Markdown come formato di lavoro e senza JSONL per la
|
||||
gestione delle Evidence. Ha scelto editor esterni per la release 0: l'editor
|
||||
preferito sul Mac o PC, oppure vim, nano o equivalenti sul server. Questa scelta
|
||||
sostituisce la proposta di editor e form di contenuto dentro Evidence management.
|
||||
Non si integra un prodotto di editing né si costruisce un editor applicativo.
|
||||
|
||||
Evidence management mantiene elenco, ricerca, filtri e dettaglio. Mostra il percorso
|
||||
assoluto della cartella del workspace e di ciascun file, con possibilità di copiarlo,
|
||||
risolto dalla configurazione effettiva dell'installazione. Indica su quale host si
|
||||
trova: per Docker occorre il percorso persistente accessibile sull'host, non soltanto
|
||||
quello interno al container. Le istruzioni distinguono draft originali e file delle
|
||||
Evidence raffinate da manutenere; includono un esempio Markdown per crearne una.
|
||||
|
||||
Chi lavora sul server modifica direttamente i file; chi lavora su una copia sul
|
||||
Mac o PC la riporta nello stesso archivio con i propri strumenti. Non è richiesto
|
||||
costruire upload/download nell'applicazione o predisporre una cartella condivisa.
|
||||
Un percorso sul server non viene presentato come un file apribile dal browser locale.
|
||||
|
||||
Dopo aver salvato, aggiunto o rimosso i file, l'operatore controlla lo stato Git,
|
||||
esegue il consolidamento ed esegue commit e push; il normale diff Git è disponibile
|
||||
per approfondire le modifiche. La pagina mostra
|
||||
le istruzioni e i comandi con i percorsi effettivi. La richiesta più recente
|
||||
sostituisce la proposta intermedia del pulsante `Apply file changes`: non sono
|
||||
necessari un pulsante di esecuzione, watcher o operazioni Git automatiche.
|
||||
Il semplice salvataggio nell'editor, o di una copia fuori dall'archivio, non aggiorna
|
||||
il recall. Il consolidamento e il seguito Git sono descritti sotto.
|
||||
|
||||
Il Markdown canonico attuale non è già un formato di editing libero: il parser
|
||||
controlla marker e corrispondenza fra testo canonico e presentazione. Per le regole
|
||||
di dominio il testo codificato viene letto prima di verificare il rendering; cambiare
|
||||
la sola frase visibile può produrre un errore di canonicalità. E1 deve quindi rendere
|
||||
il Markdown locale realmente editabile: il testo leggibile è autorevole, i campi
|
||||
richiesti sono documentati e i metadati derivati sono aggiornati dal sistema.
|
||||
Non si chiede all'operatore di correggere marker, hash o una copia codificata del
|
||||
testo. Non si introduce un secondo archivio di scambio da sincronizzare.
|
||||
|
||||
## Funzioni
|
||||
|
||||
- Elenco paginato e ordinabile; ricerca per testo, titolo e identificatore stabile.
|
||||
- Filtri combinabili per workspace, kind, purpose, concetti, tabelle/colonne,
|
||||
Source Evidence, Review item e stato di pubblicazione.
|
||||
- Dettaglio leggibile della card: contenuto tipizzato, ambito di applicazione,
|
||||
Supporting excerpt, provenienza e accesso alla Source Evidence disponibile.
|
||||
- Creazione e modifica tramite file Markdown ed editor esterno, con esempio dei
|
||||
campi richiesti per kind. In assenza di documento esterno, l'applicazione registra
|
||||
una dichiarazione manuale come fonte quando acquisisce la modifica.
|
||||
- Risoluzione dei Review item e gestione delle unità orfane o da ritirare.
|
||||
- Cancellazione tramite rimozione del file, riconosciuta dal consolidamento
|
||||
nell'archivio locale verificato come accessibile; un errore di lettura non prova
|
||||
una cancellazione. La rimozione dal corpus e dall'indice è persistente.
|
||||
- Un comando manuale di consolidamento per acquisire e validare le modifiche locali
|
||||
e renderle disponibili al core, con esito esplicito e possibilità di riesecuzione.
|
||||
- Istruzioni per controllo del diff, commit e push dei file Evidence e dei relativi
|
||||
metadati necessari, eseguiti dall'operatore nel repository indicato.
|
||||
|
||||
Il servizio acquisisce il Markdown editabile e aggiorna la rappresentazione
|
||||
tipizzata e i metadati derivati, preservando gli identificatori delle unità esistenti.
|
||||
La cancellazione di una Evidence Unit non elimina automaticamente la sua Source
|
||||
Evidence o altre unità derivate dalla stessa fonte.
|
||||
|
||||
## Salvataggio — Q12 semplificata
|
||||
|
||||
Il proprietario rifiuta la separazione ordinaria fra salvataggio della bozza e
|
||||
pubblicazione: le modifiche durante una sessione sono considerate rare e non
|
||||
giustificano un workflow editoriale separato. La scelta successiva dell'editor esterno
|
||||
sostituisce il `Save` della form con il salvataggio del file e un comando manuale
|
||||
di consolidamento. Questo acquisisce, valida e attiva insieme aggiunte, modifiche e
|
||||
cancellazioni, senza un successivo `Publish` o un secondo revisore. Commit e push
|
||||
sono il seguito manuale per versionare e trasferire il lavoro nel repository.
|
||||
L'operatore autorizza l'attivazione con il consolidamento. Le correzioni approvate nei
|
||||
gate chiamano direttamente lo stesso servizio e non richiedono un editor esterno.
|
||||
|
||||
L'ultimo chiarimento del proprietario sostituisce il requisito iniziale di aggiornare
|
||||
le sessioni aperte mentre un amministratore modifica le Evidence. Si assume che il
|
||||
core sia fermo o si ignora la contemporaneità: non servono aggiornamenti a caldo,
|
||||
notifiche, ricalcoli, attese delle sessioni o una modalità manutenzione dedicata.
|
||||
Il risultato di una modifica completata è usato nelle successive elaborazioni.
|
||||
|
||||
Restano le correzioni deliberate dalla sessione stessa secondo Q4: chiamano lo
|
||||
stesso servizio, attendono l'esito e permettono alla sessione di usare la correzione
|
||||
approvata. Il collegamento fra configurazione della ricerca e contenuto locale
|
||||
deve quindi funzionare senza richiedere un nuovo commit della fonte per ogni modifica;
|
||||
non richiede un sistema generale di aggiornamento delle altre sessioni.
|
||||
|
||||
Nel seguito, salvataggio applicativo indica questa acquisizione delle modifiche o
|
||||
la scrittura deliberata dal core. Il feedback ordinario è operazione in corso,
|
||||
completata oppure errore. Un successo
|
||||
completo significa che il contenuto è disponibile al core; se la persistenza riesce
|
||||
ma l'aggiornamento del corpus o dell'indice fallisce, l'esito deve dirlo e indicare
|
||||
come rieseguire il comando. Un errore tecnico non diventa una bozza che attende una nuova decisione
|
||||
editoriale di pubblicazione. Dopo un errore o un riavvio, un corpus parziale non
|
||||
deve essere dichiarato pronto per la successiva elaborazione.
|
||||
|
||||
Le decisioni Q11–Q15 e il successivo chiarimento sui vincoli sono registrati
|
||||
nell'[ADR 0019](../adr/0019-author-evidence-in-app-with-automatic-activation.md).
|
||||
|
||||
## Consolidamento manuale e seguito Git — release 0 {#consolidamento-manuale-e-seguito-git--release-0}
|
||||
|
||||
Il proprietario richiede un flusso KISS affidato alla disciplina dell'operatore.
|
||||
Il comando proposto è `tht evidence consolidate <workspace-root>` nel harness:
|
||||
è da implementare, non è un comando già disponibile. Riutilizza parser, validazione
|
||||
e indicizzazione esistenti, adattati al Markdown editabile. La documentazione
|
||||
operativa e la pagina mostreranno l'invocazione effettiva per l'installazione,
|
||||
compreso l'accesso al core se il comando gira in Docker.
|
||||
|
||||
Il consolidamento svolge in sequenza questi passaggi:
|
||||
|
||||
1. Legge l'archivio locale e confronta aggiunte, modifiche e rimozioni con l'ultimo
|
||||
contenuto consolidato. Se l'archivio non è accessibile, si ferma: non interpreta
|
||||
il problema come cancellazione delle Evidence.
|
||||
2. Verifica struttura e sezioni previste per kind, campi obbligatori, identificatori
|
||||
univoci, tipi, riferimenti e provenienza coerenti. Segnala file, campo o sezione,
|
||||
problema e correzione richiesta. Non valuta automaticamente la verità del contenuto
|
||||
e non riscrive il significato delle regole con un nuovo raffinamento del modello.
|
||||
3. Se ci sono errori, termina con esito non riuscito prima dell'attivazione; lascia
|
||||
all'operatore i file da correggere e il comando da rieseguire. Se i controlli
|
||||
passano, aggiorna metadati derivati e manifest, inclusa la protezione delle
|
||||
correzioni e delle cancellazioni, poi prepara e verifica il candidato completo
|
||||
prima di renderlo attivo nel corpus e nell'indice Evidence locale.
|
||||
4. Riporta un riepilogo testuale breve di file aggiunti, modificati e cancellati,
|
||||
l'esito locale, gli eventuali errori di indicizzazione e i file primari
|
||||
da includere nel commit. Dopo un errore tecnico si riesegue lo stesso comando,
|
||||
senza duplicare unità o perdere il contenuto modificato. Non dichiara pronto un
|
||||
aggiornamento incompleto e non avvia commit, push, pull o merge.
|
||||
|
||||
Il core legge soltanto il contenuto consolidato attivo, mai direttamente i file in
|
||||
corso di modifica. Una modifica salvata ma non consolidata, o un tentativo fallito,
|
||||
non deve mescolare testo nuovo e vecchi risultati di ricerca. Si conserva l'ultimo
|
||||
corpus valido; se un errore tecnico non permette di garantirne l'integrità, si
|
||||
segnala l'indisponibilità invece di usare uno stato parziale. Si riusa il percorso
|
||||
esistente di preparazione del candidato e attivazione, senza creare un secondo
|
||||
archivio autorevole o un sistema di coordinamento delle sessioni.
|
||||
|
||||
L'archivio mantenuto è una working tree persistente, versionabile nel repository
|
||||
che contiene quelle Evidence; può riusare il repository del workspace. Draft e
|
||||
unità curate restano contenuti distinti anche se ospitati nello stesso repository.
|
||||
Non si modifica una materializzazione temporanea o uno snapshot runtime ricreato
|
||||
dal preprocessing. Setup e pagina indicano working tree, cartella delle Evidence,
|
||||
branch e remoto configurati; non si creano automaticamente repository o remoti.
|
||||
|
||||
Il seguito manuale, documentato come sequenza da eseguire nel repository corretto, è:
|
||||
|
||||
```text
|
||||
git -C <repository-root> status --short
|
||||
tht evidence consolidate <workspace-root> # comando previsto, da implementare
|
||||
git -C <repository-root> add -- <file-evidence-e-metadati-indicati>
|
||||
git -C <repository-root> commit -m "Update Evidence"
|
||||
git -C <repository-root> push
|
||||
```
|
||||
|
||||
Il controllo umano usa i normali comandi Git nel terminale. `git status --short`
|
||||
mostra quali file sono cambiati; `git diff HEAD` permette, quando serve, di vedere
|
||||
le righe cambiate prima del consolidamento. `git diff --cached` è disponibile per
|
||||
controllare ciò che si sta per committare. Non sono richiesti un visualizzatore
|
||||
nell'applicazione, uno strumento grafico, due revisioni obbligatorie o un nuovo gate.
|
||||
I controlli strutturali del consolidamento vengono invece sempre eseguiti.
|
||||
|
||||
Si includono aggiunte, modifiche e cancellazioni dei dati primari necessari alla
|
||||
ricostruzione, compresi manifest e informazioni di cura manuale quando cambiano.
|
||||
Indici, cache, sessioni e segreti non fanno parte del commit Evidence. L'operatore
|
||||
controlla aggiunte, modifiche e cancellazioni prima di consolidare; i file nuovi
|
||||
segnalati da status vanno letti, perché non compaiono ancora nel diff dei file
|
||||
tracciati. L'output del consolidamento indica anche i metadati generati da includere
|
||||
nel commit. Errori Git, credenziali, branch senza upstream e conflitti vengono
|
||||
risolti con i normali strumenti Git, senza retry o risoluzioni automatiche.
|
||||
|
||||
L'ordine ha una conseguenza esplicita: un consolidamento riuscito aggiorna il core
|
||||
locale prima di commit e push. Se il push manca o fallisce, la modifica rimane locale
|
||||
e non è ancora trasferita al remoto; l'operatore completa il seguito Git. Un push
|
||||
riuscito, da solo, non aggiorna altre installazioni. Nessun processo sorveglia i file
|
||||
o impone che l'operatore abbia completato la sequenza prima di riprendere il lavoro.
|
||||
|
||||
## Persistenza e contratto da evolvere
|
||||
|
||||
Il proprietario ha approvato la risoluzione persistente dei conflitti fra Memory ed
|
||||
Evidence nel round Q4 della discussione Memory. Quando la decisione richiede correggere
|
||||
un'Evidence, il core prepara una proposta che identifica l'unità e mostra il testo
|
||||
o l'ambito risultante. La correzione passa attraverso l'authoring e la pubblicazione
|
||||
di questo modulo, con le relative autorizzazioni e validazioni. L'accettazione della
|
||||
correzione da parte di un utente autorizzato avvia lo stesso salvataggio con attivazione
|
||||
automatica. L'interfaccia distingue una proposta da approvare, un aggiornamento in
|
||||
corso o fallito e una correzione già attiva; non basta risolvere soltanto
|
||||
la domanda corrente. È sempre possibile dichiarare inadeguate le opzioni proposte.
|
||||
|
||||
Oggi il [lifecycle Evidence](../evidence.md) attribuisce l'authoring al repository
|
||||
del workspace: ThothII non lo modifica, non crea commit e non esegue push.
|
||||
Il [contratto Workspace Evidence v3](../contracts/workspace-evidence-v3.md) lega la
|
||||
pubblicazione a una revisione coerente del workspace. La manutenzione dei file locali
|
||||
richiede un'evoluzione esplicita di questo percorso e del formato editabile.
|
||||
|
||||
**Q11, riesaminata e accettata per l'archivio locale:** la draft dello specialista deve restare producibile e
|
||||
consegnabile senza accesso al PostgreSQL o alla stessa installazione. La
|
||||
scelta aggiornata conserva le fonti in file/repository esterni e le
|
||||
Evidence raffinate in un archivio locale persistente su file Markdown, gestito dal sistema.
|
||||
Il CRUD modifica tale archivio e aggiorna l'indice senza commit/push verso le fonti.
|
||||
L'alternativa di rendere PostgreSQL autorevole anche per Evidence, suggerita nella
|
||||
prima parte della revisione, è ritirata. PostgreSQL rimane l'archivio delle Memory.
|
||||
|
||||
I file locali curati sono dati primari: sopravvivono a Clear e reindicizzazione e
|
||||
devono essere inclusi nelle copie di sicurezza dell'installazione. Una loro modifica
|
||||
non aggiorna automaticamente i documenti dello specialista o altre installazioni;
|
||||
un eventuale trasferimento dei file resta esplicito, senza sincronizzazione bidirezionale.
|
||||
|
||||
Il comportamento deve coprire le origini supportate dal prodotto: filesystem/Git,
|
||||
HTTP e S3. Nella proposta riveduta sono origini di acquisizione delle fonti e dei
|
||||
contenuti già disponibili. Servono importazione e provenienza coerenti; le unità
|
||||
raffinate e le modifiche manuali vengono conservate nell'archivio locale.
|
||||
La gestione delle Evidence non richiede di aggiungere scritture sui server HTTP o S3
|
||||
di origine. Non si può dichiarare completato il CRUD lasciando queste unità in sola
|
||||
lettura senza un percorso di importazione utilizzabile.
|
||||
|
||||
Il descriptor `evidence.source` indica oggi l'origine acquisita dal preprocessing:
|
||||
non è già un importatore di documenti nel repository di authoring. Inoltre il
|
||||
runtime normalizza HTTP/S3 come documenti generici, mentre il parser canonico delle
|
||||
unità tipizzate viene applicato ai file sotto `curated/<kind>/`. La provenienza
|
||||
canonica ammette solo un percorso locale sotto `source/`; URI e fingerprint remoti
|
||||
esistono invece nel corpus acquisito. L'importazione deve collegare questi due
|
||||
livelli senza fingere che il percorso tipizzato sia già uniforme fra i trasporti.
|
||||
|
||||
Modifiche e ritiri devono sopravvivere alla successiva preparazione, sincronizzazione
|
||||
e reindicizzazione. La rigenerazione da una fonte non deve ripristinare silenziosamente
|
||||
una unità cancellata o sovrascrivere la correzione del curatore. La semantica di
|
||||
conflitto fra nuova Source Evidence e cura manuale è approvata in Q13.
|
||||
|
||||
Il runtime attuale non garantisce questa protezione durevole: `evidence prepare`
|
||||
rifiuta modifiche non committate ai file curati e al manifest, ma una fonte cambiata
|
||||
può rigenerare anche unità corrette manualmente e già committate. Il ritiro esplicito
|
||||
rimuove l'unità e i riferimenti nel manifest, senza conservare una soppressione che
|
||||
impedisca a una successiva generazione di riproporla. Questi comportamenti sono
|
||||
verificati in `harness/tht/evidence/authoring.py`; la gestione amministrativa richiede
|
||||
di evolverli, non solo di esporli come comandi dell'editor.
|
||||
|
||||
**Q13, approvata:** se la fonte aggiornata contraddice una correzione
|
||||
manuale, conservare in uso l'Evidence salvata dall'amministratore e mostrare il
|
||||
confronto in Evidence management. Una sostituzione richiede una scelta esplicita,
|
||||
seguita dalla stessa operazione di attivazione. La conseguenza è che la regola manuale può restare
|
||||
attiva anche se la fonte più recente dice altro, finché il conflitto non viene
|
||||
risolto. Il proprietario accetta questa conseguenza. La decisione comprende la
|
||||
permanenza delle cancellazioni e la protezione da sovrascritture silenziose: una
|
||||
nuova preparazione non deve riproporre automaticamente conoscenze eliminate.
|
||||
|
||||
Validazione e pubblicazione sono passaggi interni dell'unica operazione di salvataggio;
|
||||
un errore non dichiara attivo il nuovo contenuto. Il sistema continua a rispettare
|
||||
provenienza e coerenza del contenuto; il salvataggio esplicito dell'amministratore
|
||||
costituisce l'approvazione della modifica manuale. La decisione sullo storico delle
|
||||
Memory non elimina questi requisiti del dominio Evidence.
|
||||
|
||||
## Creazione manuale e aggiornamento delle fonti — Q14 e Q15 approvate
|
||||
|
||||
**Q14, approvata:** consentire di scrivere una
|
||||
Evidence senza dover fornire un documento esterno. In release 0 la si scrive in un
|
||||
nuovo file Markdown nell'archivio indicato, usando l'esempio documentato.
|
||||
Il sistema registra una dichiarazione manuale come fonte gestita e la distingue
|
||||
dall'informazione derivata da documenti. Lo stesso criterio vale per una correzione
|
||||
che cambia il significato del contenuto: la dichiarazione dell'amministratore
|
||||
sostiene il testo corrente, mentre il documento originario resta collegato come
|
||||
origine e per rilevarne gli aggiornamenti. Non deve essere mostrato come prova di
|
||||
una regola che non contiene. Il consolidamento acquisisce anche le nuove unità manuali.
|
||||
|
||||
Oggi la provenienza canonica richiede fonte locale, hash ed estratti: non esiste
|
||||
un'origine manuale esplicita. La validazione verifica integrità e presenza testuale
|
||||
degli estratti, ma non dimostra la verità o il supporto semantico della regola.
|
||||
Attuare Q14 richiede distinguere nel contratto la fonte del testo corrente dal
|
||||
documento originario; non richiede inventare estratti o una validazione semantica
|
||||
automatica presentata come garanzia di correttezza.
|
||||
|
||||
**Q15, approvata:** riacquisire le fonti esterne su richiesta
|
||||
esplicita dell'amministratore, senza controlli periodici o accessi alle fonti a ogni
|
||||
domanda o salvataggio di una card. Fra due aggiornamenti richiesti, il sistema usa
|
||||
quanto già acquisito. Il consolidamento continua ad attivare la modifica locale
|
||||
senza richiedere prima un aggiornamento della fonte remota; eventuali conflitti
|
||||
scoperti alla successiva acquisizione seguono Q13.
|
||||
|
||||
Il proprietario ha approvato entrambe le raccomandazioni il 2026-09-08. Il successivo
|
||||
riesame conserva questi comportamenti e rende esplicita l'autonomia dello specialista
|
||||
che produce le draft. I dettagli tecnici seguenti descrivono la proposta semplificata.
|
||||
|
||||
## Piano esecutivo
|
||||
|
||||
### E1 — Raffinamento e archivio canonico locale
|
||||
|
||||
**Modifica del sottosistema Evidence core.** Rendere editabile il Markdown cambia
|
||||
il contratto che il codice attuale legge e scrive. Questa attività precede la
|
||||
pagina amministrativa: non è una modifica limitata alla presentazione o all'editor.
|
||||
Il nuovo formato conserva contenuti tipizzati, ambito e provenienza richiesti dal
|
||||
core, ma usa il testo visibile come unica rappresentazione autorevole del contenuto
|
||||
umano. Va identificato come una nuova versione del contratto Curated unit, distinta
|
||||
dalla versione del descriptor del workspace.
|
||||
|
||||
L'intervento coordinato comprende:
|
||||
|
||||
- parser, renderer e validazione in `harness/tht/evidence/canonical.py`;
|
||||
- preparazione, scritture e migrazione in `harness/tht/evidence/authoring.py`,
|
||||
con adeguamento delle istruzioni e degli esempi usati nel raffinamento;
|
||||
- acquisizione e normalizzazione in `harness/tht/evidence/corpus/normalize.py`,
|
||||
consolidamento e preprocessing, affinché producano il contenuto tipizzato atteso
|
||||
dall'indicizzazione e dal recall;
|
||||
- correzioni deliberate dal core, provenienza e citazioni, che devono consumare
|
||||
e aggiornare coerentemente la nuova rappresentazione;
|
||||
- contratto documentato e test del percorso completo: modifica del testo visibile,
|
||||
consolidamento, contenuto indicizzato e successivo utilizzo da parte del core.
|
||||
|
||||
Le Evidence esistenti devono essere convertite esplicitamente al nuovo formato
|
||||
e reindicizzate, verificando il mantenimento del contenuto e degli identificatori.
|
||||
La fase di sviluppo permette un passaggio unico; non è richiesto mantenere due
|
||||
formati di authoring concorrenti. Una conversione non rappresentabile fedelmente
|
||||
va segnalata. Si preserva il modello tipizzato interno dove possibile, per contenere
|
||||
la modifica nei componenti che dipendono dal documento senza ridisegnare le fasi
|
||||
del workflow NL→SQL.
|
||||
|
||||
Estendere i contratti in `harness/tht/evidence/` per distinguere fonte corrente,
|
||||
dichiarazione manuale e documento originario. La dichiarazione viene gestita
|
||||
dall'applicazione insieme all'unità locale; chi scrive il Markdown non deve
|
||||
creare un file sorgente separato o gestire hash ed estratti. I campi per kind
|
||||
mantengono la validazione deterministica, senza attribuirle una verifica della
|
||||
verità della regola. Aggiornare il glossario e il contratto canonico con il codice.
|
||||
|
||||
Riutilizzare raffinamento, parser, renderer e validazione esistenti, distinguendo
|
||||
la working tree locale persistente dagli snapshot acquisiti e adattando il formato al testo Markdown
|
||||
editabile come fonte autorevole, senza duplicazione nascosta del contenuto umano.
|
||||
Documentare posizione dei file, campi richiesti e un esempio per la creazione.
|
||||
L'applicazione acquisisce le draft e
|
||||
conserva il risultato in file locali persistenti. Le mutazioni aggiornano contenuto
|
||||
canonico, presentazione Markdown e manifest; le scritture sono serializzate per
|
||||
workspace e controllano la versione corrente del record; una modifica concorrente
|
||||
non viene risolta sovrascrivendo silenziosamente il contenuto altrui.
|
||||
|
||||
Il salvataggio non richiede commit, push o un database condiviso con lo specialista.
|
||||
L'archivio locale è distinto dalla materializzazione runtime ricostruita da Git e
|
||||
dal corpus derivato. Consolidamento e preprocessing acquisiscono i contenuti locali
|
||||
curati; il core consulta soltanto il corpus attivo validato. Clear preserva i file
|
||||
e la ricostruzione dell'indice riparte da essi, senza sovrascriverli
|
||||
con nuove copie delle draft originali.
|
||||
|
||||
La persistenza conserva la cura manuale e le esclusioni necessarie a impedire la
|
||||
ricomparsa delle unità eliminate. La rigenerazione confronta le proposte con tale
|
||||
stato: assegnare un nuovo ID a un contenuto derivato non deve essere un modo per
|
||||
riattivarlo automaticamente aggirando una cancellazione. Le nuove proposte e i
|
||||
conflitti restano distinti dal corpus già approvato e attivo.
|
||||
|
||||
Verificare con archivi locali temporanei draft esterne e raffinamento, creazione
|
||||
manuale, cambiamento di significato
|
||||
con provenienza corretta, round trip del formato canonico, aggiornamento del manifest,
|
||||
cancellazione, conflitto fra scritture e retry. La validazione di un estratto
|
||||
presente nella fonte non viene usata come prova automatica di supporto semantico.
|
||||
|
||||
### E2 — Pagina amministrativa e consolidamento manuale
|
||||
|
||||
Esporre API amministrative per elenco completo, filtri, dettaglio, mutazioni ed
|
||||
esito delle operazioni. Il backend applica autorizzazioni e isolamento, poi chiama
|
||||
il servizio di authoring del harness. Realizzare la pagina autonoma nell'AppShell
|
||||
con provenienza leggibile, percorsi effettivi dei file sull'host e istruzioni per
|
||||
modificarli con editor esterni, consolidarli e completare commit/push manualmente.
|
||||
Il comando di consolidamento acquisisce aggiunte, modifiche e rimozioni locali
|
||||
tramite lo stesso servizio. Nessun editor, form di contenuto o
|
||||
trasferimento file web è richiesto in R0; non serve una sessione del core.
|
||||
|
||||
Evolvere lo stage interno `runEvidenceStage` e il percorso harness
|
||||
`tht preprocess evidence` per attivare il contenuto canonico locale autorizzato.
|
||||
Il salvataggio non avvia una riacquisizione HTTP/S3, una nuova estrazione dalle
|
||||
Source Evidence o una scansione DWH. Il nuovo comando manuale Evidence riusa questo
|
||||
stage interno senza richiedere un preprocessing completo per ogni modifica.
|
||||
|
||||
Preparare e verificare il candidato Evidence prima di attivarlo. L'indicizzazione
|
||||
e la rimozione devono essere circoscritte al workspace e alle generazioni Evidence
|
||||
interessate nella collezione Reference condivisa. Preservare Schema, relazioni,
|
||||
LSH e Memory: il salvataggio non usa Preprocessing Clear e non ricrea l'intera
|
||||
collezione. Se l'attivazione fallisce, mostrare l'esito parziale e rendere ripetibile
|
||||
il completamento della stessa modifica, senza chiedere una nuova approvazione.
|
||||
|
||||
Adeguare la ricerca perché consumi l'archivio locale aggiornato, senza richiedere
|
||||
commit della fonte o cambiare configurazioni estranee. Adeguare il calcolo della
|
||||
readiness: aggiornare Evidence non dichiara risolto un blocco
|
||||
di Schema o Catalog. Dopo un Clear, l'eventuale necessità di preprocessing completo
|
||||
rimane esplicita; il solo consolidamento non ricostruisce tutti i derivati mancanti.
|
||||
|
||||
Verificare che i percorsi mostrati portino ai file effettivi anche su installazioni
|
||||
Docker e che una modifica alla frase visibile sia acquisita senza editing di metadati
|
||||
tecnici. Verificare creazione/modifica/cancellazione con esito disponibile al core, errore
|
||||
di indicizzazione dopo persistenza, retry e isolamento delle altre componenti
|
||||
della collezione. Le successive elaborazioni devono usare il contenuto corrente
|
||||
senza recuperare unità cancellate. Verificare le correzioni deliberate dalla sessione
|
||||
stessa, senza aggiungere prove di CRUD amministrativo concorrente al core. Un
|
||||
problema preesistente di Catalog deve continuare a impedire una falsa readiness.
|
||||
Verificare che errori strutturali impediscano l'attivazione e producano indicazioni
|
||||
correggibili, che il comando sia rieseguibile e che non esegua operazioni Git.
|
||||
Verificare che file modificati senza consolidamento e tentativi falliti non cambino
|
||||
il contenuto usato dal core né combinino versioni differenti di testo e indice.
|
||||
Provare la sequenza documentata di commit/push con repository temporanei e remoto
|
||||
locale, verificando l'inclusione delle cancellazioni e dei metadati necessari.
|
||||
|
||||
### E3 — Importazione, refresh esplicito e conflitti con le fonti
|
||||
|
||||
Fornire un percorso di importazione locale per le origini già supportate,
|
||||
conservando contenuto acquisito e provenienza remota. Uniformare il passaggio alle
|
||||
unità canoniche: i documenti HTTP/S3 oggi normalizzati genericamente devono diventare
|
||||
file locali editabili. Le unità importate restano gestibili senza credenziali di
|
||||
scrittura sui server fonte.
|
||||
|
||||
L'azione amministrativa di aggiornamento delle fonti riacquisisce il contenuto e
|
||||
confronta le impronte con quanto già acquisito. Per le unità curate interessate,
|
||||
prepara il confronto con le proposte risultanti senza sostituire la dichiarazione
|
||||
manuale attiva. Questa protezione non dipende dalla capacità del modello di
|
||||
riconoscere ogni contraddizione semantica. La scelta dell'amministratore usa poi
|
||||
lo stesso salvataggio con attivazione; fonti invariate non richiedono nuova cura.
|
||||
|
||||
Verificare con origini controllate che la riacquisizione avvenga soltanto su richiesta,
|
||||
che un errore di accesso non venga scambiato per una cancellazione e che consolidamento/recall
|
||||
non chiamino i connettori di acquisizione remota. Verificare aggiornamento di una
|
||||
fonte collegata a una correzione manuale, permanenza della versione curata, decisione
|
||||
di sostituzione e mancata ricomparsa automatica delle unità eliminate.
|
||||
|
||||
La lettura può essere consegnata come incremento intermedio di E2, ma il progetto
|
||||
è completo soltanto con CRUD, attivazione e gestione delle origini previste. X1 nel
|
||||
piano comune collega le proposte provenienti dai conflitti con Memory e verifica
|
||||
che raggiungano questi stessi servizi con autorizzazioni ed esiti coerenti.
|
||||
|
||||
## Criteri di completamento
|
||||
|
||||
- Tutte le unità sono raggiungibili mediante elenco e filtri, senza una sessione.
|
||||
- La pagina mostra cartella e percorso effettivo sull'host per ogni unità. Markdown,
|
||||
campi richiesti ed esempi permettono creazione e modifica con editor esterni;
|
||||
i dati invalidi non vengono attivati e gli errori indicano il file da correggere.
|
||||
- Una draft prodotta fuori dall'installazione può essere acquisita, raffinata e
|
||||
conservata localmente senza accesso dello specialista a PostgreSQL.
|
||||
- Creazione, modifica e ritiro aggiornano l'archivio locale e il corpus usato dal core;
|
||||
non richiedono commit/push nel repository delle fonti.
|
||||
- Una Evidence può essere creata senza documento esterno; la dichiarazione manuale
|
||||
è riconoscibile e il documento originario di una correzione non è mostrato come
|
||||
supporto di un'affermazione che non contiene.
|
||||
- Una modifica o cancellazione completata resta valida dopo una nuova preparazione
|
||||
e reindicizzazione; non rimangono frammenti ricercabili della versione rimossa.
|
||||
- Una fonte aggiornata in conflitto con la cura manuale non sostituisce l'Evidence
|
||||
attiva: il confronto resta disponibile all'amministratore fino alla sua decisione.
|
||||
- Il consolidamento manuale completa anche l'attivazione, senza un successivo `Publish`; l'esito
|
||||
distingue operazione in corso, completata ed eventuali errori con retry.
|
||||
- Il core usa soltanto l'ultimo corpus consolidato valido. File in lavorazione o
|
||||
consolidamenti falliti non diventano disponibili attraverso letture dirette.
|
||||
- Dopo una modifica completata, le successive elaborazioni recuperano il contenuto
|
||||
corrente. Dopo una cancellazione completata non recuperano l'unità rimossa.
|
||||
Nessuna delle due operazioni riscrive decisioni, artefatti o SQL già prodotti.
|
||||
- Clear e ricostruzione degli indici preservano le Evidence canoniche locali,
|
||||
incluse le correzioni e le esclusioni dovute a cancellazioni.
|
||||
- Le correzioni originate da conflitti con Memory raggiungono lo stesso percorso
|
||||
autorevole delle modifiche amministrative e mostrano il proprio stato di pubblicazione.
|
||||
- Le origini senza scrittura dispongono di un percorso utilizzabile verso l'authoring.
|
||||
- Le fonti esterne vengono riacquisite solo su richiesta dell'amministratore;
|
||||
il consolidamento e il recall usano il contenuto locale già acquisito.
|
||||
- API e pagina applicano accesso amministrativo e isolamento dei workspace.
|
||||
- Le istruzioni identificano working tree e file effettivi; il seguito manuale
|
||||
include verifica del diff, commit e push. Nessun watcher o comando Git automatico
|
||||
è introdotto. L'esito distingue disponibilità locale e trasferimento al remoto.
|
||||
- Il salvataggio delle Evidence preserva Memory, Schema, relazioni, LSH e Catalog
|
||||
Metadata; non elimina blocchi di readiness estranei all'aggiornamento Evidence.
|
||||
@@ -0,0 +1,261 @@
|
||||
# Amministrazione di Memory ed Evidence
|
||||
|
||||
Data del piano: 2026-09-08. Aggiornamento 2026-09-09: M1–M3, E1–E3 e X1
|
||||
implementati. Risultati e limiti della verifica finale sono raccolti nel
|
||||
[rapporto X1](2026-09-09-archive-repair-x1-validation.md).
|
||||
|
||||
La [revisione di semplicità](2026-09-08-memory-evidence-simplification-review.md)
|
||||
riesamina tutte le decisioni Q1–Q15 alla luce degli ultimi chiarimenti del
|
||||
proprietario e confronta le conseguenze con il piano precedente. Per Evidence R0
|
||||
sono scelti file Markdown locali, editor esterni e consolidamento manuale con
|
||||
controllo della struttura, seguito da diff, commit e push dell'operatore. La pagina
|
||||
deve indicare chiaramente percorsi e comandi. Le restanti semplificazioni sono
|
||||
confermate. Il cambio del formato richiede adeguare il sottosistema core Evidence,
|
||||
convertire i file e reindicizzare; E1 precede la pagina. Il controllo umano usa
|
||||
lo stato Git nel terminale, con diff delle righe quando serve, senza una UI dedicata.
|
||||
Si ignora la contemporaneità fra amministrazione e core. Lo
|
||||
specialista scrive draft indipendentemente dall'installazione; il sistema le
|
||||
raffina e le conserva localmente. La proposta aggiornata usa file canonici locali
|
||||
per le Evidence e toglie commit/push automatici dal CRUD; questa revisione tecnica di Q11
|
||||
sostituisce la raccomandazione precedente ed è stata attuata negli incrementi E1–E3.
|
||||
|
||||
## Obiettivo e decisioni del proprietario
|
||||
|
||||
L'amministratore deve poter accedere in qualsiasi momento alle Memory e alle Evidence
|
||||
registrate, cercarle, filtrarle, aprirle, crearle, modificarle e cancellarle. L'accesso
|
||||
non richiede una sessione del core o una fase del workflow.
|
||||
|
||||
Il lavoro è diviso in due progetti autonomi:
|
||||
|
||||
- [Memory management](2026-09-08-memory-management.md);
|
||||
- [Evidence management](2026-09-08-evidence-management.md).
|
||||
|
||||
I progetti condividono l'esperienza di gestione e i componenti appropriati, mantenendo
|
||||
distinti i contenuti, le regole di validazione e i percorsi di persistenza.
|
||||
|
||||
### Collocazione dei due accessi
|
||||
|
||||
L'ordine previsto nell'accordion Administration è:
|
||||
|
||||
```text
|
||||
Administration
|
||||
Database management
|
||||
Memory management
|
||||
Evidence management
|
||||
────────────────────
|
||||
Workspace management
|
||||
Pi management
|
||||
```
|
||||
|
||||
Memory management ed Evidence management sono due voci autonome, allo stesso livello
|
||||
di Database management. «Sotto» indica soltanto la posizione fisica nella navigazione.
|
||||
Non sono sottopagine, tab o funzionalità di Database management. Ciascuna apre la
|
||||
propria pagina e possiede il proprio stato di navigazione.
|
||||
|
||||
### Decisioni già acquisite sulla Memory
|
||||
|
||||
- La Memory serve a migliorare schema linking e generazione SQL di domande future.
|
||||
- Il perimetro comprende chiarimenti di dominio riutilizzabili, regole corrette per
|
||||
join, filtri e aggregazioni, domande risolte consultabili ed errori da evitare
|
||||
quando il motivo è stato compreso e approvato. Le scelte occasionali non diventano
|
||||
regole generali; possono restare nel contesto di un exemplar.
|
||||
- Il formato della memory card è allineato per analogia a quello delle Evidence;
|
||||
origine e dominio restano separati. Le Memory non entrano nel canone Evidence.
|
||||
- La gestione avviene tramite CRUD e form interni a ThothII.
|
||||
- L'evoluzione del modulo Memory è interna a ThothII, riusando l'infrastruttura
|
||||
dell'installazione e senza adottare un framework esterno per governarne il comportamento.
|
||||
- Il progetto comprende ricerca semantica e lessicale ibrida in Qdrant, filtri
|
||||
sull'ambito e collegamenti espliciti fra card percorsi dal core. Non introduce
|
||||
un database a grafi dedicato e non rinvia il grafo a una successiva sperimentazione.
|
||||
- PostgreSQL, già presente nell'installazione, è l'archivio autorevole di card,
|
||||
collegamenti e dipendenze, in tabelle proprie del modulo Memory. Sostituisce il
|
||||
registro JSONL; Qdrant è una proiezione rigenerabile, con sincronizzazione esplicita.
|
||||
- I collegamenti sono proposti e approvati insieme alle card nel riepilogo finale
|
||||
e gestibili manualmente da Administration. Cancellare una card elimina anche i
|
||||
collegamenti che la coinvolgono, conservando le altre card.
|
||||
- Gli exemplar `solved_question` usano il formato card con consumo consultativo.
|
||||
- Il core prepara durante il lavoro un riepilogo finale modificabile delle nuove
|
||||
Memory e degli aggiornamenti proposti. Il reviewer seleziona cosa salvare; la
|
||||
cancellazione resta nel CRUD amministrativo.
|
||||
- Le Memory vengono proposte nei gate pertinenti: chiarimenti all'inizio, regole di
|
||||
collegamento nello schema linking e regole di calcolo durante la costruzione SQL.
|
||||
Le approvazioni sono integrate nei gate, senza una domanda separata per ogni card.
|
||||
- Una modifica sostituisce il contenuto corrente: non è richiesta una cronologia
|
||||
aggiuntiva delle revisioni delle Memory o una ricostruibilità storica dedicata.
|
||||
- Se un riferimento allo schema rende una Memory inutilizzabile, il proprietario
|
||||
sceglie la cancellazione anziché lo stato «Needs review». Dopo una sincronizzazione
|
||||
riuscita dello schema fisico, il backend comunica gli elementi rimossi al modulo
|
||||
Memory, che cancella le card dipendenti e le proiezioni. La relazione fra card ed
|
||||
elementi dello schema deve essere strutturata; cleanup del Catalog ed errori di
|
||||
connessione non sono prove di rimozione fisica.
|
||||
- I conflitti fra Memory ed Evidence si risolvono con azioni chiuse, specifiche e
|
||||
accompagnate dal contenuto risultante. La scelta alimenta una correzione degli
|
||||
archivi attraverso i rispettivi percorsi, con stato di pubblicazione esplicito;
|
||||
è sempre possibile dichiarare inadeguate le proposte e richiederne la riformulazione.
|
||||
- La verifica usa test funzionali automatici e regressioni per casi concreti; non
|
||||
promette un miglioramento qualitativo generale o un benchmark con/senza Memory.
|
||||
- Le sessioni esistenti non vincolano il design. Il loro azzeramento durante lo
|
||||
sviluppo, se necessario, è autorizzato; non è un'operazione eseguita da questi documenti.
|
||||
|
||||
La decisione di non conservare uno storico riguarda le Memory. Non modifica
|
||||
automaticamente il contratto di authoring e pubblicazione delle Evidence.
|
||||
|
||||
### Salvataggio delle Evidence
|
||||
|
||||
In Q12 il proprietario rifiuta la separazione fra `Save draft` e `Publish`.
|
||||
La scelta successiva dell'editor esterno sostituisce il Save della form con il
|
||||
salvataggio dei file e un comando manuale di consolidamento: verifica la struttura,
|
||||
indica le correzioni necessarie e, se valido, aggiorna metadati, corpus e indice.
|
||||
Acquisisce anche aggiunte e cancellazioni. Segue il controllo del diff con commit e
|
||||
push manuali dell'operatore; non sono previsti watcher, Git automatico o un editor
|
||||
in Evidence management. La pagina mostra cartella, percorsi sull'host e comandi;
|
||||
il [piano Evidence](2026-09-08-evidence-management.md) specifica la sequenza.
|
||||
Il consolidamento attiva localmente il contenuto; un push mancante o fallito lascia
|
||||
il trasferimento al remoto da completare manualmente. L'ultimo chiarimento
|
||||
elimina il requisito di aggiornare sessioni aperte a seguito di modifiche
|
||||
amministrative: durante tali modifiche il core è fermo o la contemporaneità può
|
||||
essere ignorata. Rimangono le correzioni deliberate dalla sessione stessa.
|
||||
La review di Q11 distingue le draft dello specialista dalle Evidence raffinate
|
||||
locali; raccomanda di preservare le prime e gestire le seconde su file persistenti,
|
||||
senza PostgreSQL condiviso o scritture automatiche nel repository delle fonti.
|
||||
In Q13 è approvata
|
||||
la precedenza della correzione manuale quando una fonte aggiornata la contraddice:
|
||||
resta attiva fino alla risoluzione esplicita del confronto in Evidence management.
|
||||
Le Evidence cancellate non ricompaiono automaticamente durante la rigenerazione.
|
||||
Q14 consente di crearle senza documento esterno, in R0 tramite un nuovo Markdown: una
|
||||
dichiarazione manuale sostiene il testo corrente, con l'eventuale documento
|
||||
originario conservato come provenienza distinta. Q15 limita la riacquisizione
|
||||
delle fonti esterne a una richiesta esplicita dell'amministratore; il normale
|
||||
salvataggio e il recall usano il contenuto già acquisito.
|
||||
L'[ADR 0019](../adr/0019-author-evidence-in-app-with-automatic-activation.md) registra
|
||||
l'evoluzione del contratto, ancora da implementare.
|
||||
|
||||
## Stato verificato nel repository
|
||||
|
||||
`frontend/src/shell/AppShell.tsx` contiene Administration con Database management,
|
||||
Workspace management e Pi management. Non contiene le due pagine richieste.
|
||||
|
||||
Il modulo Memory espone già comandi CLI per elenco, dettaglio, aggiornamento,
|
||||
cancellazione e ricerca, ma manca una superficie CRUD amministrativa web.
|
||||
Il riepilogo di una sessione mostra soltanto le Memory collegate alla sessione.
|
||||
Il [contratto attuale della Memory](../gestione-memory.md) descrive registro JSONL
|
||||
canonico e indice Qdrant derivato.
|
||||
|
||||
Le Evidence hanno già un percorso di consultazione e modifica dei documenti nel
|
||||
repository di authoring, descritto in [Evidence: sources, preparation, and review](../evidence.md).
|
||||
Manca una pagina amministrativa per queste operazioni dentro ThothII. Il contratto
|
||||
attuale prevede che ThothII legga e pubblichi il repository, senza modificarlo,
|
||||
creare commit o eseguire push: l'editing amministrativo richiede evolvere questo
|
||||
confine, come esplicitato nel progetto Evidence.
|
||||
|
||||
## Esperienza comune
|
||||
|
||||
L'amministratore lavora nell'interfaccia operativa esistente, con una lista densa
|
||||
e leggibile e un'area di dettaglio. Si riusano tema, controlli, focus e navigazione
|
||||
già definiti in PRODUCT.md e DESIGN.md.
|
||||
|
||||
- Selettore di workspace, ricerca testuale, filtri combinabili, ordinamento e paginazione.
|
||||
- Elenco completo dei record persistiti, indipendente dalla disponibilità della
|
||||
ricerca semantica. Una ricerca per similarità può affiancarlo, senza limitarlo ai
|
||||
pochi risultati del recall del core.
|
||||
- Apertura del contenuto completo, dell'ambito di applicazione e della provenienza.
|
||||
- Creazione e modifica Memory mediante form; per Evidence R0, percorsi ed esempi
|
||||
Markdown per editor esterni, consolidamento e seguito Git manuali.
|
||||
- Cancellazione con indicazione precisa dell'oggetto e del suo effetto; per Evidence
|
||||
R0 la rimozione del file è acquisita dal consolidamento.
|
||||
- Stato esplicito di salvataggio e disponibilità per il core, con recupero dagli errori.
|
||||
- Filtri e posizione nell'elenco conservati quando si apre e si chiude un record.
|
||||
- Controlli utilizzabili da tastiera; stato vuoto, nessun risultato e indisponibilità
|
||||
del servizio distinguibili. Chrome in inglese, contenuti nella lingua del workspace.
|
||||
|
||||
Le due pagine non dipendono dalla selezione di un database in Database management.
|
||||
Eventuali filtri su tabelle e colonne usano riferimenti al catalogo quando disponibili;
|
||||
la loro assenza non impedisce di consultare i contenuti registrati.
|
||||
|
||||
Componenti condivisibili: barra di ricerca e filtri, lista, paginazione, struttura
|
||||
del dettaglio, campi comuni della card, provenienza e feedback delle operazioni.
|
||||
Form Memory, istruzioni di manutenzione Evidence, autorizzazione, validazione, pubblicazione e
|
||||
persistenza rimangono responsabilità dei rispettivi moduli. Il riuso del frontend
|
||||
non introduce un archivio canonico unico per Memory ed Evidence.
|
||||
|
||||
## Confini e integrazione
|
||||
|
||||
Entrambe le pagine appartengono ad Administration e devono applicare il controllo
|
||||
amministrativo anche nelle API. La collocazione visiva non assegna automaticamente
|
||||
le autorizzazioni di Database management ai nuovi moduli.
|
||||
|
||||
Il progetto Memory può essere consegnato senza attendere il progetto Evidence.
|
||||
I componenti comuni si estraggono quando servono ai flussi reali di entrambi.
|
||||
La verifica finale congiunta copre ordine della navigazione, accesso indipendente,
|
||||
filtri, percorsi di manutenzione e feedback coerenti, isolamento fra workspace e assenza di effetti
|
||||
incrociati fra i due domini.
|
||||
|
||||
La separazione fra Reference Vector Collection e Memory Vector Collection rimane
|
||||
quella dell'[ADR 0017](../adr/0017-separate-reference-vectors-from-runtime-memory.md).
|
||||
Un'operazione amministrativa sulle Evidence non cancella le Memory; una cancellazione
|
||||
di Memory non elimina Evidence, Schema o metadati del database.
|
||||
|
||||
## Piano esecutivo dei due progetti
|
||||
|
||||
Il riesame mantiene i requisiti funzionali Q1–Q15 e semplifica le scelte tecniche
|
||||
secondo le condizioni descritte sopra. L'ordine di lavoro parte dalla Memory e
|
||||
riusa poi i componenti effettivamente comuni per Evidence management. Le API e
|
||||
il coordinamento delle scritture attuano questi vincoli; la distinzione fra draft
|
||||
esterne e archivio locale sostituisce l'ipotesi di un unico archivio Git da modificare.
|
||||
|
||||
| Ordine | Incremento | Risultato verificabile | Dipendenze |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | M1 — Archivio e CRUD Memory | PostgreSQL autorevole, API e pagina con elenco completo, filtri, form e cancellazione; collegamenti e dipendenze persistiti, proiezioni aggiornate o invalidate | Nessuna dipendenza dal progetto Evidence |
|
||||
| 2 | M2 — Ricerca Memory | Ricerca ibrida con filtri ed espansione limitata dei collegamenti; risultati coerenti con il contenuto corrente | M1 |
|
||||
| 3 | M3 — Memory nel workflow | Riepilogo finale, uso delle categorie nei gate e cancellazione dopo sincronizzazione fisica riuscita | M1 e M2 |
|
||||
| 4 | E1 — Preparazione e archivio Evidence | Draft esterne, raffinamento del sistema, file canonici locali persistenti e protezione delle correzioni/cancellazioni | Q11–Q15 riesaminate; non richiede il runtime Memory |
|
||||
| 5 | E2 — Manutenzione e consolidamento Evidence | Pagina con percorsi dei Markdown; comando manuale di verifica e attivazione; istruzioni per diff, commit e push | E1 |
|
||||
| 6 | E3 — Fonti e conflitti di aggiornamento | Importazione delle origini supportate, refresh esplicito, confronto con le correzioni manuali | E1 ed E2 |
|
||||
| 7 | X1 — Integrazione finale | Correzioni persistenti dei conflitti Memory/Evidence e verifica congiunta delle due pagine | M3 ed E3 |
|
||||
|
||||
E1–E3 sono un progetto separato: la sequenza è l'ordine operativo scelto per questa
|
||||
consegna, non una dipendenza tecnica dal modulo Memory. Il CRUD Memory è utilizzabile
|
||||
come primo incremento; M2 e M3 restano obbligatori nel progetto attuale. La correzione
|
||||
completa dei conflitti fra i due archivi si considera consegnata soltanto con X1.
|
||||
|
||||
### Responsabilità di implementazione
|
||||
|
||||
- Il harness possiede contratti, persistenza e operazioni dei moduli Memory ed
|
||||
Evidence. Il backend applica autorizzazioni, espone le API e orchestra le
|
||||
operazioni; non introduce una seconda implementazione delle stesse scritture.
|
||||
- Il Metadata Catalog rimane responsabilità del backend. Una sincronizzazione
|
||||
fisica riuscita chiama la pulizia Memory nello stesso flusso, con gli elementi
|
||||
effettivamente rimossi nell'ambito controllato e un recupero dopo interruzione.
|
||||
La pulizia non dipende dalla UI e non richiede un bus di eventi.
|
||||
- Le pagine condividono controlli di consultazione e feedback; logica dei kind, fonte autorevole e
|
||||
attivazione rimangono nei rispettivi moduli. L'AppShell ospita le due voci autonome
|
||||
nell'ordine concordato.
|
||||
- Le modifiche coordinate hanno gestione esplicita di errori e retry. I controlli
|
||||
sulla versione corrente impediscono sovrascritture inconsapevoli senza richiedere
|
||||
uno storico delle Memory. I retry non duplicano card o collegamenti. Il normale
|
||||
salvataggio è sequenziale, con un esito persistente da recuperare se incompleto;
|
||||
non richiede nuovi worker, code generiche o coordinamento delle sessioni aperte.
|
||||
|
||||
### Verifiche e chiusura della consegna
|
||||
|
||||
Ogni incremento esegue i test delle operazioni che cambia e i controlli dei layer
|
||||
coinvolti: pytest/ruff per il harness, vitest e typecheck per backend/frontend.
|
||||
Le pagine sono verificate anche nel browser per navigazione, filtri, form, errori
|
||||
e uso da tastiera. I contratti e i test specifici sono nei due piani di progetto.
|
||||
|
||||
X1 verifica sia i conflitti che correggono Memory sia quelli che correggono Evidence,
|
||||
inclusi utente privo dell'autorizzazione necessaria, proposta rifiutata, errore di
|
||||
attivazione e retry. Il gate deve mostrare lo stato reale dell'archivio: la sola
|
||||
risoluzione della domanda corrente non dimostra che la correzione sia persistita.
|
||||
La verifica congiunta copre inoltre isolamento dei workspace, ordine dei link e
|
||||
assenza di cancellazioni incrociate.
|
||||
|
||||
I contratti correnti vengono aggiornati insieme al relativo codice. Alla fine si
|
||||
aggiornano PROJECT_STATE.md e documentazione operativa e si esegue la build strict.
|
||||
La verifica della generazione con un modello reale rimane distinta dai test
|
||||
deterministici; non si promette un benchmark generale di miglioramento qualitativo.
|
||||
|
||||
Gli incrementi approvati sono implementati e disponibili nel Docker locale.
|
||||
I rapporti di validazione distinguono i test deterministici, i servizi reali e le
|
||||
prove con il modello configurato. Le verifiche sintetiche non modificano la
|
||||
conoscenza PSD; la valutazione dei contenuti reali rimane una decisione del reviewer.
|
||||
@@ -0,0 +1,253 @@
|
||||
# Revisione di semplicità: Memory ed Evidence
|
||||
|
||||
Data: 2026-09-08. Stato: archivio locale Markdown, editor esterni e consolidamento
|
||||
manuale con seguito Git scelti per la release 0; conseguenze esplicitate,
|
||||
restanti semplificazioni confermate, chiariti impatto core e controllo Git.
|
||||
Nessuna modifica applicativa.
|
||||
|
||||
## Condizioni che guidano la revisione
|
||||
|
||||
Chi amministra il sistema è competente e deve vedere chiaramente cosa produce ogni
|
||||
azione. Durante il CRUD amministrativo di Memory ed Evidence si può assumere che
|
||||
non ci siano attività core in corso; la loro eventuale contemporaneità non è un
|
||||
caso da supportare con meccanismi dedicati.
|
||||
|
||||
Lo specialista di contesto può essere una persona diversa da chi gestisce
|
||||
l'installazione. Scrive le draft delle Evidence senza dover accedere a PostgreSQL,
|
||||
amministrarlo o disporre della stessa installazione. Il flusso fondamentale resta:
|
||||
|
||||
1. Lo specialista scrive e consegna le draft in documenti accessibili al sistema.
|
||||
2. Il sistema le acquisisce e le raffina in Evidence strutturate.
|
||||
3. Il sistema conserva localmente le Evidence per consultazione e manutenzione.
|
||||
|
||||
La proposta avanzata durante la revisione di usare PostgreSQL come archivio
|
||||
autorevole anche delle Evidence è ritirata. Confrontava il costo del solo CRUD
|
||||
interno, senza rappresentare adeguatamente l'autonomia di chi produce le fonti.
|
||||
Un database dietro un'interfaccia non richiederebbe di per sé accesso SQL agli autori,
|
||||
né un database condiviso; questo però non risolve da solo il flusso di redazione e
|
||||
consegna esterno. Non propongo di introdurre tale dipendenza.
|
||||
|
||||
## Archivio locale delle Evidence accettato dopo il chiarimento
|
||||
|
||||
Il proprietario ha accettato i file locali e richiede una gestione facile da trovare
|
||||
e usare anche per uno specialista non tecnico. Il formato di lavoro è Markdown;
|
||||
JSONL non è una superficie di gestione delle Evidence. Il proprietario ha scelto
|
||||
editor esterni per la release 0, chiedendo di indicare chiaramente dove sono i file.
|
||||
|
||||
| Contenuto | Responsabile | Conservazione e uso |
|
||||
| --- | --- | --- |
|
||||
| Draft originali | Specialista di contesto | File o repository delle fonti, redigibili e consegnabili indipendentemente dall'installazione |
|
||||
| Evidence raffinate e correzioni locali | Sistema e persone autorizzate alla manutenzione del contenuto | File Markdown in un archivio locale persistente dell'installazione, consultabili dall'applicazione e modificabili con editor esterni |
|
||||
| Indice di ricerca | Sistema | Qdrant, ricostruibile dalle Evidence locali correnti |
|
||||
|
||||
Questa è una revisione della parte tecnica di Q11: distingue l'autorità delle draft
|
||||
esterne dall'archivio delle Evidence raffinate usate dalla singola installazione.
|
||||
Il repository delle fonti rimane utilizzabile; il consolidamento delle Evidence
|
||||
locali non esegue commit o push e non richiede un PostgreSQL condiviso. Il seguito
|
||||
manuale ora richiesto comprende controllo del diff, commit e push nel repository
|
||||
che contiene i file curati. L'archivio è una working tree persistente; draft e unità
|
||||
curate possono stare nello stesso repository, mantenendo distinta la loro funzione.
|
||||
|
||||
Le conseguenze devono essere esplicite. Una correzione locale cambia ciò che usa
|
||||
quell'installazione e non viene rispedita automaticamente allo specialista o ad
|
||||
altre installazioni. I file restano trasferibili per un passaggio esplicito; non
|
||||
si costruisce una sincronizzazione bidirezionale. L'archivio locale va conservato
|
||||
e incluso nelle copie di sicurezza: dopo una correzione non è più un semplice
|
||||
output eliminabile e rigenerabile dalle draft senza perdita di lavoro.
|
||||
|
||||
Memory mantiene PostgreSQL locale come archivio già concordato. Le due pagine
|
||||
restano separate e riusano controlli comuni; la scelta della persistenza segue il
|
||||
flusso di produzione dei rispettivi contenuti.
|
||||
|
||||
## Gestione della release 0: editor esterni scelti
|
||||
|
||||
Il proprietario sceglie il proprio editor sul Mac o PC, oppure vim, nano o
|
||||
equivalenti sul server. La proposta di editor applicativo è ritirata; non si
|
||||
integra una libreria di editing né si sviluppano form di contenuto Evidence.
|
||||
|
||||
`Evidence management` conserva lista, ricerca, filtri e dettaglio. Mostra la cartella
|
||||
del workspace e il percorso assoluto di ogni file, copiabile e risolto dalla
|
||||
configurazione effettiva. Indica l'host su cui si trova; con Docker mostra il percorso
|
||||
persistente accessibile sull'host. Le istruzioni distinguono draft originali e
|
||||
Evidence raffinate da manutenere e includono un esempio Markdown per crearne una.
|
||||
|
||||
Si modificano direttamente i file nell'archivio locale dell'installazione. Chi
|
||||
lavora su una copia sul proprio computer la riporta lì con i propri strumenti.
|
||||
Non sono richiesti upload/download web, nuove cartelle condivise o sincronizzazione.
|
||||
|
||||
Dopo aver salvato, aggiunto o rimosso file, l'operatore controlla lo stato Git,
|
||||
poi esegue un comando manuale di
|
||||
consolidamento: controlla la struttura attesa, segnala file e correzioni necessarie
|
||||
e, solo se i controlli passano, aggiorna metadati, corpus e indice. Il comando è
|
||||
rieseguibile dopo correzioni o errori tecnici. Seguono commit e
|
||||
push manuali, con le istruzioni della pagina e della documentazione operativa.
|
||||
Il core consulta solo l'ultimo corpus consolidato valido; i file in lavorazione
|
||||
e gli aggiornamenti falliti non devono introdurre contenuto parziale nella ricerca.
|
||||
La richiesta più recente sostituisce la proposta intermedia del pulsante
|
||||
`Apply file changes`; non servono un'esecuzione dalla UI, watcher o operazioni Git
|
||||
automatiche. Il salvataggio nell'editor da solo non aggiorna il recall. Il controllo
|
||||
dei file usa `git status --short` nel terminale; il normale `git diff` è disponibile
|
||||
per approfondire le righe cambiate, senza visualizzatore web o doppia revisione
|
||||
obbligatoria. Il comando riporta un breve riepilogo testuale delle modifiche.
|
||||
|
||||
Il Markdown locale deve essere realmente editabile: il testo visibile è autorevole,
|
||||
i campi richiesti sono documentati e i metadati derivati sono gestiti dal sistema.
|
||||
Il formato v3 attuale, che verifica il rendering contro una copia codificata del
|
||||
testo, va quindi adattato. Non basta indicare i percorsi dei file attuali e non si
|
||||
introduce un secondo archivio di scambio da sincronizzare. Questo comporta una
|
||||
modifica effettiva dei componenti core Evidence: parser, renderer, preparazione,
|
||||
validazione, normalizzazione e collegamento a indicizzazione/recall. E1 comprende
|
||||
nuova versione del contratto, conversione dei file esistenti e verifica del percorso
|
||||
completo; il formato interno tipizzato viene conservato dove possibile.
|
||||
|
||||
Creazione, modifica e cancellazione delle unità raffinate passano dai file e dallo
|
||||
stesso consolidamento. Un errore di accesso all'archivio non è una prova di
|
||||
cancellazione. Le correzioni approvate dal core continuano a chiamare direttamente
|
||||
il servizio di scrittura. Il proprietario ha confermato le restanti semplificazioni
|
||||
chiedendo di esplicitare impatto core e semplicità del controllo Git.
|
||||
Il [piano Evidence](2026-09-08-evidence-management.md#consolidamento-manuale-e-seguito-git--release-0)
|
||||
specifica controlli, comando previsto e sequenza Git. Dopo il consolidamento il
|
||||
contenuto è disponibile localmente; finché commit/push non sono completati, non è
|
||||
versionato/trasferito al remoto. Il sistema si affida alla disciplina dell'operatore
|
||||
e non tenta di completare o riparare automaticamente la sequenza Git.
|
||||
|
||||
## Conseguenze rispetto al piano precedente alla revisione
|
||||
|
||||
Il confronto riguarda il piano concordato prima del riesame: form strutturate per
|
||||
le unità, repository Git autorevole con scritture applicative e supporto alle
|
||||
modifiche amministrative durante sessioni aperte. Le funzionalità non erano ancora
|
||||
implementate: si confrontano due progetti, non una regressione già introdotta.
|
||||
|
||||
| Aspetto | Cosa cambia | Conseguenza pratica |
|
||||
| --- | --- | --- |
|
||||
| Gestione R0 delle Evidence | Editor esterno scelto al posto di editor e form nell'applicazione | Si usano strumenti già disponibili. La pagina indica i file; servono un Markdown realmente editabile, esempi e validazione in acquisizione. Si rinuncia alla guida e ai controlli durante la digitazione. |
|
||||
| Applicazione delle modifiche esterne | Salvare i file nell'archivio ed eseguire il consolidamento manuale | Una copia sul Mac o PC va riportata nell'archivio con gli strumenti dell'operatore. Fino al consolidamento riuscito la modifica non è disponibile al core. Gli errori strutturali indicano il seguito necessario. Non si sviluppano trasferimenti file web o watcher. |
|
||||
| Autorità delle Evidence raffinate | Archivio locale, distinto dalle draft esterne | Una correzione agisce su quell'installazione. Lo specialista che lavora alle draft e altre installazioni non la ricevono automaticamente. |
|
||||
| Cronologia e distribuzione Git | Controllo del diff, commit e push manuali dopo il consolidamento | Git conserva e trasferisce quanto l'operatore committa e pubblica. La sequenza non è imposta né completata dal sistema: se il push manca o fallisce, il core locale può già usare modifiche non trasferite. Non c'è rollback applicativo o gestione automatica dei conflitti Git. |
|
||||
| Ripristino dei dati | Le Evidence locali curate sono dati primari | Il backup deve comprenderle. Ricostruire tutto dalle sole draft recupererebbe la base, ma potrebbe perdere correzioni e cancellazioni locali; Clear deve preservare l'archivio. |
|
||||
| Attività core contemporanee | Non vengono più gestite le modifiche amministrative durante il lavoro core | Se avvengono comunque, non è garantita la coerenza della sessione in corso. Non si aggiornano contesti o SQL già prodotti. Le successive elaborazioni usano il contenuto aggiornato dopo il completamento dell'operazione. |
|
||||
| Salvataggio e indice | Operazione sequenziale con recupero minimo persistente | L'utente attende l'esito dell'indicizzazione. Un problema può richiedere Retry; il contenuto già salvato viene conservato e un esito incompleto non viene presentato come pieno successo. Il piano precedente già prevedeva questi esiti, non garantiva retry automatici. |
|
||||
| Pulizia Memory dopo sync | Chiamata diretta nel flusso esistente | Stesso effetto funzionale, con meno coordinamento interno. Rimangono il recupero dopo interruzione, i limiti dell'ambito controllato e l'esclusione di errori di connessione o cleanup del solo Catalog. |
|
||||
| Verifica semantica | Nessuna nuova valutazione generale o revisione obbligatoria a ogni Save | La responsabilità del significato resta allo specialista; i test verificano contratti e casi mirati. La validazione strutturale non garantiva la correttezza del dominio neppure nel piano precedente. |
|
||||
|
||||
Sono invariati il riepilogo Memory, le categorie ammesse, i gate esistenti, la
|
||||
ricerca ibrida e i collegamenti, le correzioni persistenti dei conflitti e la
|
||||
protezione delle modifiche manuali. Le fonti vengono aggiornate su richiesta come
|
||||
già concordato. Le scritture deliberate dal core stesso restano supportate tramite
|
||||
lo stesso servizio: l'assenza di amministrazione concomitante non le elimina.
|
||||
|
||||
Non è prevista una rinuncia alle capacità di ricerca o al contenuto delle Evidence.
|
||||
Conservare gli stessi contenuti tipizzati, ambiti e indicizzazione evita una perdita
|
||||
di qualità dovuta a un taglio di funzionalità, ma l'equivalenza del nuovo percorso
|
||||
deve essere verificata. Il formato Markdown e un editor più semplice non sono,
|
||||
da soli, una garanzia di qualità o di assenza di errori.
|
||||
|
||||
## Riesame di tutte le decisioni Q1–Q15
|
||||
|
||||
| Decisione | Esito della revisione | Approccio più semplice e conseguenza |
|
||||
| --- | --- | --- |
|
||||
| Q1 — Riepilogo Memory | Mantengo | Un riepilogo finale editabile, con selezione di cosa salvare. Nessuna approvazione ripetuta per ogni card durante la sessione. |
|
||||
| Q2 — Aggiunte e aggiornamenti | Mantengo | Mostrare contenuto risultante e record sostituito. La somiglianza non avvia fusioni automatiche; la cancellazione semantica resta esplicita nel CRUD. |
|
||||
| Q3 — Consumo nei gate | Mantengo | Usare i gate già previsti. Nessun nuovo percorso di approvazione per la sola consultazione di una Memory; exemplar consultativi. |
|
||||
| Q4 — Conflitti Memory/Evidence | Semplifico l'esecuzione | La scelta mostra quale archivio cambia e con quale testo. Chiamare lo stesso servizio di salvataggio del CRUD, con un esito unico; niente secondo sistema di pubblicazione. Le correzioni deliberate dal core restano un caso da supportare. |
|
||||
| Q5 — Dipendenze fisiche eliminate | Mantengo, con chiamata diretta | Alla fine della sincronizzazione fisica riuscita, chiamare la pulizia Memory nello stesso flusso. Mostrare le conseguenze nella conferma della sincronizzazione già esistente e il conteggio finale. Non introdurre bus di eventi o un nuovo controllo continuo del DWH. |
|
||||
| Q6 — Verifiche | Mantengo il perimetro limitato | CRUD, filtri, persistenza, cancellazioni, recupero dall'errore e casi mirati di ricerca. Nessuna valutazione qualitativa generale a ogni salvataggio, nessun secondo modello giudice obbligatorio. |
|
||||
| Q7 — Evoluzione interna | Mantengo | Riutilizzare componenti e servizi dell'installazione. Nessun framework esterno o ulteriore servizio per governare Memory. |
|
||||
| Q8 — Ibrido e collegamenti | Mantengo entrambe le capacità | Riutilizzare la ricerca ibrida; collegamenti in una lista modificabile ed espansione limitata nel core. Nessun database a grafi, editor visuale di grafi o deduzione automatica di una rete di relazioni. Le capacità restano nel progetto attuale. |
|
||||
| Q9 — PostgreSQL per Memory | Mantengo | Il database è già locale all'installazione; card, collegamenti e dipendenze restano coordinati. Qdrant è ricostruibile. Il flusso Memory non richiede un autore esterno indipendente. |
|
||||
| Q10 — Cura dei collegamenti | Mantengo | Gestirli nello stesso riepilogo e dettaglio della card. Cancellare una card elimina i collegamenti incidenti e conserva le altre card. |
|
||||
| Q11 — Archivio Evidence | Rivedo la soluzione tecnica | Draft esterne indipendenti e Evidence raffinate in file locali persistenti. Togliere commit/push dal CRUD. La modifica locale non aggiorna automaticamente la fonte dello specialista. La proposta PostgreSQL autorevole per Evidence è ritirata. |
|
||||
| Q12 — Save e sessioni aperte | Adatto agli editor esterni | Dopo il salvataggio dei file, un comando manuale consolida e attiva le modifiche; l'operatore completa poi commit/push. Nessun workflow editoriale aggiuntivo, watcher, aggiornamento delle sessioni aperte o modalità manutenzione. |
|
||||
| Q13 — Fonte cambiata e cura manuale | Mantengo, con confronto semplice | La correzione manuale prevale finché una persona decide altrimenti. Un cambiamento della fonte collegata rende disponibile il confronto; non serve dimostrare automaticamente una contraddizione semantica. Le cancellazioni non vengono annullate dalla rigenerazione. |
|
||||
| Q14 — Creazione manuale | Mantengo tramite file | Un nuovo Markdown secondo l'esempio documentato consente una Evidence manuale con provenienza dichiarata e senza documento esterno obbligatorio. Il flusso principale draft dello specialista → raffinamento locale rimane disponibile e indipendente. |
|
||||
| Q15 — Refresh delle fonti | Mantengo | Acquisizione e raffinamento delle fonti aggiornate su richiesta esplicita. Consolidamento e recall usano il contenuto locale; non cercano nuove versioni remote. |
|
||||
|
||||
Restano confermati due link autonomi sotto Database management, CRUD completo con
|
||||
filtri, assenza di storico aggiuntivo delle Memory e assenza di vincoli sulle
|
||||
sessioni di sviluppo già esistenti.
|
||||
|
||||
## Riduzioni trasversali del piano
|
||||
|
||||
**Un'operazione alla volta, con esito comprensibile.** Save per Memory e
|
||||
consolidamento manuale per Evidence validano e aggiornano l'indice in sequenza.
|
||||
L'interfaccia mostra operazione in corso,
|
||||
completata oppure errore con azione di recupero. Non espone un workflow editoriale
|
||||
di stati `draft`, `approved`, `published` per il normale CRUD. La draft dello
|
||||
specialista è il documento di ingresso della preparazione, non un secondo pulsante
|
||||
di salvataggio dell'editor delle unità locali.
|
||||
|
||||
**Recupero minimo dopo errore.** Se l'archivio è stato aggiornato ma Qdrant no, va
|
||||
detto e deve essere possibile riprovare, per Evidence rieseguendo il comando.
|
||||
Serve un'indicazione persistente del lavoro
|
||||
incompleto, sufficiente anche per ripulire una card già cancellata dopo un riavvio.
|
||||
La ricerca non deve usare contenuti rimossi o superati alla domanda successiva.
|
||||
Il piano non imponeva già una outbox o nuovi worker: la revisione rende esplicito
|
||||
che non sono richiesti né code generiche né sincronizzazioni continue.
|
||||
|
||||
**Pulizia schema diretta e ripetibile.** Il flusso esistente del Catalog può
|
||||
richiamare Memory dopo l'applicazione dello schema. Occorre coprire il crash fra
|
||||
le due scritture: conservare la pulizia pendente sul run oppure verificare di nuovo
|
||||
le dipendenze contro lo snapshot fisico riuscito e il suo ambito. Ricalcolare solo
|
||||
il nuovo diff perderebbe le rimozioni già applicate. La rimozione manuale di
|
||||
metadati Catalog o un errore di connessione non autorizzano a cancellare Memory.
|
||||
|
||||
**Nessuna gestione delle sessioni amministrate contemporaneamente.** Non progettare
|
||||
aggiornamenti a caldo, ripristino dei contesti già letti, invalidazione dello SQL,
|
||||
notifiche alle sessioni o generazioni aggiuntive per lettori paralleli. Rimangono le
|
||||
scritture esplicitamente richieste dalla sessione stessa: il riepilogo Memory e una
|
||||
correzione Evidence approvata chiamano il medesimo servizio e ne gestiscono l'esito
|
||||
prima di proseguire. Questo caso non richiede coordinare tutte le altre sessioni.
|
||||
|
||||
**Pagine essenziali.** Ricerca testuale, filtri e lista completa permettono di trovare
|
||||
i contenuti; la ricerca semantica appartiene anzitutto al core. Memory conserva le
|
||||
form; Evidence espone dettaglio, percorsi e istruzioni per la modifica esterna.
|
||||
Hash e manifest restano gestiti dal sistema. Si riusano i controlli di accesso
|
||||
esistenti; chi modifica i file necessita dei permessi sul relativo filesystem,
|
||||
senza accesso a PostgreSQL o un nuovo sistema generale di ruoli.
|
||||
|
||||
## Conseguenze delle azioni da rendere visibili
|
||||
|
||||
| Azione | Conseguenza da comunicare |
|
||||
| --- | --- |
|
||||
| Save riuscito | Il contenuto corrente è conservato ed è disponibile per le successive elaborazioni. |
|
||||
| Save con errore dell'indice | Il contenuto è conservato; la disponibilità alla ricerca non è completata. Retry completa il lavoro senza richiedere di riscrivere la modifica. |
|
||||
| Salvataggio nell'editor esterno | Cambia il file, ma non aggiorna il recall. Una copia esterna va prima riportata nell'archivio dell'installazione. |
|
||||
| Consolidamento Evidence | Acquisisce aggiunte, modifiche e cancellazioni locali; verifica la struttura e, se valida, aggiorna metadati e indice. Un errore indica cosa correggere; si riesegue il comando dopo la correzione o un errore tecnico. |
|
||||
| Commit e push manuali | Versionano e trasferiscono al repository remoto i file consolidati. Un errore Git si risolve manualmente; il consolidamento locale già riuscito non viene annullato. |
|
||||
| Delete di una Memory | La card e i collegamenti che la coinvolgono vengono rimossi; le altre card restano. |
|
||||
| Delete di una Evidence | L'unità locale non viene più usata né ricreata automaticamente; la draft originale e le altre unità derivate restano. |
|
||||
| Refresh sources | Si acquisiscono nuove versioni delle fonti e si preparano le Evidence interessate; le correzioni locali protette non vengono sovrascritte. |
|
||||
| Sincronizzazione fisica | Le Memory dipendenti da elementi effettivamente eliminati vengono cancellate; l'ambito e il conteggio dell'effetto sono visibili. |
|
||||
| Preprocessing Clear | Si eliminano i dati derivati previsti dal comando; le Evidence canoniche locali e le Memory rimangono. |
|
||||
|
||||
Non sono necessarie conferme ripetute su Save. Per le cancellazioni si usa una
|
||||
conferma concreta sull'oggetto e sulle conseguenze, integrando gli effetti nella
|
||||
conferma già presente quando l'azione è una sincronizzazione distruttiva.
|
||||
|
||||
## Cosa va comunque implementato
|
||||
|
||||
Il raffinamento locale e la scrittura di Markdown canonico/manifest esistono in
|
||||
`harness/tht/evidence/authoring.py`. Preparano e validano gli output prima della
|
||||
sostituzione con staging e rollback; non eseguono commit/push. Va separato il
|
||||
requisito di Git worktree dalla preparazione del contenuto e va integrata
|
||||
l'acquisizione delle draft esterne.
|
||||
|
||||
La materializzazione corrente in `backend/src/workspaces/evidence/materialization.ts`
|
||||
è invece ricostruita da una revisione Git: non è già l'archivio locale scrivibile
|
||||
proposto. Il renderer e il preprocessing devono consumare il nuovo archivio
|
||||
persistente. Una modifica locale non deve richiedere un nuovo commit della fonte.
|
||||
|
||||
Si riusa l'attivazione Evidence esistente dove serve a verificare un candidato e
|
||||
a recuperare da errori; l'assenza di lettori contemporanei non rende atomici file
|
||||
e Qdrant. La mutazione resta circoscritta alle Evidence e preserva Schema, relazioni,
|
||||
LSH e Memory. Il suo successo non cancella blocchi di readiness del Catalog.
|
||||
|
||||
Le verifiche prioritarie coprono il percorso draft → raffinamento → elenco/CRUD
|
||||
locale → ricerca, persistenza dopo riavvio, retry dopo errore, mancata ricomparsa
|
||||
delle unità eliminate, refresh con correzioni locali, isolamento dei workspace e
|
||||
conservazione dell'archivio locale dopo Clear. Le prove di aggiornamento live da
|
||||
amministrazione vengono eliminate; resta la verifica delle correzioni deliberate
|
||||
dal core stesso.
|
||||
|
||||
L'ordine resta Memory, Evidence e integrazione finale. I dettagli degli incrementi
|
||||
nei due piani sono lavoro interno; per l'utente rimangono due gestioni autonome.
|
||||
@@ -0,0 +1,343 @@
|
||||
# M1 — Archivio autorevole e amministrazione delle Memory Card
|
||||
|
||||
Data: 2026-09-08. Stato: M1 implementato e verificato localmente;
|
||||
confini di test confermati dal proprietario il 2026-09-08.
|
||||
|
||||
Primo incremento del progetto Memory management. Attua le decisioni già approvate
|
||||
nel piano del 2026-09-08 e nell'ADR 0018. Le scelte tecniche di dettaglio qui
|
||||
proposte derivano dalla ricognizione del runtime. Gli esiti dell'implementazione
|
||||
sono riportati nel [rapporto di verifica](2026-09-08-memory-m1-validation.md).
|
||||
|
||||
## Problem Statement
|
||||
|
||||
L'amministratore deve poter trovare, leggere e curare tutta la conoscenza
|
||||
riutilizzabile di un workspace: chiarimenti di dominio, regole SQL, domande
|
||||
risolte ed errori compresi da evitare. Oggi manca una pagina amministrativa
|
||||
dedicata e l'archivio è frammentato: le Memory sono registrate in JSONL, mentre
|
||||
gli exemplar delle domande risolte sono indicizzati attraverso un percorso distinto.
|
||||
|
||||
Questa situazione non offre un unico archivio completo di card, collegamenti e
|
||||
dipendenze strutturate. La disponibilità dell'indice non deve determinare se una
|
||||
card è consultabile o modificabile. Una modifica o cancellazione deve inoltre
|
||||
impedire che una ricerca successiva utilizzi contenuti superati, anche se
|
||||
l'aggiornamento dell'indice fallisce.
|
||||
|
||||
## Solution
|
||||
|
||||
Consegnare la pagina **Memory management** in Administration e un archivio
|
||||
PostgreSQL autorevole, appartenente al modulo Memory. La pagina consente elenco
|
||||
completo, ricerca testuale, filtri, dettaglio, creazione, modifica, cancellazione
|
||||
e gestione dei collegamenti. I contenuti restano consultabili con embedding o
|
||||
Qdrant indisponibili, purché PostgreSQL sia disponibile.
|
||||
|
||||
Un salvataggio aggiorna insieme card, collegamenti e dipendenze, poi propaga la
|
||||
modifica a Qdrant. L'amministratore vede se il contenuto è stato salvato e se è
|
||||
disponibile al recall. Se la propagazione fallisce può riprovarla, anche dopo un
|
||||
riavvio. I contenuti rimossi o superati non sono utilizzati dal recall.
|
||||
|
||||
M1 consegna l'amministrazione e la coerenza dell'archivio. La ricerca ibrida con
|
||||
espansione dei collegamenti e il nuovo riepilogo del workflow sono gli incrementi
|
||||
M2 e M3, entrambi ancora obbligatori per completare il progetto Memory.
|
||||
|
||||
## User Stories
|
||||
|
||||
1. Come amministratore, voglio aprire Memory management da Administration, così
|
||||
da curare la conoscenza senza avviare una sessione.
|
||||
2. Come amministratore, voglio scegliere esplicitamente il workspace da
|
||||
amministrare, così da sapere a quale archivio appartiene ogni operazione.
|
||||
3. Come amministratore, voglio elencare tutte le card del workspace, così da
|
||||
raggiungere anche quelle che non compaiono nel recall semantico.
|
||||
4. Come amministratore, voglio cercare per testo o identificatore e ordinare i
|
||||
risultati, così da trovare una card senza conoscerne la formulazione esatta.
|
||||
5. Come amministratore, voglio combinare filtri per famiglia, concetti, riferimenti
|
||||
a tabelle o colonne, provenienza e aggiornamento, così da restringere l'intero
|
||||
archivio prima della paginazione.
|
||||
6. Come amministratore, voglio leggere contenuto completo, ambito, motivazione e
|
||||
provenienza disponibile, così da capire quando una card è applicabile.
|
||||
7. Come amministratore, voglio creare una card manuale senza inventare una sessione
|
||||
o una decisione di origine, così da registrare conoscenza curata direttamente.
|
||||
8. Come amministratore, voglio rappresentare chiarimenti, regole SQL, domande
|
||||
risolte ed errori compresi, così da conservare i contenuti concordati.
|
||||
9. Come amministratore, voglio conservare domanda, SQL e contesto di un exemplar,
|
||||
così da distinguerlo da una regola generale.
|
||||
10. Come amministratore, voglio associare dipendenze esplicite a database, tabelle
|
||||
e colonne, così da non affidare l'identificazione degli oggetti al testo libero.
|
||||
11. Come amministratore, voglio correggere i campi consentiti dalla famiglia e
|
||||
annullare una modifica non salvata, così da controllare il contenuto corrente.
|
||||
12. Come amministratore, voglio ricevere errori di validazione comprensibili senza
|
||||
perdere il testo inserito, così da poterlo correggere.
|
||||
13. Come amministratore, voglio creare, modificare e cancellare collegamenti con
|
||||
destinazione e significato espliciti, così da curare le relazioni fra card.
|
||||
14. Come amministratore, voglio salvare card e modifiche correlate come un'unica
|
||||
operazione, così da non lasciare collegamenti o dipendenze parziali.
|
||||
15. Come amministratore, voglio cancellare una card e i suoi collegamenti
|
||||
incidenti conservando le altre card, così da rimuovere solo il contenuto scelto.
|
||||
16. Come amministratore, voglio ritrovare le modifiche dopo riapertura della pagina
|
||||
e riavvio del servizio, così da verificare che il salvataggio sia persistente.
|
||||
17. Come amministratore, voglio consultare e curare l'archivio quando embedding o
|
||||
Qdrant sono indisponibili, così da proseguire il lavoro amministrativo.
|
||||
18. Come amministratore, voglio distinguere archivio vuoto e archivio non
|
||||
disponibile, così da non interpretare un guasto come perdita dei dati.
|
||||
19. Come amministratore, voglio distinguere salvataggio fallito e contenuto
|
||||
salvato con indicizzazione incompleta, così da scegliere il recupero corretto.
|
||||
20. Come amministratore, voglio riprovare una propagazione incompleta anche dopo
|
||||
un riavvio o una cancellazione, così da completare la pulizia dell'indice.
|
||||
21. Come reviewer, voglio che una nuova ricerca escluda card eliminate o contenuti
|
||||
superati, così da ricevere soltanto conoscenza corrente.
|
||||
22. Come reviewer, voglio che gli exemplar rimangano consultativi e che una Memory
|
||||
recuperata non costituisca approvazione, così da conservare il controllo del workflow.
|
||||
23. Come amministratore, voglio che reindicizzazione e preprocessing rispettino le
|
||||
cancellazioni e le correzioni, così da non doverle ripetere.
|
||||
24. Come operatore dell'installazione, voglio preparare lo schema e configurare
|
||||
l'accesso Memory con i meccanismi esistenti, così da avviarlo senza nuovi servizi.
|
||||
25. Come proprietario del workspace, voglio che API e comandi rispettino il
|
||||
contesto autorizzato, così da evitare accessi o collegamenti fra archivi diversi.
|
||||
26. Come proprietario del workspace, voglio che il CRUD Memory lasci invariati
|
||||
Evidence e metadati del database, così da mantenere distinte le responsabilità.
|
||||
|
||||
## Implementation Decisions
|
||||
|
||||
### Responsabilità e punti d'ingresso
|
||||
|
||||
- Il modulo Memory del harness possiede modello, validazione, repository,
|
||||
mutazioni, collegamenti, dipendenze e coerenza delle proiezioni. PostgreSQL è
|
||||
autorevole; Qdrant contiene una proiezione ricostruibile.
|
||||
- I comandi Memory esistenti diventano adattatori del medesimo servizio. La
|
||||
superficie viene completata con creazione manuale, gestione dei collegamenti,
|
||||
elenco delle propagazioni incomplete e retry. Nessuna logica di persistenza
|
||||
Memory viene duplicata nel backend.
|
||||
- Il backend espone API amministrative attraverso il runner del harness,
|
||||
associando principal attendibile e configurazione del workspace alla richiesta.
|
||||
Si conservano opzioni di configurazione per comando e output JSON puro.
|
||||
- La ricognizione conferma che il harness usa già SQLAlchemy e PostgreSQL per le
|
||||
sessioni. Se ne riusano i meccanismi adatti, mantenendo separati modello,
|
||||
migrazioni e proprietà dei dati Memory. Il repository in memoria del Metadata
|
||||
Catalog è un test double del Catalog, non il modulo Memory.
|
||||
|
||||
### Modello e transazioni
|
||||
|
||||
- La card ha identità stabile, workspace, famiglia/contenuto, titolo o soggetto,
|
||||
ambito, motivazione, provenienza, concetti e date di creazione/aggiornamento.
|
||||
Le domande risolte conservano anche domanda, SQL e contesto. L'identità di una
|
||||
card manuale non dipende da una sessione né dal solo testo.
|
||||
- Il modello rappresenta le quattro categorie di contenuto approvate senza
|
||||
imporre quattro nuovi kind vettoriali o la corrispondenza con i tipi del ledger.
|
||||
Le origini manuali sono distinguibili; sessione e decisione sono riferimenti
|
||||
opzionali quando effettivamente disponibili.
|
||||
- I collegamenti sono record propri del modulo con sorgente, destinazione e
|
||||
significato. Le due card devono esistere nello stesso workspace. La cancellazione
|
||||
di una card elimina i collegamenti incidenti, senza propagarsi alle altre card.
|
||||
- Le dipendenze identificano esplicitamente database, schema, tabella e colonna
|
||||
secondo l'ambito applicabile. Il contratto consente il futuro confronto con
|
||||
lo schema fisico. Un cleanup dei metadati Catalog non deve poter cancellare
|
||||
card attraverso una cascata implicita di chiavi esterne.
|
||||
- Le tabelle logiche necessarie sono card, collegamenti, dipendenze e stato
|
||||
operativo delle proiezioni. Card e modifiche correlate si aggiornano nella
|
||||
stessa transazione. Una validazione o scrittura fallita non lascia aggiornamenti
|
||||
parziali. Non si conserva una storia delle revisioni del contenuto.
|
||||
- Le modifiche ordinarie non spostano una card in un altro workspace. Tutti gli
|
||||
identificatori ricevuti vengono verificati nel workspace dell'operazione,
|
||||
inclusi estremi dei collegamenti e riferimenti delle azioni di retry.
|
||||
|
||||
### Salvataggio, cancellazione e recall
|
||||
|
||||
- Il servizio valida l'intera mutazione, registra il nuovo stato autorevole e
|
||||
il lavoro di propagazione nella stessa transazione PostgreSQL, poi aggiorna
|
||||
Qdrant nello stesso flusso di salvataggio. Si completa un'operazione alla volta;
|
||||
non occorrono una coda generale, un worker o una sincronizzazione continua.
|
||||
- Lo stato persistente è sufficiente a distinguere la proiezione del contenuto
|
||||
corrente da una proiezione precedente e a ritentare l'azione dopo un riavvio.
|
||||
Può usare una versione tecnica o un'impronta interna; non è una cronologia
|
||||
editoriale né un ulteriore stato che l'utente debba gestire.
|
||||
- Un risultato Qdrant è utilizzabile solo se corrisponde a una card autorevole
|
||||
corrente del workspace e a una proiezione valida. Il contenuto restituito
|
||||
viene dall'archivio autorevole. La verifica si applica anche agli exemplar.
|
||||
In assenza di verifica autorevole il recall non restituisce il vecchio payload.
|
||||
- Dopo il commit PostgreSQL, una propagazione fallita lascia il contenuto
|
||||
consultabile nell'amministrazione e la sua proiezione non utilizzabile dal
|
||||
recall fino al recupero. L'esito distingue chiaramente questo caso da un
|
||||
salvataggio fallito prima del commit.
|
||||
- La cancellazione rimuove card, collegamenti incidenti e dipendenze e conserva
|
||||
soltanto i dati operativi necessari a eliminare la proiezione. La card non è
|
||||
più richiamabile anche se il punto Qdrant esiste ancora. La pulizia pendente
|
||||
resta raggiungibile dalla pagina, senza richiedere il dettaglio della card eliminata.
|
||||
- Il retry è esplicito e ripetibile. Usa lo stato corrente del repository, non
|
||||
il contenuto di una vecchia richiesta. Un retry superato non può sovrascrivere
|
||||
una correzione successiva né ricreare una card cancellata.
|
||||
- La ricostruzione degli indici Memory e solved-question usa esclusivamente
|
||||
le card autorevoli. Non reimporta automaticamente il registro JSONL, i payload
|
||||
Qdrant o le sessioni di origine. Il preprocessing delle reference mantiene
|
||||
la separazione delle collezioni stabilita nell'ADR 0017.
|
||||
- Anche i produttori attuali di Memory ed exemplar scrivono attraverso il
|
||||
servizio autorevole. Si adeguano promozione, salvataggio singolo e percorso di
|
||||
finalizzazione quanto necessario a evitare scritture dirette al solo indice.
|
||||
Un errore successivo al commit della sessione non deve annullarne la finalizzazione;
|
||||
l'esito e il recupero Memory restano espliciti. Questa transizione non introduce
|
||||
il nuovo riepilogo di approvazione previsto da M3.
|
||||
|
||||
### API, autorizzazione e configurazione
|
||||
|
||||
- Il contratto amministrativo comprende elenco, dettaglio, creazione,
|
||||
aggiornamento, cancellazione, manutenzione dei collegamenti, stato delle
|
||||
propagazioni incomplete e retry. Le mutazioni restituiscono identità interessata,
|
||||
esito del salvataggio ed esito della propagazione; gli errori non espongono segreti.
|
||||
- L'elenco restituisce pagina, conteggio totale filtrato e ordinamento stabile
|
||||
con identificatore come discriminante. Ricerca testuale e filtri combinabili
|
||||
agiscono sull'intero archivio prima della paginazione, senza embedding.
|
||||
- Il backend distingue input invalido, accesso negato, record assente nel
|
||||
workspace richiesto, archivio indisponibile e propagazione incompleta dopo
|
||||
salvataggio. Un archivio indisponibile non produce una lista vuota riuscita.
|
||||
- Si riusano autenticazione, controlli di accesso e trasmissione del principal.
|
||||
Il catalogo attuale non ha un permesso Memory dedicato: la proposta è aggiungere
|
||||
la capability amministrativa Memory al ruolo admin esistente, senza introdurre
|
||||
ruoli nuovi. Il controllo copre anche letture amministrative e retry.
|
||||
- Le operazioni amministrative e i comandi esposti non permettono bypass del
|
||||
controllo nel harness. Le scritture già previste dal workflow conservano il
|
||||
proprio contesto autorizzato di sessione; non diventano CRUD amministrativo
|
||||
liberamente accessibile a un utente ordinario. Il recall rimane accessibile
|
||||
secondo le regole del workflow.
|
||||
- M1 include configurazione della connessione al PostgreSQL dell'installazione,
|
||||
distribuzione protetta delle credenziali al harness, migrazioni versionate e
|
||||
privilegi runtime necessari alle sole tabelle Memory. Si riusano i meccanismi
|
||||
di configurazione generata, segreti e provisioning esistenti; non si usano le
|
||||
credenziali di lettura del DWH. I nomi fisici di schema, tabelle e parametri
|
||||
vengono fissati nell'implementazione rispettando questi contratti.
|
||||
- Le migrazioni sono eseguite dal percorso di preparazione dell'installazione,
|
||||
non da una richiesta HTTP ordinaria. Schema mancante o non aggiornato produce
|
||||
un errore operativo comprensibile. La transizione non prevede doppie scritture
|
||||
permanenti o conservazione del comportamento delle sessioni storiche.
|
||||
|
||||
### Pagina amministrativa
|
||||
|
||||
- Memory management è un accesso indipendente nell'Administration dell'AppShell,
|
||||
immediatamente dopo Database management, senza richiedere una sessione attiva
|
||||
o l'ingresso in Database management.
|
||||
- La pagina rende esplicito il workspace e offre lista paginata, ricerca,
|
||||
filtri, ordinamento, dettaglio completo e form. Le modifiche hanno salvataggio,
|
||||
annullamento e validazione. La cancellazione rende chiari contenuto interessato
|
||||
e rimozione dei collegamenti, seguendo le convenzioni UI esistenti.
|
||||
- Il feedback distingue operazione in corso, salvataggio fallito, contenuto
|
||||
salvato con indice incompleto e operazione completata. Il recupero delle
|
||||
cancellazioni pendenti è disponibile anche quando la card non compare più in lista.
|
||||
- I controlli sono accessibili da tastiera e hanno etichette comprensibili.
|
||||
Chrome e messaggi UI sono in inglese; il contenuto resta nella lingua del workspace.
|
||||
Hash, versioni tecniche e dettagli delle tabelle non sono esposti nel flusso ordinario.
|
||||
|
||||
## Testing Decisions
|
||||
|
||||
Confini confermati dal proprietario: usare tre confini già presenti nel
|
||||
repository, concentrando la maggior parte dei casi sul servizio pubblico Memory
|
||||
del harness. I test osservano risultati, persistenza ed errori; non vincolano
|
||||
metodi privati, numero di query o disposizione interna delle tabelle.
|
||||
|
||||
### 1. Servizio pubblico Memory e suoi comandi
|
||||
|
||||
Usare PostgreSQL reale in testcontainers, come nei test del repository delle
|
||||
sessioni, e gli adapter vettoriali sostituibili già impiegati nei test di recall
|
||||
e del ciclo di vita solved-question. Gli embedding dei casi deterministici sono
|
||||
controllati. Un gruppo mirato con Qdrant reale verifica aggiornamento, cancellazione
|
||||
e ricostruzione della proiezione; non richiede DWH remoto o un modello generativo.
|
||||
|
||||
Questo confine verifica il comportamento di archivio, propagazione e recall:
|
||||
|
||||
| Caso | Risultato osservabile richiesto |
|
||||
| --- | --- |
|
||||
| Creare e riaprire il repository | La card completa, i collegamenti e le dipendenze sono persistiti; l'origine manuale non contiene sessioni inventate. |
|
||||
| Salvare una card di ciascuna categoria | Contenuto, ambito e dati specifici sono rappresentabili e leggibili senza dipendere dai tipi del ledger. |
|
||||
| Cercare un record fuori dalla prima pagina | Filtri combinati, totale e ordinamento si riferiscono all'intero archivio. |
|
||||
| Fallire una scrittura correlata | Card, collegamenti e dipendenze mantengono tutti lo stato precedente. |
|
||||
| Indicare una card di un altro workspace | Lettura, mutazione, collegamento e retry non accedono al contenuto estraneo. |
|
||||
| Cancellare una card collegata | Scompaiono card e collegamenti incidenti; le altre card restano intatte. |
|
||||
| Rendere embedding o Qdrant indisponibili | Elenco e dettaglio funzionano; il CRUD persiste e distingue la propagazione incompleta. |
|
||||
| Fallire PostgreSQL prima del commit | Nessun falso salvataggio riuscito e nessun nuovo contenuto propagato. |
|
||||
| Fallire Qdrant dopo un aggiornamento | Il dettaglio contiene la correzione; il recall esclude il vecchio risultato. |
|
||||
| Fallire Qdrant dopo una cancellazione | La card non è richiamabile; il lavoro di pulizia resta visibile e recuperabile. |
|
||||
| Riavviare fra commit e propagazione | Il lavoro incompleto permane e un retry lo completa. |
|
||||
| Ritentare dopo un errore o un esito incerto | Non si creano duplicati; si applica lo stato corrente senza ripristinare contenuti superati. |
|
||||
| Indice con punto orfano o versione superata | Recall Memory ed exemplar lo escludono anche se ha il punteggio più alto. |
|
||||
| PostgreSQL indisponibile durante il recall | Il servizio segnala l'indisponibilità senza servire payload non verificati. |
|
||||
| Ricostruire dopo modifica o cancellazione | Il contenuto corretto è conservato; nessuna card viene ricreata dalle sessioni o da vecchi indici. |
|
||||
| Eseguire promozione o finalizzazione corrente | I nuovi contenuti passano dall'archivio; un errore Memory successivo non annulla una sessione già finalizzata. |
|
||||
| Applicare migrazioni e riavviare | Lo schema è utilizzabile con il ruolo runtime previsto; la preparazione è ripetibile e non richiede privilegi di migrazione nelle richieste ordinarie. |
|
||||
|
||||
I test CLI coprono solo l'adattamento che il servizio non prova: parsing, principal,
|
||||
workspace, esiti macchina e JSON puro. I test di integrazione riusano le convenzioni
|
||||
L0 del harness. I test di recall esistenti continuano a verificare che decisioni
|
||||
già registrate nella sessione e famiglie non ammesse non vengano riproposte.
|
||||
|
||||
### 2. API amministrative Fastify
|
||||
|
||||
Usare l'iniezione HTTP e il runner sostituibile già presenti nei test backend,
|
||||
seguendo i test delle route Catalog e dell'autorizzazione. Verificare principal
|
||||
autenticato, admin e utente ordinario; validazione; selezione del workspace;
|
||||
contratto delle risposte e mappatura degli errori. Includere letture, collegamenti
|
||||
e retry, non soltanto le mutazioni delle card.
|
||||
|
||||
Questi test provano il confine HTTP e il passaggio al harness. Non si considera
|
||||
il runner simulato una prova della transazione PostgreSQL o della coerenza Qdrant.
|
||||
La normale policy CSRF dell'applicazione resta applicata alle nuove mutazioni.
|
||||
|
||||
### 3. Pagina nell'AppShell
|
||||
|
||||
Usare React Testing Library, MSW e le convenzioni dei test di AppShell e Database
|
||||
management. Verificare ingresso amministrativo, scelta workspace, lista completa,
|
||||
filtri, dettaglio, form, annullamento, errori, collegamenti e retry dopo cancellazione.
|
||||
Controllare il comportamento tramite elementi accessibili e contenuto visibile.
|
||||
|
||||
Un percorso browser mirato sullo stack reale collega i tre confini: amministratore
|
||||
autenticato, creazione manuale, modifica, riapertura della pagina, cancellazione
|
||||
e verifica dell'assenza nel recall. I test browser con API intercettate provano
|
||||
interazione e presentazione; non vengono dichiarati prova della persistenza.
|
||||
|
||||
Non si replica l'intera matrice su tutti e tre i confini. PostgreSQL, indice e
|
||||
recupero sono verificati nel harness; autenticazione e trasporto nel backend;
|
||||
interazione e feedback nella UI. Il percorso integrato copre il collegamento reale.
|
||||
|
||||
### Verifica della consegna
|
||||
|
||||
Eseguire i test interessati e i gate documentati dei layer modificati, inclusi
|
||||
typecheck TypeScript, lint Python e build documentale strict. Le verifiche con
|
||||
PostgreSQL, Qdrant e browser reale hanno esito riportato separatamente; se un
|
||||
servizio necessario manca, il relativo gate resta aperto.
|
||||
|
||||
M1 non richiede una valutazione della qualità SQL generata da un LLM. I test
|
||||
deterministici non sono presentati come prova di tale capacità: gli eventuali
|
||||
casi reali appartengono agli incrementi che cambiano generazione e workflow.
|
||||
|
||||
## Out of Scope
|
||||
|
||||
- Ricerca ibrida, nuova selezione per ambito ed espansione dei collegamenti: M2.
|
||||
- Riepilogo finale modificabile, nuove categorie nei gate e pulizia dopo una
|
||||
sincronizzazione fisica del Catalog: M3. M1 ne prepara card e dipendenze.
|
||||
- Authoring, consolidamento e manutenzione Evidence: E1–E3; risoluzione persistente
|
||||
congiunta dei conflitti fra Memory ed Evidence: X1.
|
||||
- Revisione storica delle card, snapshot per vecchie sessioni, migrazione dei dati
|
||||
di sviluppo o compatibilità con il registro JSONL come archivio operativo.
|
||||
- Aggiornamento a caldo delle altre sessioni, nuove invalidazioni dello SQL già
|
||||
generato, coordinamento generale dei lettori paralleli e modalità manutenzione.
|
||||
- Nuovi servizi PostgreSQL o graph database, code generiche, worker e polling continuo.
|
||||
- Promozione automatica di rifiuti senza spiegazione o scelte occasionali,
|
||||
consolidamento automatico e benchmark generale della qualità del modello.
|
||||
- Deploy o pulizia dell'installazione PSD: restano soggetti ai rispettivi piani e gate.
|
||||
|
||||
## Further Notes
|
||||
|
||||
Fonti: progetto **Memory management** del 2026-09-08; piano comune
|
||||
**Amministrazione di Memory ed Evidence**; **Revisione di semplicità: Memory ed
|
||||
Evidence**; glossario di dominio; ADR 0017 sulla separazione delle collezioni e
|
||||
ADR 0018 su PostgreSQL autorevole e Qdrant per il retrieval.
|
||||
|
||||
La ricognizione ha verificato MemoryRecord, recall ordinario, ricerca degli
|
||||
exemplar, comandi Memory, repository PostgreSQL delle sessioni, runner del harness,
|
||||
autorizzazione backend e navigazione amministrativa. Il recall ordinario oggi
|
||||
risolve già i risultati nel registro autorevole, mentre gli exemplar leggono
|
||||
contenuti dal payload vettoriale: M1 deve uniformare entrambe le garanzie.
|
||||
|
||||
Le scelte tecniche da fissare durante l'implementazione sono nomi e DDL delle
|
||||
tabelle, firma esatta dei nuovi comandi/API e parametri generati di connessione.
|
||||
Devono rispettare i contratti e i casi di accettazione di questa specifica;
|
||||
non riaprono le decisioni di prodotto approvate.
|
||||
|
||||
La destinazione della specifica è il tracker Gitea canonico di ThothII, con
|
||||
etichetta **ready-for-agent**. Il proprietario ha confermato i confini di test
|
||||
e autorizzato la pubblicazione il 2026-09-08. L'implementazione resta da eseguire.
|
||||
@@ -0,0 +1,103 @@
|
||||
# M1 — Implementazione e verifica
|
||||
|
||||
Data: 2026-09-08. Implementazione locale della
|
||||
[specifica approvata](2026-09-08-memory-m1-spec.md), associata all'
|
||||
[issue 27](https://git.tylconsulting.it/mptyl/ThothII/issues/27).
|
||||
|
||||
## Risultato
|
||||
|
||||
La pagina **Memory management** è disponibile nell'Administration dopo Database
|
||||
management. Gestisce le quattro famiglie di card, elenco completo, ricerca e filtri,
|
||||
ordinamento, dettaglio, creazione, modifica, cancellazione, collegamenti e dipendenze.
|
||||
Richiede un amministratore autenticato e una selezione esplicita del workspace;
|
||||
non richiede una sessione o un database DWH configurato.
|
||||
|
||||
Il harness possiede l'archivio PostgreSQL `thoth_memory`. Card, collegamenti,
|
||||
dipendenze e lavoro di propagazione sono salvati nella stessa transazione.
|
||||
La pagina distingue salvataggio fallito e contenuto salvato con indice incompleto,
|
||||
offrendo retry anche per le cancellazioni. Recall Memory ed exemplar verificano
|
||||
esistenza, workspace e proiezione corrente nell'archivio prima di restituire contenuto.
|
||||
|
||||
Promozione, salvataggio singolo e finalizzazione corrente passano dal servizio
|
||||
autorevole. Le ricevute della sorgente impediscono duplicati e ricreazione di card
|
||||
cancellate. Reindicizzazione e preprocessing non importano vecchi payload o sessioni.
|
||||
L'errore Memory non annulla una sessione già finalizzata; il gate segnala anche
|
||||
una promozione salvata con indicizzazione incompleta.
|
||||
|
||||
Le migrazioni sono versionate, controllate tramite checksum e incluse nel wheel
|
||||
e nell'immagine core. Il servizio di preparazione `catalog-migrate` le esegue dopo
|
||||
quelle del Catalog. Il runtime assume il ruolo limitato `thoth_memory_runtime`,
|
||||
con isolamento del workspace tramite RLS e senza privilegi DDL.
|
||||
|
||||
## Verifiche eseguite
|
||||
|
||||
| Confine | Esito |
|
||||
| --- | --- |
|
||||
| Harness, test senza L0/L2 | 1.134 passati; i 9 test dei percorsi portabili sono stati eseguiti separatamente e sono passati. |
|
||||
| Servizio Memory, PostgreSQL e Qdrant reali | 17 passati, inclusi CLI, migrazioni, ruolo runtime, isolamento, transazioni, outage, retry, cancellazioni, cambio famiglia e rebuild. |
|
||||
| Gate Pi | 190 passati, inclusi identità UUID e avviso dopo salvataggio con indice incompleto. |
|
||||
| Backend | 1.345 passati nella suite completa, 40 esclusi dalle condizioni previste dai test; un test di autenticazione ha superato il timeout sotto carico. Il relativo file è stato rieseguito isolato: tutti i 17 test passati. |
|
||||
| Frontend | 632 passati, inclusi ingresso dall'AppShell, form, filtri, collegamenti, dipendenze e retry delle cancellazioni. |
|
||||
| Browser integrato | Passato: autenticazione amministratore, creazione, modifica, riavvio del backend, rilettura, cancellazione e assenza nel recall. |
|
||||
| Build e tipi | Build backend e frontend, typecheck TypeScript e build documentale strict superati. |
|
||||
| Lint e diff | Ruff sui file Python modificati e `git diff --check` superati. Il lint globale segnala tre rilievi in file non modificati, elencati sotto. |
|
||||
|
||||
Il browser utilizza autenticamente frontend, login locale, Fastify, ThtRunner,
|
||||
CLI Python, PostgreSQL e Qdrant. Gli embedding sono deterministici e le attività
|
||||
Pi/sessione estranee al percorso Memory usano le fixture esistenti. Non sono state
|
||||
intercettate le API Memory. Sono stati usati container temporanei PostgreSQL 16 e
|
||||
Qdrant 1.18.2, senza accesso a un DWH remoto o a un modello generativo.
|
||||
|
||||
Il test browser ha consentito di correggere etichette accessibili instabili nei
|
||||
campi compilati e la sovrapposizione del pannello di recupero ai comandi del dettaglio.
|
||||
La selezione del workspace e l'uscita dalla pagina sono bloccate durante le operazioni.
|
||||
|
||||
Il lint globale preesistente riguarda soltanto:
|
||||
|
||||
- ordinamento import in `harness/tests/test_effective_relationships.py`;
|
||||
- ordinamento import in `harness/tests/test_p3_dwh_binding.py`;
|
||||
- uso di `datetime.UTC` in `harness/tht/mschema/catalog_snapshot.py`.
|
||||
|
||||
## Riproduzione
|
||||
|
||||
Usare Node 24 e le dipendenze installate dei tre layer. Per eseguire il harness
|
||||
in un ambiente con home non scrivibile si può impostare `THT_HOME` su una directory
|
||||
di prova. I test dei percorsi portabili devono essere eseguiti senza questo override,
|
||||
perché verificano deliberatamente la risoluzione dell'home e di `THT_DATA_ROOT`.
|
||||
|
||||
```sh
|
||||
cd harness
|
||||
THT_HOME=/private/tmp/thothii-m1-test-home .venv/bin/pytest -m 'not l0 and not l2' --ignore=tests/test_portable_paths.py -q
|
||||
.venv/bin/pytest tests/test_portable_paths.py -q
|
||||
.venv/bin/pytest tests/memory/test_administration.py -q
|
||||
npm test
|
||||
```
|
||||
|
||||
```sh
|
||||
cd backend
|
||||
npx vitest run
|
||||
npx tsc --noEmit -p .
|
||||
npm run build
|
||||
```
|
||||
|
||||
```sh
|
||||
cd frontend
|
||||
npx vitest run
|
||||
npx tsc -b
|
||||
npm run build
|
||||
THT_MEMORY_BROWSER_E2E=1 npx playwright test e2e/memory-real.spec.ts
|
||||
```
|
||||
|
||||
Il percorso browser richiede Docker, Python del harness, Go per il bridge di
|
||||
autenticazione e Chromium di Playwright. Avvia risorse isolate e le rimuove alla
|
||||
fine. Su macOS il browser deve poter avviare i processi Chromium fuori dalle
|
||||
restrizioni della sandbox. La build documentale si esegue dalla radice con
|
||||
`./scripts/build-docs.sh`.
|
||||
|
||||
## Stato della consegna
|
||||
|
||||
Le modifiche sono nel worktree locale. Nessuno stack già attivo è stato aggiornato
|
||||
e nessun dato esistente è stato migrato o eliminato. Prima di usare M1 su
|
||||
un'installazione occorrono il nuovo core e la preparazione `catalog-migrate`.
|
||||
M2 (retrieval ibrido ed espansione dei collegamenti), M3 (integrazione estesa nel
|
||||
workflow) ed Evidence management restano incrementi successivi.
|
||||
@@ -0,0 +1,342 @@
|
||||
# Progetto: Memory management
|
||||
|
||||
Data del piano: 2026-09-08. Aggiornamento 2026-09-09: M1–M3 implementati,
|
||||
con integrazione X1 per le correzioni persistenti dei conflitti. Risultati e limiti
|
||||
sono raccolti nel [rapporto X1](2026-09-09-archive-repair-x1-validation.md).
|
||||
|
||||
La [revisione di semplicità](2026-09-08-memory-evidence-simplification-review.md)
|
||||
mantiene il perimetro Memory e precisa un salvataggio sequenziale e una pulizia
|
||||
diretta dopo sincronizzazione. Non si progetta l'amministrazione contemporanea
|
||||
all'attività core.
|
||||
|
||||
Il progetto realizza il CRUD amministrativo previsto dalla discussione sull'evoluzione
|
||||
della Memory. Segue le [decisioni comuni di Administration](2026-09-08-memory-evidence-administration.md)
|
||||
e rimane distinto dal [progetto Evidence management](2026-09-08-evidence-management.md).
|
||||
|
||||
## Risultato richiesto
|
||||
|
||||
Un amministratore apre Memory management direttamente da Administration, cerca e
|
||||
filtra l'intero archivio di un workspace e gestisce le card senza avviare una sessione.
|
||||
La voce è immediatamente sotto Database management, allo stesso livello.
|
||||
|
||||
L'elenco comprende le Memory riutilizzabili e gli exemplar `solved_question`,
|
||||
distinguibili per famiglia. La modifica di un exemplar non riscrive gli artefatti
|
||||
della sessione da cui deriva e non lo trasforma in una decisione applicabile al gate.
|
||||
|
||||
## Contenuti ammessi: decisione del proprietario
|
||||
|
||||
Il perimetro concordato il 2026-09-08 comprende quattro categorie di contenuto.
|
||||
La classificazione descrive il valore della conoscenza; non impone quattro nuovi
|
||||
kind tecnici o una corrispondenza con i tipi delle decisioni del ledger.
|
||||
|
||||
| Contenuto | Cosa conserva | Esempio inventato |
|
||||
| --- | --- | --- |
|
||||
| Chiarimento di dominio | Significato riutilizzabile di un termine, con il suo ambito | «In questo workspace, ordine evaso significa che tutte le righe sono state spedite.» |
|
||||
| Regola SQL | Regola corretta per join, filtri o aggregazioni, con condizioni e motivazione | «Il codice commessa è univoco solo all'interno dell'esercizio: collegare movimenti e commesse usando codice ed esercizio.» |
|
||||
| Domanda risolta | Domanda, SQL approvato e contesto, come exemplar consultativo | «Totale degli ordini del 2024 per cliente», con la query che lo calcola. |
|
||||
| Errore da evitare | Errore compreso, motivo e comportamento corretto approvato | «Il join fra ordini e righe moltiplica il totale di testata: calcolare il totale una sola volta per ordine.» |
|
||||
|
||||
Il criterio di ammissione è l'utilità per altre domande nello stesso ambito.
|
||||
Una scelta come «questa volta usa il 2024» non è una regola riutilizzabile; il 2024
|
||||
può rimanere nel contesto della domanda risolta. Analogamente, la selezione di una
|
||||
tabella per una domanda non diventa automaticamente una regola di schema linking.
|
||||
|
||||
La categoria «errore da evitare» richiede una spiegazione verificata e approvata.
|
||||
Un timeout, una query rifiutata senza motivo o una proposta non selezionata non
|
||||
bastano a produrre conoscenza. Quando errore e correzione esprimono la stessa
|
||||
regola, una sola card conserva la regola e la sua motivazione.
|
||||
|
||||
## Formazione, aggiornamento e uso delle card
|
||||
|
||||
### Decisioni del primo round di grill-with-docs
|
||||
|
||||
Il proprietario ha approvato le tre raccomandazioni il 2026-09-08:
|
||||
|
||||
- **Q1, approvazione del salvataggio:** riepilogo finale modificabile, preparato
|
||||
durante il lavoro. Il reviewer corregge le card e sceglie quali salvare; la
|
||||
creazione manuale da Administration resta sempre disponibile.
|
||||
- **Q2, operazioni proposte dal core:** aggiunte e aggiornamenti espliciti. Il
|
||||
riepilogo distingue una nuova card dalla modifica di una card esistente e ne
|
||||
spiega il cambiamento. La sostituzione richiede la selezione del reviewer;
|
||||
la cancellazione semantica resta un'operazione del CRUD amministrativo. La pulizia
|
||||
automatica dei riferimenti invalidi è disciplinata separatamente da Q5.
|
||||
- **Q3, momento del consumo:** i chiarimenti sono proposti all'inizio, le regole di
|
||||
collegamento durante lo schema linking e le regole di calcolo durante la costruzione
|
||||
SQL. Le approvazioni entrano nei gate pertinenti, senza una domanda separata per
|
||||
ciascuna card; gli exemplar rimangono consultativi.
|
||||
|
||||
Queste sono decisioni di prodotto; i contratti runtime non sono ancora aggiornati.
|
||||
|
||||
### Decisioni del secondo round di grill-with-docs
|
||||
|
||||
Il proprietario ha approvato i chiarimenti su Q4–Q6 il 2026-09-08:
|
||||
|
||||
- **Q4, risoluzione persistente dei conflitti:** il gate propone azioni chiuse e
|
||||
specifiche per il caso, mostrando record interessati, azione e testo o ambito
|
||||
risultante. Le opzioni possono confermare l'Evidence e correggere la Memory,
|
||||
confermare la Memory e preparare una correzione dell'Evidence, oppure precisare
|
||||
gli ambiti distinti di entrambe. È sempre disponibile «Nessuna proposta è adeguata»,
|
||||
che richiede una riformulazione. Le modifiche Memory confluiscono nel riepilogo
|
||||
finale; quelle Evidence seguono l'authoring e la pubblicazione del rispettivo
|
||||
modulo. Come approvato in Q12, accettare la correzione Evidence con le autorizzazioni
|
||||
necessarie avvia anche l'attivazione automatica, senza un ulteriore `Publish`.
|
||||
Il sistema distingue proposte da approvare, aggiornamenti in corso o falliti e
|
||||
archivio già aggiornato. La sola risoluzione della domanda corrente non esaurisce il flusso.
|
||||
- **Q5, cancellazione dopo modifiche allo schema:** dopo una sincronizzazione
|
||||
riuscita dello schema fisico, il backend comunica al modulo Memory gli elementi
|
||||
rimossi. Il modulo identifica tramite dipendenze strutturate le card non più
|
||||
valide e cancella record e proiezioni ricercabili. Non si introduce lo stato
|
||||
«Needs review» per conservarle. Il controllo avviene alla sincronizzazione, senza
|
||||
scansione continua del DWH o interrogazioni aggiuntive a ogni domanda. Un cleanup
|
||||
manuale del Catalog o un errore di accesso al database non prova una rimozione
|
||||
fisica e non avvia questa pulizia. Essa è distinta dalle proposte semantiche del
|
||||
core in Q2. Oggi mancano sia i riferimenti strutturati a colonne nelle Memory sia
|
||||
il collegamento fra sincronizzazione e pulizia: devono essere implementati.
|
||||
- **Q6, verifiche concrete:** lo sviluppatore prepara ed esegue test automatici
|
||||
funzionali per CRUD, filtri, approvazioni, aggiornamenti e cancellazioni. Quando
|
||||
cambia la ricerca, verifica casi mirati con card necessarie e card fuori ambito;
|
||||
quando emerge un errore SQL riproducibile, aggiunge una regressione su dati
|
||||
controllati confrontando i risultati, senza richiedere un identico testo SQL.
|
||||
L'esperto di dominio conferma inizialmente regola e risultato atteso soltanto per
|
||||
i casi reali che lo richiedono. La verifica della generazione necessita di un
|
||||
modello reale ed è separata dalla suite deterministica: una query scritta a mano
|
||||
non prova che il modello sappia generarla. Non si introduce una valutazione umana
|
||||
permanente o un benchmark generale con percentuali di miglioramento promesse.
|
||||
|
||||
### Terzo round: direzione tecnica e capacità di ricerca
|
||||
|
||||
- **Q7, deciso:** il proprietario ha approvato l'evoluzione interna di ThothII.
|
||||
Il modulo riusa l'infrastruttura dell'installazione e integra card, CRUD, mutazioni
|
||||
e recall con i gate; non adotta un framework esterno per governare la Memory.
|
||||
- **Q8, deciso:** il proprietario ha approvato ricerca ibrida in Qdrant e collegamenti
|
||||
espliciti fra card gestiti dal core, senza un database a grafi aggiuntivo. Entrambe
|
||||
le capacità sono incluse nella pianificazione attuale; la presenza dei collegamenti
|
||||
non è rinviata alla futura comparsa di casi concreti.
|
||||
|
||||
La configurazione approvata comprende:
|
||||
|
||||
- ricerca semantica e lessicale ibrida in Qdrant, con filtri sull'ambito;
|
||||
- collegamenti espliciti fra card, proposti e revisionabili, percorsi nel core con
|
||||
espansione limitata e riordinamento dei risultati insieme a quelli della ricerca;
|
||||
- persistenza dei collegamenti coordinata con le card, con rimozione dei riferimenti
|
||||
a contenuti cancellati e rispetto dei confini fra workspace e dei gate;
|
||||
- nessun servizio di database a grafi aggiuntivo.
|
||||
|
||||
La scelta include il grafo logico, senza introdurre un servizio di graph DB.
|
||||
La qualità non è garantita dalla scelta di un motore: mantenere queste capacità
|
||||
evita una rinuncia architetturale ai collegamenti, ma non dimostra equivalenza
|
||||
qualitativa con qualsiasi soluzione basata su graph DB.
|
||||
Qdrant è il motore di ricerca; l'archivio autorevole è PostgreSQL, scelto in Q9.
|
||||
|
||||
Le [query ibride di Qdrant](https://qdrant.tech/documentation/search/hybrid-queries/)
|
||||
e i [filtri sui metadati](https://qdrant.tech/documentation/search/filtering/)
|
||||
coprono le capacità di ricerca indicate. La logica dei collegamenti di dominio
|
||||
nel core è lavoro applicativo da implementare.
|
||||
|
||||
### Decisioni del quarto round di grill-with-docs
|
||||
|
||||
- **Q9, archivio autorevole:** il proprietario ha approvato PostgreSQL, già presente
|
||||
nell'installazione, con tabelle proprie del modulo Memory per card, collegamenti
|
||||
e dipendenze dallo schema. Sostituisce il registro JSONL; Qdrant è l'indice
|
||||
rigenerabile. Le modifiche correlate vengono coordinate in PostgreSQL e la
|
||||
propagazione a Qdrant deve gestire esplicitamente errori e cancellazioni.
|
||||
- **Q10, gestione dei collegamenti:** il core propone i collegamenti insieme alle
|
||||
card, indicando destinazione e significato. Il reviewer li approva nello stesso
|
||||
riepilogo finale, senza un gate aggiuntivo. Administration ne consente creazione,
|
||||
modifica e cancellazione manuali. Quando una card è cancellata vengono rimossi
|
||||
anche i collegamenti che la coinvolgono, conservando le altre card. I collegamenti
|
||||
contribuiscono al recupero e non applicano automaticamente i contenuti.
|
||||
|
||||
La decisione architetturale è registrata nell'[ADR 0018](../adr/0018-use-postgres-for-memory-and-qdrant-for-retrieval.md).
|
||||
|
||||
### Flusso da implementare
|
||||
|
||||
Il flusso seguente traduce le decisioni approvate. I payload e l'integrazione con
|
||||
i gate sono dettagli da definire nell'implementazione, senza altre decisioni di
|
||||
prodotto pendenti.
|
||||
|
||||
1. Durante il lavoro il core individua possibili conoscenze riutilizzabili a partire
|
||||
da decisioni e artefatti registrati. Una candidata esplicita cosa afferma, dove
|
||||
vale, perché è utile e su quale correzione o decisione si basa.
|
||||
2. Prima di proporne il salvataggio confronta la candidata con le card correnti.
|
||||
Un doppione esatto non richiede una nuova card; una somiglianza semantica non
|
||||
autorizza da sola a eliminare o sovrascrivere una conoscenza.
|
||||
3. Alla conclusione del lavoro presenta un riepilogo editabile delle aggiunte e
|
||||
degli aggiornamenti proposti. Il reviewer può correggere il contenuto, restringere
|
||||
l'ambito e scegliere cosa salvare; approvare la query non equivale ad approvare
|
||||
ogni generalizzazione ricavata dalla query.
|
||||
4. Una correzione alla stessa regola nello stesso ambito propone un aggiornamento
|
||||
esplicito della card esistente. Regole valide in ambiti diversi restano distinte;
|
||||
un conflitto irrisolto non viene risolto silenziosamente dal modello.
|
||||
5. Le card salvate sono subito consultabili in Memory management; la loro
|
||||
disponibilità al recall segue lo stato di indicizzazione. La scrittura sostituisce
|
||||
il contenuto corrente senza introdurre una cronologia delle Memory.
|
||||
|
||||
La creazione manuale da Memory management resta disponibile in qualsiasi momento
|
||||
e non dipende dal riepilogo finale di una sessione. La form richiede contenuto e
|
||||
ambito adeguati alla famiglia e identifica l'origine amministrativa.
|
||||
|
||||
Gli exemplar conservano domanda e soluzione approvata come materiale consultativo.
|
||||
Il loro salvataggio non applica le scelte di quella soluzione a domande successive.
|
||||
La distribuzione del consumo nei passaggi pertinenti è decisa in Q3. Restano da
|
||||
definire i payload e l'integrazione con i gate esistenti, compreso il contesto necessario
|
||||
a proporre una regola di collegamento o di calcolo e a registrarne l'approvazione.
|
||||
|
||||
### Scenari per verificare il design
|
||||
|
||||
| Evento | Esito atteso |
|
||||
| --- | --- |
|
||||
| Il reviewer corregge un join perché il codice commessa si ripete fra esercizi e approva la spiegazione. | Proporre la regola con entrambe le chiavi e l'ambito delle tabelle interessate. |
|
||||
| Il reviewer chiede di limitare solo la domanda corrente al 2024. | Nessuna regola generale; mantenere il periodo nell'eventuale exemplar. |
|
||||
| Una query conta più volte lo stesso ordine e la correzione viene spiegata e approvata. | Proporre una card che descrive la granularità corretta e il rischio di duplicazione. |
|
||||
| Una query fallisce per timeout o una memory non viene selezionata. | Nessuna nuova regola dedotta automaticamente dall'evento. |
|
||||
| La candidata ripete esattamente una regola già presente nello stesso ambito. | Evitare una nuova card duplicata. |
|
||||
| Una nuova regola corregge una card dello stesso ambito. | Mostrare la sostituzione proposta prima del salvataggio; conservare poi solo il contenuto corrente. |
|
||||
| Due regole differenti valgono per processi o tabelle differenti. | Conservare entrambe con ambiti espliciti, senza generalizzarle al workspace intero. |
|
||||
| Il reviewer risolve un contrasto fra Memory ed Evidence. | Mostrare una correzione esplicita degli archivi; applicare i percorsi distinti per Memory ed Evidence. L'accettazione autorizzata della correzione Evidence avvia anche l'attivazione; indicare esito, operazione in corso o errore. |
|
||||
| Una sincronizzazione riuscita accerta la rimozione di una colonna da cui dipende una card. | Cancellare la card dipendente e rimuoverla dai risultati di ricerca. |
|
||||
| La connessione al DWH fallisce oppure vengono puliti solo metadati del Catalog. | Non interpretare l'evento come prova di rimozione della colonna e non cancellare Memory per quel motivo. |
|
||||
|
||||
## Differenza rispetto al runtime corrente
|
||||
|
||||
`harness/tht/memory/core.py` limita `REUSABLE_TYPES` a `concept_clarified`.
|
||||
Anche il contratto Pi di F2 ammette soltanto questi chiarimenti; gli exemplar
|
||||
`solved_question` hanno già un percorso distinto di consultazione.
|
||||
|
||||
Il perimetro concordato amplia quindi il modulo Memory. Il design deve distinguere
|
||||
la conoscenza riutilizzabile dall'evento di workflow che l'ha originata, e aggiornare
|
||||
insieme estrazione, validazione, persistenza, recall e gate. Aggiungere alla whitelist
|
||||
tutti i tipi delle decisioni SQL o sulle tabelle promuoverebbe anche scelte occasionali
|
||||
e non realizza il requisito.
|
||||
|
||||
## Funzioni
|
||||
|
||||
- Elenco paginato e ordinabile, ricerca per testo o identificatore.
|
||||
- Filtri combinabili per workspace, famiglia/kind, concetti, tabelle e colonne
|
||||
quando presenti, provenienza e data di aggiornamento.
|
||||
- Dettaglio completo: titolo, contenuto, ambito, motivazione e provenienza disponibile.
|
||||
- Creazione manuale di una card, distinguibile da una card prodotta dal workflow;
|
||||
la creazione manuale non inventa una sessione o una decisione di origine.
|
||||
- Modifica dei campi consentiti dalla famiglia, con validazione e annullamento.
|
||||
- Cancellazione del record e rimozione delle sue proiezioni ricercabili.
|
||||
- Indicazione di contenuti salvati ma non ancora disponibili al recall, con retry
|
||||
dell'operazione necessaria a renderli disponibili.
|
||||
|
||||
L'elenco amministrativo legge i record persistiti senza richiedere embedding o
|
||||
ricerca per similarità. Un'indisponibilità dell'archivio deve produrre un errore
|
||||
esplicito, distinguibile da un elenco vuoto. I filtri sono applicati sull'intero
|
||||
archivio, prima della paginazione, e non sui soli risultati del recall.
|
||||
|
||||
## Comportamento delle modifiche
|
||||
|
||||
Una modifica sostituisce il contenuto corrente. Non si introducono revisioni storiche,
|
||||
snapshot dedicati alle vecchie sessioni o migrazioni per conservarne il comportamento.
|
||||
La cancellazione toglie la card dall'archivio e dal recall ordinario.
|
||||
|
||||
La mutazione deve aggiornare o invalidare ogni proiezione interessata. Un errore
|
||||
dell'indice non può essere presentato come piena disponibilità del nuovo contenuto,
|
||||
né permettere di usare silenziosamente il contenuto eliminato o sostituito.
|
||||
La strategia di consistenza e di retry appartiene al design tecnico del modulo.
|
||||
|
||||
Il salvataggio esplicito dell'amministratore cura il contenuto condiviso. Il suo
|
||||
successivo consumo nel core mantiene la semantica della famiglia: le Memory vengono
|
||||
proposte secondo i gate del workflow, gli exemplar restano consultativi.
|
||||
|
||||
## Piano esecutivo
|
||||
|
||||
### M1 — Archivio e CRUD amministrativo
|
||||
|
||||
Definire nel modulo `harness/tht/memory/` il contratto delle card: identità stabile,
|
||||
workspace, contenuto, famiglia, ambito, motivazione, provenienza e dati specifici
|
||||
delle domande risolte. I riferimenti allo schema identificano database, tabella e
|
||||
colonna senza affidarsi alla sola presenza di nomi nel testo. Le card manuali
|
||||
non richiedono sessioni inventate.
|
||||
|
||||
Implementare un repository PostgreSQL del modulo con card, collegamenti e dipendenze.
|
||||
La transazione aggiorna insieme il contenuto e le modifiche correlate; la propagazione
|
||||
a Qdrant avviene nello stesso flusso di salvataggio. Conservare un'indicazione
|
||||
persistente dell'operazione incompleta, sufficiente anche a ripulire cancellazioni
|
||||
dopo un riavvio; il recupero usa un retry esplicito. Non servono una coda generale,
|
||||
un nuovo worker o una sincronizzazione continua. Un risultato indicizzato
|
||||
con contenuto superato o privo di card autorevole non può essere usato dal recall.
|
||||
Gli exemplar passano anch'essi dall'archivio autorevole. La transizione dal registro
|
||||
JSONL non introduce scritture doppie permanenti o compatibilità storica delle sessioni.
|
||||
|
||||
Esporre attraverso il backend elenco filtrato prima della paginazione, dettaglio,
|
||||
creazione, aggiornamento, cancellazione, gestione dei collegamenti ed esito della
|
||||
propagazione. Le operazioni chiamano la logica del harness e applicano controllo
|
||||
amministrativo e isolamento del workspace. La UI legge il repository attraverso
|
||||
queste API anche quando il servizio di embedding o Qdrant è indisponibile.
|
||||
|
||||
Consegnare Memory management nell'AppShell con form, contenuto completo, gestione
|
||||
dei collegamenti e feedback di salvataggio/indicizzazione. Verificare persistenza
|
||||
PostgreSQL, rollback delle mutazioni correlate, aggiornamento e rimozione dal recall,
|
||||
retry dopo errore dell'indice, filtri sull'intero archivio e autorizzazioni. Una
|
||||
cancellazione elimina i collegamenti incidenti conservando le altre card.
|
||||
|
||||
### M2 — Ricerca ibrida e collegamenti
|
||||
|
||||
Estendere l'adapter Qdrant alla ricerca dense e lessicale della Memory e applicare
|
||||
l'ambito anche ai risultati raggiunti attraverso collegamenti. Le card iniziali
|
||||
alimentano l'espansione limitata nel core; deduplicazione, gestione dei cicli e
|
||||
limiti espliciti impediscono una visita incontrollata dell'archivio. I risultati
|
||||
vengono riordinati insieme e risolti contro il contenuto autorevole corrente.
|
||||
|
||||
Verificare card attese, esclusioni per ambito, cicli, collegamenti verso card rimosse
|
||||
e rigenerazione dell'indice da PostgreSQL. Quando si verifica il recupero effettivo,
|
||||
usare il percorso di embedding e ricerca configurato su un indice isolato: un fake
|
||||
che restituisce gli ID predisposti verifica soltanto il contratto applicativo.
|
||||
La separazione fra le collezioni Reference e Memory rimane quella degli ADR 0017 e 0018.
|
||||
|
||||
### M3 — Workflow e sincronizzazione fisica
|
||||
|
||||
Aggiornare insieme contratti, CLI, regole Pi e widget necessari al riepilogo finale
|
||||
modificabile. Il salvataggio applica soltanto card e collegamenti selezionati; le
|
||||
nuove categorie entrano nei gate pertinenti. Il recupero di una regola non ne
|
||||
costituisce approvazione, e l'exemplar continua a essere consultativo.
|
||||
|
||||
Collegare la sincronizzazione fisica del Catalog alla pulizia delle dipendenze nel
|
||||
modulo Memory con una chiamata diretta dopo l'applicazione riuscita dello schema,
|
||||
con copertura del controllo e riferimenti rimossi. Per recuperare un'interruzione
|
||||
fra applicazione e pulizia, conservarne lo stato pendente oppure verificare di
|
||||
nuovo le dipendenze contro lo snapshot fisico riuscito e il suo ambito: il nuovo
|
||||
diff da solo perderebbe le rimozioni già applicate. La pulizia è ripetibile e
|
||||
non richiede un sistema generale di consegna eventi.
|
||||
Un confronto parziale non prova la rimozione di elementi fuori dall'ambito controllato.
|
||||
La pulizia aggiorna archivio, collegamenti e proiezioni senza un'azione manuale ulteriore.
|
||||
|
||||
Verificare selezioni e rifiuti nel riepilogo, contenuto manuale, categorie ammesse,
|
||||
notifica di rimozione fisica, errore di connessione e cleanup del solo Catalog.
|
||||
Integrare le correzioni che riguardano Evidence nell'incremento congiunto X1, dopo
|
||||
il completamento del relativo servizio di authoring e attivazione.
|
||||
|
||||
L'evoluzione interna è decisa in Q7; ricerca ibrida e grafo nel core in Q8;
|
||||
PostgreSQL autorevole in Q9; gestione dei collegamenti in Q10. I contratti tecnici
|
||||
di persistenza, indicizzazione e API devono attuare queste decisioni. Apprendimento
|
||||
automatico da rifiuti non spiegati e consolidamento automatico restano fuori dal
|
||||
perimetro concordato; gli errori compresi e approvati rientrano nei contenuti decisi.
|
||||
|
||||
## Criteri di completamento
|
||||
|
||||
- Accesso amministrativo indipendente da sessioni e da Database management.
|
||||
- Tutti i record sono raggiungibili con elenco, filtri e paginazione, senza dipendere
|
||||
dalla disponibilità di embedding e recall semantico.
|
||||
- Creazione, modifica e cancellazione persistono dopo riapertura della pagina.
|
||||
- Dopo una mutazione completata il recall usa il contenuto corrente; i record
|
||||
cancellati non riappaiono dopo reindicizzazione o preprocessing.
|
||||
- Errori di salvataggio e indicizzazione sono distinguibili e recuperabili.
|
||||
- API e interfaccia rispettano isolamento dei workspace e accesso amministrativo.
|
||||
- Nessuna operazione del CRUD modifica Evidence o metadati del database.
|
||||
- Non vengono richieste compatibilità storica o conservazione delle sessioni esistenti.
|
||||
- Le quattro categorie concordate sono rappresentabili senza promuovere le scelte
|
||||
occasionali a regole generali; gli scenari di ammissione verificano il confine.
|
||||
- La rimozione fisica accertata di una dipendenza elimina le card interessate;
|
||||
errori di connessione e cleanup del Catalog non vengono scambiati per rimozioni.
|
||||
- Le scelte sui conflitti producono correzioni persistenti esplicite secondo Q4.
|
||||
- La verifica rispetta Q6, separando contratti funzionali e casi di generazione reale.
|
||||
- Il recupero combina ricerca ibrida, filtri d'ambito e collegamenti espliciti fra
|
||||
card; la gestione del grafo non richiede un servizio di database aggiuntivo.
|
||||
- Card, collegamenti e dipendenze hanno un'unica fonte autorevole PostgreSQL;
|
||||
la rigenerazione di Qdrant conserva il contenuto corrente e le cancellazioni.
|
||||
- I collegamenti sono curabili nel riepilogo e in Administration; cancellare una
|
||||
card elimina i suoi collegamenti senza cancellare altre card.
|
||||
@@ -0,0 +1,112 @@
|
||||
# X1 — validation of session archive corrections
|
||||
|
||||
Date: 2026-09-09. The joint Memory/Evidence repair increment is implemented.
|
||||
The authoritative contract is [Session archive corrections](../contracts/archive-repair.md).
|
||||
|
||||
## Delivered behavior
|
||||
|
||||
The session gate shows complete before/after content for specific alternatives targeting
|
||||
Memory or Evidence. The reviewer chooses one correction or rejects all proposals as
|
||||
inadequate and requests reformulation. The resulting receipt survives interruption;
|
||||
saved content and index activation are reported separately. Pending activation offers
|
||||
retry of the same chosen operation. A subsequent curator change blocks replay.
|
||||
|
||||
Application requires an administrator in the harness and the responding browser
|
||||
principal's archive-management permission. Cross-principal runtime responses cannot
|
||||
misattribute the correction. A non-administrator can decline or continue the current
|
||||
question without modifying shared archives. The gate does not advance a workflow phase.
|
||||
|
||||
Memory and Evidence remain separate domains. The integration coordinator reuses their
|
||||
canonical persistence and activation operations. A session Evidence correction requires
|
||||
a consolidated archive, preserves source lineage, and cannot publish unrelated external
|
||||
edits. Existing administration, source import, dependency cleanup and final Memory review
|
||||
remain available. No automatic Git commit or push was added.
|
||||
|
||||
## Verification
|
||||
|
||||
- Harness regression: **1,264 passed**, one skipped, five deselected. All **nine**
|
||||
portable-path checks passed separately without `THT_HOME`. Python lint passed on changed modules.
|
||||
- Backend: **1,366 passed**, 40 skipped. Tests include actual session-response routes
|
||||
for both target archives, unauthorized response, malformed choice and runtime ownership.
|
||||
- Frontend: complete suite **645 passed**; the final display adjustment passed all four
|
||||
focused widget tests. Backend and frontend TypeScript checks passed.
|
||||
- Pi extension: **199 passed**, including closed human choices, rejection, failure/retry,
|
||||
forged selections and the updated public tool schema. The modular skill projection is
|
||||
byte-identical to its updated approved template.
|
||||
- PostgreSQL/Qdrant integration traverses the actual Python CLI for preparation,
|
||||
application and recovery inspection. Corrected Memory and Evidence are retrieved from
|
||||
real indexes, and Evidence activation preserves the Memory card. Session loading is a
|
||||
controlled fixture and embeddings are deterministic; this is not an LLM quality test.
|
||||
- Failure tests cover both targets, index outage, replay, later edits, workspace/session
|
||||
isolation, changed session context, rejection, non-admin writes, and interruption after
|
||||
the Evidence file write but before its saved receipt.
|
||||
- Playwright desktop/mobile: **one passed**. The real widget renders both alternatives,
|
||||
accepts an Evidence choice, displays pending activation and allows retry to active.
|
||||
No page errors or mobile horizontal overflow. Screenshots are
|
||||
`/private/tmp/thothii-x1-repair-desktop.png` and `/private/tmp/thothii-x1-repair-mobile.png`.
|
||||
This browser fixture controls operation outcomes; persistent behavior is tested above.
|
||||
- Strict MkDocs build and `git diff --check` passed.
|
||||
|
||||
## Local installation and reviewer acceptance
|
||||
|
||||
Core and frontend images were rebuilt from this worktree using the existing local
|
||||
preview launcher. Migration `004_archive_repairs.sql` was applied to the existing
|
||||
installation catalog. The new gate is available to session workflows; it is not an
|
||||
always-visible administration panel. Existing PSD archive content was not changed by
|
||||
the synthetic validation cases.
|
||||
All five local services are healthy at `http://127.0.0.1:8080/`.
|
||||
|
||||
The technical increments and their planned checks are complete. The end-user acceptance
|
||||
check remains a real session containing a meaningful domain conflict, with the reviewer
|
||||
evaluating the proposed correction. Automated browser validation uses temporary accounts
|
||||
and data, not the user's authenticated PSD session. Source import retains its E3
|
||||
validation boundaries; no broader model-quality benchmark was added.
|
||||
|
||||
## Follow-up acceptance: configured model
|
||||
|
||||
The opt-in `test_real_model_proposes_a_reviewable_persistent_archive_correction`
|
||||
passed with the installation's **zai/glm-5.3** model. Synthetic Memory asserted an
|
||||
order-ID-only join; synthetic Evidence required the financial year too. The model
|
||||
returned two schema-valid, specific alternatives with complete content and the exact
|
||||
target revisions. The test reviewer selected Memory, persisted the correction through
|
||||
the real coordinator and PostgreSQL, and retrieved the updated rule. Evidence stayed
|
||||
unchanged. This test uses deterministic vectors and the configured completion helper;
|
||||
it does not claim a full autonomous Pi session or human acceptance of PSD semantics.
|
||||
|
||||
The run log is `/private/tmp/x1-acceptance-model.log`. Reproduce with
|
||||
`THT_MEMORY_L2_INSTALLATION=<installation.yaml>` and `THT_MEMORY_L2_CORE=<core-container>`
|
||||
using `pytest -q -s -m l2 tests/memory/test_administration.py -k real_model_proposes`.
|
||||
Credentials are resolved inside core and are not returned to the test runner.
|
||||
|
||||
## Follow-up acceptance: both administration pages
|
||||
|
||||
The opt-in `frontend/e2e/memory-real.spec.ts` passed through real authentication,
|
||||
Fastify, ThtRunner, Python, isolated PostgreSQL and Qdrant. It verifies:
|
||||
|
||||
- Database management, Memory management and Evidence management appear as peers in
|
||||
that order, with no active core session or DWH binding required.
|
||||
- Memory creation, editing, persistence across backend restart, deletion and absence
|
||||
from subsequent recall.
|
||||
- Canonical Evidence remains intact after the Memory deletion. Its full rule is read
|
||||
through the real Evidence administration worker; content filtering finds it and an
|
||||
unmatched filter produces the empty state.
|
||||
- Requests for an unregistered workspace return 404 for both archives.
|
||||
- Desktop and mobile Evidence views render without horizontal document overflow.
|
||||
On phones, both archive pages have at least 380px of usable width at a 390px viewport.
|
||||
Navigation opens in the shared accessible dialog, closes with Escape or archive selection,
|
||||
and returns focus to the trigger after Escape.
|
||||
|
||||
The temporary PostgreSQL readiness probe now waits for TCP, avoiding the image's
|
||||
socket-only initialization server. The browser waits for Memory refresh to finish
|
||||
before leaving its page, matching the existing navigation guard. Visual inspection
|
||||
also exposed a real mobile layout issue: the fixed sidebar left only 134px for the
|
||||
Evidence page. `ArchiveNavigation` now moves that sidebar into the shared dialog below
|
||||
768px on Memory/Evidence pages. Desktop behavior is unchanged. The frontend image
|
||||
was rebuilt for the local preview.
|
||||
|
||||
Run log: `/private/tmp/x1-acceptance-browser7.log` (**one passed**).
|
||||
Screenshots: `/private/tmp/thothii-acceptance-evidence-desktop.png` and
|
||||
`/private/tmp/thothii-acceptance-evidence-mobile.png`. Reproduce with
|
||||
`THT_MEMORY_BROWSER_E2E=1 npx playwright test e2e/memory-real.spec.ts` from `frontend/`.
|
||||
The fixture removes its temporary containers, accounts and checkout on completion.
|
||||
The TypeScript check, Python lint, strict documentation build and diff check also pass.
|
||||
@@ -0,0 +1,67 @@
|
||||
# Evidence E1 — validation
|
||||
|
||||
Date: 2026-09-09. Scope: editable Curated Evidence v4 and the persistent local archive.
|
||||
|
||||
## Implemented behavior
|
||||
|
||||
- Parser, renderer, authoring output and normalization share the existing typed payloads.
|
||||
Visible Markdown edits determine content for all eight kinds. Legacy v1–v3 conversion
|
||||
is explicit and lossless, with errors for content that cannot be represented exactly.
|
||||
- Manual declarations record the curator. A correction preserves the original document
|
||||
as lineage, separately from the current declaration. No source hash is needed to
|
||||
create a manual file.
|
||||
- The local archive records baselines, immutable candidates, active revisions and
|
||||
deletion/source suppression metadata. Unresolved review items and invalid edits block
|
||||
consolidation. Missing archive directories are availability failures, not deletions.
|
||||
- Activation failures preserve the previous active revision. Interrupted normalization
|
||||
replays only unchanged input bytes; later operator edits survive recovery.
|
||||
- Revision-checked correction methods reject stale workflow updates. Legacy preparation
|
||||
and resolution cannot overwrite an initialized local archive; explicit import/refresh
|
||||
integration is deferred to E3.
|
||||
|
||||
## Verification
|
||||
|
||||
The final harness suite excluding opt-in L0/L2 and portable-layout cases passed with
|
||||
**1,180 tests** (58 deselected). All **9 portable-layout tests** passed separately with
|
||||
`THT_HOME` unset. The dedicated real-Qdrant integration test passed, including the
|
||||
optional 35-unit PSD probe. Ruff passed on the changed Evidence implementation and
|
||||
tests, and the strict documentation build succeeded. No frontend or backend TypeScript
|
||||
changes are part of E1.
|
||||
|
||||
The integration test uses an isolated Qdrant 1.18.2 container, the actual corpus
|
||||
pipeline, semantic chunking, vector adapter and active Evidence searcher. Deterministic
|
||||
three-dimensional embeddings isolate file/content correctness from model behavior.
|
||||
It verifies that raw edits do not change recall, consolidation updates recalled content
|
||||
and curator identity, a blocked candidate preserves prior recall, and deletions remove
|
||||
recall. Existing schema and Memory records survive each operation.
|
||||
|
||||
All **35 PSD units** were copied from the owner's workspace into
|
||||
`/private/tmp/thothii-e1-psd.bsW4cp`. Deterministic conversion preserved every ID, payload,
|
||||
scope, provenance and review item. There were no unresolved review items. The optional
|
||||
integration probe then indexed all 35 converted units and compared their complete ID
|
||||
set to the original. It uses PSD's actual `max_chunk_chars: 5000`; a preliminary probe
|
||||
at 4000 correctly blocked an oversized atomic unit.
|
||||
|
||||
Reproduce the isolated real-corpus probe after creating a converted workspace copy:
|
||||
|
||||
```sh
|
||||
cd harness
|
||||
THT_E1_PSD_COPY=/absolute/path/to/converted-copy \
|
||||
.venv/bin/pytest -q -s tests/test_evidence_editable_integration.py
|
||||
```
|
||||
|
||||
The environment variable is optional. Ordinary CI uses only synthetic Evidence. No
|
||||
source refresh, external document download, DWH call or model request is involved.
|
||||
|
||||
## Delivery boundary
|
||||
|
||||
E1 is a core/library increment. E2 must add the installed manual consolidation command,
|
||||
connect runtime source selection to the active local snapshot, and build administrative
|
||||
list/filter/detail with real persistent host paths and manual Git instructions. E3
|
||||
adds source acquisition and explicit refresh/conflict handling. X1 later wires deliberate
|
||||
joint Memory/Evidence corrections into review gates.
|
||||
|
||||
The actual PSD Evidence checkout was not converted. The live Docker preview at
|
||||
`http://127.0.0.1:8080` remains the previously deployed M3 stack, with no new Evidence
|
||||
administration page. The corpus conversion and reindexing described here used copies
|
||||
and disposable test resources.
|
||||
@@ -0,0 +1,86 @@
|
||||
# Evidence E2 — validation
|
||||
|
||||
Date: 2026-09-09. E2 is implemented locally and installed on the existing Docker preview.
|
||||
E3 source imports/refresh and X1 deliberate Memory/Evidence workflow corrections remain open.
|
||||
|
||||
## Delivered behavior
|
||||
|
||||
- Independent **Administration → Evidence management**, after Memory, protected by
|
||||
`evidence.manage`: complete typed content, provenance and original excerpts, review items,
|
||||
pagination, search, kind/purpose/status and scope/source filters, sort, and refresh.
|
||||
- Working-file states distinguish active, modified, new, removed, invalid, legacy and review
|
||||
required. Detail shows the actual configured host path with copy controls. Instructions
|
||||
cover external editing, all eight Markdown templates, consolidation and manual Git.
|
||||
- Installed `tht workspace evidence consolidate --workspace <id> [--json]` uses a closed
|
||||
maintenance envelope. First use converts legacy units. Validation, immutable candidates,
|
||||
activation and retry run through the existing corpus pipeline without a DWH scan or Git.
|
||||
- Runtime and ordinary preprocessing consume the active local snapshot. Unconsolidated
|
||||
edits remain excluded. Catalog/Schema readiness is not advanced by this operation.
|
||||
Clear preserves curated files, archive metadata and Memory; full preprocessing must
|
||||
recreate the missing Reference/Schema derivations afterward.
|
||||
- Immutable runtime lease filenames now identify rendered bytes as well as logical input
|
||||
identity. This fixes upgrades colliding with old runtime files without changing Catalog
|
||||
fingerprints or removing the checks against tampered files.
|
||||
|
||||
## Automated checks
|
||||
|
||||
The complete backend suite passed: **1,355 tests**, 40 skipped. The complete frontend
|
||||
suite passed: **639 tests**. Both TypeScript checks passed. Native Go workspace operation
|
||||
and CLI tests passed, including rejection of arbitrary consolidation flags. Ruff passed
|
||||
for changed Python implementation and test files.
|
||||
|
||||
The harness run passed **1,248 tests**, with one skipped and five deselected. Its three
|
||||
portable-path tests failed because that run deliberately set `THT_HOME` to the test
|
||||
runtime; rerunning the portable tests with `THT_HOME` unset passed. The final focused
|
||||
administration/path suite passed all 18 tests, including actionable migration errors and invalid
|
||||
consolidation combinations rejected before cleanup or indexing.
|
||||
|
||||
The real-Qdrant integration test exercised the actual harness consolidation CLI with
|
||||
deterministic embeddings: all 35 PSD units converted and indexed with stable identities;
|
||||
active-only source selection; separate Schema and Memory canaries; Clear and rebuild
|
||||
from the retained snapshot. Unit tests cover validation, saved-but-unindexed failure,
|
||||
retry, browsing/filtering, no automatic Git, and no Catalog mutation from consolidation.
|
||||
|
||||
A temporary Git repository and bare local remote exercise the documented manual sequence:
|
||||
edit, add and remove files, consolidate, inspect, stage the complete Evidence tree,
|
||||
commit, push and clone. The clone retains changed content, additions, deletions, managed
|
||||
metadata and an accessible active snapshot. No remote user repository was pushed.
|
||||
|
||||
## Installed preview
|
||||
|
||||
The existing Compose project is `thothii-18998cca7b0a`, at `http://127.0.0.1:8080`.
|
||||
The persistent editable checkout is:
|
||||
|
||||
```text
|
||||
/Users/mp/projects/ThothII/deploy/psd/evidence-registry/repo/psd-clinical/evidence
|
||||
```
|
||||
|
||||
The original registry checkout was copied from its retained Docker volume. The original
|
||||
author repository was not changed. Core and maintenance share a nested host bind for
|
||||
`repo`; registry state/snapshots and all other existing data volumes were retained.
|
||||
The installation descriptor includes the existing workspace bindings and the new
|
||||
`evidence-host.yaml` override. The previous descriptor and native binary are backed up
|
||||
at `/private/tmp/thothii-installation-before-e2.yaml` and `/private/tmp/tht-before-e2`.
|
||||
|
||||
The real installed command succeeded with **35 documents, 35 chunks, 35 changed, zero
|
||||
removed**, using the configured embedding service and Qdrant. A second run succeeded
|
||||
with **35 unchanged, zero changed**. Reading the actual archive from core returned
|
||||
35 active units and no file errors. All five long-running services are healthy.
|
||||
Only the Evidence stage ran. The strict documentation build and `git diff --check`
|
||||
also passed. The stack launcher is `bash /private/tmp/thothii-memory-preview.sh`; keep its
|
||||
worktree image-build override until this branch is integrated into the main checkout.
|
||||
|
||||
Browser verification reached the local login page. The saved administrator password
|
||||
does not match the current account hash, so the authenticated visual check remains
|
||||
manual. No account or password was modified. React interaction tests cover navigation,
|
||||
detail, host paths, templates, filtering, pending activation and invalid files.
|
||||
|
||||
## Boundaries
|
||||
|
||||
There is no web content editor, watcher, automatic commit/push, or implicit source refresh.
|
||||
The API exposes administration reads and consolidation; the archive's revision-checked
|
||||
save/remove operations remain available for the later explicit workflow corrections.
|
||||
These gates are not claimed as implemented by E2. Initialized local archives retain
|
||||
structural/review checks but bypass the legacy fixed retrieval-evaluation fixture so
|
||||
its old expected IDs cannot veto deliberate deletions. A general retrieval benchmark
|
||||
is outside the agreed scope.
|
||||
@@ -0,0 +1,100 @@
|
||||
# Evidence E3 — validation
|
||||
|
||||
Date: 2026-09-09. Explicit source import/refresh and decisions are implemented. X1,
|
||||
the integration of deliberate Memory/Evidence corrections into workflow gates, remains next.
|
||||
|
||||
## Delivered behavior
|
||||
|
||||
The independent Evidence page now offers **Sources and imports**. An operator copies
|
||||
a specialist's draft into `evidence/incoming/`, then explicitly imports/refreshes.
|
||||
Original local Markdown and configured HTTP/S3 sources use existing read-only adapters.
|
||||
Acquisition retains raw bytes, source identity and versioned normalized documents.
|
||||
The existing Pi authoring refiner prepares typed, editable v4 proposals.
|
||||
|
||||
Unchanged hashes skip refinement. All source acquisitions/refinements must succeed
|
||||
before saving a new set of comparisons. Missing sources are recorded as unavailable,
|
||||
never interpreted as permission to delete. No runtime lookup, ordinary consolidation
|
||||
or preprocessing triggers remote refresh once the local archive is initialized.
|
||||
|
||||
The administrator sees current and proposed units, scope, content, excerpts, review
|
||||
items and explicit retirement IDs. **Keep local Evidence** records the retained wording
|
||||
as a manual declaration with original lineage. **Use proposed Evidence** adopts the
|
||||
proposal and its source version. Both save and activate through the existing archive
|
||||
and corpus pipeline; review items block adoption. Comparisons use optimistic checks
|
||||
on affected file bytes. Interrupted decisions have a durable replay journal and retry
|
||||
without reacquisition, while intervening external edits are preserved and reported.
|
||||
|
||||
Deleted IDs remain reserved. New model-generated identities from sources with curated
|
||||
deletions are also conservatively suppressed; surviving IDs can still receive reviewed
|
||||
updates. Deliberate new knowledge can be authored as a manual file. This mechanical
|
||||
protection does not depend on the model detecting semantic duplication or contradictions.
|
||||
|
||||
Installed commands are `workspace evidence refresh` and `workspace evidence decide`,
|
||||
alongside E2 consolidation. Decision envelopes carry a source identity, comparison
|
||||
revision and keep/replace choice. Extra URLs, arbitrary paths, forged actors and unknown
|
||||
fields are rejected at the public API/CLI boundary. HTTP requests bind the authenticated
|
||||
curator. Source operations do not mutate Catalog readiness or run DWH/schema stages.
|
||||
The Python source worker is internal; the workflow CLI's visible surface is preserved.
|
||||
|
||||
## Checks
|
||||
|
||||
- Complete backend suite: **1,359 passed**, 40 skipped. Complete frontend suite:
|
||||
**641 passed**. Both TypeScript checks passed; native Go CLI/workspace tests passed.
|
||||
- Harness regression run: **1,256 passed**, one skipped and five deselected, with
|
||||
portable-path tests run separately without `THT_HOME`. All **24 focused import,
|
||||
CLI-surface and portable-path checks** passed. These
|
||||
cover import, unchanged refresh, access failure, missing source, manual correction,
|
||||
keep/replace, deletion suppression, stale comparisons, failure/retry and interrupted
|
||||
journal writes. Ruff passed on the changed Python implementation and tests.
|
||||
- The real-Qdrant test traverses the actual harness source CLI with deterministic
|
||||
refinement/embedding boundaries: import is absent from recall before a decision,
|
||||
accepted content becomes searchable, refreshed proposals preserve active manual
|
||||
corrections, replacement removes the former text, deletion remains absent after
|
||||
another refresh, and unrelated Schema/Memory canaries survive.
|
||||
- Source contract fixtures cover controlled HTTP and S3 identities, exact acquired
|
||||
bytes, and acquisition call counts. Existing adapter tests retain transport/egress
|
||||
coverage. The test does not claim to exercise a live S3 account.
|
||||
- React interaction tests verify explicit refresh, comparison content, exact decisions,
|
||||
saved-decision retry and failure feedback. Route tests cover admin authorization,
|
||||
workspace isolation, strict inputs and principal attribution. Service tests verify
|
||||
the trusted config file descriptor and absence of Catalog mutation.
|
||||
|
||||
## Local preview
|
||||
|
||||
Core/frontend were rebuilt for the existing `thothii-18998cca7b0a` stack. Its persistent
|
||||
archive and data volumes are retained. The native `/usr/local/bin/tht` was updated;
|
||||
the previous executable is at `/private/tmp/tht-before-e3`.
|
||||
|
||||
The installed refresh command ran against `psd-clinical` successfully: **35 unchanged
|
||||
sources, zero changed, zero pending comparisons**. All 35 source hashes matched their
|
||||
existing units, so this probe required no refinement and changed no active Evidence.
|
||||
Source registry metadata was saved locally; no Git commit or push was performed.
|
||||
|
||||
A separate synthetic draft was passed to the configured Pi/model inside core. It
|
||||
produced one domain proposal with one review item, which was not activated. The probe
|
||||
exposed a deployment issue: Python wheel modules and Pi skills live in different
|
||||
directories. The refiner now resolves resources through `THT_HARNESS_DIR`, with the
|
||||
source-tree location as its development fallback; a regression test covers this layout.
|
||||
|
||||
The corrected installed worker was then exercised end to end in a temporary workspace
|
||||
inside core, using the real configured Pi/model and a synthetic `incoming/orders.md`.
|
||||
It returned success, one changed source, one comparison and one proposal with a review
|
||||
item. The active snapshot remained absent. The temporary directory was removed on exit;
|
||||
the probe did not open the DWH or activate an index. Strict docs build and
|
||||
`git diff --check` also passed.
|
||||
|
||||
The in-app browser still showed the login page with the prior credential error.
|
||||
Authenticated visual verification remains manual; no credentials were reset or retried.
|
||||
|
||||
## Operational instructions and boundaries
|
||||
|
||||
See [Import drafts and refresh sources](../contracts/curated-evidence-v4.md#import-drafts-and-refresh-sources)
|
||||
for commands, local paths, review, retry and backup/Git requirements. Preserve the
|
||||
complete Evidence tree, including source comparisons, journals and acquired versions.
|
||||
Local activation and transfer to the remote Git repository remain separate operator steps.
|
||||
|
||||
No web content editor, automatic Git, background watcher, new job queue, general
|
||||
retrieval benchmark or automatic source merge was introduced. Review/refinement is
|
||||
sequential and bounded by per-source limits plus 200 documents/100 MiB per refresh.
|
||||
New changed-source decisions and failure scenarios use isolated test data; live PSD
|
||||
curated content was kept unchanged. X1 is not included in this increment.
|
||||
@@ -0,0 +1,96 @@
|
||||
# M2 — Ricerca ibrida e collegamenti
|
||||
|
||||
Data: 2026-09-09. Implementazione locale dell'incremento M2 del
|
||||
[piano Memory approvato](2026-09-08-memory-management.md#piano-esecutivo).
|
||||
|
||||
## Risultato
|
||||
|
||||
La ricerca Memory ed exemplar usa embedding dense e BM25 in Qdrant. I filtri sono
|
||||
applicati in entrambi i rami prima della selezione dei candidati. Il core espande
|
||||
i collegamenti uscenti, deduplica, limita cicli e visite, riordina insieme i risultati
|
||||
e restituisce il contenuto corrente verificato in PostgreSQL. Non usa un database
|
||||
a grafo né una chiamata LLM per il riordinamento.
|
||||
|
||||
Il contesto fisico distingue database, schema, tabella e colonna e richiede che
|
||||
corrispondano alla stessa dipendenza strutturata. Le card senza dipendenze valgono
|
||||
per il workspace; un riferimento a un antenato fisico si applica ai suoi discendenti.
|
||||
Ambito descrittivo e concetti possono restringere ulteriormente la ricerca tramite
|
||||
`--filters`. La CLI impedisce di sostituire database/schema del runtime. Il dettaglio
|
||||
dei limiti e della formula di ranking è nel [contratto operativo](../gestione-memory.md#hybrid-recall-and-links).
|
||||
|
||||
L'incremento conserva i confini dei gate correnti: F2 riceve chiarimenti di dominio,
|
||||
gli exemplar restano consultativi. Un collegamento non autorizza a consumare una
|
||||
famiglia diversa o una card fuori ambito. Il riepilogo finale, i nuovi gate e la
|
||||
pulizia delle dipendenze dopo sincronizzazione fisica appartengono a M3.
|
||||
|
||||
## Transizione e recupero
|
||||
|
||||
La migrazione versionata `002_hybrid_projection.sql` aggiunge il formato delle
|
||||
proiezioni. Le card M1 restano autorevoli e consultabili; le loro proiezioni dense
|
||||
risultano pendenti e non possono alimentare il recall. Un retry esplicito o
|
||||
`tht memory index -c <runtime.yaml>` costruisce dense e BM25 dal contenuto corrente.
|
||||
Il formato della proiezione e la revisione della card sono verificati prima dell'uso.
|
||||
|
||||
Il salvataggio può aggiungere il vettore sparse mancante nella sola collezione
|
||||
Memory. Non sostituisce configurazioni incompatibili e non modifica Reference.
|
||||
Il rebuild esplicito ricrea anche una collezione Memory assente; il test elimina
|
||||
la collezione, ricostruisce da PostgreSQL e verifica il ritorno della sola card conservata.
|
||||
Fallimenti lasciano il lavoro di propagazione persistito e recuperabile. Nessuna
|
||||
importazione da JSONL, sessioni storiche o vecchi payload Qdrant.
|
||||
|
||||
## Verifiche
|
||||
|
||||
| Controllo | Esito |
|
||||
| --- | --- |
|
||||
| Suite harness senza L0/L2, escluso il file dei percorsi portabili | 1.152 test passati nell'esecuzione finale. |
|
||||
| Suite mirata Memory, adapter e CLI, con embedding reale | 78 test passati. |
|
||||
| Verifica aggiuntiva del rebuild con collezione assente e adapter | 54 passati; il solo test del modello reale era escluso in questa riesecuzione. |
|
||||
| API Fastify Memory | 13 test passati, compresa propagazione della lingua del workspace. |
|
||||
| Browser amministrativo integrato | Passato: creazione, modifica, riavvio, rilettura, cancellazione e verifica del recall. |
|
||||
| Wheel e casi CLI | 10 test passati; il wheel include entrambe le migrazioni Memory. |
|
||||
| Build e controlli statici | Build/typecheck backend, Ruff sui file Python interessati e build documentale strict passati. |
|
||||
|
||||
- Test deterministici: collegamenti necessari, contenuto corrente, duplicati,
|
||||
cicli, profondità e limiti, card mancanti o pendenti, rifiuti già registrati,
|
||||
famiglie e ambiti esclusi, dipendenze omonime e filtri CLI vincolati al runtime.
|
||||
- Adapter: stesso filtro nei prefetch dense/BM25 per Memory ed exemplar; restano
|
||||
coperti i contratti Evidence esistenti.
|
||||
- PostgreSQL/Qdrant: salvataggio, modifica, cambio famiglia, cancellazione,
|
||||
ricostruzione, riferimento separato, isolamento, RLS, errori, retry e transizione
|
||||
delle proiezioni M1 al formato ibrido.
|
||||
- Recupero effettivo: client Ollama di produzione con il modello configurato
|
||||
`qwen3-embedding:0.6b`, dimensione 1024, e Qdrant dell'immagine fissata in Compose.
|
||||
La domanda sulla chiave commessa fra esercizi recupera la regola attesa e la
|
||||
granularità collegata, escludendo un altro database, un altro ambito e dipendenze
|
||||
che corrispondono soltanto combinando riferimenti distinti. Verifica separatamente
|
||||
dense, BM25 e fusione, poi recall, cancellazione e rebuild.
|
||||
|
||||
Il test effettivo avvia un processo Ollama separato, montando il volume del modello
|
||||
installato in sola lettura. PostgreSQL e Qdrant sono container temporanei dedicati,
|
||||
eliminati a fine test. Non usa ID di risultati predisposti. Il browser amministrativo
|
||||
usa invece embedding deterministici: verifica il collegamento fra UI, autenticazione,
|
||||
Fastify, ThtRunner e persistenza, senza essere una misura di qualità del recupero.
|
||||
|
||||
Non è una valutazione generale della qualità semantica su un corpus di produzione;
|
||||
verifica i casi di recupero richiesti da M2, con il percorso reale configurato.
|
||||
|
||||
## Riproduzione
|
||||
|
||||
Dalla directory `harness`, con Docker disponibile:
|
||||
|
||||
```sh
|
||||
THT_HOME=/private/tmp/thothii-m2-test-home \
|
||||
THT_MEMORY_TEST_OLLAMA_VOLUME=<volume-modelli-installazione> \
|
||||
THT_MEMORY_TEST_MODEL=qwen3-embedding:0.6b \
|
||||
THT_MEMORY_TEST_DIMENSIONS=1024 \
|
||||
.venv/bin/pytest -q tests/memory/test_administration.py \
|
||||
tests/memory/test_retrieval.py tests/memory/test_recall.py \
|
||||
tests/test_qdrant_vector_store.py tests/test_solved_search_cli.py
|
||||
```
|
||||
|
||||
Senza il volume esplicito, il solo test con modello reale viene escluso; gli altri
|
||||
test restano eseguibili. Il volume deve contenere il modello indicato. Le immagini
|
||||
Qdrant e Ollama del test sono lette da `compose.yaml`.
|
||||
|
||||
Consegna locale: non sono stati eseguiti deploy, migrazioni delle installazioni
|
||||
attive o aggiornamenti remoti dell'issue tracker.
|
||||
@@ -0,0 +1,78 @@
|
||||
# Memory M3 — validation
|
||||
|
||||
Implemented on 2026-09-09 in the rapid-harbor worktree.
|
||||
|
||||
## Delivered behavior
|
||||
|
||||
- F8 presents an editable summary of proposed additions, explicit updates and links.
|
||||
Only selected content is saved, including the optional solved-question exemplar.
|
||||
- Proposals reference effective approved decisions. Exact existing content is reused.
|
||||
Concurrent edits invalidate an update; manual identities and origins are preserved.
|
||||
- Selected cards and links commit atomically. Durable receipts recover repeat delivery
|
||||
and the gap before the session review marker. Finalization does not add Memory.
|
||||
- F4/F6/F7 retrieve SQL rules and explained errors for the existing approval gates.
|
||||
Retrieval is consultative and does not write an approval decision.
|
||||
- Successful Catalog physical sync deletes cards with matching removed dependencies.
|
||||
The same Catalog transaction marks pending Memory cleanup. Retry keeps the original
|
||||
removals and does not rescan; deletion receipts and projection tombstones survive restarts.
|
||||
- Migration 003 adds minimal review and physical-cleanup receipts.
|
||||
|
||||
## Executed checks
|
||||
|
||||
| Check | Result |
|
||||
| --- | --- |
|
||||
| Harness deterministic suite, excluding portable-path environment cases | 1,152 passed |
|
||||
| Portable-path suite without the temporary THT_HOME override | 9 passed |
|
||||
| Memory service/retrieval with isolated PostgreSQL and Qdrant | 41 passed, 1 optional real-embedding case skipped, 1 L2 case excluded |
|
||||
| Pi gate suite | 195 passed |
|
||||
| Backend full suite | 1,346 passed; one auth timing test exceeded 5 seconds under concurrent load |
|
||||
| Isolated auth and Catalog route rerun | All 40 passed, including the timed-out case |
|
||||
| Catalog PostgreSQL integration after adding atomic cleanup-marker coverage | All 5 passed |
|
||||
| Frontend full suite | 635 passed |
|
||||
| Chromium summary review, desktop and 390px mobile | Passed; no page errors or horizontal overflow |
|
||||
| Configured real GLM 5.3 generation | Passed on synthetic PostgreSQL data |
|
||||
| Backend/frontend production builds, modified Python lint, strict docs build | Passed |
|
||||
|
||||
The existing local Docker preview was rebuilt from this worktree, migration 003
|
||||
was applied, and core/frontend were recreated with the existing persistent volumes.
|
||||
The preview remains at `http://127.0.0.1:8080`.
|
||||
|
||||
The browser check uses the production widget in an isolated Vite fixture. It edits
|
||||
the rule, declines the exemplar, submits only the selected card and checks responsive
|
||||
layout. Gate tests separately verify request ordering through the production Pi
|
||||
composition root; service and Catalog tests use real PostgreSQL. This is not a claim
|
||||
of an automated complete live Pi conversation.
|
||||
|
||||
The L2 case retrieves an approved SQL rule, excludes a card bound to another database,
|
||||
and asks the configured GLM 5.3 model to generate a query. Order IDs repeat between
|
||||
financial years; the correct composite join returns 120 on the synthetic fixture.
|
||||
The generated SQL is validated and executed in a read-only PostgreSQL transaction.
|
||||
No real DWH rows are sent. Embeddings in this case are deterministic; the real
|
||||
embedding/hybrid retrieval evidence remains documented in M2.
|
||||
|
||||
## Reproduction
|
||||
|
||||
From the harness:
|
||||
|
||||
```sh
|
||||
THT_HOME=/private/tmp/thothii-m1-harness-home .venv/bin/pytest -q -m 'not l0 and not l2' --ignore=tests/test_portable_paths.py
|
||||
.venv/bin/pytest -q tests/test_portable_paths.py
|
||||
THT_HOME=/private/tmp/thothii-m1-harness-home .venv/bin/pytest -q tests/memory/test_administration.py tests/memory/test_retrieval.py -m 'not l2'
|
||||
npm test
|
||||
```
|
||||
|
||||
The optional generation case requires an installation YAML path and its running
|
||||
core container. It resolves the model credential inside core without printing it:
|
||||
|
||||
```sh
|
||||
THT_MEMORY_L2_INSTALLATION=<installation.yaml> THT_MEMORY_L2_CORE=<core-container> \
|
||||
.venv/bin/pytest -q -s -m l2 tests/memory/test_administration.py -k real_model
|
||||
```
|
||||
|
||||
From frontend: `npx playwright test e2e/memory-review.spec.ts`.
|
||||
Screenshots are written to `/private/tmp/thothii-m3-summary-desktop.png` and
|
||||
`/private/tmp/thothii-m3-summary-mobile.png`.
|
||||
|
||||
Evidence authoring and the joint X1 persistent Memory/Evidence conflict repair remain
|
||||
outside M3. This increment does not infer knowledge from unexplained failures or
|
||||
promise general improvements in SQL-generation accuracy.
|
||||
Reference in New Issue
Block a user