State management in AI-agents: hoe je voorkomt dat je assistent zijn werk vergeet

Een AI-assistent zonder state is een goudvis met een goede uitspraak. Slim binnen één sessie. Volkomen vergeten in de volgende. Iedere ochtend begin je weer met "even uitleggen aan welk project ik werk".

In de eerste maanden Claude Code is dat acceptabel, je leert het systeem kennen, je context-window is overzichtelijk. Maar als je serieus AI-werk gaat doen, wordt het al snel het grootste productiviteitslek.

Vandaag, voor AI peers en hobbyisten die voorbij de eerste experimenten zijn: vier concrete patronen voor state management in Claude Code-projecten. Geen vector-databases nodig. Geen RAG-pipeline. Wel: gestructureerde markdown-bestanden, hooks, en discipline.

Wat bedoel ik met "state"?

Drie soorten geheugen die een werkende AI-agent nodig heeft:

1. Project-state, wat is de huidige status van mijn werk? Welke features zijn af, welke draaien, welke wachten op review?

2. Decision-state, welke beslissingen heb ik eerder genomen, en waarom? Wat zijn de "trade-offs" die het systeem moet respecteren?

3. Personal-state, wie ben ik, hoe werk ik, wat zijn mijn voorkeuren?

Iedere goed-werkende AI-setup heeft alle drie. Een gemiddelde MKB-implementatie heeft geen van drieën, en dat is precies waarom ze niet werken.

Drie soorten state in AI-agents
Project-state (huidige status), decision-state (eerdere beslissingen), personal-state (wie ben jij). Iedere serieuze AI-agent heeft alle drie.

Patroon 1, Memory directory met SessionStart hook

Het simpelste werkbare patroon. Een lokale directory .claude/memory/ met markdown-bestanden, geladen via een SessionStart-hook.

javascript
.claude/
└── memory/
    ├── MEMORY.md ← index van alle memory-bestanden
    ├── project_status.md ← huidige projectstatus
    ├── decisions.md ← logged beslissingen
    └── preferences.md ← persoonlijke voorkeuren

De SessionStart-hook (zie vorige post over hooks) leest dit bij iedere nieuwe sessie en injecteert het als context.

MEMORY.md voorbeeld:

markdown
# Project Memory

## Active project
SEO-tool, AI-native voor MKB en agencies.
Status: pre-launch (target: 19 mei 2026).
SaaS, niet open source.

## Active branches
- `main`, stabiel, wacht op v1.0 release
- `feature/geo-extractor`, bezig, ~70% klaar

## Recent decisions
- Gekozen voor Supabase ipv eigen Postgres → schaal-redenen
- Geen Stripe, wel Mollie → Nederlands MKB

## Blocked
- Wachten op definitieve productnaam voor 19 mei launch

Dit is je centrale memory. Bij iedere sessie weet Claude wat er speelt, geen herhaling nodig.

Patroon 2, Auto-update memory bij iedere sessie-einde

Memory schrijven met de hand vergeet je. Dus: laat Claude het zelf doen.

Stop hook (in .claude/hooks/auto_update_memory.sh) detecteert sessie-einde en kan Claude vragen om een korte memory-update te genereren:

bash
#!/bin/bash
#.claude/hooks/auto_update_memory.sh

# Stuur Claude een prompt om memory te updaten
# (alleen bij sessies > 10 minuten, om triviale runs te skippen)

INPUT=$(cat)
SESSION_DURATION=$(echo "$INPUT" | jq -r '.session_duration_sec // 0')

if ((SESSION_DURATION > 600)); then
  # Trigger een mini-prompt: "Update MEMORY.md met de belangrijkste 
  # ontwikkelingen uit deze sessie"
  cat <<EOF >>.claude/memory/_session_log.md

## Session $(date -u +%Y-%m-%dT%H:%M:%SZ)
Duration: ${SESSION_DURATION}s
[Claude: review en samenvatten in MEMORY.md indien relevant]
EOF
fi

echo '{}'

In de praktijk werk ik met een eenvoudiger patroon: aan het einde van een productieve sessie tik ik handmatig update memory als instructie aan Claude. Hij leest dan de eigen sessie-context en update MEMORY.md zelf. Geeft mij controle, kost niets.

Patroon 3, Decision log voor architectuur-keuzes

Voor projecten met serieuze technische beslissingen: een aparte .claude/memory/decisions.md met format:

markdown
# Architecture Decisions

## 2026-04-15, Supabase ipv eigen Postgres
**Context:** SEO-tool moet schaalbaar opslag voor crawl-data hebben
**Decision:** Supabase managed Postgres
**Reasoning:** 
- Auto-scaling zonder DBA-werk
- Built-in auth (we hebben dat sowieso nodig)
- Realtime subscriptions voor dashboard
**Trade-offs:**
- Vendor lock-in (mitigeren met regelmatige pg_dump backups)
- Iets duurder bij groot volume (acceptabel)
**Alternatives evaluated:** RDS, Neon, eigen Postgres
**Reversibility:** Hoog, Postgres-data is eenvoudig migreerbaar

