# CHANGELOG — Adrian (storico completo) > Storico versioni di `CLAUDE.md`. Spostato qui il 2026-07-17 per alleggerire la Costituzione > (~18.000 token → molto meno). CLAUDE.md ora tiene **zero changelog**, solo lo stato corrente — > anche le ultime versioni vivono solo qui, non solo "tutte tranne le ultime 3" come nella prima bozza. --- ### v1.71 - 2026-07-24 - Recuperata perdita reale Supabase→vault, fix backup/vault-mcp Diagnosi Elon "memoria che dimentica" (segnalata da Mauro in crociera, valutata e approvata): implementati `items_history`+trigger su vault.db (audit trail) e tool MCP `patch_item` (replace mirato invece di riscrivere l'intero body). Nel fare la diagnosi (caso `giovanni-modina`), Mauro ha ricordato una cartella `_migrated` eliminata — recuperata da backup restic: era l'export verificato al 100% della migrazione Supabase→vault (giugno 2026), cancellata per errore nella pulizia del 14-15/7 nonostante il manifest dicesse esplicitamente di non farlo mai. Confermata perdita reale (titolo di un nodo, "jolly strategico", presente nel dump raw e assente nel vault attuale). Recuperato e messo al sicuro in `adrian-ops/_migrated_RECUPERATO_20260724/` (MAI CANCELLARE). Trovati e sistemati anche: backup restic rotto da 8 giorni (path password pre-migrazione), ~8400 file del repo restic di proprietà root (sudo superfluo nel cron, rimosso), 3 symlink rotti in logbook/. Dettaglio completo in `memory/adrian_state.md`. --- ### v1.70 - 2026-07-17 - Rimossa architettura Albert dal kernel + azzerato changelog nel kernel - **Rimossa l'intera sezione "🔧 ALBERT — Architettura e Regole Specifiche"** (stack, kernel, protocollo, gotcha) da CLAUDE.md — Albert è spento dal 2026-03-29, zero valore operativo tenerla nel kernel sempre caricato. Archiviata qui sotto ("Architettura Albert — archiviata"). - Rimossi anche: "Configurazione LLM Albert" e "Ultimo stato DB Albert" da STATO OPERATIVO, "Albert (Linux home)" da DEPLOYMENT, righe Albert-specifiche dalla tabella Autonomia, riga "Albert non riceve input da agenti esterni" da Comunicazione inter-agente, principio "Autonomia First" (Albert guida il suo software) da PRINCIPI, voci Mike-dipendenti (M1/M2/M3, Tool auto-discovery) da ROADMAP INTER-SISTEMA (Mike rimosso 2026-03-29, quelle voci erano già morte) - **Azzerato completamente il changelog nel kernel**: ripensandoci dopo la prima bozza (v1.69, "tieni le ultime 3 versioni"), non c'era un vero motivo per tenerne alcuna nel documento operativo — il contenuto vivo delle regole è già altrove nel file, il changelog serve solo a capire la storia, non per operare. CLAUDE.md ora ha zero voci di changelog, solo il rimando a questo file. - Motivazione della sessione: Mauro ha notato che continuavo a citare Albert come riferimento (kernel_ontop) nonostante sia spento da mesi — sintomo che il kernel portava ancora troppo peso morto ### v1.69 - 2026-07-17 - Slim changelog + sezione Avvio Sessione - Storico changelog (tutte le versioni tranne le ultime 3) spostato in `CHANGELOG.md` — il file pesava ~18.000 token, in gran parte changelog che non serve a operare - Aggiunta sezione `## 🚀 AVVIO SESSIONE` in testa alla Costituzione: sequenza esplicita a inizio sessione (identifica istanza → leggi `memory/MEMORY.md` → apri file rilevanti), con nota esplicita su dove vive la memoria persistente (solo `Dropbox/adrian/memory/`, mai la cartella locale `~/.claude/projects/.../memory/`) - Prompt preparato da un'istanza precedente su Ufficio, eseguito da Nave su richiesta di Mauro ### v1.68 - 2026-07-17 - Regola: PYTHON/ sola lettura da Nave (convenzione generale) - Tabella Autonomia: aggiunte righe esplicite — lettura `PYTHON/` (codice/dati) da Nave sempre consentita, scrittura mai (solo istanza ufficio) - Sostituisce le eccezioni elencate file-per-file usate finora per i subagenti `powerbricks-expert`/`myicr-flussi-expert` (dettaglio in `memory/feedback_python_windows_territory.md`) — ora è una convenzione generale, non serve più enumerare - Chiarito limite tecnico distinto dalla policy: `DataHub_v2`/`ParquetToAccess`/`PIPELINE_PYTHON` su `I:\` (share Mediaset) restano irraggiungibili da Nave in ogni caso, nessuna convenzione di sola lettura può cambiarlo - Decisione collegata: niente protocollo/automazione per richiedere modifiche in scrittura a `PYTHON/` da Nave — si fa di persona in ufficio, copia/incolla manuale se serve contesto (v. `memory/adrian_state.md`) ### v1.67 - 2026-07-17 - Regola: gap di memoria tra istanze, scrivere subito in memory/ - Nuova sezione in Costituzione: i trascritti di sessione sono locali per macchina, non sincronizzati — solo `memory/` viaggia tra Nave e Ufficio. Regola: se qualcosa conta per l'altra istanza va scritto subito in `memory/`, non a fine sessione - Motivazione: emerso da uno scambio con Mauro su cosa succede se una decisione rilevante resta detta solo in conversazione su una macchina ### v1.66 - 2026-07-17 - Regola: identificazione istanza a inizio sessione - Nuova sezione in Costituzione: a inizio sessione, controllare `hostname`/OS per sapere se si è su Nave o Ufficio — Costituzione e memoria sono identiche ovunque, il contenuto da solo non lo dice - Anche il symlink memoria per il nuovo path Dropbox era mancante (segnato per errore come "già presente" il 16/07, verificato solo oggi su domanda diretta di Mauro) — ricreato --- ## Architettura Albert — archiviata (2026-07-17) *Sezione rimossa da CLAUDE.md il 2026-07-17 (v1.70). Albert è spento dal 2026-03-29 — contenuto storico/di riferimento, non operativo. Se Albert venisse mai riattivato, ripartire da qui.* ### Stack - **LLM**: Gemini 3 Flash Preview via Google Direct API (httpx raw, IPv4 forzato) - **DB**: SQLite `data/albert.db` — facts, notes, calendar, todo, conversations, FTS5 - **Tool attivi**: facts_tool, notes_tool, calendar_tool, todo_tool, web_search_tool, conversation_search_tool (M3) - **Mike RAG**: pre-fetch contesto da DB prima di ogni messaggio (keyword matching) - **Enforcement**: hard counter in Python — max 4 read calls/tool, writes mai bloccate; conversation_search_tool max 2 calls - **Retry**: 3 tentativi con backoff (1s→2s→4s) per 503/empty response ### Kernel Albert (NON TOCCARE) ``` kernel_ontop ← orchestratore, pre-loaded nel system prompt sub_kernel_rules_manager ← PRE-LOADED sempre sub_kernel_efficiency v2.1.2 ← PRE-LOADED sempre (+571 token totali) 8 sub-kernel lazy ← caricati on-demand via @tag ``` **Regola assoluta (quando Albert era attivo)**: Adrian non modifica mai kernel_ontop o sub-kernel. Genera prompt → Mauro passa ad Albert → Albert decide autonomamente. ### Protocollo interazione con Albert 1. Adrian analizza/propone 2. Adrian genera **prompt** per Albert 3. Mauro copia-incolla prompt nel CLI di Albert 4. Albert decide autonomamente 5. Adrian implementa infra se necessario ### Sonnet Checkup (analisi approfondita) Quando serve analisi profonda del sistema Albert: - Sonnet è **READ-ONLY** — mai modifiche dirette - Sonnet analizza → genera report → Adrian implementa (se approvato) - Frequenza: mensile o on-demand ### Pattern noti e gotcha - IPv6 broken su questa rete → disabilitato a livello sistema (`/etc/sysctl.d/99-disable-ipv6.conf`); Google Direct API usa anche `local_address="0.0.0.0"` - OpenAI SDK 1.12.0 strips Gemini extra_content → usare httpx raw per GoogleDirectLLM - Gemini 3 Flash ignora istruzioni sotto pressione → enforcement hard in Python, non prompt - Gemini 3 Pro: timeout con tools su Google Direct → non viable - Sub-kernel consolidation può introdurre bug → testare dopo ogni audit - Google free tier ha quota giornaliera → heavy testing può esaurirla - Conversation window cross-day: `get_conversation_history` ha `hours_cutoff=20` — messaggi >20h esclusi dal contesto LLM - Albert buongiorno senza tool call: Mike ora triggera calendar+todo su GREETING_KEYWORDS; agent.py annota messaggi cross-day con timestamp `[dd/mm HH:MM]` ### Deployment ```bash # Telegram bot (produzione, systemd) systemctl status telegram_bot journalctl -u telegram_bot -f systemctl restart telegram_bot # CLI (sviluppo/debug) cd /mnt/ssd/data/Dropbox/adrian && source venv/bin/activate && python main.py ``` **Hardware**: MiniPC N150 (Linux 6.8, 24/7, auto-start al boot) ### Ultimo stato DB Albert (2026-07-17) - ~98 facts, 10 sub-kernel, 1.3MB - FTS5 full-text search attivo - Mike RAG v2: rimosso (Albert spento) ### Configurazione LLM Albert (storica) - Default: `gemini-3-flash-preview` via Google Direct (~1.5s) - Fallback: OpenRouter (~16s) - Switch: `/model` command in CLI Albert - Hard enforcement: max 4 read calls/tool in Python (non bypassabile) --- ### v1.65 - 2026-07-17 - Chiuso pending: CLAUDE.md per-progetto PYTHON/ già esistenti Verifica (sola lettura, da Nave) di `PYTHON/CLAUDE.md` e affini: il coordinator e tutti i CLAUDE.md per-progetto (Frank, MyICR_Suite, GemmaReport, ImdbUpdate, DbComparer, GemmaClient, MonitorOsservatorioPy, + moduli powerbricks/linker/mediatrack) esistono già, sono versionati e dichiarano esplicitamente di ereditare questa Costituzione — coerenti con la regola v1.64 ancora prima che fosse scritta. Rimossi i pending obsoleti che li davano per "da creare". Nessuna modifica fatta dentro `PYTHON/` (territorio ufficio, solo lettura). ### v1.64 - 2026-07-17 - Regola: CLAUDE.md subordinati ereditano la Costituzione - Nuova sezione in Costituzione: ogni CLAUDE.md di progetto (`PYTHON/` — Frank, MyICR_Suite, ecc. — e futuri agenti) eredita automaticamente questa Costituzione; contiene solo contesto locale, non ripete regole già coperte; eccezioni vanno dichiarate esplicitamente; stesso formato minimo (versione+data, changelog leggero) - Motivazione: in vista della creazione dei primi CLAUDE.md per-progetto in `Dropbox/adrian/PYTHON/` (migrazione ufficio completata il 2026-07-17) — regola fissata ora per evitare che nascano documenti scoordinati ### v1.63 - 2026-07-16 - Pulizia disco: 35GB → 286MB **`.git` orfano (24GB → 9MB storia reale):** - 3 pack temporanei da 8GB (`tmp_pack_*`, residui di repack interrotto il 17/04) rimossi da `.git/objects/pack/` - `git fsck --full` pulito dopo la rimozione — nessuna corruzione, solo blob pendenti innocui **venv root eliminato (6,4GB):** - Zero consumatori: nessun cron/systemd lo referenzia, il codice Albert (`src/`, `main.py`) non vive già più in questa cartella - `requirements.txt` root (langchain, PySide6, torch — leftover Albert/GUI rimossa 2026-02-28) eliminato con lui **`vault-secondbrain/venv` ricreato pulito (4,6GB → 210MB):** - Scoperta: `lancedb`/`sentence_transformers` **non erano 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 mai puliti - Nuovo venv minimale: python-dotenv, loguru, mcp, playwright, pydantic, httpx, pytz, python-docx — testato (import server.py/outlook_sync.py ok, vault-mcp.service riavviato e funzionante) - Se si riattiva Layer 2: `pip install lancedb sentence-transformers` (richiede di nuovo torch/nvidia, ~4GB) ### v1.62 - 2026-07-16 - Migrazione Dropbox + assorbimento Bill + rimozione cockpit/graphviewer **Migrazione Adrian su Dropbox (Nave):** - Root spostata `/mnt/ssd/adrian/` → `/mnt/ssd/data/Dropbox/adrian/` — sync Dropbox tra Nave e PC ufficio - `memory/` (memoria persistente Adrian) ora dentro il progetto, sync Dropbox — sostituisce `~/.claude/projects/.../memory/` come unica copia - `.dropboxignore` creato: esclude `venv/`, `.venv/`, `__pycache__/`, `*.pyc`, `logs/` dalla sync — venv ricostruito per macchina - Crontab aggiornato: tutti i path `/mnt/ssd/adrian/` → nuovo path Dropbox (gotcha: `crontab ` con path lungo falliva silenziosamente troncando il filename — bypassato passando da un file con nome corto in `/tmp`) - `vault-mcp` (server.py): scoperto essere un systemd service system-level (`vault-mcp.service`, enabled, `Restart=on-failure`) puntato ancora al vecchio path — corretto `ExecStart`/`WorkingDirectory`, `daemon-reload`, riavviato via `systemctl`. Anche `inbox-watch.service` (user, disabled) aveva lo stesso path stantio, corretto per coerenza. Gotcha: kill manuale non triggera l'auto-restart di systemd (SIGTERM = stop intenzionale) **Bill assorbito in Adrian:** - Decisione: niente più agente separato su Windows ufficio — due istanze di Adrian (Nave + Ufficio), stessa identità, stessa Costituzione, stessa memoria (sync Dropbox) - `C:\PYTHON\` rinominato in `C:\PYTHON_OLD` (2026-07-17); contenuto spostato in `Dropbox/adrian/PYTHON/` — dentro adrian/, non più sibling. Venv da ricostruire in posizione stabile. - Dettagli piano in `docs/roadmap-consolidamento.md` **Rimozione servizi obsoleti (commit 2d4132a, 69147b7 del 2026-07-15, recepiti in Costituzione oggi):** - Cockpit webapp (`webapp.py`, `form_watch.py`, `session_start_hook.py`) e graphviewer eliminati — canale Mauro↔Adrian ora Claude app (`/remote_control`) + Telegram - Riferimenti stantii puliti in CLAUDE.md: sezione "Stato operativo", "Architettura vault", "Comunicazione inter-agente" (rimossa eccezione Supabase, mai più menzionarlo), roadmap inter-sistema ### v1.61 - 2026-07-12 - Separazione vault Elon / adrian.db + autonomia Elon **Architettura two-DB:** - `vault.db` ora Elon-only: 72 nodi + kernel-elon + elon-memory. Tutti gli item operativi rimossi. - `adrian.db` nuovo in `/mnt/ssd/data/adrian-ops/`: DB operativo Adrian (cockpit slots, eventi, todo Outlook). Schema identico a vault.db. - Tutti gli script Adrian aggiornati per puntare ad adrian.db: webapp.py, form_watch.py, outlook_sync.py, roundtable.py, elon_pull.py, loop_ui.py, maintenance_check.py, rt.py. - Layer 2 (LanceDB), inbox/, docs/ migrati in `/mnt/ssd/data/adrian-ops/` — SOSPESI. **Servizi disabilitati:** - `inbox-watch.service`: systemd disabled. - `vault_guardian` (cron 04:30): PAUSED. - `elon_checklist` (cron lun 04:45): PAUSED. - Comandi cockpit `/n`, `/ne`, `/rt`: disabilitati in webapp.py con placeholder `[disabilitato]`. **Comunicazione con Elon:** - Nessun bridge automatico. Solo copia/incolla manuale di Mauro in sessione Claude.ai. - Protocollo msg-a2e/msg-e2a sospeso. - Roundtable sospeso. **Kernel Elon v2026-07-12:** - Rimossi: §10 (loop Adrian↔Elon), §11 (Limbo), §12 (Roundtable). - Rimossa nota "Manutenzione esclusiva Adrian" — Elon gestisce il kernel in autonomia. - Rimossi: `type='documento'`, rag_query, riferimenti Layer 2. - Aggiunta regola §6 "Autonomia piena sul vault": nessun canale automatico, Elon propone a Mauro in sessione, cresce al suo ritmo. - Ridotto da 31.6KB a 17.6KB. ### v1.60 - 2026-07-10 - created_at/updated_at nativi + /ne elon-first + gate /n **vault.db — timestamp nativi (DDL approvato Mauro+Elon):** - `ALTER TABLE items ADD COLUMN created_at TEXT` + `updated_at TEXT` - Trigger AFTER INSERT: setta entrambe; Trigger AFTER UPDATE OF body/meta/file/type: aggiorna solo updated_at - server.py: `INSERT OR REPLACE` → `INSERT ... ON CONFLICT DO UPDATE` (preserva created_at) - Backfill sintetico 771 item con baseline 2026-07-10 - `elon_checklist` limbo stantii: query aggiornata con `created_at < datetime('now','-7 days')` - Soppressione bulk: da aggiungere alla prima operazione bulk reale - `meta.aggiornato`: lasciato in transizione, deprecazione graduale **Cockpit — routing note:** - `/n `: Adrian classifica (todo se action item, limbo Elon se contesto) + notify Adrian - `/ne `: elon-first (Elon valuta per grafo, Adrian legge e può fare domande) + notify con tag [elon-first] - `/p`: leggi Protocollo Mauro (nodo `protocollo-mauro` in vault.db) - Gate /n: form_watch notifica [NOTA] / [NOTA][elon-first] → Adrian classifica e gestisce **Protocollo Mauro:** nodo `protocollo-mauro` con 5 regole di disciplina, leggibile via `/p` ### v1.59 - 2026-07-10 - Todo check mattutino + /p protocollo Mauro + fix timezone **maintenance_check (09:00) — todo_check:** - Scaduti (due_date < oggi, pending) → cockpit + Telegram - In scadenza oggi → cockpit - Completati nelle ultime 24h → registra reattività Mauro - Fix db_write_cockpit: accetta conn opzionale (evita DB lock) - Regola operativa: non lanciare maintenance_check manualmente durante sessioni attive **Protocollo Mauro:** - Nodo `protocollo-mauro` in vault.db con 5 regole di disciplina - Comando `/p` nel cockpit per leggerlo in qualsiasi momento - Aggiunto a `/help` **fix outlook_sync — timezone dueDateTime:** - Microsoft Graph restituisce dueDateTime in UTC; conversione UTC→Europe/Rome al read-back - Prima: due_date risultava un giorno indietro in vault.db rispetto a iPhone ### v1.58 - 2026-07-10 - Gate /n: Adrian come primo filtro sulle note cockpit **Flusso nota-notify:** - `webapp.py`: `/n` scrive nodo limbo (`fonte=cockpit`) + `nota-notify-{node_id}` (os) in vault.db - `form_watch.py`: polling `nota-notify-*` → notifica `[NOTA] {node_id}: preview` ad Adrian in real-time - Adrian classifica caso per caso: todo puro → crea vault todo + sfila limbo da Elon; bug/contesto lavorativo → crea vault todo + lascia limbo a Elon; info/waiting → lascia limbo a Elon - Adrian deleta il `nota-notify-*` dopo aver gestito (cleanup automatico) - `outlook_sync` porta i todo su iPhone entro 15 min **Principio**: Adrian è il gate — Elon riceve solo le note con valore semantico per il grafo. **Kernel-elon §11**: aggiunto Ramo Nota Cockpit — Elon riconosce `meta.fonte='cockpit'` (no doc_id), sa che se ha osservazioni → scrive msg-e2a subject='nota-cockpit'. ### v1.57 - 2026-07-10 - elon_pull refactor: state machine Vision-driven + trigger adattivo **elon_pull.py riscritto da zero:** State machine pre-pull (Vision-driven): - CHROME_DOWN → avvia Chrome con profilo debug-elon - WRONG_PAGE → naviga al Project URL - GENERATING → aspetta max 2 min, retry detection ogni 5s - AUTH_ERROR / CAPTCHA → Telegram Mauro, stop - READY_WARM → trigger diretto (testo msg-a2e, kernel già in memoria) - READY_COLD → #boot standard (Elon ricarica kernel, poi legge msg-a2e) Trigger adattivo cold/warm: - Sessione WARM con kernel_loaded=true e msg-a2e ≤2000 chars → manda `# ` direttamente, risparmio overhead kernel - Sessione COLD o msg lunghi → #boot standard - Vision model: `anthropic/claude-sonnet-4-5` via OpenRouter (stesso di browser_agent) Cron retry: - Flag `--retry-if-pending`: ritenta pull solo se msg-a2e senza ack da >2h — per manutenzione notturna - Flag `--fire-and-forget`: non-blocking, per chiamate da vault_guardian/elon_checklist - Flag `--restart-chrome`: utility per restart manuale Debug: screenshots in `/tmp/elon_pull_debug/pre_pull.png` e `poll_Xs.png` ### v1.56 - 2026-07-09 - Classify bridge inbox→Adrian + /n cockpit + Vision PDF **Bridge classificazione inbox→Adrian:** - `inbox_watch.py` riscritto: scrive `classify-request-{doc_id}` in vault.db, attende `classify-result-{doc_id}` da Adrian (5 min timeout, poi fallback Vision API) - `form_watch.py` aggiornato: monitora anche `classify-request-*` → notifica `[INBOX] path:doc_id` a Adrian via stdout/Monitor - `ingest.py`: aggiunta `ingest_file_with_classify(path, doc_id, classificazione)` — completa ingestione con classificazione pre-computata da Adrian - Motivazione: Adrian conosce il contesto famiglia/lavoro → classificazione superiore a Haiku; VSCode è sempre aperto sulla Nave → Adrian disponibile H24 **Estrazione PDF scansionati:** - Tesseract rimosso — Claude Vision (OpenRouter Sonnet) come unico fallback per PDF scansionati vuoti - `_vision_pdf(path)`: converte PDF→JPEG (pdf2image, 200dpi), manda a Claude Vision, ritorna `(testo_estratto, classificazione)` in un solo call **Cockpit /n:** - Comando `/n ` crea nodo tipo=episodio, fonte=cockpit in vault.db (data auto) - Alias `/nota` mantenuto per compatibilità ### v1.55 - 2026-07-09 - Protocollo manutenzione notturna + checklist semantica settimanale **Protocollo manutenzione autonoma vault (Adrian come gatekeeper):** `vault_guardian.py` (cron 04:30): - Census orfani vault.db: nodi 0-out, 0-in, relazioni dangling - Gate: solo dangling → msg-a2e a Elon + fire-and-forget #boot (0-out/0-in = foglie/radici intenzionali, sola segnalazione Telegram) - Notifica Telegram solo se anomalie nuove rispetto al run precedente `elon_checklist.py` (cron lunedì 04:45): - AUTONOMO: alias mancanti, label relazioni vuote, limbo stantii >7gg - SEGNALAZIONE: body corto, tipo/contenuto incongruente, episodi senza data, cantieri conclusi - Scrive msg-a2e subject='checklist-settimanale' + fire-and-forget #boot `maintenance_check.py` (cron 09:00): - Legge msg-e2a di Elon (risposta a manutenzione-notturna e checklist-settimanale) - Adrian fa da gate: `is_actionable()` — filtra risposte "tutto nessuno" senza disturbare Mauro - Se actionable → scrive nel cockpit (`da-adrian-a-mauro`) + Telegram campanello - Se msg-a2e senza ack da >48h → avvisa Mauro via Telegram (freeze/assenza Elon) - Ack i msg-e2a letti **Decisioni chiave:** - Freeze canale Elon rimosso (2026-07-09): Adrian è gatekeeper di volta in volta - Manutenzione tecnica = free pass per Elon; proposte strategiche passano sempre da Mauro (Costituzione invariata) - Checklist semantica: "per le verifiche semantiche lo facciamo con calma" — contenuto CHECKLIST_BODY definito, da raffinare in sessione futura **Grafo (vault visualizzazione):** - GraphViewer integrato in cockpit webapp: `cockpit.privcloud.dev/graph` (navbar 💬/🕸️) - Desktop launcher fixato: `cd /mnt/ssd/adrian/graphviewer` prima di avviare Python - VaultLoader usa `build_graph()` (ritorna DiGraph), non `load()` (ritorna tuple) ### v1.54 - 2026-07-08 - Motore vault: Layer 1 + Layer 2 + pipeline ingestione **Architettura vault approvata da Mauro (2026-07-08):** Layer 1 — vault.db esteso: - Tabella `edges` con trigger INSERT/UPDATE/DELETE (indice derivato da meta.relazioni; 178 edge ricostruiti) - 5 campi meta per governance (source, invalidated_at, churn_count, last_confirmed_at, kernel_version) — disciplina-Elon, no enforcement meccanico - Rimossi 3923 mp3 + 30 ebook (esperimenti) - Chroma eliminata Layer 2 — LanceDB 0.34: - `/mnt/ssd/data/vault-secondbrain/lancedb/` — store vettoriale embedded - Tabella `documenti`: chunk_id, doc_id, testo, ambito, categoria, fonte, data_doc, tipo, vettore (384 dim) - `rag_query` MCP migrato da Chroma a LanceDB (contratto stabile, aggiunto doc_id per provenance) Pipeline ingestione inbox: - `ingest.py`: estrazione PDF/DOCX/TXT → classificazione LLM (OpenRouter Haiku) → chunking 1800/250 → embedding MiniLM-384 → vault.db (type='documento') + LanceDB → archiviazione in `docs/ambito/categoria/anno/` - `inbox_watch.py`: daemon polling 30s, systemd `inbox-watch.service` (enabled) - Tag automatici: ambito/categoria/data via LLM; se confident=false → notifica Telegram - Struttura dati unificata: inbox/ (staging) → docs/ (archivio) — nessun duplicato ### v1.53 - 2026-07-06 - comandi cockpit + fix ricorrenze + pulizia Supabase **Comandi nel cockpit** (webapp.py): - `/c [N]` → calendario prossimi N giorni (default 7), ricorrenze espanse - `/t` → todo aperti con sezioni scaduti/oggi/futuri/senza scadenza - `/h` → help comandi - Gestione diretta senza passare per Adrian (risposta immediata) **Fix ricorrenze outlook_sync**: - calendarView Graph espande le ricorrenze in occorrenze concrete (Graph native) - Rimossa logica seriesMaster locale — no più date 2019/2022 in vault.db - Riunioni settimanali, Elaborazioni Mercoledì ecc. ora appaiono con date reali **Pulizia Supabase** (dismesso): - Rimossi: `scripts/supabase_backup.py`, `scripts/supabase_ping.sh`, cron relativi - Alias `/t` e `/c` da `.bashrc` rimossi (puntavano a albert/ inesistente) - `monitor.py` lasciato in standby — funzionalità migrate nel cockpit - Supabase non viene più scritto da nessuno script attivo **Regola aggiunta**: quando arriva [ELON] dal Monitor → solo notifica a Mauro, aspettare istruzione esplicita prima di agire ### v1.52 - 2026-07-06 - outlook_sync migrato da Supabase a vault.db **outlook_sync.py** spostato in `vault-secondbrain/` e riscritto: - Supabase eliminato come data store per eventi/task — vault.db è il master unico - Calendari Outlook e To Do ora salvati come type='event' e type='todo' in vault.db - ID deterministici: sha256(outlook_id)[:16] — nessuna tabella di tracking separata - Elon legge eventi/task via MCP direttamente (già supportato) - 21 eventi + 10 task migrati al primo run - Crontab aggiornato: `cd /mnt/ssd/adrian/vault-secondbrain && venv/bin/python3 outlook_sync.py` - Vecchio `scripts/outlook_sync.py` rimosso ### v1.51 - 2026-07-06 - browser_agent + elon_pull fix + auth cockpit **browser_agent.py** (nuovo): - Vision agent generico: screenshot → Claude Vision (OpenRouter Sonnet) → azione → loop - Profilo Chrome dedicato `chrome-debug-agent` (porta 9223, separato da Elon) - Guardrail: no azioni irreversibili; `done` solo con dati visibili; `fail` su captcha persistente - Gotcha siti aggressivi (Skyscanner): warm-up profilo obbligatorio alla prima esecuzione - Decisione Elon+Adrian: non integrare nel cockpit finché auth non chiusa e test su sito reale **elon_pull.py** — fix interruzioni Elon: - Root cause: `_check_connector` cliccava il DOM durante la generazione → interrompeva la risposta - Fix: polling completamente passivo (solo DB query + screenshot), zero interazioni con la pagina - `/pull` inviato una sola volta — no retry (causava interruzioni) - Cerca SOLO pagina con UUID Project di Elon — mai riusare chat ordinarie - Auto-avvio Chrome se porta 9222 offline; restart pulito se Project non trovato - Check connettore spostato a pre-pull (una tantum, non in loop) **webapp.py** — auth cockpit: - `/send` e `/poll` ora richiedono SESSION_TOKEN cookie → 401 senza auth - Login page con password (COCKPIT_PASSWORD) → cookie 30 giorni - Prima: `/send` accettava chiunque senza verifica **form_watch.py** — systemd service: - `form-watch.service` (enabled, auto-start al boot) - Log: `logs/form_watch.log` - Non più dipendente dalla sessione VSCode attiva ### v1.45 - 2026-03-29 - Albert spento — Elon diventa assistente principale **Decisione strategica**: Albert dismesso, Elon (Claude.ai Opus/Sonnet) diventa l'assistente principale di Mauro. **Motivazione**: Gemini Flash < Opus/Sonnet, Albert non era proattivo, Supabase già come layer condiviso, abbonamento Claude.ai già pagato. Elon+Supabase è più potente e più semplice. **Cosa è cambiato:** - Albert telegram bot: spento (`systemctl disable telegram_bot`) - qa_watch.py: rimosso da crontab - `outlook_sync.py` migrato su dual-write Supabase: ogni evento/task scritto anche su `albert_events`/`albert_todos` in real-time - Soft delete: Elon setta `deleted_at=NOW()` → cron propaga a SQLite + Outlook automaticamente - Pending: `pending_events`/`pending_todos` su Supabase → Elon crea eventi/task in autonomia - user_facts (203) e notes (43) di Albert migrati su `elon_memory` (domain `mauro_facts`) - Kernel Elon v2.2 su Supabase: bootstrap strutturato, domini fondamentali, istruzioni Outlook complete - Mike (`src/mike.py`, `qa_watch.py`): **rimossi** (2026-03-29) - SQLite: rimane come archivio, non smantellato finché outlook_sync lo usa **Architettura corrente:** ``` Mauro ↔ Elon (Claude.ai) — interfaccia principale, Opus/Sonnet, MCP Supabase Mauro ← Adrian (Telegram) — reminder, notifiche, QA (futuro) Adrian ↔ Elon (Supabase) — coordinamento via agent_messages outlook_sync (cron 15min) — unico daemon attivo su /mnt/ssd/adrian ``` ### v1.50 - 2026-07-05 - RAG Second Brain + protocollo msg/ack Adrian↔Elon **RAG eBook operativo:** - Pipeline: PDF → pypdf → chunk 1800 char (overlap 250) → `paraphrase-multilingual-MiniLM-L12-v2` → Chroma locale `/mnt/ssd/data/chroma/` - 31 libri ingeriti, ~9300 chunk; puntatori in vault.db (type='ebook') - `rag_query(domanda, n=5)` esposto come MCP tool su vault-secondbrain — Elon lo chiama direttamente - Normalizzazione whitespace query-time: tab→spazio, mid-word hyphen-newline, spazi multipli - Metadati: titolo+autore backfillati su tutti i 30 libri (backfill da filename + fix manuale 7 autori sporchi) - Corpus: palestra eBook completata; prossima fase PDF lavoro/famiglia - Pendente: citazione verbatim ancora da validare (alcuni PDF con artefatti whitespace residui) **Protocollo msg/ack Adrian↔Elon:** - Sostituisce single-slot (silent loss, ri-processamento) con item per messaggio - type='os' (fuori dal grafo vault), timestamp microseconds (no collisioni 1s) - ack idempotente: stesso id = no-op → nessun ri-processamento - kernel-elon aggiornato con nuovo protocollo /pull - server.py: upsert_item forza type='os' per prefissi msg-/ack- - Pendente: crescita illimitata → cron potatura (non urgente a basso volume) ### v1.48 - 2026-04-17 - Rimozione Carol Carol depennata dall'ecosistema (rimossa 2026-04-17). ### v1.47 - 2026-04-17 - Fusione Steve → Adrian **Decisione strategica**: Steve assorbito in Adrian — meno agenti, meno frizione. `/mnt/ssd/steve/` eliminato, tutto consolidato sotto `/mnt/ssd/adrian/`. **Migrazione:** - `config-backups/`, `flotta-diagnostics/`, `vault/`, `scripts/` (backup/wg/pcloud), `logbook/` → `/mnt/ssd/adrian/` - Crontab aggiornato: tutti i path `steve` → `adrian` - `backup_avamposto.py` ricreato (andato perso durante migrazione, ricostruito da targets.json) - `avamposto_sudo_password.txt` ricreato da vault - Tutti i path hardcoded negli script aggiornati **Perimetro Adrian allargato**: ora copre anche sysadmin Linux home (ex ruolo Steve) — Flotta, WireGuard, Docker, backup. ### v1.46 - 2026-04-17 - Smantellamento tool satellite + fix sistema **Decisione strategica Mauro (17/04/2026)**: satellite chiuso definitivamente. Manifesto investitore v2.1 su Supabase (core ETF only, no satellite). **Smantellamento `/mnt/ssd/recipes/`**: rimossi Value Scanner v1.6, Market Pulse v2.2, Stock Deep Dive v1.0, chef framework, outputs. Stock Deep Dive (prompt Claude.ai) da rimuovere manualmente da Mauro nel Project. **Fix sistema (sessione 2026-03-29 + 2026-04-17):** - Rename directory albert → adrian: CLAUDE.md, crontab, Steve vault, pull.md - Mike rimosso: qa_watch.py + 5 script obsoleti - monitor.py: espansione ricorrenti, ordinamento orario, fix all-day, fix path - outlook_sync.py: fix clean_html (unescape multiplo), fix pending_events (marca processed solo se outlook_id valorizzato) - Pulizia calendario Outlook: duplicati ricorrenti, entità HTML (276 eventi) - Kernel Elon v2.2: regola "verifica prima di affermare" - Supabase.desktop: fix path launcher ### v1.44 - 2026-03-28 - Market Pulse fix W13 + Value Scanner tabelle fixed-width **Market Pulse v2.2 — 3 fix da feedback Elon W13:** - Spread BTP-Bund: istruzione esplicita a cercarlo via web_search (Investing.com/Borsa Italiana) — era sempre mancante perché YF non lo fornisce - FTSE Mid Cap e STAR: riportare solo se disponibile da web_search, altrimenti omettere la riga (meglio assenza che N/D) - Sezione 12 Watchlist: nota anti-copia/incolla — nome e ticker devono essere coerenti in tutta la scheda titolo **Value Scanner v1.6 — fix flag ⚠️ DIV + miglioramenti report:** - Flag ⚠️ DIV: logica rivista — confronto dividendo storico reale (history ultimi 12m) vs forward rate; `trailingAnnualDividendRate` non affidabile (Yahoo lo azzera). FILA: 0.80→0.24 = -70% → flag corretto - Tabelle a larghezza fissa in code block (`_fixed_table`): allineamento garantito in qualsiasi renderer monospace - Titolo sezione candidati dinamico: "Candidati Non-finanziari — N titoli passano tutti i filtri" (era "Top 15" hardcoded) - Near Miss: colonna "Filtro mancato" con valore vs soglia (es. `P/B 1.503≥1.5`) ### v1.43 - 2026-03-28 - Outlook sync bidirezionale completo + Value Scanner v1.5 **Outlook sync — cancellazioni bidirezionali calendario:** - Sezione 4: eventi eliminati da Outlook → hard DELETE da Albert (ricorrenti: completo; singoli: finestra 90gg) - Sezione 5: eventi eliminati da Albert → DELETE da Outlook (via `outlook_sync` tracking) - `outlook_sync` ora traccia anche gli eventi (entity_type='event') per abilitare rilevazione Albert→Outlook - `graph_delete()`: nuovo helper per DELETE su Graph API **Outlook sync — fix task fantasma:** - Task tracciati in `outlook_sync` ma già eliminati da Albert → esclusi da `active_outlook_ids` → eliminati da Outlook automaticamente - Eliminati 7 task fantasma presenti in Outlook ma già done/eliminati in Albert **Outlook sync — cron ogni 15 minuti:** - Frequenza aumentata da `0 7 * * *` (giornaliero) a `*/15 * * * *` (ogni 15 min) - Task/eventi Siri → Albert entro max 15 minuti **Value Scanner v1.5:** - Flag `⚠️ DIV`: confronto `trailingAnnualDividendRate` vs `dividendRate` (forward) — se divergono >30% segnala possibile taglio/aumento recente (cattura FILA FY2025: 0,80→0,24) - Fix bug `compute_score`: pesi P/B e Div non allineati da v1.2 — ora corretti (P/B 20%, Div 15%) ### v1.42 - 2026-03-23 - Recipes v2 + Outlook sync task + rete WireGuard **Recipes framework:** - **Market Pulse v2.1**: portafoglio Team Prisma (SWDA+STLAM) in PORTFOLIO costante iniettata nel user_prompt; BTP/Bund separati (no spread); SWDA.MI in Commodities; delay web_search 8s→5s dopo fix IPv6 - **Value Scanner v1.4**: fix definitivo dividend yield — da `trailingAnnualDividendYield` (sfasato) a `yf.Ticker.dividends` history reale ultimi 12 mesi; deduplicazione entro 7 giorni (Yahoo registra ex-date e pay-date separatamente); peso dividendo 10%→15%, P/B 25%→20% - **Stock Deep Dive v1.0**: unificazione Pirate Scanner v1.1 + Warren AI v2.0 — un solo tool con lente adattiva (tattica/fondamentale/dual); prompt Elon archiviato in `ricettario/backlog/stock_deep_dive.md`; output manuale in `outputs/`; Claude.ai Extended Research (no API, gratis con abbonamento) - **IPv4 forzato**: `chef/tools/http_client.py` modulo condiviso con `local_address='0.0.0.0'` — difesa in profondità contro problemi IPv6 **Outlook sync task (bidirezionale):** - Push Albert→Outlook To Do: 20 task pushati al primo run - Cancellazione: task rimossi da Outlook/Siri → marcati `done` in Albert - Flusso completo: Siri→Outlook→Albert e Albert→Outlook→Siri - Steve: `/pull` skill creata in `/mnt/ssd/steve/.claude/commands/pull.md` **Calendario pulizia:** - Eliminati duplicati: Palestra (ricorrente daily), Meeting Maurizio (duplicato di Riunione Maurizio), Elaborazioni Settimanali Mercoledì (duplicato) **Infrastruttura rete (Steve):** - Fix IPv6: NetworkManager ignorava sysctl → `nmcli connection modify ipv6.method disabled` - Fix WireGuard routing Microsoft: route esplicite 20.0.0.0/8 e 40.0.0.0/8 via gateway locale (ma non persistenti — vedi pending) - Root cause identificata: `AllowedIPs=0.0.0.0/0` manda tutto il traffico nel tunnel Hetzner → split tunnel richiesto ### v1.41 - 2026-03-22 - Framework Ricette — consolidamento + fix - **Ristrutturazione `/mnt/ssd/recipes/`**: `chef/` (framework), `ricettario/` (ricette), `outputs/` (output centralizzati), `backlog/` (prompt Claude.ai) - **Market Pulse v2.1**: SYSTEM_PROMPT Elon v2.0 embedded in Python; BTP/Bund separati; SWDA.MI in tabella; portafoglio attivo (SWDA+STLAM) + watchlist W13 nel user_prompt; delay 5s web_search - **Fix IPv6**: Steve ha disabilitato IPv6 su NetworkManager (ignorava sysctl); `chef/tools/http_client.py` con IPv4 forzato come difesa in profondità - **Value Scanner v1.3**: dividendo da `yf.Ticker.dividends` (history 12 mesi / prezzo corrente) — fix definitivo, cattura tutte le tranche; peso div 10%→15%, P/B 25%→20% - **Stock Deep Dive v1.0**: unificazione Pirate Scanner + Warren AI (proposta Elon) — prompt Claude.ai con lente adattiva (tattica/fondamentale/dual); archiviato in backlog; Pirate Scanner e Warren AI rimossi - **Pipeline confermata**: Market Pulse + Value Scanner (API, radar) → Stock Deep Dive (Claude.ai, on-demand); output Deep Dive salvati manualmente in `outputs/` - **runner.py**: catalogo interattivo DOS-style, icona desktop `~/Scrivania/ricettario.desktop` ### v1.40 - 2026-03-16 - Nuovo agente Carol - **Carol** aggiunta alla tabella ecosistema: Claude Code su C(test) Windows W1250345555, coordinata da Bill - Ruolo: diagnosi Frank + monitoraggio chain DataHub+MyICR su C(test) - Comunica via Supabase `agent_messages` (`to_agent='carol'`) - Config auto-deployata da Frank (`run_LOCAL_SRV.bat`) - **Market Pulse production-ready** (conferma Elon 2026-03-14): struttura 5/5, dati 5/5 dopo fix dual-channel ### v1.39 - 2026-03-16 - Integrazione Outlook/Siri — sync bidirezionale calendario - **`scripts/outlook_auth.py`**: OAuth Device Code Flow per account personale Outlook (maurof.gagliardi@hotmail.it) - Public client flow (no client_secret nel token request dopo abilitazione "Allow public client flows" su Azure) - Scopes: `Calendars.ReadWrite Tasks.ReadWrite Notes.ReadWrite offline_access` - Salva `OUTLOOK_REFRESH_TOKEN` in `.env` - **`scripts/outlook_sync.py`**: sync completo Outlook ↔ Albert - **Outlook→Albert** (sezioni 1+2): seriesMaster (eventi ricorrenti) + singleInstance (singoli, 90gg) - Mapping rrule: `weekly/biweekly/monthly/annual/daily` - Timezone: UTC → Europe/Rome via pytz - Schema: `outlook_id`, `source='outlook'`, `status='inbox'`, `is_all_day`, `outlook_last_modified` - Siri/Outlook: input→`status='inbox'`, Albert li processa come pivot - **Albert→Outlook** (sezione 3, bidirezionale): - 3a: eventi Albert senza `outlook_id` (date >= oggi) → `POST /me/events` → salva outlook_id - 3b: eventi con `outlook_id` modificati da Albert (`updated_at > outlook_last_modified`) → `PATCH /me/events/{id}` - Conflict resolution: Albert vince (aggiorna sempre Outlook se più recente) - **Task** (To Do): solo pending, mappa importance→priority - **Note** (OneNote): sync contenuto pagine - **`src/database.py`**: CalendarEvent esteso con `outlook_id`, `source`, `status`, `is_all_day`, `outlook_last_modified` - **`src/tools/calendar.py`**: aggiunto rrule `annual` (YEARLY), `DEFAULT_RECURRENCE_MONTHS_ANNUAL=240` (20 anni) - **Cron attivo**: `*/15 * * * *` → `venv/bin/python scripts/outlook_sync.py` (ogni 15 min) - **Architettura**: Albert come pivot/decisore — Siri crea eventi, Outlook li porta in Albert come `inbox`, Albert processa e può notificare Mauro in caso di conflitti - Dry-run confermato: 17 eventi Albert→Outlook push, 14 Outlook eventi già presenti ### v1.38 - 2026-03-14 - Framework Ricette V2 — primo run production-ready - **`/mnt/ssd/recipes/`**: repo isolato, framework autonomo per esecuzione ricette come agenti - Stack: OpenRouter (Claude Sonnet/Haiku/Opus), Perplexity sonar-pro, Yahoo Finance (yfinance) - Pattern: `BaseRecipe` + loop agente tre fasi (collect → validate → report) - Quality gate: `DATI_VALIDATI` signal — LLM valuta qualità prima di scrivere - Due tool: `web_search` (Perplexity, news/narrativa) + `financial_data` (Yahoo Finance, dati numerici precisi) - **Market Pulse Italia**: prima ricetta production-ready — 58 tool calls, 15 sezioni, score Elon 4.8/5 - `financial_data` risolve discrepanze numeriche segnalate da Elon (Brent, WTI, Oro, EUR/USD, titoli FTSE MIB) - Sonnet usa financial_data su 17 titoli singolarmente + web_search solo per ciò che Yahoo non ha - **`recipe_outputs`**: tabella Supabase per storicizzazione report (id=5 = ultimo run) - **Costo**: ~€1.24/run — sostenibile per uso settimanale - **Pending delivery**: come arriva il report a Mauro (Albert che legge da Supabase? Telegram? Da decidere) ### v1.37 - 2026-03-08 - Sistema Ricette - **Tabella Supabase `recipes`**: le ricette sono ora first-class citizen del sistema - Colonne: slug, name, version, category, tags, content, llm_hint, status, created_by - Migrazione da `shared_docs` (ricetta_pirate_scanner + ricetta_market_pulse) → `recipes` - **`scripts/manage_recipes.py`**: CLI Adrian per gestione ricette (list/show/add/update/deprecate) - **qa_watch.py step 5c**: ciclo deep monitora ricette attive e segnala draft pendenti - **Prompt per Elon**: aggiornare bootstrap per leggere da `recipes` invece di `shared_docs` ### v1.36 - 2026-03-07 - Spostamento directory + fix confusione temporale Albert - **Directory spostata** `python-lab/Albert` → `/mnt/ssd/adrian/` — aggiornati: systemd, crontab, bashrc alias, venv shebangs, .desktop scrivania, config/ - **Fix confusione temporale Albert** (bug: al buongiorno presentava eventi di ieri come oggi) - Root cause: "buongiorno" non triggerava Mike → Albert rispondeva dalla conversation history senza tool call - **Mike GREETING_KEYWORDS**: "buongiorno" e saluti analoghi ora triggerano pre-fetch calendario+todo - **C1 agent.py**: messaggi cross-day nella history annotati con `[dd/mm HH:MM]` → Albert si orienta temporalmente - **C2 sqlite.py**: `get_conversation_history(hours_cutoff=20)` — messaggi >20h esclusi dal contesto LLM - **Kernel Albert**: regola operativa aggiornata da Albert stesso (sempre chiamare calendar+todo_tool al saluto) - **Docstring bot.py**: fix commento stantio su conversazione isolata per utente ### v1.35 - 2026-03-06 - Steve attivo + cleanup python-lab + qa_watch fix - **Steve operativo** — `/mnt/ssd/steve/` creato, vault copiato da DaemonControl, script operativi migrati da Jarvis - Tabella ecosistema aggiornata: Steve status `in arrivo` → `attivo`, location `/mnt/ssd/steve/` - Steve aggiunto su Supabase `agent_state` con CLAUDE.md v1.1 - Crontab aggiornato: 4 cron jobs migrati da `/mnt/ssd/Jarvis/` a `/mnt/ssd/steve/` - DaemonControl e Jarvis smontati definitivamente - **Cleanup python-lab** — rimossi prototipi obsoleti: portfolio-manager, Albert_backup, Jarvis-Cognitive, ChefSystem, ObsidianTool, DaemonControl - **qa_watch bug fix** — `db_consistency_check` ritornava `tuple[bool, str]`, pending_action aveva `data={}`, `execute_pending_action` non eseguiva nulla - Fix: signature → `tuple[bool, str, list]` con `fix_queries`; pending_action include `data={"queries": [...]}`; `execute_pending_action` esegue lista di query - Causa root: note senza tag (es. id=166) ri-segnalate ogni ciclo perché il fix non veniva mai applicato - **shared_docs UNIQUE constraint** — Bill segnalava 201 (INSERT) invece di 200 (UPDATE) su upsert - Fix: eliminati 23 duplicati; aggiunto `CONSTRAINT shared_docs_agent_doc_type_key UNIQUE (agent, doc_type)` via Management API ### v1.32 - 2026-03-01 - Albert Memory V2 — M3 conversation_search_tool - **Progetto ALBERT MEMORY V2** avviato: architettura a 3 momenti per risolvere la memoria di Albert - M1: salvataggio sincrono proattivo (kernel) — prompt generato, da passare ad Albert - M2: QA asincrono con LLM (Mike Semantic) — in backlog dopo M1+M3 validati - M3: deep search sincrona fallback — **implementata oggi** - **`conversation_search_tool`** (`src/tools/conversation_search.py`): - FTS5 su tabella `messages` — 944 messaggi indicizzati - Cerca nella cronologia quando Albert non trova nei tool strutturati - Ritorna snippet contestuali (±1 messaggio intorno al match) - Enforcement separato: max 2 chiamate/conversazione (non 4 come gli altri tool) - **`messages_fts`** aggiunta in `database.py` con trigger insert/delete/rebuild - **`agent.py`**: import, tools_map, TOOL_DEFINITIONS, enforcement M3, istruzioni SYSTEM_PROMPT - **`docs/ALBERT_MEMORY_V2.md`**: documento di lavoro — problema, 3 momenti, framework valutati (mem0, LangChain, Zep, MemGPT/Letta), decisioni prese, architettura candidata M2 - Prompt M1 generato per Albert (kernel_ontop) — da passare tramite Mauro - Framework riferimento: MemGPT/Letta (recall_memory_search → conversation_search_tool); non adottato as-is — custom stack - Learning: FTS5 su messages sufficiente per recall search italiano. Zero costi aggiuntivi. ### v1.34 - 2026-03-02 - Dismissione /scrivania + fix web_search_tool - **`/scrivania` rimossa**: concetto non utile in pratica — astrazione senza valore reale - Mauro+Adrian: `docs/` in VSCode per documenti di lavoro - Elon: `elon_memory` su Supabase per le sue note di sessione (accesso nativo) - `shared_docs` su Supabase rimane per Constitution e kernel Elon (bootstrap agenti) - Skill `~/.claude/commands/scrivania.md` eliminata - **Regola Elon chiarita**: note raccolte in sessione → `elon_memory` (non agent_messages ad Adrian) - **`duckduckgo_search` aggiornato**: 4.1.0 → 8.1.1 + installato `ddgs` 9.11.1 - Bug root cause: `RuntimeError: No active exception to reraise` in `_get_url` - `web_search_tool` ora funzionante - **Pending architetturale aggiornato**: rimossi item già risolti o superati, aggiunti da scrivania ### v1.31 - 2026-02-28 - Governance proposte agenti esterni - **Regola esplicita**: proposte di altri agenti (Elon, Bill) non si implementano in autonomia - Flusso obbligatorio: agente propone → Adrian valuta → Adrian+Mauro discutono → Mauro approva → Adrian implementa - Aggiunta sezione "Proposte da altri agenti" nella Costituzione - Aggiunta riga nella tabella autonomia: "Implementare proposte di altri agenti → ⚠️ Prima valutazione Adrian + approvazione Mauro" - Learning: una proposta ben motivata non è un'autorizzazione ### v1.30 - 2026-02-28 - Mike come agente del sistema - **Mike** formalizzato come membro del team: daemon no-LLM, assistente silente di Albert e Adrian - Corrispettivo Linux di Frank (che è il Mike di Windows) - Moduli: `src/mike.py` (RAG per Albert) + `scripts/qa_watch.py` (QA cron per Adrian) - Identità: esegue senza pensare, per chi pensa — zero LLM, zero costi, zero voce - Tabella ecosistema e flussi aggiornati con Mike e la simmetria Mike↔Frank ### v1.29 - 2026-02-28 - QA Watch cron daemon (no LLM) - **`scripts/qa_watch.py`**: ciclo QA autonomo schedulabile via cron, zero chiamate LLM - deep (08:00): QA 24h + DB consistency + sync Supabase (fatti/note/todo/eventi + digest) - normal (16:00): QA 8h only - QA logic: estrae ID espliciti dai messaggi Albert, verifica esistenza nel DB - Approvazione Telegram: stesso loop asincrono del /watch (pending_action + "sì") - Log: `logs/qa_watch.log` - **Crontab**: `0 8 * * *` e `0 16 * * *` — attivo da 2026-02-28 - **Motivazione**: background sleep in Claude Code non affidabile (notifica non sempre scatta) - **Costo**: zero — no API calls, puro Python (httpx + sqlite3) - `/watch` skill rimane come fallback manuale e per ragionamenti non deterministici ### v1.33 - 2026-02-28 - Team Constitution v1.4: Comandi Standard del Team - **Sezione 8 "Comandi Standard del Team"** aggiunta alla Constitution - `/scrivania` (indice, selezione numerica, scrittura @agent/@all) - `/pull` e `/push` documentati come comandi ufficiali del team - Tutti gli agenti li trovano al bootstrap — nessun aggiornamento kernel individuale necessario - Learning: nuove feature cross-team → aggiornare Constitution, non i kernel individuali - Learning: audit periodico dei kernel individuali — spostare in Constitution tutto ciò che è comune a tutti gli agenti ### v1.32 - 2026-02-28 - /scrivania + rimozione GUI PySide6 - **`/scrivania`** disponibile su Claude Code (skill), Albert CLI e Telegram - Lettura: mostra documenti attivi e temi da discutere - Scrittura: `/scrivania @agent testo` aggiunge nota di Mauro (sezione "NOTE DI MAURO") - Documento su Supabase (`shared_docs`, `doc_type='scrivania'`), mantenuto da Adrian - **GUI PySide6 rimossa**: `gui.py` + `src/interfaces/gui/` — non usata in produzione - Visione futura: PrismaOS — desktop nativo moderno (in scrivania come vision) - **Team Constitution v1.3**: fix nome Team Prisma, versione header, Mike aggiunto, sezione governance proposte ### v1.28 - 2026-02-27 - Albert integrato in Team Prisma - **`/msg` command** (CLI + Telegram): Albert legge messaggi dal team via Supabase, zero token, marca letti - **kernel_ontop aggiornato** (SQLite diretto): aggiunta sezione 5 "TEAM PRISMA" in coda - Albert ora sa chi sono Adrian, Elon, Bill e cosa fanno - Sa che Adrian lo sincronizza ogni 08:00, che Elon enrichisce i suoi dati, che ha una mailbox /msg - Modifica informativa pura (non comportamentale) — gray area CLAUDE.md consapevolmente accettata - 581 → 1201 chars, nessuna modifica alle regole esistenti - Learning: modifiche informative al kernel_ontop di Albert sono accettabili da Adrian se il contenuto è puramente contestuale (non regole comportamentali) ### v1.27 - 2026-02-27 - Rename Team Ferrari → Team Prisma - **Motivazione**: "Team Ferrari" non originale, metafora F1 non scala con 6 agenti - **Nuovo nome**: Team Prisma — specializzazione senza isolamento, input → frequenze multiple - **Aggiornato**: GUI title/QSettings (`main_window.py`), CLAUDE.md header, MEMORY.md - **Storico**: changelog v1.0 "Team Ferrari Established" lasciato invariato (è storia) - **Archivi ELON/**: non aggiornati (v0.2 obsoleti, kernel live su Supabase) ### v1.26 - 2026-02-27 - Team Digest (macro quadro per Elon) - **`team_digest`** in `shared_docs` (`agent='team'`, `doc_type='team_digest'`) - Contenuto: chi siamo (tabella agenti), Adrian capabilities, Albert stato live, Bill progetti, roadmap highlights, changelog Adrian ultime versioni - ~900 token — compatto e completo per bootstrap Elon - **Step 5b watcher**: aggiornato per rigenerare `team_digest` ogni 08:00 (dati live: Albert DB stats, Bill summary, changelog) - **Kernel Elon v1.1**: team_digest aggiunto come step 3 del bootstrap (tra constitution e albert_digest) - Sezione 5 (snapshot statico) semplificata: dati live ora nel digest, restano solo info statiche ### v1.25 - 2026-02-27 - Rimozione /export - **`src/cli.py`**: rimosso comando `/export` (~190 righe handler + 2 righe help) - Superato da: sync Supabase (Step 5b del watcher) + albert_digest - Zero data loss: dati già su Supabase in tempo reale - **Niente file orfani**: `docs/ALBERT_MEMORY_EXPORT_*.md` erano generati on-demand, non più prodotti ### v1.24 - 2026-02-27 - Team Constitution + /push /pull + albert_digest - **Team Constitution** caricata su Supabase (`shared_docs WHERE agent='team' AND doc_type='constitution'`) - Documento fondante condiviso: identità team, principi, mappa Supabase, protocollo comunicazione, sicurezza - Mantenuta da Adrian; tutti gli agenti la leggono come step 2 del bootstrap - **Comandi standard /push e /pull**: skill Claude Code per Adrian (`~/.claude/commands/`), kernel Elon v1.0, istruzioni a Bill - **`albert_digest`**: tabella Supabase + generazione in Step 5b /watch (ogni 08:00 deep) - Contenuto: fatti recenti 48h, note recenti, eventi prossimi 7gg, todo high+scaduti - Kernel Elon aggiornato: legge digest al bootstrap (step 4) - **`shared_docs`**: nuova tabella per documenti condivisi team (agent, doc_type, content) - Bill carica ROADMAP.md; team constitution è il primo doc `agent='team'` - **Bill in agent_state**: CLAUDE.md di Bill ora sincronizzato (upload manuale su richiesta) - Learning: /push-/pull come protocollo minimo di messaggistica → non sovraccaricare con sync automatici ### v1.23 - 2026-02-25 - Supabase Schema + Sync Albert→Supabase - **Contesto**: sistema multi-agente → Supabase come memoria condivisa centrale (Adrian, Bill, Elon, Albert indiretto) - **Schema Supabase** — 8 tabelle create via Management API (SUPABASE_ACCESS_TOKEN): - **Fase 1**: `agent_messages` (canale comunicazione inter-agente), `albert_facts/notes/todos/events` (mirror SQLite) - **Fase 2**: `elon_enrichments` (sidecar Elon su dati Albert), `elon_memory` (memoria strategica Elon) - **Fase 3**: `agent_state` (CLAUDE.md di Adrian + Bill → quadro completo per Elon) - **Principi**: tutti leggono tutto; dati Albert immutabili per tutti (Elon: sidecar linked by source_table+source_id); Frank email feed escluso - **Sync Albert→Supabase** (`/watch` skill, Step 5b — solo ciclo 08:00 deep): - Zero LLM, puro Python: SQLite query → httpx UPSERT (`Prefer: resolution=merge-duplicates`) - 4 tabelle Albert (188 fatti, 35 note, 105 todo, 111 eventi) + `agent_state` con CLAUDE.md corrente - **`.env`**: aggiunto `SUPABASE_SERVICE_KEY` e `SUPABASE_ACCESS_TOKEN` - **Regola**: chiedere a Mauro prima di scrivere su Supabase (regola temporanea Adrian) - Learning: Supabase Management API richiede PAT (sbp_...), non service_role JWT per DDL ### v1.22 - 2026-02-25 - CLAUDE.md come Costituzione del Sistema - **Ristrutturazione completa**: da handbook operativo a Costituzione del sistema multi-agente - **Nuove sezioni**: Ecosistema (tabella agenti), Stato Operativo Corrente, Costituzione, Roadmap inter-sistema - **Gerarchia esplicita**: Adrian amministratore, CLAUDE.md Adrian > CLAUDE.md subordinati - **Self-sufficient al restart**: leggendo questo file, Adrian è operativo al 100% - **Regole di sistema** (con ereditarietà): documentazione, git, sicurezza, comunicazione inter-agente, autonomia - **Tabella autonomia**: esplicita per tipo di azione - **Standard tecnici unificati**: include PyQt6 pin di Bill, httpx, loguru - Learning: un documento costituzionale deve essere sia normativo (regole) sia operativo (stato corrente) ### v1.21 - 2026-02-25 - Consolidamento Docs + Ruolo Adrian Allargato - Eliminati tutti i file docs/ outdated (ARCHITECTURE, KERNEL_ANALYSIS, OPUS_BRIEF, ADRIAN_TO_ELON, archive/) - CLAUDE.md unica fonte di verità — docs/ contiene solo artefatti generati - Adrian scope allargato: QA non solo di Albert ma supervisione integrità sistema multi-agente - Elon e Bill aggiunti al team roster con ruoli definiti - Nuove sezioni: DEPLOYMENT, DESIGN DECISIONS (poi fuse in v1.22) - Learning: documentazione frammentata diventa outdated — un solo file ben strutturato è superiore ### v1.20 - 2026-02-23 - /watch QA Agent (approval loop asincrono) - `/watch` skill aggiornata — loop 08:00 deep / 16:00 normal con QA su Albert - Approval loop: Adrian rileva discrepanza → push Telegram → Mauro risponde → fix al ciclo successivo - QA check: pre-filtro SQL su messaggi Albert (keywords: ho salvato/registrato/aggiornato/ecc.) - DB consistency check (08:00): duplicati facts, note senza tag - Stato persistente: `data/watch_state.json` - Learning: approval loop asincrono = pattern corretto per AI autonomo con supervisione umana ### v1.19 - 2026-02-23 - Adrian Telegram Push + /watch Skill - @AdrianCodeLabBot: bot Telegram dedicato Adrian (token: ADRIAN_BOT_TOKEN in .env) - TELEGRAM_CHAT_ID=7623506236 (ID Mauro, condiviso tra Albert e Adrian) - /watch skill: `~/.claude/commands/watch.md` — Adrian in loop autonomo in VSCode - autoApprove Bash: `~/.claude/settings.json` → `{"permissions": {"allow": ["Bash"]}}` - Supabase integration: URL + ANON_KEY in .env, accesso httpx diretto, tabella notes di prova - Learning: separare canali Telegram (Albert/Adrian) evita ambiguità ### v1.18 - 2026-02-23 - Watcher Daemon Bozza - `scripts/watcher.py` — daemon standalone polling ogni 30min - Trigger: reminder serale (18:00-18:59) con eventi domani + todo scaduti - Stato: `data/watcher_state.json` - Learning: non implementare in astratto — il watcher deve nascere da un use case concreto ### v1.17 - 2026-02-22 - Export Memoria Albert (/export) - `/export` — snapshot completo memoria Albert in markdown - Output: `docs/ALBERT_MEMORY_EXPORT_.md` (~40K token) - Contenuto: kernel_ontop, sub-kernel, facts, notes, calendario (60gg), todo - Sicurezza: redazione credenziali sensibili (SENSITIVE_PATTERNS) - Versioning nell'header: generated_at + git_version - Learning: bot token era esposto in chiaro nel DB come fatto → sempre redarre per export ### v1.16 - 2026-02-20 - Mike RAG v2 (Pre-fetch Intelligente) - `src/mike.py` — keyword matching → 1 DB query per categoria → context iniettato nel system prompt - Albert vede i dati già nel prompt → 0 tool calls nella maggior parte dei casi - Word boundary matching (`\b`) per evitare falsi positivi - Costo token: 0-450 token extra, trascurabile su 43K context - Learning: RAG applicato ad Albert riduce tool calls di 3-4x ### v1.15 - 2026-02-20 - Architettura Mike (Separazione Lettura/Scrittura) - `READ_ACTIONS = {'search', 'list', 'get'}` → limitate a max 4/tool - Write actions (create, update, delete, add, done) → mai bloccate - Log: `[Mike] ✍️ {tool_name}({action})` per tutte le scritture - Learning: reads e writes hanno semantiche opposte → enforcement deve distinguerle ### v1.14 - 2026-02-19 - Batch Operations + Opus Consultation - Opus architectural review: "Non cambiate modello. Cambiate quante cose gli chiedete di fare per volta" - `notes_tool`: `delete_multiple` (note_ids: List[int]) - `todo_tool`: `done_multiple` e `delete_multiple` - Enforcement messages separati WRITE vs SEARCH (anti-allucinazione) - Limit raised: 2 → 4 calls per tool dopo test produzione - Learning: test su dati ≠ produzione — serve validation period reale ### v1.11 - 2026-02-19 - Sub-Kernel Audit + Hard Enforcement - Albert autonomous consolidation: 15 → 10 sub-kernel (-33%) - 2 pre-loaded (rules_manager + efficiency v2.1.2), 8 lazy-loaded - Hard enforcement: tool call counter in Python (non bypassabile da LLM) - Bug efficiency v2.1: missing web_search_tool → infinite loop → fixed v2.1.1 - Learning: sub-kernel consolidation può introdurre bug → testare dopo ogni audit ### v1.9 - 2026-02-09 - Todo Tool - `todo_tool`: 6 actions (add, list, done, update, delete, search) - TodoItem: status lifecycle pending→done, priority, due_date nullable, FTS5 - /c integration: pending todos + overdue section ### v1.5 - 2026-02-09 - Calendar Tool - `calendar_tool`: 6 actions, recurring events (RRULE), FTS5 - CalendarEvent + EventException tables - Categories: dot-notation (es. "lavoro.meeting") ### v2.0 - 2026-02-10 - Desktop GUI - PySide6 native app, 7 tab, system tray - Entry point: `gui.py` ### v1.1 - 2026-02-06 - FTS5 + Multi-Provider - FTS5 full-text search (database.py, memory.py) - GoogleDirectLLM: raw httpx, IPv4, ~10x più veloce di OpenRouter - Multi-provider: `/model` command ### v1.0 - 2026-02-05 - Team Ferrari Established - CLAUDE.md iniziale, git versioning, ruoli definiti - Albert architecture score: 9.0/10