--- name: adrian-state description: "Stato operativo Adrian — thread aperti, sistema corrente, pattern riconosciuti. Da rileggere a inizio sessione e aggiornare a fine." metadata: node_type: memory type: project originSessionId: c35b3ade-b2cb-4b16-9684-fcd6d0b1386d --- ## Diagnosi Elon "memoria che dimentica" + fix infrastruttura (2026-07-24) Elon ha segnalato (via Mauro, che era in crociera) di "dimenticare le cose" — diagnosi propria di Elon, valutata e approvata da Mauro, implementata da Adrian in giornata: **Fix implementati:** 1. **`vault.db`**: aggiunta tabella `items_history` + trigger `items_history_snapshot` (AFTER UPDATE OF body,meta,file,type ON items) — salva lo stato precedente della riga prima di ogni sovrascrittura. Zero impatto sul comportamento esistente, solo audit trail additivo. Testato con nodo di prova prima del deploy. 2. **`vault-secondbrain/server.py`**: nuovo tool MCP `patch_item(id, old_string, new_string, replace_all)` — replace mirato nel body (stringa vuota = append), invece di dover ri-emettere l'intero body con `upsert_item` (causa primaria sospettata della "perdita": riformulare tutto il body a ogni update rischia di perdere sfumature). Testato (replace singolo, non-univoco→errore, replace_all, append) prima del riavvio di `vault-mcp.service`. 3. **Diagnosi caso concreto** (`giovanni-modina`, presunta perdita "ruolo Modina"): confrontati i body a 16/07 (restic), 23/07 (pcloud), 24/07 (attuale) — il body **cresce** (522→1948→2638 char), nessuna evidenza di perdita catastrofica. Nessun archivio markdown pre-migrazione trovato su Nave/Dropbox per verifica incrociata (grep "Modina" vuoto ovunque) — il vault vive solo in `vault.db`, i riferimenti "fonte" nei nodi sono etichette interne di Elon, non file reali. **Scoperte collaterali serie, riparate nello stesso giro** (trovate facendo la diagnosi, non richieste da Elon): - **Backup restic rotto dal 17/07**: `scripts/backup_completo.sh` puntava ancora al path pre-migrazione (`/mnt/ssd/adrian/...`) per la password restic — falliva ogni notte da 8 giorni. Corretto al path Dropbox attuale. - **~8412 file del repo restic + cache locale (`~/.cache/restic/`) di proprietà `root`** — causa: il cron chiamava `sudo bash backup_completo.sh` (sudo superfluo, nessun file sotto `/mnt/ssd` richiede root). Rimosso `sudo` dal cron, sistemata la proprietà con `chown -R mauro:mauro`. Prima di questo fix, `restic snapshots` andava in timeout infinito per retry su file illeggibili. - **3 symlink rotti in `logbook/`** (path pre-migrazione `/mnt/ssd/adrian/...`) che causavano errori ogni notte nel mirror pCloud — risistemati ai path Dropbox attuali. - **pCloud mirror ha comunque una copia più recente di vault.db** (23/07) rispetto a restic (16/07, poi rotto) — utile saperlo per prossime diagnosi: pCloud gira ogni notte 01:15, restic 03:00, ma restic era quello rotto. Backup di sicurezza pre-modifica di `vault.db` lasciato in `/tmp/.../scratchpad/vault_recovery/` (scratchpad, non persistente — se serve un backup vero fare copia altrove). ## ⚠️ AGGIORNAMENTO CRITICO (stesso giorno, 2026-07-24) — trovata perdita reale, recuperata Il punto 3 sopra ("nessun archivio pre-migrazione trovato") era vero solo per file `.md` su disco vivo. **Mauro ha ricordato una cartella `_migrated` che era stata eliminata** — cercata nei backup restic, trovata, recuperata. Riepilogo: - **Cosa era**: `/mnt/ssd/data/adrian-ops/_migrated/_archivio/` — l'export completo e verificato (`MANIFEST.md`/`VERIFICA.md`, righe DB = righe file, 89/89 su elon_memory ecc.) della migrazione Supabase→vault fatta da Elon a fine giugno 2026. Conteneva: dump raw verbatim di **tutte** le tabelle Supabase (`elon_memory`, `agent_messages`, `albert_digest`, `notes`, ecc.), 33 file markdown di session_log splittati, ricette, `BRIEF-adrian-export.md`. Il manifest dichiarava esplicitamente: *"il raw resta, ed è ri-derivabile"* — pensato per non essere mai cancellato. - **Cosa è successo**: cancellata per errore durante la pulizia generale del 14-15 luglio 2026 (stessa ondata della migrazione Dropbox/assorbimento Bill) — nessuno l'aveva segnata come "intoccabile per sempre" nonostante il manifest lo dicesse. Anche `data/supabase-backups/` (dump giornalieri automatici separati) eliminata lo stesso periodo (commit git `b4004ea`, 14/7). - **Conferma della perdita reale**: nel dump raw di `elon_memory` (snapshot 6/7, 89/89 righe) c'è un documento "ELON_LAVORO.md" con la gerarchia completa: *"PSB > Giovanni Modina (jolly strategico) > Maurizio (Capo Area ICR) > Marcello > Mauro"* — il titolo esatto di Modina ("jolly strategico") che l'attuale `vault.db` non ha. **9 documenti su 89** in `elon_memory` menzionano Modina (domini lavoro/strategia/fili_attivi/mauro_archivio_albert) — molto più contesto strategico di quanto sopravvissuto nell'attuale vault a 77 nodi. - **RECUPERATO** (da snapshot restic 13/7, ultimo prima della cancellazione) e **messo al sicuro in `/mnt/ssd/data/adrian-ops/_migrated_RECUPERATO_20260724/`** (2,7MB, 461 file). **⚠️ NON CANCELLARE MAI QUESTA CARTELLA** — è l'unica copia oltre al backup restic stesso, e il punto di questa storia è che va trattata come intoccabile stavolta per davvero. - **Learning per il futuro**: quando si fa pulizia disco/migrazione, cercare esplicitamente cartelle con nomi tipo `_migrated`, `_archivio`, `*backup*`, `*export*` e verificare se contengono note esplicite tipo "non cancellare" prima di eliminarle in un giro di pulizia generico — non basta che sembrino "vecchie"/"superate". ### Revisione completa — esito (2026-07-24 sera) Su richiesta di Mauro, confronto sistematico di tutto il contenuto recuperato (89 voci `elon_memory`, `agent_messages`, `albert_digest`, `notes`) contro i 75 nodi attuali di `vault.db`, dominio per dominio (lavoro, strategia, mauro, finanze, casa, sistema, kernel letti per intero; fili_attivi/session_log/mauro_archivio_albert/agent_messages/albert_digest/notes verificati a campione). **Esito: una sola perdita reale, quella di Modina — corretta.** Patchato (via UPDATE diretto su `vault.db`, stesso semantico di `patch_item`: append in coda, non riscrittura) il nodo `giovanni-modina` con la gerarchia formale recuperata (PSB > Modina "jolly strategico" > Maurizio > Marcello > Mauro) e aggiunta voce di correzione in `elon-memory` (seguito all'errore #8 del log di Elon). Cronologia salvata in `items_history` (pre-immagini di entrambi i nodi presenti, verificate). Tutto il resto del contenuto storico (watchlist satellite dismessa, storico operazioni Fineco per data, Albert facts/notes, log agent_messages, note di fondazione sistema feb-2026) è **correttamente non distillato per design** — il vault stesso lo dichiara esplicito ("resta archivio forense, non migrato: è log, non stato", nodo `portafoglio-fineco`). Prima di questa revisione quel log sarebbe stato irraggiungibile (Supabase dismesso); ora è al sicuro nell'archivio recuperato. Nessun'altra voce vault dichiara "informazione persa/irrecuperabile" a parte Modina — verificato via grep mirato su tutti i nodi. **Trovato e sistemato**: il nodo `archivio` conteneva 40 wikilink auto-generati (dal vecchio `consolidamento-notturno`, morto da inizio luglio) verso `_migrated/_archivio/...` — path che non esisteva più. Verificati uno per uno i 40 file al nuovo percorso (`adrian-ops/_migrated_RECUPERATO_20260724/_archivio/...`), poi ripuntati con find/replace mirato sul body; commento aggiornato per segnalare che il generatore automatico è morto e il fix è manuale. History salvata. ## Sistema (post 2026-07-15) Architettura two-DB: - `vault.db` → Elon-only (72 nodi + kernel + memory) - `adrian.db` → Adrian operational (eventi Outlook, todo) **Servizi attivi:** - `vault-mcp` (8765) — MCP server vault - `outlook-sync` (cron */15) — sincronizza calendario/todo iPhone - `guacd` (cron */5) — mantiene vivo container Guacamole **Cron attivi:** outlook_sync */15, guacd */5, wg_monitor orario, pcloud 01:15, avamposto 02:45, restic 03:00, collect_logs 05:45, sentinel dom 06:00 **Servizi eliminati (2026-07-15):** cockpit-webapp, form-watch — sostituiti da Claude app (/remote_control) + Telegram **Servizi sospesi:** inbox-watch, vault_guardian, elon_checklist, elon_pull, maintenance_check **Comunicazione Mauro↔Adrian:** Claude app (/remote_control) per interattivo, Telegram per notifiche push **Comunicazione Elon:** solo copia/incolla manuale di Mauro. Nessun bridge automatico. **Caddy VPS (privcloud.dev):** jellyfin, music, desktop, webdav, vault — cockpit e jarvis rimossi ## Migrazione PC ufficio completata (2026-07-17) **PYTHON/ ora dentro Dropbox/adrian/PYTHON/** — blitz completato prima della crociera di Mauro (sabato 2026-07-19). Cosa è cambiato: - `C:\PYTHON` → `C:\PYTHON (dismesso)` (rinominata, non eliminata — contiene venv e legacy_snapshot intoccabili) - `Dropbox\PYTHON\` → `Dropbox\adrian\PYTHON\` — la catena CLAUDE.md ora è: `~/.claude/CLAUDE.md` (eliminato su Windows) → `Dropbox\adrian\CLAUDE.md` → `Dropbox\adrian\PYTHON\CLAUDE.md` → project CLAUDE.md - Venv ricostruito: `Dropbox\adrian\PYTHON\_runtimes\venv\` (da requirements.txt, 31 pacchetti) - Tutti i .bat aggiornati al nuovo path venv (Frank, GemmaReport, ImdbUpdate, DbComparer, omdb_enrich) - `frank_config.json` → `database.path` aggiornato a `Dropbox\adrian\PYTHON\Frank\data\frank.db` - `frank.db` copiato da `C:\PYTHON (dismesso)\Frank\data\frank.db` → posizione Dropbox - **Frank confermato funzionante** — ha caricato tutte le schedulazioni (2026-07-17) Task Scheduler: Mauro ha aggiornato manualmente il job che chiamava `frank_watchdog_launcher.vbs` (il path con spazi richiedeva `wscript.exe` come program con VBS path quotato come argument). Gotcha scoperto: SQLite DB locked durante robocopy = skip silenzioso. Per questo frank.db non era in Dropbox — era bloccato dal daemon Frank durante la sync. **PowerBricks**: visual query builder Blockly→JSON→SQL su Parquet Mediaset. Modulo dentro MyICR_Suite (`app/modules/powerbricks/`). Seme da ~5 settimane, tutto da progettare. Layer semantico è il pezzo fondante. Logica diritti è il valore vero. Specifiche complete in `PowerBricks_Specifiche.md`. NL Query Fase 1 in corso (`NL_semantic_layer/`). Contenitore ancora da decidere (PyQt6+QtWebEngine vs altro). **SQLite mirror già esiste**: `linker.db`, `ott.db`, `mediatrack.db` — dati già locali e interrogabili senza toccare i Parquet. **Venv Windows**: ricostruito in `Dropbox\adrian\PYTHON\_runtimes\venv\`. Escluso da Dropbox sync via `.dropboxignore`. Ricostruire con `requirements.txt` se perso. ## Migrazione Dropbox completata (2026-07-16) - **Symlink memoria**: avevo segnato "già presente" il 16/07 controllando solo che la cartella progetto esistesse in `~/.claude/projects/-mnt-ssd-data-Dropbox-adrian/` — errore, non avevo verificato il symlink `memory` specifico. Scoperto mancante il 17/07 (Mauro ha chiesto "hai un file di memoria esterno alla cartella Adrian?"), creato ora: `~/.claude/projects/-mnt-ssd-data-Dropbox-adrian/memory -> /mnt/ssd/data/Dropbox/adrian/memory`. Il vecchio symlink in `-mnt-ssd-adrian/memory` punta al path pre-migrazione ormai inesistente (rotto, lasciato lì, cartella intera ormai storica). - Crontab: tutti i path aggiornati `/mnt/ssd/adrian/` → `/mnt/ssd/data/Dropbox/adrian/` (gotcha: `crontab ` con path lungo/sandbox falliva silenziosamente troncando il nome file — risolto copiando il file in `/tmp` con nome corto prima di caricarlo) - **vault-mcp È un systemd service** (`/etc/systemd/system/vault-mcp.service`, system-level, enabled, `Restart=on-failure`) — non un processo nudo come inizialmente creduto. Path in `ExecStart`/`WorkingDirectory` aggiornato al nuovo Dropbox path, `daemon-reload` fatto, riavviato via `systemctl start` (PID pulito, gira come dovrebbe). Gotcha: kill manuale (SIGTERM) non triggera `Restart=on-failure` — systemd lo considera stop intenzionale, non riparte da solo; avevo inizialmente rilanciato a mano con nohup fuori da systemd, poi corretto. - `inbox-watch.service` (user, disabled): stesso path stantio, corretto per coerenza anche se non attivo - Vecchia cartella `/mnt/ssd/adrian/` **non esiste più** — già rimossa/spostata, nulla da eliminare - `.env` vault-secondbrain: nessun path hardcoded da correggere **Gotcha scoperto (2026-07-17): `.dropboxignore` non esiste come meccanismo reale.** Il client Dropbox non lo legge (`dropbox exclude list` → "No directories are being ignored"). L'esclusione vera è `dropbox exclude add ` (client-side, non tocca cloud/altri dispositivi, reversibile con `exclude remove`). Il file `.dropboxignore` creato in `adrian/` è pura documentazione, zero effetto pratico. **Non applicato a `PYTHON/` su richiesta esplicita di Mauro — non toccare quella cartella.** **Pulizia disco (2026-07-16): 35GB → 286MB** - `.git/objects/pack/tmp_pack_*`: 24GB di pack temporanei orfani (garbage da repack interrotto, 17/04) — rimossi, `git fsck` pulito, storia reale solo 9MB - `venv/` root: 6,4GB, **zero consumatori attivi** (nessun cron/systemd lo referenzia, codice Albert src/main.py già rimosso da questa cartella) — eliminato. `requirements.txt` root (langchain/PySide6/torch, leftover Albert) eliminato con lui. - `vault-secondbrain/venv/`: ricreato pulito (210MB vs 4,6GB). Scoperta: `lancedb`/`sentence_transformers` **non erano nemmeno installati** nonostante `ingest.py` li importi — Layer 2/RAG era già rotto (ImportError), non solo sospeso. nvidia/triton/pyarrow/onnxruntime/chromadb erano scarti morti di install precedenti. Nuovo venv: python-dotenv, loguru, mcp, playwright, pydantic, httpx, pytz, python-docx. Testato: server.py e outlook_sync.py importano ok, vault-mcp.service riavviato e funzionante. - Se si riattiva Layer 2: `pip install lancedb sentence-transformers` nel venv vault-secondbrain (richiederà di nuovo torch/nvidia, ~4GB) --- ## Roadmap consolidamento (decisa 2026-07-16) Adrian si sposta su Dropbox. Bill assorbito — due istanze di Adrian (Nave + PC ufficio), stessa identità, stessa memoria. - `Dropbox/adrian/` — casa Adrian, CLAUDE.md unico, memory/ dentro il progetto (sync Dropbox) - `Dropbox/PYTHON/` — codice Windows, sibling separato; ogni progetto ha suo CLAUDE.md - venv escluso da Dropbox (.dropboxignore), ricostruito per macchina - Cron/systemd rimangono sulla Nave, path da aggiornare al momento della migrazione Dettagli in `docs/roadmap-consolidamento.md`. ## Thread aperti - **Terzo subagente futuro — sviluppo software MyICR (2026-07-18)**: `[da approfondire, nessuna urgenza]` — a completamento del quadro (dopo `powerbricks-expert` = semantica dati, `myicr-flussi-expert` = logistica flussi), Mauro propone un terzo agente specializzato nello **sviluppo software di MyICR_Suite**. Punto di design aperto quando si scoperà: a differenza dei primi due (sola lettura), uno agente-sviluppatore avrebbe bisogno di scrivere codice — si scontra con la regola "scrittura `PYTHON/` solo da istanza ufficio, mai da Nave". Da decidere: resta consulente sola-lettura (propone diff/prompt, come fatto oggi per Frank-relay) o gira solo da istanza ufficio dove la scrittura è permessa. - 🔥 **PowerBricks/NL Query + logistica flussi — due subagenti operativi, sessione lunga 2026-07-17**: `powerbricks-expert` (semantica dati, `memory/project_powerbricks_knowledge.md`) e `myicr-flussi-expert` (provenienza/pipeline, `memory/project_myicr_flussi_knowledge.md`) entrambi attivi e ben popolati. Novità grosse di oggi: **Frank-relay** operativo (canale file via Dropbox, Frank esegue `list_dir`/`read_file`/`glob`/`duckdb_query` in sola lettura su richiesta di Nave — vedi `PYTHON/Frank/daemon/relay_handler.py`), che ha permesso di ricostruire e **quantificare con query reali** l'intera pipeline SCHEDULATORE→parquet L2 (solo 18,8% dei diritti totali arriva in MyICR_Suite/PowerBricks — il resto, incluso tutto il pay/streaming e quasi tutto DVB-T/DVB-H, viene filtrato) e la storia del workaround Free+DVB-T (introdotto dall'ufficio diritti/Sara Ragazzi senza coinvolgere ICR — oggi MyICR_Suite non espone da nessuna parte che un prodotto è "canale secondario", candidato fix futuro). **Domande aperte tenute calde** (elenco completo in cima a `project_myicr_flussi_knowledge.md`, sezione "🔥 Domande aperte"): consumer di `db_Osservatorio.accdb`, collegamento `gemma.parquet`↔Acquisti mai verificato, significato `ICR_MONDO` CON/MED, `sync_DEV_LOCAL.bat` non verificabile da Nave, più le domande lato semantica in `project_powerbricks_knowledge.md` (scala veg criterio esatto, situazione/causale diritti, tre codifiche rete, contenuto business linker/ott/mediatrack mai interrogato). **Pending residuo**: impostazione per esportare le estrazioni su richiesta, mai affrontato. Thread molto caldo — non lasciarlo raffreddare, riprendere dalla lista domande aperte alla prossima sessione. - **VPS Hetzner Avamposto**: usato solo come reverse proxy Caddy per *.privcloud.dev via WireGuard. Sottoutilizzato per il costo (~13€/mese). Opzioni: Cloudflare Tunnel (gratis, Cloudflare come intermediario) o downgrade a CAX11 (~4€/mese). Da valutare con calma. - **vault/config.txt**: voci cron stantie da pulire (snapshot_configs, wg_monitor */5 ora è orario). - **Fragilità Nave**: MiniPC N150 è SPOF — vault/Elon/cron tutti lì. Piano resilienza da fare. Non urgente, ma cresce. - **Label vuote archi Elon**: 166/199 (83%) senza label. Regime: label-on-touch. - **Adrian second brain**: filosofia e continuità operativa prima del RAG. - **Rischio corruzione git via Dropbox (2026-07-17, ridimensionato)**: `.git/` di `adrian/` sincronizza per intero via Dropbox (nessuna esclusione — `dropbox exclude list` conferma). Rischio reale solo se Nave e istanza Ufficio committano **su `adrian/.git`** vicino nel tempo — ma il lavoro vero (Frank, MyICR_Suite, ecc.) resta dentro `PYTHON/`, che è un repo separato con un solo scrittore (PC ufficio), quindi lì il problema non si pone. Il punto residuo: se l'ufficio aggiorna `memory/`/`CLAUDE.md` mentre anche Nave committa nello stesso repo — occorrenza rara, non costante. Opzioni se mai servisse irrigidire: (a) vero git remote (bare repo privato via WireGuard) con push/pull espliciti, (b) disciplina manuale — controllare `git log` prima di committare se si sa che l'altra istanza ha lavorato di recente. Non urgente. - **Modifiche a `PYTHON/` (Frank, MyICR_Suite, ecc.) — chiuso, nessun meccanismo (2026-07-17)**: esplorate e scartate diverse opzioni (tunnel di rete verso PC ufficio, protocollo a file JSON richiesta/risposta, coda con stati, perfino una semplice voce in "Thread aperti") — tutte inutili. **Decisione finale di Mauro**: le modifiche al codice in `PYTHON/` si fanno **direttamente sul PC ufficio**, in sessione lì. Se serve portare contesto da Nave a Ufficio, si fa **copia/incolla manuale**, esattamente come già avviene per Elon — nessuna automazione, nessun file dedicato, nessuna infrastruttura. Non riaprire questo tema salvo bisogno concreto e diverso in futuro. ## Canali comunicazione (aggiornato 2026-07-13) - **Cockpit + Telegram**: alert asincroni, notifiche push, comandi quick (/c /t) — funziona anche con app chiusa - **App Claude remote control** (`/remote_control` da VSCode): continua la sessione sullo smartphone con contesto completo + MCP + upload file. Più veloce del cockpit per conversazioni interattive. Richiede computer acceso. - I due canali si complementano: Telegram sveglia → apri app → trovi conversazione aggiornata ## Pulizia Dropbox/documenti/Adrian (2026-07-15) ~32 GB liberati in totale: - **Dropbox/documenti duplicati**: ~6 GB (VAULT ebook, staging, apparato cardiovascolare, Nadia, ecc.) — master confermato: `/mnt/ssd/data/documenti/` - **Ebook VAULT/media**: 2.1 GB (VAULT/EBOOK rimossa, master: `media/ebooks/`) - **config-backups/snapshots**: 28 GB (30 snapshot giornalieri Nave — ridondanti con restic, dismessi) - **packages RAG venv**: 1.4 GB (torch, lancedb, sentence-transformers — pipeline sospesa) - **Cron aggiornato**: wg_monitor da */5 a oraria; elon_pull e maintenance_check in pausa (bridge sospeso) - **Script rimossi**: flotta_health_check.py, rag_ingest.py, roundtable.py, loop_ui.py, snapshot_configs.py, proposta-*.md - **adrian-ops pulita**: rimossi _migrated/, docs/, inbox/, lancedb/ (sospesi) ## Miglioramenti sessione 2026-07-13 - SessionStart hook: aggiornato con `session_start_hook.py` — banner arancione (`systemMessage`) se ci sono msg-m2a pending senza ack - `docs/claude-code-slash-commands.md`: lista comandi slash estratta da video YouTube (dnsW4zkbiH0) - `youtube-transcript-api` installato in vault-secondbrain/venv ## Pattern riconosciuti - form-watch va riavviato se il DB_PATH cambia — non si aggiorna a caldo - vault-mcp va riavviato dopo ogni modifica a server.py - I tool MCP si fissano al boot della sessione Elon — cambiamenti visibili solo al reboot - Il pkill su processi di sistema li killa senza riavvio automatico — usare systemctl - Il Monitor va avviato PRIMA di leggere i messaggi utente — se c'è già un messaggio, rischio di saltarlo