## 2026-04-22, Geen Redis cache
**Context:** Performance vragen
**Decision:** Voorlopig geen cache-laag
**Reasoning:** Premature optimization. Bij <10K queries/dag is Postgres prima.
**Trade-offs:** Bij groei moet dit eventueel terug
**Reversibility:** Hoog

Dit is decision-state in actie. Iedere belangrijke keuze schriftelijk vastgelegd, met reasoning en trade-offs. Claude kan dit lezen en respecteren, als hij voorstelt om Redis toe te voegen, wijst hij op de eerder gemaakte beslissing.

In mijn ervaring: zonder decision log vergeet Claude (en jij) waarom dingen zoals ze zijn. Met decision log heb je effectief een persistent architectuur-geheugen.

📖 Lees ook: Mijn AI-manager werd slechter naarmate ik langer met hem praatte: waarom state management onlosmakelijk verbonden is met context-beheer.

Patroon 4, Per-task state files

Voor langlopende taken die meerdere sessies kosten: aparte state-bestanden per taak.

Voorbeeld voor een blog-pipeline taak:

javascript
.claude/work/
└── 2026-05-19-seo-tool-launch/
    ├── status.md ← waar staan we?
    ├── research.md ← bronnen en notities
    ├── outline.md ← uitgewerkte structuur
    └── draft.md ← lopende draft

Iedere keer dat je terugkomt op deze taak, lees je .claude/work/[task-name]/status.md en je weet exact waar je was.

Dit patroon is goud waard voor projecten die je niet dagelijks oppakt. Een blog die je over 3 weken afmaakt, een feature die wacht op klant-feedback, een refactor die je in stukjes doet.

Wat NIET in state hoort

Drie soorten informatie die ik bewust niet in state-bestanden zet:

Niet: Iedere bash-command die ik draai. Dat is sessie-context, geen project-state. Verspilt context-window.

Niet: Code-snippets van features die af zijn. De code zelf is de state, niet een markdown-versie ervan. Houd het DRY.

Niet: Persoonlijke afspraken of geheime info. State-bestanden gaan in git en kunnen lekken. Houd het op project-niveau.

Vuistregel: state moet lange-termijnwaardevol zijn (waarom we iets hebben gedaan, waar we naartoe willen) en nietkorte-termijn ruis (wat ik vandaag aan het doen ben).

Mijn eigen state-stack (concreet)

Voor wie het wil overnemen, mijn eigen setup:

javascript
.claude/
├── memory/
│ ├── MEMORY.md ← centraal, ~50 regels max
│ ├── decisions.md ← architectuur-beslissingen
│ ├── preferences.md ← mijn werkstijl
│ └── lessons_learned.md ← wat ik fout deed (en hoe ik het wil voorkomen)
├── hooks/
│ ├── load_memory.sh ← SessionStart
│ ├── auto_commit_memory.sh ← Stop
│ └──...
└── work/
    └── [active-task-folders]/

Plus, op project-niveau, CLAUDE.md en .claude/rules/.

Per sessie wordt dit hele complex automatisch geladen. Resultaat: iedere nieuwe sessie weet alles dat relevant is, niet meer, niet minder.

Wat doe je deze week?

Drie acties:

  1. Maak .claude/memory/MEMORY.md met max 50 regels. Wat is het project? Wat is de status? Welke beslissingen zijn recent? Wat blokkeert?
  2. Voeg een SessionStart-hook toe die deze MEMORY.md laadt (zie vorige post).
  3. Begin een decision log. Iedere keer dat je een architectuur-keuze maakt: schrijf het op in .claude/memory/decisions.md met context, beslissing, reasoning, trade-offs.

Volgende week: context engineering, hoe je voorkomt dat je memory en context-bestanden verzanden in ruis.

Veelgestelde vragen

Vier patronen, één resultaat

Een AI-agent zonder state is een goudvis. Vier patronen lossen dat op: memory directory met SessionStart-hook, auto-update bij sessie-einde, een decision log voor architectuur-keuzes, en per-task state files voor langlopend werk.

Begin deze week met een MEMORY.md van 50 regels en een SessionStart-hook die hem laadt. Daarmee heb je 80% van de waarde. De rest groeit organisch met je gebruik.


Vragen over jouw state-setup of Claude Code workflow? Volg me op LinkedIn, daar deel ik wekelijks build-in-public updates. Of lees hoe ik AI-architectuur aanpak voor het MKB.


Vincent van Deth

AI Strategy & Architecture

Vincent van Deth bouwt productiesystemen met AI voor het MKB. Hij is de maker van VNX, een multi-agent LLM orchestrator, en helpt teams betrouwbare AI-automatisering te shippen — zonder bullshit.

Reacties

Je e-mailadres wordt niet gepubliceerd. Reacties worden beoordeeld voor plaatsing.

Reacties laden...