log append --body-file mit fehlender Datei: Traceback statt ERROR-Zeile #145

Closed
opened 2026-09-26 06:28:08 +00:00 by torben · 2 comments
Owner

Gefunden beim Durchgang für #142 (2026-09-26). Nach dessen Regel wurde eine Abweichung zwischen Text und Code nicht dort korrigiert, sondern hier erfasst. Erledigt in 7.1.0-beta.24 (a70d904, Changelog-Korrektur 2074539).

Befund (behoben)

Der Datensatz von log append (tools/chemenu/commands/log_append.py, seit #142/#143 in zwei Failure-Einträge aufgeteilt) nannte als zweite Exit-1-Ursache „--body-file cannot be read“ mit der Reaktion „Nothing was written - fix the path and retry once“ – einen Validierungsfehler (AGENTS.md § Tool error contract, Fall 2).

Der Code rief body_file.read_text(encoding="utf-8") ungeschützt auf. Mit CliRunner gegen --body-file /nonexistent: Exit 1, keine Ausgabe, Ausnahme FileNotFoundError; unter dem echten Wrapper ein Traceback, also Fall 4 („unexpected error“, bei einem nicht-idempotenten Kommando nicht wiederholen). Ein Agent bekam für denselben Fehler zwei widersprüchliche Anweisungen. Nebenbei erstattete der Weg an fail() vorbei den Budget-Slot nicht zurück, obwohl nichts geschrieben wurde.

Umsetzung

  1. Code: Das Lesen von --body-file ist in try/except (OSError, UnicodeDecodeError) gefasst und bricht über fail(f"Cannot read --body-file {body_file}: {exc}") ab. OSError deckt fehlende Datei, Verzeichnis und fehlende Rechte ab, UnicodeDecodeError eine Datei, die kein UTF-8 ist; der Pfad steht explizit in der Zeile, weil die Meldung von UnicodeDecodeError ihn nicht nennt. Das Lesen liegt vor dem open("a") – kb/log.md bleibt in jedem Fehlerfall byte-identisch, was der Test festhält.
  2. Datensatz: Ursache lautet jetzt „--body-file is missing, not a readable file, or not valid UTF-8“, Reaktion unverändert; tools/CONTRACT.md per docs contract --apply regeneriert.
  3. Tests (tools/chemenu/tests/test_log_append.py): parametrisiert über fehlende Datei, Verzeichnis (statt chmod, weil CI als root läuft) und Nicht-UTF-8-Datei – Exit 1, stdout beginnt mit ERROR und enthält den Pfad, LOG_FILE byte-identisch. Dazu der bis dahin fehlende Positivfall: Inhalt von --body-file landet im Eintrag. Der stderr-Hinweis (ON FAILURE) ist generisch in test_util.py abgedeckt und hier nicht wiederholt.
  4. Version: --patch --impact low, Kandidat 7.1.0-beta.23 → beta.24. Den CHANGES.md-Abschnitt habe ich zunächst auf Deutsch geschrieben und in 2074539 auf Englisch umgestellt, wie den Rest des Kandidaten (Präzedenz: 685fc2e für #144); reine CHANGES.md-Commits liegen außerhalb des Version-Gates.
  5. Pull-through: nur der Datensatz. Keine andere Doku, kein docs/-Text und kein Stage-Contract nennt --body-file oder dessen Fehlerverhalten – geprüft per grep über alle *.md außerhalb von kb/.

Verifiziert: pytest in tools/ (1540 passed), docs verify, instructions verify, jeweils vor dem Publish; CI-Runs 409 und 410 auf a70d904 grün, Run 411 auf 2074539 grün.

Bewusst ausgelassen: --body und --body-file gleichzeitig (heute gewinnt still --body-file) – anderes Verhalten, nicht Teil dieses Befunds; bei Bedarf ein eigenes Issue.

Nicht behoben, Nebenbefund: Der Commit a70d904 trägt keine Co-Authored-By/Claude-Session-Trailer. wikitool publish baut die Nachricht selbst (<message>\n\nFiles changed:\n…) und nimmt keinen Trailer an; nachträgliches Amend und Force-Push verbietet Invariante 5.

Akzeptanzkriterien

  • log append --body-file <fehlend, Verzeichnis oder kein UTF-8> endet mit Exit 1 und einer ERROR-Zeile, die den Pfad nennt, und kb/log.md ist danach byte-identisch zu vorher.
  • Ein Test hält das für alle drei Fälle fest.
  • Der Datensatz beschreibt danach genau dieses Verhalten, tools/CONTRACT.md ist regeneriert und docs verify grün.
Gefunden beim Durchgang für #142 (2026-09-26). Nach dessen Regel wurde eine Abweichung zwischen Text und Code nicht dort korrigiert, sondern hier erfasst. **Erledigt in `7.1.0-beta.24`** (`a70d904`, Changelog-Korrektur `2074539`). ## Befund (behoben) Der Datensatz von `log append` (`tools/chemenu/commands/log_append.py`, seit #142/#143 in zwei `Failure`-Einträge aufgeteilt) nannte als zweite Exit-1-Ursache „`--body-file` cannot be read“ mit der Reaktion „Nothing was written - fix the path and retry once“ – einen Validierungsfehler (AGENTS.md § Tool error contract, Fall 2). Der Code rief `body_file.read_text(encoding="utf-8")` ungeschützt auf. Mit `CliRunner` gegen `--body-file /nonexistent`: Exit 1, keine Ausgabe, Ausnahme `FileNotFoundError`; unter dem echten Wrapper ein Traceback, also Fall 4 („unexpected error“, bei einem nicht-idempotenten Kommando nicht wiederholen). Ein Agent bekam für denselben Fehler zwei widersprüchliche Anweisungen. Nebenbei erstattete der Weg an `fail()` vorbei den Budget-Slot nicht zurück, obwohl nichts geschrieben wurde. ## Umsetzung 1. **Code**: Das Lesen von `--body-file` ist in `try/except (OSError, UnicodeDecodeError)` gefasst und bricht über `fail(f"Cannot read --body-file {body_file}: {exc}")` ab. `OSError` deckt fehlende Datei, Verzeichnis und fehlende Rechte ab, `UnicodeDecodeError` eine Datei, die kein UTF-8 ist; der Pfad steht explizit in der Zeile, weil die Meldung von `UnicodeDecodeError` ihn nicht nennt. Das Lesen liegt vor dem `open("a")` – `kb/log.md` bleibt in jedem Fehlerfall byte-identisch, was der Test festhält. 2. **Datensatz**: Ursache lautet jetzt „`--body-file` is missing, not a readable file, or not valid UTF-8“, Reaktion unverändert; `tools/CONTRACT.md` per `docs contract --apply` regeneriert. 3. **Tests** (`tools/chemenu/tests/test_log_append.py`): parametrisiert über fehlende Datei, Verzeichnis (statt `chmod`, weil CI als root läuft) und Nicht-UTF-8-Datei – Exit 1, stdout beginnt mit `ERROR ` und enthält den Pfad, `LOG_FILE` byte-identisch. Dazu der bis dahin fehlende Positivfall: Inhalt von `--body-file` landet im Eintrag. Der stderr-Hinweis (ON FAILURE) ist generisch in `test_util.py` abgedeckt und hier nicht wiederholt. 4. **Version**: `--patch --impact low`, Kandidat `7.1.0-beta.23` → `beta.24`. Den `CHANGES.md`-Abschnitt habe ich zunächst auf Deutsch geschrieben und in `2074539` auf Englisch umgestellt, wie den Rest des Kandidaten (Präzedenz: `685fc2e` für #144); reine `CHANGES.md`-Commits liegen außerhalb des Version-Gates. 5. **Pull-through**: nur der Datensatz. Keine andere Doku, kein `docs/`-Text und kein Stage-Contract nennt `--body-file` oder dessen Fehlerverhalten – geprüft per `grep` über alle `*.md` außerhalb von `kb/`. **Verifiziert:** `pytest` in `tools/` (1540 passed), `docs verify`, `instructions verify`, jeweils vor dem Publish; CI-Runs 409 und 410 auf `a70d904` grün, Run 411 auf `2074539` grün. **Bewusst ausgelassen:** `--body` und `--body-file` gleichzeitig (heute gewinnt still `--body-file`) – anderes Verhalten, nicht Teil dieses Befunds; bei Bedarf ein eigenes Issue. **Nicht behoben, Nebenbefund:** Der Commit `a70d904` trägt keine `Co-Authored-By`/`Claude-Session`-Trailer. `wikitool publish` baut die Nachricht selbst (`<message>\n\nFiles changed:\n…`) und nimmt keinen Trailer an; nachträgliches Amend und Force-Push verbietet Invariante 5. ## Akzeptanzkriterien - [x] `log append --body-file <fehlend, Verzeichnis oder kein UTF-8>` endet mit Exit 1 und einer `ERROR`-Zeile, die den Pfad nennt, und `kb/log.md` ist danach byte-identisch zu vorher. - [x] Ein Test hält das für alle drei Fälle fest. - [x] Der Datensatz beschreibt danach genau dieses Verhalten, `tools/CONTRACT.md` ist regeneriert und `docs verify` grün.
torben added the prio/plannedsize/Sarea/kbkind/defect labels 2026-09-26 06:28:08 +00:00
Author
Owner

Changelog: Befund auf den aktuellen Datensatz (nach #142/#143 aufgeteilt) korrigiert. Plan ergänzt: OSError/UnicodeDecodeError → fail(), präzisierte Ursache im Datensatz, parametrisierter Test (fehlend/Verzeichnis/kein UTF-8) plus Positivfall, --patch-Bump mit --impact low. Kriterium 1 um „Verzeichnis oder kein UTF-8“ und „byte-identisch“ geschärft.

**Changelog:** Befund auf den aktuellen Datensatz (nach #142/#143 aufgeteilt) korrigiert. Plan ergänzt: `OSError`/`UnicodeDecodeError` → `fail()`, präzisierte Ursache im Datensatz, parametrisierter Test (fehlend/Verzeichnis/kein UTF-8) plus Positivfall, `--patch`-Bump mit `--impact low`. Kriterium 1 um „Verzeichnis oder kein UTF-8“ und „byte-identisch“ geschärft.
Author
Owner

Changelog: Body auf Endstand: Plan → Umsetzung, alle drei Kriterien abgehakt, Verifikation benannt (pytest 1540, docs verify, instructions verify, CI 409/410/411 grün). Neu: CHANGES.md-Abschnitt nachträglich auf Englisch (2074539); Nebenbefund zu fehlenden Commit-Trailern bei wikitool publish festgehalten.

**Changelog:** Body auf Endstand: Plan → Umsetzung, alle drei Kriterien abgehakt, Verifikation benannt (pytest 1540, `docs verify`, `instructions verify`, CI 409/410/411 grün). Neu: `CHANGES.md`-Abschnitt nachträglich auf Englisch (`2074539`); Nebenbefund zu fehlenden Commit-Trailern bei `wikitool publish` festgehalten.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#145