🇫🇷🇺🇸🇧🇷🇪🇸🇩🇪🇮🇹

Aggiungere una memoria di sessione come in OpenClaw

Finita la necessità di rispiegare il contesto a ogni sessione. Claude ricorda automaticamente cosa hai fatto, le decisioni prese, i problemi incontrati — per progetto, nel tuo repo git, senza database. Portabile, versionabile, meno di 1 $/mese. Ecco come mettere in piedi questo sistema in meno di un'ora.


Info

Scritto originalmente in francese. Tradotto dall'IA — il significato è stato preservato, non la prosa.

Lunedì mattina. Apri Claude Code su un bug complesso che avevi lasciato in sospeso venerdì. Claude non ricorda nulla. Rispieghi il contesto, ridescivi l'architettura, rilenchi quello che era già stato provato. Quindici minuti persi prima di poter riprendere da dove ti eri fermato.

È esattamente il problema che risolve la memoria di sessione — ed è quello che OpenClaw ha risolto per primo.


Cos'è OpenClaw?

OpenClaw è un framework open source progettato per Claude Code. Il suo obiettivo: trasformare Claude da assistente senza memoria in un agente autonomo persistente, capace di ricordare cosa ha fatto, cosa è stato deciso e cosa resta da fare.

OpenClaw funziona interamente in Markdown e Python, senza database, senza dipendenze esterne. La sua filosofia: i file flat, versionabili e leggibili da un umano, sono la migliore memoria a lungo termine.

La sua architettura di memoria si basa su tre livelli: - Memoria immediata — il contesto caricato nella sessione corrente - Log giornalieri — quello che è successo oggi (e ieri) - Memoria a lungo termine — i fatti duraturi, condensati e tenuti aggiornati

Ho adattato questa architettura per i miei progetti Claude Code: uno Stop hook che gira automaticamente dopo ogni scambio, due file Markdown per progetto (long_memory.md + un log al giorno), e due skill per caricare e consolidare la memoria. Ecco come funziona e come metterlo in piedi.


Perché è un vero vantaggio rispetto a Claude predefinito

Claude Code dispone di una memoria automatica nativa — ma ha due limitazioni importanti:

Memoria auto Claude Code Sistema stile OpenClaw
Posizione ~/.claude/projects/... (macchina locale) Nel repo git del progetto
Portabilità No — legata alla macchina Sì — segue il repo ovunque
Versionamento No Sì — git log sulla memoria
Granularità Globale Per progetto / sottoprogetto
Ispezionabile Difficilmente Markdown leggibile direttamente

Il CLAUDE.md è un'altra soluzione, ma è un file di regole statiche — non un diario di attività. Non traccia cosa è stato fatto, i problemi incontrati, né le decisioni prese durante la sessione.

La memoria di sessione colma questo vuoto: cattura automaticamente, a ogni scambio, quello che è successo. Senza che tu debba pensarci.


Architettura

Il sistema si basa su due tipi di file Markdown, uno Stop hook e un modello Haiku che effettua l'estrazione.

Struttura dei file

projet/
  memory_sessions/
    long_memory.md          ← memoria a lungo termine (compendio permanente)
    logs/
      2026-03-22.md         ← log giornaliero strutturato per sezioni
      2026-03-21.md
      archives/             ← log > 30 giorni
      .debug/               ← JSON grezzo Haiku (gitignored)

In un workspace multi-progetto, ogni sottoprogetto ha la propria directory memory_sessions/ — la memoria di cmms_doc non si mescola con quella di competitors.


Template 1 — Il log giornaliero (logs/2026-03-22.md)

Un file per giorno, strutturato in sezioni fisse. Haiku aggiunge bullet a ogni scambio — senza mai duplicare quello che esiste già.

# Log session — 2026-03-22

## Contesto
- Rifacimento del sistema di memoria di sessione per il workspace PRODUCT_AGENTS.

## Obiettivo
- Testare il nuovo formato JSON strutturato restituito da Haiku.

## Problemi riscontrati
- L'estrazione del transcript falliva: messaggi tool_result filtrati incorrettamente.

## Conoscenze acquisite
- Il transcript JSONL contiene molti messaggi con contenuto vuoto (tool_use, thinking) — filtrare su `content[].type == "text"`.

## Lavoro prodotto
- Riscrittura del parser del transcript in memory-session.sh.
- Aggiunta della directory .debug/ per ispezionare il JSON grezzo di Haiku.

## Decisioni prese
- Chiamare `claude` da `/tmp` per evitare che il CLAUDE.md del progetto interferisca.

## Da monitorare
- Validare che il rilevamento delle skill funzioni dopo il patch.

## Completato
- ✅ Validare che il rilevamento delle skill funzioni dopo il patch.

Ogni sezione ha un ruolo preciso. La sezione Completato accoglie i punti risolti da «Da monitorare» — attivati quando invii OK-done a Claude.


Template 2 — La memoria a lungo termine (long_memory.md)

Un compendio permanente, limitato a 300 righe. Non è un log — è quello che Haiku giudica duraturo: fatti tecnici, regole di business, decisioni strutturali.

# Memoria a lungo termine — cmms_doc

## 2026-03-09
- L'hook memory-session.sh deve chiamare `claude` da /tmp (non dalla directory del progetto) per evitare l'iniezione del CLAUDE.md host nella risposta di Haiku.
- Formato intermedio scelto: JSON strutturato per sezioni → Python formatta il Markdown.
- Deduplicazione gestita da Haiku, che rilegge il log esistente prima di scrivere.

