docs verify prüft die beiden Tabellen in tools/CONTRACT.md nicht getrennt - Fehlerkontrakt gar nicht #91
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Befund
check_cli_readme()intools/chemenu/commands/docs_verify.pyglich die registrierten CLI-Kommandos gegentools/CONTRACT.mdab. Der Regex, mit dem es die dokumentierten Kommandos einsammelte, kannte keine Abschnittsgrenzen:tools/CONTRACT.mdhat aber zwei Tabellen mit Kommandonamen in der ersten Spalte: § Commands (ab Zeile 44) und § Error contracts (ab Zeile 188). Der Check sah beide als einen Topf. Zwei Konsequenzen, beide gemessen:docs verifywar grün:budget reset,instructions list,instructions verify,log append,migrate status,sources rebuild-index,sources trace,types describe,upload show,version notes.Ursache der 10 Lücken (beim Umsetzen gefunden)
Keine zehn unabhängigen Auslassungen: acht der zehn Kommandos teilten sich in § Error contracts eine Zeile der Form
`a` / `b`mit einem Geschwisterkommando -TABLE_CELL_REliest je Zeile nur das erste Backtick-Wort, der Rest der Gruppe war für den (ohnehin ungeprüften) Check unsichtbar.log appendwar die neunte Lücke aus einem anderen Grund: seine Zeile stand im Quelltext ohne Zeilenumbruch hinter der vonindex rebuild/sources rebuild-indexverschmolzen - für Menschen kaum als Tabelle lesbar, für die zeilenanfang-verankerte Regex unsichtbar. Beim Aufteilen dieser Gruppen fielen zusätzlich drei sachlich falsche Zeilen auf:sources coverage,types list,instructions listundbudget statusschlagen nie fehl, die alte gemeinsame Zeile behauptete pauschal das Gegenteil, weil sie das Verhalten des jeweils benachbarten Kommandos mit übernahm. Alle betroffenen Zeilen wurden einzeln aufgeteilt und gegen den tatsächlichen Code (run_budget.py,instructions_cmd.py,log_append.py,migrate_cmd.py,provenance_cmd.py,types_cmd.py,upload_cmd.py/upload.py,version_cmd.py) nachgesehen statt aus dem Nachbarn übernommen.Umsetzung
check_cli_readme()liest beide Tabellen jetzt über ihre##-Überschrift ab (neue Funktionsection_text()), unabhängig voneinander und je Tabelle in beide Richtungen. Fehlt eine der beiden Überschriften, meldet die Funktion das explizit statt stillschweigend auf "ganzes Dokument" zurückzufallen.Akzeptanzkriterien
documented_commands()-Ersatz liest die Kommandotabelle abschnittsweise (§ Commands / § Error contracts getrennt geführt). Regressionstest:test_a_row_deleted_from_commands_is_caught_even_if_error_contracts_still_has_it.##-Überschriften, nicht an Zeilennummern, und schlägt mit klarer Meldung fehl, wenn eine Überschrift fehlt - kein stillschweigendes "alles gescannt". Tests:test_a_renamed_commands_heading_is_reported_not_silently_scanned,test_a_renamed_error_contracts_heading_is_reported_not_silently_scanned, plus drei Unit-Tests fürsection_text()selbst.test_error_contracts_is_enforced_against_registered_commands,test_a_phantom_error_contract_row_is_reported.docs verify-Zeile intools/CONTRACT.md(§ Commands) nennt jetzt beide Tabellen, beide Richtungen je Tabelle, und dass nur die Präsenz des Namens geprüft wird, nie der Zellentext.pytestintools/grün (1193 passed, inkl. 9 neuer Tests intest_docs_verify.py);docs verifyundinstructions verifygrün.--minor(5.0.0-beta.12 → 5.0.0-beta.13) mit Changelog-Body, der die Fremdinstanz-Ausnahme (eigenes, abweichendestools/CONTRACT.md) explizit benennt - gegenversion-parts.mdgeprüft: additiv, drop-in in beide Richtungen, kein neues Boundary-Crossing.Nicht in diesem Paket: Flag-Parität
Naheliegend, weil Typer die deklarierten Parameter eines Kommandos kennt und ein neues
--flagheute fürdocs verifyvollständig unsichtbar ist (AGENTS.mdsagt selbst „a README goes stale on every new flag"). Trägt aber in dieser Form nicht: eine Tabellenzelle ist eine Einzeiler-Beschreibung und nennt nie alle Flags - die stehen in den Prosa-Abschnitten darunter. Ein solcher Check bräuchte ein Modell der Abschnittsgrenzen je Kommando, nicht nur je Tabelle, und müsste entscheiden, welche Flags dokumentationspflichtig sind (--help? geerbte?).Weiterhin offene Designfrage, eigenes Issue, falls es aufgegriffen wird. Der hier gebaute abschnittsweise Leser (
section_text()) ist die Vorarbeit dafür.Verifiziert
tools/wikitool docs verify,tools/wikitool instructions verify, vollepytest-Suite (1193 passed). Publiziert als Commit2030844.Modell-Handover
Design, Umsetzung, Tests und Versionsbump liefen in einer Sitzung auf Sonnet 5 bei Effort
high- kein Moment, an dem die Sitzung zwischen Design und mechanischer Phase umschalten musste, weil das Issue bereits vollständig spezifiziert war (kind/build, keine offenen Designfragen). Die Closing-Phase (dieser Body,stack-close) lief ebenfalls auf Sonnet 5.Changelog: Alle Akzeptanzkriterien umgesetzt und abgehakt. Neuer Abschnitt "Ursache der 10 Lücken" ergänzt das Befund: acht der zehn Lücken waren
`a` / `b`-gruppierte Zeilen (nur das erste Backtick-Wort zählte), eine (log append) eine verschmolzene Zeile ohne Zeilenumbruch; beim Aufteilen wurden vier zusätzliche sachlich falsche Nachbarzeilen korrigiert (sources coverage,types list,instructions list,budget statusschlagen nie fehl). Versionsbump 5.0.0-beta.12 → 5.0.0-beta.13, Commit2030844.