Risposta diretta
Il sistema di Claude Code persiste fatti rilevanti tra sessioni in modo strutturato e auto-curato, consentendo al modello di ricordare decisioni e contesto senza doverli ripetere ogni volta che si avvia una nuova sessione. Ciò riduce la fatica di "spiegare di nuovo al modello" e migliora l'efficienza del lavoro.
Una sessione Claude Code è effimera per default: la memoria
conversazionale finisce quando chiudi la finestra. Per progetti long-running
questo è un problema: ogni sessione riparte da zero, ti tocca ricordare al
modello "ricordi che avevamo deciso X?". Il sistema memory/
di Claude Code risolve esattamente questo: persiste fatti rilevanti
tra sessioni in modo strutturato, auto-curato, lazy-loaded.
Disclaimer di indipendenza: non sono affiliato a qrx né ad Anthropic. La descrizione che segue è basata sulla mia memoria portfolio (60+ fact accumulati in ~12 mesi) e su come la uso operativamente.
Struttura della directory memory/
Location: ~/.claude/projects/<project-slug>/memory/. Schema:
memory/
├── MEMORY.md index (max 200 righe)
├── user_role.md user fact
├── user_workflow.md user fact
├── feedback_no_dark_mode.md feedback fact
├── feedback_ollama_only.md feedback fact
├── project_architecture.md project fact
├── project_brand.md project fact
├── reference_wikidata_token.md reference fact
└── reference_buttondown.md reference fact
MEMORY.md è l'index sempre caricato a inizio sessione. Ogni
entry punta a un file specifico (es. - [No dark mode](feedback_no_dark_mode.md)
- Sito light only, no toggle). Quando il modello giudica
rilevante il fact, legge il file completo (lazy-load).
Le 4 categorie di fact
- user: chi è l'utente, role, expertise, preferenze cognitive (es. "Senior Java developer, learning React for the first time"). Aiuta a tarare spiegazioni e analogie.
- feedback: guidance ricevuta su workflow. Do (pattern confermati come buoni) e don't (correzioni applicate). Esempio: "Don't use git stash in worktree" - feedback dopo un disastro di pop tirato dentro WIP da sibling worktree.
- project: stato corrente del progetto. Decisioni recenti, in-flight blocker, vincoli temporali (es. "P.IVA forfettaria simulata fino a €5K/anno"). Si update spesso, vita più breve dei feedback.
- reference: pointer a sistemi esterni. URL dashboard, account, repo, doc esterni rilevanti. "Buttondown account federico@federicocalo.dev", "Wikidata Q139562320", ecc.
Quando Claude salva un fact
Default: "anche solo 1% di rilevanza in future sessioni" = salva. Soglia bassa intenzionalmente. Meglio salvare e poi pruning ciclico, che non salvare e perdere context.
Trigger espliciti utente:
ricorda che X- salva immediatamente.dimentica Y- rimuovi fact + entry da MEMORY.md.aggiorna che X- sovrascrivi fact esistente.
Trigger automatici (osservati ma senza istruzione esplicita):
- Nuova decisione di design/architettura.
- Correzione utente su workflow ("non così, fai cosà").
- Vincolo scoperto (es. "questa API non funziona in Italia").
- Riferimento a sistema esterno menzionato per la prima volta.
Esempi reali dal mio MEMORY.md
Selezione di entry attuali nel mio MEMORY portfolio (sintesi):
- [Project Architecture](project_portfolio_architecture.md)
- Monorepo with Angular 21 SSR + Spring Boot 3.4 + FastAPI,
migrating from Firestore to REST API
- [Brand Positioning](project_brand_positioning.md)
- "Full-Stack AI Engineer per startup e PMI IT/EU, applicazioni
enterprise documentate 8-12 settimane" + vincolo pull
- [SSH VPS via public key](feedback_ssh_vps_access.md)
- Accesso VPS Hetzner solo via alias ssh portfolio-prod
- [No git stash in worktree](feedback_worktree_no_stash.md)
- Mai usare git stash in worktree (refs/stash condiviso)
- [AI provider Ollama-only](feedback_ai_provider_ollama_only.md)
- Tutti i tool AI usano Ollama on-prem VPS
- [Wikidata API token](reference_wikidata_token.md)
- Token Federico per Q139562320, .env.prod only
- [Design System GitHub Primer light](project_design_system.md)
- Sito light theme only, no toggle
Ogni entry è ~100-150 caratteri. Index totale ~180 righe (entro il limit 200). Quando inizio una sessione, Claude legge MEMORY.md e ha tutto il context macro in 1k token. Lazy-load fact specifici on-demand.
Frontmatter dei fact files
---
name: feedback-no-dark-mode
description: Sito light theme only - no dark mode toggle, palette in styles.css
metadata:
type: feedback
---
# No dark mode
Decisione del 2026-03: il sito federicocalo.dev usa SOLO light theme.
Rimosso ThemeService toggle. Palette completa in
`frontend/src/styles.css` con CSS custom properties var(--color-*).
NON proporre dark mode toggle in nuovi componenti.
NON usare rgba hardcoded per "fall-back dark" - sempre var(--color-*).
Link related: [[project_design_system]]
Frontmatter sempre minimo: name, description,
metadata.type. Body 50-300 righe. Link cross-fact via
[[name]] syntax (markdown-style internal link).
Pruning ciclico
MEMORY.md cresce ma deve restare sotto 200 righe. Pruning trimestrale tipico:
- Claude analizza MEMORY.md attuale + ultima sessione activity.
- Identifica fact stale (es. project fact superseded da decisione più recente).
- Propone rimozione (con rationale per ognuna).
- Utente approva/rifiuta caso per caso.
- Rimozioni approvate: cancella file fact + entry da MEMORY.md.
Tipicamente 5-15 entry rimosse ogni trimestre. Cumulato: stable size intorno a 60-80 entry totali.
Memory cross-progetto
Ogni progetto ha la sua directory memory separata (path con
project-slug). Fact in ~/.claude/projects/<project-A>/memory/
non sono visibili in ~/.claude/projects/<project-B>/memory/.
User fact generici (es. "Federico è developer Java/TS") spesso vengono
duplicati cross-progetto. Workaround: alcune installazioni Claude Code
supportano user-level memory globale in
~/.claude/memory/ (verifica documentazione corrente). Sul
mio setup uso memory per-progetto + duplico user fact dove serve.
Anti-pattern: memory come task tracker
Tentazione: salvare TODO o backlog in memory. Errore. Memory è per
fatti che persistono, non per task in volo. Per task tracker
usa .planning/STATE.md (GSD-managed) o issue tracker
esterno.
Sintomo di anti-pattern: project fact che dicono "in corso X, prossimo passo Y, blocker Z". Quelli sono task, non fatti. Salvali altrove, memory resta più pulita.
Anti-pattern: memory come reference docs
Altra tentazione: salvare snippet di documentazione lunga in memory. Errore. Memory è per pointer + decisioni, non per content reference. Reference fact dice "Wikidata API doc URL https://..." non incolla la documentazione intera.
Sintomo di anti-pattern: fact files da 500+ righe. Splitta in
pointer-only + content esterno (file in docs/ del progetto).
Sicurezza: cosa NON salvare in memory
- API key, password, token (sempre in
.env.prodnon in memory). - Personal data di terzi (GDPR - memory non è classificata per dati personali).
- Decisioni in conflitto con vincoli legali/etici (es. workaround per bypassare licensing).
- Snippet di codice proprietario protetto da NDA.
Memory è file markdown plain text; trattalo come git-tracked (anche se non lo committi, è sul filesystem). Niente cose che non vorresti in un backup.
Memory in workflow GSD
Memory complementa .planning/PROJECT.md:
- PROJECT.md: planning artifacts, formale, in git, condiviso col team se progetto è team.
- memory/: personal context, informale, NON in git (utente personal), tra sessioni Claude Code.
Pattern complementare: una decisione strategica importante va in entrambi. PROJECT.md per audit trail formale; memory per avere il context comodo a portata in ogni sessione futura.
Cosa ho imparato scrivendo questo articolo
La cosa che mi ha sorpreso è quanto il memory abbia ridotto la fatica di "spiegare di nuovo al modello". Prima dell'adozione (sessioni memory-free), ogni inizio sessione era 5-10 minuti di onboarding: "il progetto è X, lo stack è Y, abbiamo deciso Z". Dopo, l'onboarding automatico via MEMORY.md è 30 secondi.
Secondo insight: la disciplina di scrivere fact files in stile ADR (con rationale + Why + How to apply) ha migliorato il content. Memory che cita "Why: incidente del 2026-03 dove abbiamo perso WIP usando git stash in worktree" è più utile di "Memory: don't git stash in worktree". Il why permette al modello di capire edge case quando applica la rule.
Anti-pattern evitati
- Memory come task tracker. STATE.md è per i task; memory per fact persistenti.
- Memory come reference docs. Pointer + decisioni; non content. Splitta in file esterni se cresce.
Una storia ricevuta che vale la pena condividere
Sezione segnaposto. Se hai pattern memory che ti hanno
cambiato il workflow, scrivimi a federico@federicocalo.dev.
← Cluster precedente: Ingest-docs synthesizer Prossimo cluster (track Platform): MCP server development →
Domande frequenti
Come funziona la persistenza dei fatti rilevanti tra sessioni in Claude Code?
La persistenza dei fatti rilevanti tra sessioni in Claude Code è gestita dal sistema di memoria, che struttura e auto-cura i fatti in modo lazy-loaded.
Quali sono le 4 categorie di fact utilizzate da Claude Code per classificare i fatti?
Le 4 categorie di fact non sono specificate nel testo fornito, ma si menziona che ci sono trigger espliciti dell'utente e automatici.
Come funziona il pruning ciclico dei fatti in memoria?
Il pruning ciclico dei fatti in memoria avviene ogni trimestre, con la rimozione di 5-15 entry per mantenere l'indice totale sotto le 200 righe.
Perché è importante evitare di utilizzare la memoria come task tracker o come repository di documentazione?
È importante evitare di utilizzare la memoria come task tracker perché i fatti in memoria sono destinati a persistere nel tempo, non per tracciare le attività in corso. Inoltre, è meglio salvare snippet di documentazione lunga esternamente e utilizzare la memoria solo per pointer e decisioni.
Commenti
Caricamento commenti...
Accedi per commentare