Quando long_memory.md supera le 300 righe, la skill /memory_promotion consolida e archivia le voci più vecchie.


Il meccanismo: il log giornaliero alimenta la memoria a lungo termine

Scambio con Claude
    ↓
Haiku analizza: cosa conservare nel log del giorno?
    ↓
Log giornaliero aggiornato (sezioni in append, deduplicazione)
    ↓
Se rilevato un fatto duraturo → long_memory.md aggiornato
    ↓
/memory_promotion (settimanale/mensile) → archivia i log vecchi,
    consolida long_memory.md se > 300 righe

Il flusso dell'hook (versione semplificata)

Il trigger centrale è uno Stop hook — uno script Shell che Claude Code esegue automaticamente alla fine di ogni turno di conversazione.

Claude risponde
    ↓
Stop hook attivato (settings.json)
    ↓
[Anti-loop] stop_hook_active = true ? → exit 0
    ↓
Parsare il transcript JSONL → estrarre l'ultimo scambio umano + assistente
    ↓
Leggere i log esistenti del giorno (per non duplicare)
    ↓
Chiamare Haiku da /tmp con il prompt strutturato
    ↓
Haiku restituisce un JSON per sezioni (obiettivo, problemi, lavoro…)
    ↓
Python fonde nel log Markdown del giorno
    ↓
exit 0

L'anti-loop merita una spiegazione: quando l'hook chiama claude, questa invocazione termina e riattiva lo Stop hook. Claude Code inietta allora stop_hook_active: true nel JSON stdin. L'hook rileva questo flag per primo ed esce immediatamente, senza alcuna elaborazione.

Perché chiamare claude da /tmp? Se l'hook gira dalla directory del progetto, il CLAUDE.md del progetto viene iniettato nel contesto di Haiku. Risultato: Haiku segue le tue regole di business invece di restituire JSON puro. Chiamare da /tmp neutralizza questo effetto.


Come mettere in piedi il sistema

1. Le skill di memoria

Due skill completano l'hook:

  • /memory_load [progetto] — da chiamare a inizio sessione. Legge long_memory.md + i log del giorno e del giorno precedente. Mostra un riepilogo consolidato. Questo caricamento è manuale — la memoria viene registrata automaticamente, ma non si ricarica da sola.
  • /memory_promotion [progetto] — consolida i log recenti in long_memory.md e archivia i log più vecchi di 30 giorni. Da eseguire manualmente, una volta alla settimana o al mese secondo la propria attività.

Le skill sono file Markdown in .claude/skills/{nome}/SKILL.md. Claude Code le riconosce come comandi /nome.

2. Collegare lo Stop hook

Lo Stop hook è dichiarato in .claude/settings.json:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/memory-session.sh" }
        ]
      }
    ]
  }
}

Quando si attiva lo Stop hook? Claude Code attiva Stop alla fine di ogni turno — cioè dopo ogni risposta completa di Claude, che sia semplice (una frase) o complessa (con chiamate a strumenti). È diverso dalla fine della sessione: l'hook gira dopo ogni scambio, non solo quando chiudi Claude Code.

3. Adattare la lista dei progetti

Nell'hook, una variabile PROJECT_PATHS elenca le directory di memoria di ogni sottoprogetto:

PROJECT_PATHS = {
    "root": "memory_sessions",
    "cmms_doc": "projects/cmms_doc/memory_sessions",
    "competitors": "projects/competitors/memory_sessions",
}

Haiku analizza lo scambio e determina i progetti coinvolti — poi scrive nei file corretti.

4. Costo

Haiku 4.5 è scelto deliberatamente: veloce (~1-2 secondi) ed economico. Con un uso intensivo di 20 scambi al giorno, il costo rimane sotto 1 $/mese. È trascurabile per quello che offre.


Cosa cambia concretamente

Con questo sistema attivo:

  • Ripresa dopo il weekend: /memory_load a inizio sessione → Claude conosce lo stato del bug, le decisioni prese, quello che restava da fare.
  • Multi-progetto: ogni sottoprogetto ha la propria memoria. Lavorare su cmms_doc poi su competitors nella stessa sessione → i log sono separati.
  • Tracciabilità: la storia delle decisioni tecniche è nel repo. git log memory_sessions/ racconta l'evoluzione del progetto.
  • Portabilità: clona il repo su un'altra macchina e la memoria è lì.

Limitazione principale

/memory_load è manuale. La memoria viene catturata automaticamente a fine turno, ma non si ricarica da sola all'avvio di una nuova sessione. Bisogna ricordarsi di eseguire /memory_load a inizio sessione per poterne beneficiare.

È una scelta deliberata — forzare il caricamento automatico rischierebbe di inquinare il contesto di sessioni brevi o non correlate al progetto.


Allegati

La specifica tecnica completa (codice completo dell'hook, formato JSON, scelte di implementazione, bug noti) è disponibile come allegato:

spec_session_memory.md

Esempio concreto — log giornaliero reale: il file seguente è il log di sessione generato automaticamente il giorno in cui è stato scritto questo articolo. Illustra quello che il sistema cattura realmente a ogni scambio: contesto, lavoro prodotto, decisioni prese, punti da seguire.

session-log-exemple.md

Per saperne di più

Dal file unico al sistema di contesti: perché la memoria di un LLM non sta in un solo documento Un file, qualche direttiva, e Claude fa il resto — come ho strutturato 500 email senza fatica