Was macht Sitzungsabschluss (projektbewusst)?
Zwei Teile: §1 ist universell; §2 leitet je nach Projekt weiter (Zustandstabellen sind projektspezifisch — niemals Tabellen eines Projekts für ein anderes schreiben). §0 = Mid-Session-Herzschlag (siehe unten). <MEM> = das Memory-Verzeichnis, das durch bash ~/.claude/hooks/session-resume.sh --dir ausgegeben wird.
Vor jedem SPEICHERN redigieren (Herzschlag, Handoff-Memory, Regeln/Aktuell-Dateien, DB-Zeilen, Resume-Prompt): API-Schlüssel, Tokens, Passwörter, private Schlüssel, Kontonummern und -salden, personenbezogene Daten, alles, was Live-Konten identifiziert, entfernen. Schreiben Sie <REDACTED — siehe Tresor> oder paraphrasieren Sie („Live-Saldo verifiziert, hier nicht erfasst“). Die Benennung, WO der echte Wert lebt, ist in Ordnung; der Wert selbst nicht. Gleiches Muster wie die Guardrail-Paraphrase-Regel in §2 — beide beachten.
0. Herzschlag-Checkpoint — MID-SESSION (nur Handoff-Memory)
Nach jeder abgeschlossenen Teilaufgabe und VOR jedem langen/riskanten Schritt (großes Refactoring, Deployment, DB-Migration) nur die §1-Handoff-Datei des aktuellen Projekts aktualisieren (ggf. neu erstellen): einen ## LIVE STATE (Herzschlag)-Block — was gerade abgeschlossen wurde, was in Bearbeitung ist, der nächste Schritt. Vorherigen Block ersetzen, niemals anhängen; Ziel <15 geschriebene Zeilen. Halten Sie die Überschrift exakt ein: Der Hook erwartet sie.
- MEMORY.md NICHT neu taggen, keine Datenbank berühren oder den Resume-Prompt ausgeben – diese bleiben am Ende der Sitzung (§1-Tag, §2, §3). Beim Abschluss den Block in den verifizierten Zustand überführen und löschen.
- Ein Absturz zu jedem Zeitpunkt kostet jetzt höchstens einen Schritt Erinnerung.
session-resume.shlistet jedes Handoff, das den Block noch enthält, beim nächsten Start alsUNWRAPPED HEARTBEATauf, sodass auch eine ungetaggte erste Herzschlag-Datei noch gefunden wird.
1. Handoff-Memory — IMMER (beliebiges Projekt)
<MEM>/project_<proj>_handoff_<YYYYMMDD>.md schreiben/aktualisieren: verifizierter Zustand (wichtige SHAs, was gelandet ist, OFFENE Entscheidungen, geordnete nächste Arbeiten, Vorgaben). In <MEM>/MEMORY.md die Indexzeile mit ★READ FIRST FOR <PROJECT> (aktuell)★ taggen; die vorherige als „(ersetzt)“ markieren. Alte Handoffs bleiben auf der Festplatte: Die Ersetzungskette ist die Projekthistorie.
- Der SessionStart-Hook
~/.claude/hooks/session-resume.shist PROJEKTUNABHÄNGIG: Er injiziert JEDE Zeile, die aufREAD FIRST FOR <IRGENDEIN PROJEKT>passt und nicht als ersetzt markiert ist → das Taggen der Zeile IST die Resume-Garantie für JEDES Projekt (kein projektspezifischer Hook nötig). Behalten Sie den Hook, auch wenn MEMORY.md automatisch geladen wird: Er fügt die Anweisung „Handoff VOR dem Arbeiten lesen“ hinzu, funktioniert von jedem Verzeichnis aus und überlebt, wenn MEMORY.md über das 200-Zeilen-Ladelimit hinauswächst. Er warnt auch, wenn ein Projekt zwei Live-Zeiger oder einen Zeiger auf eine fehlende Datei hat – diese beim Abschluss korrigieren.
Regeln weitertragen. Jede neue Eigentümerregel, dauerhafte Anweisung, funktionierender Befehl oder bezahlte Lektion geht sofort in die immer geladene Regeln-Datei dieses Projekts ein, nicht nur in ein Handoff. Regeln-Datei: <MEM>/<proj>_rules.md, wird von session-resume.sh vollständig geladen für jedes Projekt, das in <MEM>/session-wrap.conf aufgeführt ist. Kurz halten; ersetzen statt anhängen. Beim Abschluss prüfen: Alles, was der Eigentümer in dieser Sitzung wiederholen musste, muss jetzt darin sein. Auch <MEM>/<proj>_now.md umschreiben (aktueller Zustand und nächste Schritte, kurz halten: Hook-Kontext wird bei etwa 10.000 Zeichen abgeschnitten).
2. Projekt-Zustandsspeicher-Sync — ROUTE zuerst
Projekt aus cwd / der Arbeit dieser Sitzung erkennen. Dann der Route dieses Projekts folgen. Eine ###-Route pro eigenem Projekt hinzufügen; die drei unten sind die Muster.
→ dessen eigene Datenbank
Mit Anmeldedaten aus der Umgebung verbinden (psql "$PROJECT_DB_URL"), niemals ein Literal im Befehl. Beispieltabellen in examples/state-store.sql:
INSERT INTO session_handoff (session_id, handoff_prompt, created_at) VALUES ('<sid>','<resume>',now());
INSERT INTO decisions (title,rationale,applies_to,status,session,"timestamp",decided_at)
VALUES ('<d>','<why>','<project>','implemented','<sid>',now()::text,now()); -- ein INSERT pro Zeile
INSERT INTO code_map (module,path,lines,purpose,bounded_context) VALUES (...); -- DELETE the path first if no unique constraint
GOTCHAS (hier eigene Speicher-Gotchas eintragen; dies sind die Art, die jeweils eine Sitzung kosten): Keyword-benannte Spalten in Anführungszeichen setzen (decisions."timestamp"; für reservierte Wörter wie "order" erforderlich, sonst harmlos) und deren Typ beachten (hier text + NOT NULL, daher now()::text); eine CHECK-constraint-Spalte akzeptiert NUR ihre aufgelisteten Werte (pending|implemented|superseded|deferred|rejected); nicht davon ausgehen, dass eine Tabelle existiert – zuerst \d ausführen; mehrzeiliges VALUES ist atomar, daher ein fehlerhafter Zeile verwirft alle → zeilenweise mit -v ON_ERROR_STOP=off arbeiten. Guardrail-Fehlalarm: Ein PreToolUse-Hook, der gefährliche Befehle blockiert, durchsucht den GESAMTEN Bash-Befehl – wenn Ihr SQL-Text ein wörtliches blockiertes Muster enthält (reset --hard, git push, git clean), wird der GESAMTE Befehl BLOCKIERT. Solche Zeichenfolgen in Handoff-/Entscheidungstext paraphrasieren (z. B. „destruktives git“ nicht das wörtliche).
<Projekt, das live läuft> → dessen eigener Speicher (NICHT eines anderen Projekts)
Schema VOR dem Schreiben ÜBERPRÜFEN; Notizen dazu werden schnell alt. Live-Infrastruktur – das externe System of Record (Zahlungsanbieter, Produktions-DB, der laufende Dienst) ist die Wahrheit, nicht das Handoff; niemals ein Live-Flag oder eine Live-Einstellung als Teil eines Abschlusses umschalten.
→ nur Memory
Kein DB-Zustandsspeicher – das §1-Handoff-Memory IST die Aufzeichnung. Dies notieren; keine Tabellen anderer Projekte schreiben.
3. RESUME-PROMPT ausgeben (das letzte Artefakt – was der Benutzer in den nächsten Claude einfügt)
Nach dem Speichern eine eingerahmte Copy-Paste-Aufforderung für die nächste Sitzung AUSGEBEN. Der SessionStart-Hook injiziert bereits den Handoff-Zeiger, daher fügt dieser Prompt nur hinzu: erneute Lade-Prüfungen + die OFFENE(N) Entscheidung(en), die der Benutzer treffen muss. Vorlage:
Resume <Projekt>. Lies zuerst Memory <handoff-file>, dann Skill /<project-map-skill>.
Verifizierter Zustand: <1-zeilig: wichtiger SHA + was live ist + das gesperrte/blockierte Ding>.
Zuerst: 1) /context — <erneute Lade-Prüfung, z. B. Kosten neu geladener Plugins messen>; 2) <Lade-Bestätigungs-Prüfung>.
Dann meine Entscheidung zu <OFFENER FORK>: [EINS AUSWÄHLEN] (a) <Empfehlung> (b) … (c) …
<Ihre dauerhaften Sitzungsanweisungen, z. B. vor Fertigmeldung verifizieren>
KURZ halten – Zeiger + Entscheidungen, kein Zustandsdump (Zustand lebt im Handoff-Memory + DB; nicht duplizieren → Kontextverschmutzung). Diesen Prompt auch im Handoff-Memory unter einer ## RESUME PROMPT-Überschrift ablegen, damit er abfragbar ist und nicht im Chat verloren geht.
Abschluss (prüfen, Ergebnisse zitieren)
- Abgleich-Gate – ZUERST ausführen, obligatorisch. Die gesamte Konversation (nicht nur Memory) durchsuchen und alle Entscheidungen, offenen Punkte, Eigentümerkorrekturen und Vorgaben dieser Sitzung auflisten. Für JEDEN Punkt zitieren + wo er gelandet ist (Handoff-Memory-Zeile, Regeln-Datei-Zeile oder DB-Zeile) oder als
FALLENGELASSEN: <einzeiliger Grund>markieren. „Ich denke, es ist abgedeckt“ ist nicht erlaubt – auf die Zeile verweisen oder als fallengelassen markieren. Alles Ungeklärte → jetzt schreiben (§3 aktualisieren, wenn eine OFFENE Entscheidung geändert wurde), dann erneut auflisten. - §1: Die MEMORY.md-Zeile des Handoff-Memorys trägt
(aktuell); vorherige als ersetzt markiert;grep -c 'LIVE STATE (Herzschlag)' <handoff>= 0. - §2: Für ein DB-Projekt:
SELECT max(created_at) FROM session_handoff;≈ jetzt + die von Ihnen geschriebenen Zeilenanzahlen. Für Memory-only dies angeben. - §3: Der Resume-Prompt wird AUSGEGEBEN UND im Handoff-Memory gespeichert.