board-agent's own README documents docs/intent/ and docs/research-intent/ as tracked corpus directories, and docs/review/<slug>.md as the reviewer's persisted report per card - but the pipeline only writes these files to the checkout, it never commits them itself. This had built up a backlog of intent/review docs for cards already marked deployed or archiviert in the live board state, which were sitting uncommitted in the working tree. Adds that backlog as-is: the originating intents, their reviewer reports, the research-intent/research pair for the board UX evaluation, and one standalone process-retrospective report (board-review-pipeline-context- overhead.md, same genre as the two already-tracked audit reports in docs/review/). No code changes. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T7UVrKsttMP9a6FiGFna9b
5.4 KiB
Bericht: Aufwand zur Kontextbeschaffung in dieser Session
Deine Ausgangsnachricht war ein einziger Satz, ohne Job-ID, ohne Fehlermeldung, ohne Dateiverweis:
„ein review ist auf fehlgeschlagen im intent board pipeline Intent: Isolierte Worktrees und parallele Builder-Jobs für das Board"
Alles Weitere musste ich mir selbst erarbeiten. Grobe Zählung der tatsächlichen Tool-Aufrufe (Bash/Read/Grep/Edit/Write/etc.) über die gesamte Session: rund 80, davon der überwiegende Teil reine Kontextbeschaffung, bevor überhaupt eine Korrektur möglich war.
Phase 1 — Wo ist die Karte, wo ist der Fehler? (~9 Aufrufe)
git status+ Intent-Dokument lesen, um den Slug zu identifizieren- Verzeichnisstruktur suchen (
find -iname "*board*") — der Prompt nannte keinen Pfad hostnameprüfen, ob überhaupt auf blunix gearbeitet wird (wo der Live-State liegt)/var/lib/board-agent/{inbox,processing,failed,done}durchsuchen, bis die passende JSON-Datei auftauchte- Die eigentliche Fehlermeldung stand am Ende in einer einzelnen Zeile: „Reviewer lieferte keinen ===REVIEW-REPORT===-Block."
Phase 2 — Code lesen, um die Fehlermeldung überhaupt einzuordnen (~20 Aufrufe)
Die Fehlermeldung allein sagt nichts darüber, warum der Marker fehlte. Nötig war:
worker.pykomplett lesen (Prompt-Templates,parse_claude_response,extract_review_report,run_review,process_job) — ~460 Zeilentrigger.pyundREADME.mdgegenlesen, um zu verstehen, welche Phasen/Spalten es gibt und ob es einen „Retry"-Mechanismus gibt (gibt es nicht)test_board_agent.pyan mehreren Stellen lesen, um zu verifizieren, obphase="review"nach einem Review absichtlich stehen bleibt oder ein Bug ist (war Absicht — steht so in den Tests)- Mehrere
journalctl-Läufe mit falschen Zeitfenstern (leere Ergebnisse), bis das richtige Zeitfenster und die richtige Journal-Zeile gefunden waren — der Log-Eintrag selbst enthielt aber nur dieselbe knappe Fehlermeldung, keine Rohausgabe des Modells
Phase 3 — Root Cause: die eigentliche Modellantwort rekonstruieren (~15 Aufrufe)
worker.py druckt die Modellantwort nur bei Erfolg — bei einem Fehler ist sie nirgends gespeichert außer im Claude-Transkript selbst. Also:
~/.claude/projects/-home-drone-nixos-config-agents/durchsuchen nach der passenden.jsonl-Sitzung anhand des Zeitfensters- Mehrfach mit
grep -o/wc -ldie Anzahl von===REVIEW-REPORT===vs.===END-REVIEW-REPORT===gezählt, um zu verifizieren, ob der Marker überhaupt geschrieben wurde python3/python/nodewaren auf blunix gar nicht im Pfad verfügbar — Umstieg aufjq, um JSON aus der Transkript-Datei zu extrahieren- damit die tatsächliche, vollständige, aber unabgeschlossene Review-Antwort wiederhergestellt
Phase 4 — Erster Recovery-Versuch, Blockade, Rückfrage (~5 Aufrufe)
- Bericht manuell nach
docs/review/…mdgeschrieben - Versuch,
state.jsonperjqzu korrigieren → vom Auto-Mode-Classifier blockiert (Live-Service-State außerhalb des Repos) - Rückfrage per
AskUserQuestion→ Entscheidung für einen echten Retry über die Pipeline statt manueller Reparatur
Phase 5 — Retry #1, gleicher Fehler, zweite Fehleranalyse (~8 Aufrufe)
- Neuen Job in
/var/lib/board-agent/inbox/geschrieben - Fehlgeschlagene Monitor-Bedingung (systemd meldet bei Oneshot-Services nie „active", sondern „activating" → falsches „DONE" nach 3 Sekunden, während der Job noch lief) — Wartelogik musste korrigiert und neu aufgesetzt werden
- Zweites Transkript gefunden und ausgewertet → exakt derselbe Fehler, damit als reproduzierbar (2/2) bestätigt
- Erneute Rückfrage → Entscheidung, den Root Cause im Code zu fixen
Phase 6 — Fix, Test, Deploy, Verifikation (~15 Aufrufe)
extract_review_report()inworker.pyrobuster gemacht (Fallback ohne Closing-Marker)- Regressionstest ergänzt, volle Testsuite (58 Tests) über
nix-shelllaufen lassen predeploy-check-Skill für blunix gestartet →nix evalscheiterte zunächst mitpath:-Präfix, Umstellung auf.nix build+nix store diff-closures→ Diff zeigte keine Änderung an, obwohl der Code sich geändert hatte (bekannte Einschränkung vondiff-closuresbei unversionierten eigenen Skript-Derivationen — falscher Alarm, erst überExecStart-Pfad-Vergleich aufgelöst)- Deploy erfolgte durch den Nutzer selbst („switched") — verifiziert über den geänderten
ExecStart-Store-Pfad und einengrepauf den neuen Code-Kommentar, da/run/current-systemtextuell gleich aussah
Phase 7 — Retry #2, endlich sauber (~4 Aufrufe)
- Dritten Job requeued, korrekt auf „fertig" gewartet, Ergebnis geprüft → lief durch, mit einem echten (neuen) Befund: fehlende Testabdeckung für die neue Concurrency-Logik in
trigger.py.
Fazit
Von den ~80 Aufrufen entfielen grob 45–50 allein auf Kontextbeschaffung und Root-Cause-Diagnose, bevor überhaupt eine Korrektur möglich war — das liegt vor allem daran, dass die Pipeline keine zentrale, aussagekräftige Fehlerquelle hat: die Fehlermeldung in state.json/journal ist bewusst knapp gehalten, die eigentliche Modellantwort landet nur bei Erfolg irgendwo, und bei einem Fehler existiert sie ausschließlich verstreut im Claude-Session-Transkript. Zwei zusätzliche Reibungspunkte kosteten weitere Zyklen: kein python3 im Pfad auf blunix, und eine falsche Annahme über systemctl is-active-Semantik bei Oneshot-Services, die zu einer verfrühten Fehlmeldung führte.