tools/wikitool dist export lieferte Dateien aus, die im Fliesstext auf Issue-Nummern dieses
Trackers verwiesen - "flat since Gitea #67", "new source refuses without it (Gitea #66)". In
einer verteilten Instanz zeigte das auf nichts: der Leser konnte den Verweis weder aufloesen
noch als unaufloesbar erkennen, und eine Regel sah damit so aus, als stuetze 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 ueberhaupt sagt - wird von dist export mit dem Rest von instructions/dev/ weggeschnitten.
Gegenprobe zum Eigenanspruch aus instructions/CONTRACT.md § "Writing an instruction":
"self-contained enough for an agent with no prior context". Eine Issue-Nummer ist genau der
Verweis, den ein Agent ohne Vorkontext nicht aufloesen kann.
Umfang, gemessen statt geschaetzt. Export in ein leeres Verzeichnis, grep -rn '#[0-9]': 43 Treffer in 16 Dateien ausserhalb tools/**/*.py - raw/CONTRACT.md allein acht. Die
urspruengliche Befund-Tabelle dieses Issues fuehrte zehn Stellen in fuenf Dateien; der Rest kam
erst beim Messen gegen den echten Export zutage. Dazu ~90 Treffer in.py, die nach
Entscheidung 1 nicht in den Umfang fielen.
Entschieden und umgesetzt
1. Umfang: nur Doku-Prosa, tools/**/*.py blieb unberuehrt.
Adressat eines Code-Kommentars ist, wer die Zeile editiert - und das passiert ausschliesslich im
Ursprungs-Repo, weil dist exportinstructions/dev/ samt stack-dev-Skill wegschneidet. Die
Frontload-Regel, aus der der Befund stammt, bindet Instructions, nicht Quelltext; eine
ausgelieferte tools/-Kopie ist Laufzeit-Maschinerie, keine Lektuere. Akzeptanzkriterium 4
wurde entsprechend auf Doku-Pfade eingegrenzt statt woertlich ueber den ganzen Export gelesen.
2. Beleg-Form: Nummer raus, Datierung in Worte - statt der im urspruenglichen Body
vorgeschlagenen Historien-Markierung.
Aus "flat since Gitea #67" wurde "flat since the addressing scheme dropped type directories",
aus "Pre-#67 files are not moved" wurde "Files promoted under the old type directories are
not moved". Der Satz traegt sich damit selbst: keine repoweite Notation, die definiert und an
genau einer Stelle gehalten werden muesste (Invariante 8), und kein README.md-Leser muss AGENTS.md geladen haben, um sie aufzuloesen. Rueckverfolgbar bleibt es hier ueber 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 uebrig
geblieben waere, stehen jetzt in einem <!-- dist:strip-start/end -->-Block: instructions/CONTRACT.md (was ein Test der Kontextfenster-Behauptung kosten wuerde, #72) und EVALS.md (Schliessen der Coverage-Luecken, #51). Bestehende Konvention aus instructions/CONTRACT.md § instructions/dev/, hier zum zweiten Mal angewandt statt neu
erfunden.
3. Die offene docs verify-Frage: mit Ja beantwortet. check_no_issue_references liest nicht den Arbeitsbaum, sondern den Text, den dist_cmd.build_plan() schreiben wuerde - dort leben ROOT_FILES, der instructions/dev/-Ausschluss und das .template-Rekeying schon, und der Text hat seine
Marker-Bloecke bereits verloren. Ein Strip-Block ist damit automatisch exemptiert, ohne dass der
Check ihn kennen muesste.
Der Einwand aus § "What no tool checks" - wikitool soll den Tracker nicht kennen - traegt
nicht, und der Abschnitt zieht die Grenze jetzt selbst: 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 ueber den gesamten Export, weil
Markdown-Anker aus Wortzeichen bestehen (](#gates) matcht nicht).
Der erste Fund des Checks war prompt der Satz, den diese Sitzung selbst in tools/CONTRACT.md
geschrieben hatte, um die Regel zu erklaeren (ein illustratives "#42").
Akzeptanzkriterien
Keine von dist export ausgelieferte .md/.template-Datei enthaelt einen Verweis auf
eine Gitea-Issue-Nummer.
Die Begruendungen, die vorher nur ueber die Nummer erreichbar waren (warum source_type
keinen Default hat, warum raw accept auf Stem-Eindeutigkeit besteht, warum raw/ flach
ist), stehen im Text selbst.
tools/.coveragerc und .gitignore mitgezogen, obwohl der Check sie nicht erfasst.
Frischer dist export + grep -rn '#[0-9]' liefert null Treffer - nicht nur in .md/.template, sondern im gesamten Export ausserhalb .py.
docs verify meldet den Verstoss, wenn eine Nummer wieder in eine ausgelieferte Datei
gelangt; sechs Tests decken beide Richtungen ab.
docs verify, instructions verify und pytest ohne neue Findings.
tools/**/*.py unveraendert (Entscheidung 1).
Verifiziert
Check
Ergebnis
tools/wikitool docs verify
OK - "no issue references in 63 shipped document(s)"
tools/wikitool instructions verify
OK - 21 Instructions, 7 Skills, 14 publizierte Kopien deckungsgleich
pytest (tools/)
1082 passed
dist export + grep -rn '#[0-9]', --exclude='*.py'
0 Treffer
CI-Lauf 210 (verify, Nr. 165)
success - alle 9 Schritte, inkl. "Export the distribution" und "The distribution works as a fresh instance" (der setup-instance-Replay, der einzige Check, der lokal nicht lief)
CI-Lauf 211 (release, Nr. 166)
success, ohne etwas zu veroeffentlichen - neuester Tag/Release bleibt v4.7.4. Erwartet: 4.8.0-beta.12 ist ein Kandidat, und release.yml handelt nur auf einer suffixfreien VERSION
docs/-Veralterung geprueft und keine gefunden: docs/version-model.md's Aussage "No check
in docs verify or anywhere else confirms that a version part was chosen correctly" bleibt wahr
(der neue Check sagt nichts ueber Versionsteile), und docs/ownership-and-templates.md
beschreibt, wer eine Datei aendern darf und was ein Upgrade ueberschreiben darf - der Check
schreibt nichts und verschiebt keine Ownership. docs/pipeline-rationale.md hat nur die
Klammer verloren, seine Begruendung ist unberuehrt.
Geaendert
tools/chemenu/commands/docs_verify.py (neuer Check plus shipped_prose()), tools/chemenu/tests/test_docs_verify.py (sechs Tests: sauberer Baum, praeparierte Datei,
Anker-Nicht-Treffer, .py ausserhalb des Scans, Strip-Block unsichtbar, verify bricht ab), tools/CONTRACT.md (Kommandotabelle + Fehlerkontrakt-Zeile), tools/README.md, instructions/dev/issue-tracking.md (neuer § Citing an issue in the repo; § What no tool checks
zieht die Grenze zwischen "was dieses Repo ueber den Tracker schreibt" und "dem Tracker selbst").
Eine Historien-Notation ("origin-repo issue #67") - der urspruengliche Body liess sie als
Option zu. Verworfen zugunsten von Entscheidung 2: sie haette eine repoweite Notation
gebraucht, die genau eine Definitionsstelle haben darf, waehrend README.md und INSTALL.md
von Lesern gesehen werden, die AGENTS.md nie laden.
Eine Ausnahme fuer instanzeigene Dateien. Der Check liest auch 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 ein Finding. Das ist kein Fehlalarm - ein
Export dieser Instanz wuerde den Verweis weitergeben - aber es ist neu, und es steht so im CHANGES.md-Eintrag.
Herkunft
Analyse aus #65, Sitzung 2026-09-09, aufgefallen bei der Volltext-Sichtung von wiki-ingest.
Per grep auf die uebrigen ausgelieferten Instructions ausgeweitet, in der Umsetzungssitzung
auf den vollstaendigen Export gemessen. Verwandte Vorgeschichte in die Gegenrichtung: #29
(Issue-Texte trugen veraltete Pfade nach dem Chemenu-Rename).
**Erledigt** mit `a51d7a3` (`4.8.0-beta.12`, MINOR).
## Was das Problem war
`tools/wikitool dist export` lieferte Dateien aus, die im Fliesstext auf Issue-Nummern dieses
Trackers verwiesen - "flat since Gitea #67", "`new source` refuses without it (Gitea #66)". In
einer verteilten Instanz zeigte das auf nichts: der Leser konnte den Verweis weder aufloesen
noch als unaufloesbar erkennen, und eine Regel sah damit so aus, als stuetze 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 ueberhaupt sagt - wird von
`dist export` mit dem Rest von `instructions/dev/` weggeschnitten.
Gegenprobe zum Eigenanspruch aus `instructions/CONTRACT.md` § "Writing an instruction":
"self-contained enough for an agent with no prior context". Eine Issue-Nummer ist genau der
Verweis, den ein Agent ohne Vorkontext nicht aufloesen kann.
**Umfang, gemessen statt geschaetzt.** Export in ein leeres Verzeichnis, `grep -rn '#[0-9]'`:
**43 Treffer in 16 Dateien** ausserhalb `tools/**/*.py` - `raw/CONTRACT.md` allein acht. Die
urspruengliche Befund-Tabelle dieses Issues fuehrte zehn Stellen in fuenf Dateien; der Rest kam
erst beim Messen gegen den echten Export zutage. Dazu ~90 Treffer *in* `.py`, die nach
Entscheidung 1 nicht in den Umfang fielen.
## Entschieden und umgesetzt
**1. Umfang: nur Doku-Prosa, `tools/**/*.py` blieb unberuehrt.**
Adressat eines Code-Kommentars ist, wer die Zeile editiert - und das passiert ausschliesslich im
Ursprungs-Repo, weil `dist export` `instructions/dev/` samt `stack-dev`-Skill wegschneidet. Die
Frontload-Regel, aus der der Befund stammt, bindet Instructions, nicht Quelltext; eine
ausgelieferte `tools/`-Kopie ist Laufzeit-Maschinerie, keine Lektuere. Akzeptanzkriterium 4
wurde entsprechend auf Doku-Pfade eingegrenzt statt woertlich ueber den ganzen Export gelesen.
**2. Beleg-Form: Nummer raus, Datierung in Worte** - statt der im urspruenglichen Body
vorgeschlagenen Historien-Markierung.
Aus "flat since Gitea #67" wurde "flat since the addressing scheme dropped type directories",
aus "**Pre-#67 files are not moved**" wurde "**Files promoted under the old type directories are
not moved**". Der Satz traegt sich damit selbst: keine repoweite Notation, die definiert und an
genau einer Stelle gehalten werden muesste (Invariante 8), und kein `README.md`-Leser muss
`AGENTS.md` geladen haben, um sie aufzuloesen. Rueckverfolgbar bleibt es hier ueber `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 uebrig
geblieben waere, stehen jetzt in einem `<!-- dist:strip-start/end -->`-Block:
`instructions/CONTRACT.md` (was ein Test der Kontextfenster-Behauptung kosten wuerde, #72) und
`EVALS.md` (Schliessen der Coverage-Luecken, #51). Bestehende Konvention aus
`instructions/CONTRACT.md` § `instructions/dev/`, hier zum zweiten Mal angewandt statt neu
erfunden.
**3. Die offene `docs verify`-Frage: mit Ja beantwortet.**
`check_no_issue_references` liest nicht den Arbeitsbaum, sondern den Text, den
`dist_cmd.build_plan()` schreiben wuerde - dort leben `ROOT_FILES`, der
`instructions/dev/`-Ausschluss und das `.template`-Rekeying schon, und der Text hat seine
Marker-Bloecke bereits verloren. Ein Strip-Block ist damit automatisch exemptiert, ohne dass der
Check ihn kennen muesste.
Der Einwand aus § "What no tool checks" - `wikitool` soll den Tracker nicht kennen - traegt
nicht, und der Abschnitt zieht die Grenze jetzt selbst: `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 ueber den gesamten Export, weil
Markdown-Anker aus Wortzeichen bestehen (`](#gates)` matcht nicht).
Der erste Fund des Checks war prompt der Satz, den diese Sitzung selbst in `tools/CONTRACT.md`
geschrieben hatte, um die Regel zu erklaeren (ein illustratives "#42").
## Akzeptanzkriterien
- [x] Keine von `dist export` ausgelieferte `.md`/`.template`-Datei enthaelt einen Verweis auf
eine Gitea-Issue-Nummer.
- [x] Die Begruendungen, die vorher nur ueber die Nummer erreichbar waren (warum `source_type`
keinen Default hat, warum `raw accept` auf Stem-Eindeutigkeit besteht, warum `raw/` flach
ist), stehen im Text selbst.
- [x] `tools/.coveragerc` und `.gitignore` mitgezogen, obwohl der Check sie nicht erfasst.
- [x] Frischer `dist export` + `grep -rn '#[0-9]'` liefert **null Treffer** - nicht nur in
`.md`/`.template`, sondern im gesamten Export ausserhalb `.py`.
- [x] `docs verify` meldet den Verstoss, wenn eine Nummer wieder in eine ausgelieferte Datei
gelangt; sechs Tests decken beide Richtungen ab.
- [x] `docs verify`, `instructions verify` und `pytest` ohne neue Findings.
- [x] `tools/**/*.py` unveraendert (Entscheidung 1).
## Verifiziert
| Check | Ergebnis |
|---|---|
| `tools/wikitool docs verify` | OK - "no issue references in 63 shipped document(s)" |
| `tools/wikitool instructions verify` | OK - 21 Instructions, 7 Skills, 14 publizierte Kopien deckungsgleich |
| `pytest` (`tools/`) | 1082 passed |
| `dist export` + `grep -rn '#[0-9]'`, `--exclude='*.py'` | 0 Treffer |
| CI-Lauf 210 (`verify`, Nr. 165) | **success** - alle 9 Schritte, inkl. "Export the distribution" und "The distribution works as a fresh instance" (der `setup-instance`-Replay, der einzige Check, der lokal nicht lief) |
| CI-Lauf 211 (`release`, Nr. 166) | **success**, ohne etwas zu veroeffentlichen - neuester Tag/Release bleibt `v4.7.4`. Erwartet: `4.8.0-beta.12` ist ein Kandidat, und `release.yml` handelt nur auf einer suffixfreien `VERSION` |
`docs/`-Veralterung geprueft und **keine** gefunden: `docs/version-model.md`'s Aussage "No check
in `docs verify` or anywhere else confirms that a version part was chosen correctly" bleibt wahr
(der neue Check sagt nichts ueber Versionsteile), und `docs/ownership-and-templates.md`
beschreibt, *wer* eine Datei aendern darf und was ein Upgrade ueberschreiben darf - der Check
schreibt nichts und verschiebt keine Ownership. `docs/pipeline-rationale.md` hat nur die
Klammer verloren, seine Begruendung ist unberuehrt.
## Geaendert
`tools/chemenu/commands/docs_verify.py` (neuer Check plus `shipped_prose()`),
`tools/chemenu/tests/test_docs_verify.py` (sechs Tests: sauberer Baum, praeparierte Datei,
Anker-Nicht-Treffer, `.py` ausserhalb des Scans, Strip-Block unsichtbar, `verify` bricht ab),
`tools/CONTRACT.md` (Kommandotabelle + Fehlerkontrakt-Zeile), `tools/README.md`,
`instructions/dev/issue-tracking.md` (neuer § Citing an issue in the repo; § What no tool checks
zieht die Grenze zwischen "was dieses Repo ueber den Tracker schreibt" und "dem Tracker selbst").
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`.
## Bewusst nicht gemacht
- **`tools/**/*.py`** (~90 Stellen) - Entscheidung 1.
- **Eine Historien-Notation** ("origin-repo issue #67") - der urspruengliche Body liess sie als
Option zu. Verworfen zugunsten von Entscheidung 2: sie haette eine repoweite Notation
gebraucht, die genau eine Definitionsstelle haben darf, waehrend `README.md` und `INSTALL.md`
von Lesern gesehen werden, die `AGENTS.md` nie laden.
- **Eine Ausnahme fuer instanzeigene Dateien.** Der Check liest auch `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 ein Finding. Das ist kein Fehlalarm - ein
Export dieser Instanz wuerde den Verweis weitergeben - aber es ist neu, und es steht so im
`CHANGES.md`-Eintrag.
## Herkunft
Analyse aus #65, Sitzung 2026-09-09, aufgefallen bei der Volltext-Sichtung von `wiki-ingest`.
Per `grep` auf die uebrigen ausgelieferten Instructions ausgeweitet, in der Umsetzungssitzung
auf den vollstaendigen Export gemessen. Verwandte Vorgeschichte in die Gegenrichtung: #29
(Issue-Texte trugen veraltete Pfade nach dem Chemenu-Rename).
Changelog: Zeilennummern in der Befund-Tabelle nachgezogen. 663b1c0 (#79) hat instructions/wiki-ingest/SKILL.md in den Schritten 1 und 6 gekuerzt, die drei dort gelisteten Stellen sind verrutscht:
Datei
alt
neu
instructions/wiki-ingest/SKILL.md
Z. 46
Z. 43
instructions/wiki-ingest/SKILL.md
Z. 93
Z. 91
instructions/wiki-ingest/SKILL.md
Z. 102
Z. 100
Der Wortlaut der dritten Stelle hat sich mitgeaendert: "new source refuses without them the same way (Gitea #67) - but here there is no catalog slot to fall back on, for the reason step 1 gives". Am Befund aendert das nichts, die Nummer steht weiter im ausgelieferten Text.
Die uebrigen vier Dateien der Tabelle (kb-profiles.md, mcp-read-server.md, bootstrap.md, evolve-subtypes.md) wurden nicht angefasst, ihre Zeilennummern stehen.
Sonst unveraendert - Wegweiser/Beleg-Unterscheidung, Akzeptanzkriterien und die offene docs verify-Frage gelten wie beschrieben.
**Changelog:** Zeilennummern in der Befund-Tabelle nachgezogen. `663b1c0` (#79) hat `instructions/wiki-ingest/SKILL.md` in den Schritten 1 und 6 gekuerzt, die drei dort gelisteten Stellen sind verrutscht:
| Datei | alt | neu |
|---|---|---|
| `instructions/wiki-ingest/SKILL.md` | Z. 46 | **Z. 43** |
| `instructions/wiki-ingest/SKILL.md` | Z. 93 | **Z. 91** |
| `instructions/wiki-ingest/SKILL.md` | Z. 102 | **Z. 100** |
Der Wortlaut der dritten Stelle hat sich mitgeaendert: "`new source` refuses without them the same way (Gitea #67) - but here there is no catalog slot to fall back on, **for the reason step 1 gives**". Am Befund aendert das nichts, die Nummer steht weiter im ausgelieferten Text.
Die uebrigen vier Dateien der Tabelle (`kb-profiles.md`, `mcp-read-server.md`, `bootstrap.md`, `evolve-subtypes.md`) wurden nicht angefasst, ihre Zeilennummern stehen.
Sonst unveraendert - Wegweiser/Beleg-Unterscheidung, Akzeptanzkriterien und die offene `docs verify`-Frage gelten wie beschrieben.
Changelog: Body auf den entschiedenen Stand umgeschrieben.
Neu: die drei Entscheidungen der Umsetzungssitzung (Umfang ohne tools/**/*.py, Beleg-Form "Nummer raus, Datierung in Worte" statt Historien-Marker, docs verify-Check mit Ja beantwortet). Der Abschnitt "Offene Frage" faellt damit weg - sie ist beantwortet, nicht mehr offen.
Korrigiert: der Umfang. Die Befund-Tabelle fuehrte 10 Stellen in 5 Dateien; gemessen am tatsaechlichen dist export sind es 43 ausserhalb .py, in 16 Dateien. Die Zeilennummern-Tabelle ist durch eine Datei/Treffer-Tabelle ersetzt - Zeilennummern waren zweimal in zwei Tagen nachzuziehen und sind fuer die Abarbeitung ohnehin kein Fundort, der Grep ist einer.
Gestrichen: der separate Hinweis auf instructions/CONTRACT.md Z. 218 - die Datei steht jetzt regulaer im Umfang. Der Wegweiser/Beleg-Abschnitt bleibt, aber ohne die Auflage "als Historie markiert" (Entscheidung 2 macht sie gegenstandslos).
Akzeptanzkriterien entsprechend neu: Kriterium 4 auf .md/.template eingegrenzt, ein Kriterium fuer den docs verify-Test und eines fuer die Unveraendertheit von tools/**/*.py dazu.
**Changelog:** Body auf den entschiedenen Stand umgeschrieben.
Neu: die drei Entscheidungen der Umsetzungssitzung (Umfang ohne `tools/**/*.py`, Beleg-Form "Nummer raus, Datierung in Worte" statt Historien-Marker, `docs verify`-Check mit Ja beantwortet). Der Abschnitt "Offene Frage" faellt damit weg - sie ist beantwortet, nicht mehr offen.
Korrigiert: der Umfang. Die Befund-Tabelle fuehrte 10 Stellen in 5 Dateien; gemessen am tatsaechlichen `dist export` sind es **43 ausserhalb `.py`, in 16 Dateien**. Die Zeilennummern-Tabelle ist durch eine Datei/Treffer-Tabelle ersetzt - Zeilennummern waren zweimal in zwei Tagen nachzuziehen und sind fuer die Abarbeitung ohnehin kein Fundort, der Grep ist einer.
Gestrichen: der separate Hinweis auf `instructions/CONTRACT.md` Z. 218 - die Datei steht jetzt regulaer im Umfang. Der Wegweiser/Beleg-Abschnitt bleibt, aber ohne die Auflage "als Historie markiert" (Entscheidung 2 macht sie gegenstandslos).
Akzeptanzkriterien entsprechend neu: Kriterium 4 auf `.md`/`.template` eingegrenzt, ein Kriterium fuer den `docs verify`-Test und eines fuer die Unveraendertheit von `tools/**/*.py` dazu.
Changelog: Abschluss-Rewrite. Body steht auf dem Endstand, geschlossen mit a51d7a3 (4.8.0-beta.12).
Neu: die drei Entscheidungen als umgesetzt statt als Vorhaben formuliert, ein Abschnitt "Verifiziert" mit den tatsaechlichen Ergebnissen (CI 210 verify und 211 release, beide gruen), die docs/-Veralterungspruefung mit ihrem Negativbefund, und ein Abschnitt "Bewusst nicht gemacht".
Korrigiert gegenueber dem vorherigen Stand: die CI-Zeile nannte die Laeufe nur als laufend. 210 ist durch, inklusive "The distribution works as a fresh instance" - der setup-instance-Replay war der einzige Check, der lokal nicht lief. 211 (release) lief ebenfalls gruen und hat korrekt nichts veroeffentlicht: neuester Tag/Release bleibt v4.7.4, weil 4.8.0-beta.12 ein Kandidat ist.
Alle sieben Akzeptanzkriterien abgehakt. Kriterium 4 uebererfuellt: der Export ist nicht nur in .md/.template frei von Issue-Nummern, sondern im gesamten Baum ausserhalb .py - .gitignore und tools/.coveragerc wurden von Hand mitgezogen, obwohl der Check sie nicht erfasst.
Nachtragen fuer spaeter, ohne eigenes Issue: 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 ein neues Finding. Steht im Body unter "Bewusst nicht gemacht" und im CHANGES.md-Eintrag.
**Changelog:** Abschluss-Rewrite. Body steht auf dem Endstand, geschlossen mit `a51d7a3` (`4.8.0-beta.12`).
Neu: die drei Entscheidungen als umgesetzt statt als Vorhaben formuliert, ein Abschnitt "Verifiziert" mit den tatsaechlichen Ergebnissen (CI 210 `verify` und 211 `release`, beide gruen), die `docs/`-Veralterungspruefung mit ihrem Negativbefund, und ein Abschnitt "Bewusst nicht gemacht".
Korrigiert gegenueber dem vorherigen Stand: die CI-Zeile nannte die Laeufe nur als laufend. 210 ist durch, inklusive "The distribution works as a fresh instance" - der `setup-instance`-Replay war der einzige Check, der lokal nicht lief. 211 (`release`) lief ebenfalls gruen und hat korrekt **nichts** veroeffentlicht: neuester Tag/Release bleibt `v4.7.4`, weil `4.8.0-beta.12` ein Kandidat ist.
Alle sieben Akzeptanzkriterien abgehakt. Kriterium 4 uebererfuellt: der Export ist nicht nur in `.md`/`.template` frei von Issue-Nummern, sondern im gesamten Baum ausserhalb `.py` - `.gitignore` und `tools/.coveragerc` wurden von Hand mitgezogen, obwohl der Check sie nicht erfasst.
Nachtragen fuer spaeter, ohne eigenes Issue: 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 ein neues Finding. Steht im Body unter "Bewusst nicht gemacht" und im `CHANGES.md`-Eintrag.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Erledigt mit
a51d7a3(4.8.0-beta.12, MINOR).Was das Problem war
tools/wikitool dist exportlieferte Dateien aus, die im Fliesstext auf Issue-Nummern diesesTrackers verwiesen - "flat since Gitea #67", "
new sourcerefuses without it (Gitea #66)". Ineiner verteilten Instanz zeigte das auf nichts: der Leser konnte den Verweis weder aufloesen
noch als unaufloesbar erkennen, und eine Regel sah damit so aus, als stuetze 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 ueberhaupt sagt - wird vondist exportmit dem Rest voninstructions/dev/weggeschnitten.Gegenprobe zum Eigenanspruch aus
instructions/CONTRACT.md§ "Writing an instruction":"self-contained enough for an agent with no prior context". Eine Issue-Nummer ist genau der
Verweis, den ein Agent ohne Vorkontext nicht aufloesen kann.
Umfang, gemessen statt geschaetzt. Export in ein leeres Verzeichnis,
grep -rn '#[0-9]':43 Treffer in 16 Dateien ausserhalb
tools/**/*.py-raw/CONTRACT.mdallein acht. Dieurspruengliche Befund-Tabelle dieses Issues fuehrte zehn Stellen in fuenf Dateien; der Rest kam
erst beim Messen gegen den echten Export zutage. Dazu ~90 Treffer in
.py, die nachEntscheidung 1 nicht in den Umfang fielen.
Entschieden und umgesetzt
1. Umfang: nur Doku-Prosa,
tools/**/*.pyblieb unberuehrt.Adressat eines Code-Kommentars ist, wer die Zeile editiert - und das passiert ausschliesslich im
Ursprungs-Repo, weil
dist exportinstructions/dev/samtstack-dev-Skill wegschneidet. DieFrontload-Regel, aus der der Befund stammt, bindet Instructions, nicht Quelltext; eine
ausgelieferte
tools/-Kopie ist Laufzeit-Maschinerie, keine Lektuere. Akzeptanzkriterium 4wurde entsprechend auf Doku-Pfade eingegrenzt statt woertlich ueber den ganzen Export gelesen.
2. Beleg-Form: Nummer raus, Datierung in Worte - statt der im urspruenglichen Body
vorgeschlagenen Historien-Markierung.
Aus "flat since Gitea #67" wurde "flat since the addressing scheme dropped type directories",
aus "Pre-#67 files are not moved" wurde "Files promoted under the old type directories are
not moved". Der Satz traegt sich damit selbst: keine repoweite Notation, die definiert und an
genau einer Stelle gehalten werden muesste (Invariante 8), und kein
README.md-Leser mussAGENTS.mdgeladen haben, um sie aufzuloesen. Rueckverfolgbar bleibt es hier uebergit blame-> Commit-Message; die tragen die Nummern ohnehin.
Zwei Stellen, an denen der Zeiger der ganze Wert des Satzes war und in Worten nichts uebrig
geblieben waere, stehen jetzt in einem
<!-- dist:strip-start/end -->-Block:instructions/CONTRACT.md(was ein Test der Kontextfenster-Behauptung kosten wuerde, #72) undEVALS.md(Schliessen der Coverage-Luecken, #51). Bestehende Konvention ausinstructions/CONTRACT.md§instructions/dev/, hier zum zweiten Mal angewandt statt neuerfunden.
3. Die offene
docs verify-Frage: mit Ja beantwortet.check_no_issue_referencesliest nicht den Arbeitsbaum, sondern den Text, dendist_cmd.build_plan()schreiben wuerde - dort lebenROOT_FILES, derinstructions/dev/-Ausschluss und das.template-Rekeying schon, und der Text hat seineMarker-Bloecke bereits verloren. Ein Strip-Block ist damit automatisch exemptiert, ohne dass der
Check ihn kennen muesste.
Der Einwand aus § "What no tool checks" -
wikitoolsoll den Tracker nicht kennen - traegtnicht, und der Abschnitt zieht die Grenze jetzt selbst:
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 ueber den gesamten Export, weil
Markdown-Anker aus Wortzeichen bestehen (
](#gates)matcht nicht).Der erste Fund des Checks war prompt der Satz, den diese Sitzung selbst in
tools/CONTRACT.mdgeschrieben hatte, um die Regel zu erklaeren (ein illustratives "#42").
Akzeptanzkriterien
dist exportausgelieferte.md/.template-Datei enthaelt einen Verweis aufeine Gitea-Issue-Nummer.
source_typekeinen Default hat, warum
raw acceptauf Stem-Eindeutigkeit besteht, warumraw/flachist), stehen im Text selbst.
tools/.coveragercund.gitignoremitgezogen, obwohl der Check sie nicht erfasst.dist export+grep -rn '#[0-9]'liefert null Treffer - nicht nur in.md/.template, sondern im gesamten Export ausserhalb.py.docs verifymeldet den Verstoss, wenn eine Nummer wieder in eine ausgelieferte Dateigelangt; sechs Tests decken beide Richtungen ab.
docs verify,instructions verifyundpytestohne neue Findings.tools/**/*.pyunveraendert (Entscheidung 1).Verifiziert
tools/wikitool docs verifytools/wikitool instructions verifypytest(tools/)dist export+grep -rn '#[0-9]',--exclude='*.py'verify, Nr. 165)setup-instance-Replay, der einzige Check, der lokal nicht lief)release, Nr. 166)v4.7.4. Erwartet:4.8.0-beta.12ist ein Kandidat, undrelease.ymlhandelt nur auf einer suffixfreienVERSIONdocs/-Veralterung geprueft und keine gefunden:docs/version-model.md's Aussage "No checkin
docs verifyor anywhere else confirms that a version part was chosen correctly" bleibt wahr(der neue Check sagt nichts ueber Versionsteile), und
docs/ownership-and-templates.mdbeschreibt, wer eine Datei aendern darf und was ein Upgrade ueberschreiben darf - der Check
schreibt nichts und verschiebt keine Ownership.
docs/pipeline-rationale.mdhat nur dieKlammer verloren, seine Begruendung ist unberuehrt.
Geaendert
tools/chemenu/commands/docs_verify.py(neuer Check plusshipped_prose()),tools/chemenu/tests/test_docs_verify.py(sechs Tests: sauberer Baum, praeparierte Datei,Anker-Nicht-Treffer,
.pyausserhalb des Scans, Strip-Block unsichtbar,verifybricht ab),tools/CONTRACT.md(Kommandotabelle + Fehlerkontrakt-Zeile),tools/README.md,instructions/dev/issue-tracking.md(neuer § Citing an issue in the repo; § What no tool checkszieht die Grenze zwischen "was dieses Repo ueber den Tracker schreibt" und "dem Tracker selbst").
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.Bewusst nicht gemacht
tools/**/*.py(~90 Stellen) - Entscheidung 1.Option zu. Verworfen zugunsten von Entscheidung 2: sie haette eine repoweite Notation
gebraucht, die genau eine Definitionsstelle haben darf, waehrend
README.mdundINSTALL.mdvon Lesern gesehen werden, die
AGENTS.mdnie laden.kb/CONVENTIONS.mdundkb/<collection>/COLLECTION.md, weil ein Export sie als.templatemitnimmt. Eine Instanz,die dort ihre eigene Ticket-Nummer zitiert, bekommt ein Finding. Das ist kein Fehlalarm - ein
Export dieser Instanz wuerde den Verweis weitergeben - aber es ist neu, und es steht so im
CHANGES.md-Eintrag.Herkunft
Analyse aus #65, Sitzung 2026-09-09, aufgefallen bei der Volltext-Sichtung von
wiki-ingest.Per
grepauf die uebrigen ausgelieferten Instructions ausgeweitet, in der Umsetzungssitzungauf den vollstaendigen Export gemessen. Verwandte Vorgeschichte in die Gegenrichtung: #29
(Issue-Texte trugen veraltete Pfade nach dem Chemenu-Rename).
Changelog: Zeilennummern in der Befund-Tabelle nachgezogen.
663b1c0(#79) hatinstructions/wiki-ingest/SKILL.mdin den Schritten 1 und 6 gekuerzt, die drei dort gelisteten Stellen sind verrutscht:instructions/wiki-ingest/SKILL.mdinstructions/wiki-ingest/SKILL.mdinstructions/wiki-ingest/SKILL.mdDer Wortlaut der dritten Stelle hat sich mitgeaendert: "
new sourcerefuses without them the same way (Gitea #67) - but here there is no catalog slot to fall back on, for the reason step 1 gives". Am Befund aendert das nichts, die Nummer steht weiter im ausgelieferten Text.Die uebrigen vier Dateien der Tabelle (
kb-profiles.md,mcp-read-server.md,bootstrap.md,evolve-subtypes.md) wurden nicht angefasst, ihre Zeilennummern stehen.Sonst unveraendert - Wegweiser/Beleg-Unterscheidung, Akzeptanzkriterien und die offene
docs verify-Frage gelten wie beschrieben.Changelog: Body auf den entschiedenen Stand umgeschrieben.
Neu: die drei Entscheidungen der Umsetzungssitzung (Umfang ohne
tools/**/*.py, Beleg-Form "Nummer raus, Datierung in Worte" statt Historien-Marker,docs verify-Check mit Ja beantwortet). Der Abschnitt "Offene Frage" faellt damit weg - sie ist beantwortet, nicht mehr offen.Korrigiert: der Umfang. Die Befund-Tabelle fuehrte 10 Stellen in 5 Dateien; gemessen am tatsaechlichen
dist exportsind es 43 ausserhalb.py, in 16 Dateien. Die Zeilennummern-Tabelle ist durch eine Datei/Treffer-Tabelle ersetzt - Zeilennummern waren zweimal in zwei Tagen nachzuziehen und sind fuer die Abarbeitung ohnehin kein Fundort, der Grep ist einer.Gestrichen: der separate Hinweis auf
instructions/CONTRACT.mdZ. 218 - die Datei steht jetzt regulaer im Umfang. Der Wegweiser/Beleg-Abschnitt bleibt, aber ohne die Auflage "als Historie markiert" (Entscheidung 2 macht sie gegenstandslos).Akzeptanzkriterien entsprechend neu: Kriterium 4 auf
.md/.templateeingegrenzt, ein Kriterium fuer dendocs verify-Test und eines fuer die Unveraendertheit vontools/**/*.pydazu.Changelog: Abschluss-Rewrite. Body steht auf dem Endstand, geschlossen mit
a51d7a3(4.8.0-beta.12).Neu: die drei Entscheidungen als umgesetzt statt als Vorhaben formuliert, ein Abschnitt "Verifiziert" mit den tatsaechlichen Ergebnissen (CI 210
verifyund 211release, beide gruen), diedocs/-Veralterungspruefung mit ihrem Negativbefund, und ein Abschnitt "Bewusst nicht gemacht".Korrigiert gegenueber dem vorherigen Stand: die CI-Zeile nannte die Laeufe nur als laufend. 210 ist durch, inklusive "The distribution works as a fresh instance" - der
setup-instance-Replay war der einzige Check, der lokal nicht lief. 211 (release) lief ebenfalls gruen und hat korrekt nichts veroeffentlicht: neuester Tag/Release bleibtv4.7.4, weil4.8.0-beta.12ein Kandidat ist.Alle sieben Akzeptanzkriterien abgehakt. Kriterium 4 uebererfuellt: der Export ist nicht nur in
.md/.templatefrei von Issue-Nummern, sondern im gesamten Baum ausserhalb.py-.gitignoreundtools/.coveragercwurden von Hand mitgezogen, obwohl der Check sie nicht erfasst.Nachtragen fuer spaeter, ohne eigenes Issue: der Check liest auch die instanzeigenen
kb/CONVENTIONS.mdundkb/<collection>/COLLECTION.md, weil ein Export sie als.templatemitnimmt. Eine Instanz, die dort ihre eigene Ticket-Nummer zitiert, bekommt ein neues Finding. Steht im Body unter "Bewusst nicht gemacht" und imCHANGES.md-Eintrag.