This repository has been archived on 2026-09-17. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
nixos-config/docs/review/board-review-pipeline-context-overhead.md
pijukka 05575df408 docs: commit backlog of already-resolved intent/review corpus files
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
2026-09-10 12:06:53 +02:00

52 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
- `hostname` prü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.py` komplett lesen (Prompt-Templates, `parse_claude_response`, `extract_review_report`, `run_review`, `process_job`) — ~460 Zeilen
- `trigger.py` und `README.md` gegenlesen, um zu verstehen, welche Phasen/Spalten es gibt und ob es einen „Retry"-Mechanismus gibt (gibt es nicht)
- `test_board_agent.py` an mehreren Stellen lesen, um zu verifizieren, ob `phase="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 -l` die Anzahl von `===REVIEW-REPORT===` vs. `===END-REVIEW-REPORT===` gezählt, um zu verifizieren, ob der Marker überhaupt geschrieben wurde
- `python3`/`python`/`node` waren auf blunix gar nicht im Pfad verfügbar — Umstieg auf `jq`, 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/…md` geschrieben
- Versuch, `state.json` per `jq` zu 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()` in `worker.py` robuster gemacht (Fallback ohne Closing-Marker)
- Regressionstest ergänzt, volle Testsuite (58 Tests) über `nix-shell` laufen lassen
- `predeploy-check`-Skill für blunix gestartet → `nix eval` scheiterte zunächst mit `path:`-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 von `diff-closures` bei unversionierten eigenen Skript-Derivationen — falscher Alarm, erst über `ExecStart`-Pfad-Vergleich aufgelöst)
- Deploy erfolgte durch den Nutzer selbst („switched") — verifiziert über den geänderten `ExecStart`-Store-Pfad und einen `grep` auf den neuen Code-Kommentar, da `/run/current-system` textuell 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.