--- tipo: entità --- # Archiviazione raw conversazioni — decisione (05/09/2026) **Stato: design deciso, implementazione non ancora fatta.** Nato come costola di [[project_scatola_llm_wrapper]] (sezione digest/bibliotecario), separato in file suo perché è diventato un progetto implementabile a sé, non più solo teoria. ## Problema I trascritti `.jsonl` di Claude Code (`~/.claude/projects/`) vengono cancellati dal CLI dopo `cleanupPeriodDays` (default 30 giorni, nessun override in `settings.json` — verificato 05/09: il file più vecchio rimasto oggi è del 06/08/2026, esattamente 30 giorni fa). Il backup restic/rclone esteso lo stesso giorno a `/home/mauro` protegge dalla perdita per crash/disco, ma non dalla cancellazione automatica della fonte primaria — un backup di un file che poi sparisce dall'origine non lo rende permanente, va estratto *prima* che il CLI lo cancelli. ## Decisione: sì, conservare il grezzo Due ragioni date da Mauro: (1) la disciplina "scrivi subito in memory/archivio ciò che conta" a volte fallisce — pezzi si perdono; (2) il materiale grezzo ha valore storico/di garanzia a prescindere, come prova di provenienza, non solo come rete di sicurezza per la disciplina di memoria. ## Cosa conservare: solo la trascrizione **as-is**, non filtrata Discusso se filtrare (testo conversazione + `tool_use`/`tool_result`, scartando `thinking` e bookkeeping harness) o tenere il `.jsonl` intero. Deciso **as-is** — motivazione: filtrare ora significa decidere per sempre cosa sarà mai stato interessante, rischio di buttare via proprio il pezzo che si rivela utile in futuro (es. `thinking` per capire un errore di ragionamento passato). L'estrazione resta un'operazione meccanica pura (copia, nessun parsing) — coerente col principio "orologio vs giudizio" già usato per i `servizio`: il giudizio su cosa è utile si applica quando si legge l'archivio, non quando lo si scrive. Contenuto reale di un `.jsonl` (verificato su un file campione, 05/09): oltre al testo conversazione, ci sono `tool_use`/tool result (comandi eseguiti, parametri, output), `thinking` (ragionamento interno), `file-history-snapshot`/`file-history-delta` (diff letterali dei file modificati in sessione — unica traccia se un edit non è mai stato committato), più bookkeeping harness (`queue-operation`, `bridge-session`, ledger artifact) di scarso valore storico ma comunque conservato per non dover giudicare cosa scartare. ## Dove: directory semplice, non database Un DB avrebbe senso solo se il contenuto venisse parsato/normalizzato — esattamente il lavoro di interpretazione che "as is" rimanda. Un DB che contenesse i `.jsonl` come blob grezzi sarebbe solo una directory con passaggi in più, e peggiore per il backup incrementale (un file DB che si riscrive ogni notte vs tanti file immutabili indipendenti). Il DB resta lo strumento giusto più avanti, ma per un layer di query sui **digest** (piccoli, strutturati) — fase 2, non questa. Qui: directory a specchio, un file per sessione. ## Dove fisicamente: fuori da `Dropbox/adrian/` Non dentro `archivio/_raw/` né altrove nel repo git — stesso rischio già scartato per l'idea gemella del bibliotecario ("contenuto non filtrato che si propaga", come visto con Docker in cartella Dropbox). Destinazione proposta: `~/claude-raw-archive/` (locale, fuori da Dropbox) — già coperta automaticamente dal backup home esteso il 05/09 (restic + rclone su tutto `/home/mauro`) senza dover toccare di nuovo quegli script. ## Meccanismo costruito (05/09/2026) `scripts/archivio-raw-conversazioni/archive_raw.py`, cron giornaliero 05:55 Nave (batch, non systemd — non serve reattività, stesso slot di `collect_logs.py`/`report.py`): scandisce `~/.claude/projects/**/*.jsonl` (inclusi `subagents/`) e copia (`shutil.copy2`, preserva timestamp) ogni file in `~/claude-raw-archive///.jsonl` se non già presente/invariato — idempotente, nessun parsing. **Nessuna soglia di età**: prima idea era aspettare 20-25 giorni ("margine di sicurezza prima dei 30 reali") — scartata su domanda diretta di Mauro ("perché non cataloga tutti quelli disponibili?"): è solo una copia meccanica, non c'è motivo di lasciare scoperta una finestra di giorni prima dell'archiviazione. Una sessione ancora attiva viene semplicemente ricopiata ai run successivi finché cambia (costo trascurabile su disco locale). Testato: primo run con soglia ha salvato 17 file già al limite dei 30gg; rimossa la soglia, secondo run ne ha catalogati 109 in più (tutto il disponibile, 126 file totali, 214MB) in un colpo solo. **Da replicare su Ufficio** (Task Scheduler): altrimenti la storia grezza di `gemello-ufficio` sbatte contro lo stesso muro dei 30 giorni senza protezione — la Nave copre solo se stessa. **(05/09/2026, aggiornato) Destinazione migrata da locale a "ponte" Dropbox**: Mauro ha fatto notare che Ufficio non ha un backup locale equivalente a restic/rclone su Nave — un `~/claude-raw-archive` locale lì sarebbe protetto dal cleanup CLI a 30gg ma non da un guasto disco. Verificato con `gemello-ufficio`: il client Dropbox su Ufficio sincronizza l'intero account (non solo `adrian\`, confermate presenti anche le sorelle `ObsidianPortable\`/`da organizzare\` con contenuto reale) — quindi una cartella sorella di `adrian/`, fuori dal repo git, arriva su entrambe le macchine via sync Dropbox senza bisogno di nulla di nuovo lato Windows. Nuova destinazione: `Dropbox/claude-raw-archive//...` (calcolata relativamente alla posizione dello script — `Path(__file__).resolve().parents[3]` — stesso file invariato su Nave e Ufficio). Coperta gratis dal backup Nave esistente (`restic`+`rclone` su `/mnt/ssd`, che include l'intera cartella Dropbox) una volta sincronizzata da Ufficio. Migrato il contenuto esistente (214MB/126 file), verificato con un run reale post-migrazione. Resta da fare lato Ufficio: verificare lo script sincronizzato, test manuale, poi Task Scheduler (delegato a `gemello-ufficio`). ## Vincolo di accesso L'archivio raw non va mai esposto a mirror/connettori esterni (mai in SecondBrain) — resta privato. Punto aperto, non ancora deciso in dettaglio: se i `tool_result` grezzi possono contenere dati sensibili (credenziali finite per sbaglio in output di debug), la regola di redazione di `CLAUDE.md` si applicherebbe se questo archivio diventasse mai leggibile da altro; finché resta locale-solo-Adrian il rischio è più contenuto ma non nullo — non affrontato oggi. ## Stato finale (05/09/2026) — costruito su entrambe le macchine Su Nave: cron giornaliero 05:55 (non systemd, stesso slot di `collect_logs.py`/`report.py`). Su Ufficio: job `archivio_raw_conversazioni` in `schedule.json`/`scheduler_locale.py` (10:00, **non** Task Scheduler — rimosso attivamente da Direzione Sistemi, vedi `PYTHON/gate-ufficio/CLAUDE.md`), costruito e testato da `gemello-ufficio` il 05/09 (`completed exit_code=0`). Digest/riassunti dei `.jsonl` accumulati restano fase 2, non affrontata — vedi [[project_scatola_llm_wrapper]] e ora anche [[project_roadmap_condivisa]] (la domanda su come interrogarli si intreccia con il thread sulla fluidità/memoria aperto la sera del 05/09).