docs: ausgelieferte Doku zitiert keine Issue-Nummern mehr, docs verify prueft es (schliesst #77)
CI / verify (push) Successful in 59s
Release / release (push) Successful in 37s

Files changed:
- .gitignore
- CHANGES.md
- EVALS.md
- INSTALL.md
- README.md
- VERSION
- docs/pipeline-rationale.md
- instructions/CONTRACT.md
- instructions/bootstrap.md
- instructions/dev/issue-tracking.md
- instructions/evolve-subtypes.md
- instructions/kb-profiles.md
- instructions/mcp-read-server.md
- instructions/wiki-ingest/SKILL.md
- kb/CONTRACT.md
- kb/concepts/COLLECTION.md
- kb/sources/COLLECTION.md
- raw/CONTRACT.md
- tools/.coveragerc
- tools/CONTRACT.md
- tools/README.md
- tools/chemenu/commands/docs_verify.py
- tools/chemenu/tests/test_docs_verify.py
- types/source.schema.yaml
- types/type-spec.md
This commit is contained in:
2026-09-09 18:52:34 +02:00
parent 5820924ffd
commit a51d7a322f
25 changed files with 388 additions and 68 deletions
+89 -1
View File
@@ -35,7 +35,7 @@ dev-checkout concern - readable here, never shipped as something to parse.
---
## 4.8.0-beta.11 - 2026-09-09 - SKILL.md-Sanierung: Checklisten, Kommandolisten, wiki-status-Hard-Rule, wiki-query-Filingpruefung (#70, #74, #75, #78)
## 4.8.0-beta.12 - 2026-09-09 - Ausgelieferte Doku zitiert keine Issue-Nummern mehr, docs verify prueft es (schliesst #77)
**Author:** Torben Nehmer
@@ -52,6 +52,7 @@ dev-checkout concern - readable here, never shipped as something to parse.
- source_type ist Instanzsache: Profilkatalog, Setup-Frage, evolve-subtypes-Instruction (#68)
- instructions/CONTRACT.md: Skill-H1, Referenztiefe und Begruendungsprosa praezisiert (#71, #72, #79)
- SKILL.md-Sanierung: Checklisten, Kommandolisten, wiki-status-Hard-Rule, wiki-query-Filingpruefung (#70, #74, #75, #78)
- Ausgelieferte Doku zitiert keine Issue-Nummern mehr, docs verify prueft es (schliesst #77)
<!-- /wikitool:bumps -->
Das Label `status/incoming` gibt es seit heute in Gitea: der Mensch legt einen
@@ -752,6 +753,93 @@ instruction, neuer Unterabschnitt „When a skill carries a copy-in checklist").
Schließt #70, #74, #75 und #78.
**Issue-Nummern in ausgelieferter Doku** (#77): `dist export` lieferte
Dateien aus, die im Fließtext auf Issue-Nummern dieses Trackers verwiesen —
„flat since Gitea #67", „`new source` refuses without it (Gitea #66)". In einer
verteilten Instanz zeigt das auf nichts. Der Leser kann den Verweis weder
auflösen noch als unauflösbar erkennen, und eine Regel sieht damit so aus, als
stütze sie sich auf einen Beleg, den niemand beibringen kann. Das Board liegt
im Ursprungs-Repo, und `instructions/dev/issue-tracking.md` — die einzige Datei,
die das überhaupt sagt — wird von `dist export` mit dem Rest von
`instructions/dev/` weggeschnitten. Gegenprobe zum eigenen Anspruch aus
`instructions/CONTRACT.md` § „Writing an instruction": „self-contained enough
for an agent with no prior context".
Gemessen statt geschätzt: ein Export in ein leeres Verzeichnis, `grep -rn
'#[0-9]'`, ergab **43 Treffer in 16 Dateien** außerhalb von `tools/**/*.py` —
`raw/CONTRACT.md` allein acht. Das Issue hatte zehn gelistet.
Aufgelöst wurde nicht durch eine Markierung, sondern durch Umformulierung:
**die Nummer fällt weg, die Datierung geht in Worte.** Aus „flat since Gitea
#67" wird „flat since the addressing scheme dropped type directories", aus
„**Pre-#67 files are not moved**" wird „**Files promoted under the old type
directories are not moved**". Der Satz trägt sich damit selbst — es gibt keine
repoweite Notation zu definieren und an genau einer Stelle zu halten
(Invariante 8), und kein Leser von `README.md` muss `AGENTS.md` geladen haben,
um sie aufzulösen. Rückverfolgbar bleibt es hier über `git blame` → Commit-
Message; die tragen die Nummern ohnehin.
Zwei Stellen, an denen der Zeiger *der ganze Wert* des Satzes war und in Worten
nichts übrig geblieben wäre, stehen jetzt in einem
`<!-- dist:strip-start/end -->`-Block: in `instructions/CONTRACT.md` (was ein
Test der Kontextfenster-Behauptung kosten würde) und in `EVALS.md` (wo die
Coverage-Lücken geschlossen werden). Im Dev-Repo sichtbar, im Export weg — die
bestehende Konvention aus `instructions/CONTRACT.md` § `instructions/dev/`, hier
zum zweiten Mal angewandt statt neu erfunden.
**`docs verify` prüft es jetzt** — die offene Frage des Issues, mit Ja
beantwortet. `check_no_issue_references` liest nicht den Arbeitsbaum, sondern
den Text, den `dist_cmd.build_plan()` schreiben würde: dort leben `ROOT_FILES`,
der `instructions/dev/`-Ausschluss und das `.template`-Rekeying schon, und der
Text hat seine Marker-Blöcke bereits verloren. Deshalb ist ein Strip-Block
automatisch exemptiert, ohne dass der Check ihn kennen müsste.
Der Einwand aus `instructions/dev/issue-tracking.md` § „What no tool checks" —
`wikitool` soll den Tracker nicht kennen — trägt hier nicht, und das ist die
Grenze, die der Abschnitt jetzt selbst zieht: `re.compile(r"#\d+")` hat keinen
Client, keine URL und keinen Begriff vom Zustand eines Issues. Der Check sieht
eine Eigenschaft des *Dokuments*, nicht des Boards. Gemessen: null False
Positives über den gesamten Export, weil Markdown-Anker aus Wortzeichen
bestehen (`](#gates)` matcht nicht). Der erste Fund war prompt der Satz, den
diese Sitzung selbst in `tools/CONTRACT.md` geschrieben hatte, um die Regel zu
erklären.
**`tools/**/*.py` bleibt bewusst außen vor**, mit ~90 Treffern in Docstrings und
Kommentaren. Ein Code-Kommentar adressiert, wer die Zeile editiert, und das
passiert ausschließlich im Ursprungs-Repo: `dist export` schneidet den
`stack-dev`-Skill mit `instructions/dev/` weg. Ein ausgeliefertes `tools/` ist
Laufzeit-Maschinerie, keine Lektüre. `.gitignore` und `tools/.coveragerc` sind
aus demselben Grund nicht im Check — von Hand mitgezogen wurden sie trotzdem,
sodass der Export heute in *keiner* Datei außerhalb `.py` eine Nummer trägt.
**MINOR**, geprüft gegen den Drop-in-Test: kein Kommando, kein Flag, kein
Dateiformat, keine Umbenennung; der Rückweg funktioniert unverändert, die alte
Version führt den Check schlicht nicht aus. Kein `--breaking`, kein
Migrationsdokument. Eine Konsequenz ist zu kennen: der Check liest auch die
instanzeigenen `kb/CONVENTIONS.md` und `kb/<collection>/COLLECTION.md`, weil ein
Export sie als `.template` mitnimmt. Eine Instanz, die dort ihre eigene
Ticket-Nummer zitiert, bekommt beim nächsten `docs verify` ein Finding. Das ist
kein Fehlalarm — ein Export dieser Instanz würde den Verweis weitergeben —
aber es ist neu.
Geändert: `tools/chemenu/commands/docs_verify.py` (neuer Check plus
`shipped_prose()`), `tools/chemenu/tests/test_docs_verify.py` (sechs Tests:
sauberer Baum, präparierte Datei, Anker-Nicht-Treffer, `.py` außerhalb des
Scans, Strip-Block unsichtbar, `verify` bricht ab), `tools/CONTRACT.md`
(Kommandotabelle und Fehlerkontrakt-Zeile), `tools/README.md`,
`instructions/dev/issue-tracking.md` (neuer § Citing an issue in the repo, und
§ What no tool checks zieht die Grenze zwischen „was dieses Repo über den
Tracker schreibt" und „dem Tracker selbst"), sowie die 16 Doku-Dateien:
`raw/CONTRACT.md`, `kb/CONTRACT.md`, `tools/CONTRACT.md`, `types/type-spec.md`,
`types/source.schema.yaml`, `kb/sources/COLLECTION.md`,
`kb/concepts/COLLECTION.md`, `instructions/wiki-ingest/SKILL.md`,
`instructions/evolve-subtypes.md`, `instructions/bootstrap.md`,
`instructions/kb-profiles.md`, `instructions/mcp-read-server.md`,
`instructions/CONTRACT.md`, `README.md`, `EVALS.md`, `INSTALL.md`,
`docs/pipeline-rationale.md`, `.gitignore`, `tools/.coveragerc`.
Schließt #77.
---
## 4.7.4 - 2026-09-04 - bootstrap.md nennt den session-id-WARN nach frischem Bootstrap explizit als erwartet