wikitool lint hatte keinen Befund für eine Seite ohne Inhalt. Keiner der Report-Abschnitte in tools/chemenu/lint_core.py maß Substanz - geprüft wurden Struktur, Verlinkung, Provenance, Schema, Zitate. Eine Seite, die nur ihr Template-Gerüst und eine Zeile trägt, war damit mechanisch nicht von einer vollständigen zu unterscheiden. Seit 8.0.0-beta.37 meldet lint eine solche Seite als Unfilled Template Sections.
Ergebnis
Erledigt (2026-10-04). Alle Akzeptanzkriterien erfüllt.
8.0.0-beta.37, Commit a2a6baa - der Befund selbst; CI-Runs 533 und 534 grün.
8.0.0-beta.38, Commit 20a7624 - Nachzug aus der Abschlussphase: kb/CONTRACT.md § Every page should nennt die Seiteneigenschaft und den Befund; CI-Runs 535 und 536 grün.
Verifiziert: Demo-Korpus genau die 34 Seiten aus #175 und keine weitere; Produktivinstanz 0 Seiten; lokal 2211 Tests bestanden (auch hermetisch), docs verify und instructions verify grün, dazu die vier CI-Runs.
Warum das zählte
Der Schaden ist nicht die einzelne dünne Seite, sondern was sie mit späteren Sitzungen macht: sie steht im Katalog, search findet sie, und die nächste Sitzung liest den Gegenstand als abgedeckt und schaut nicht mehr in die Quelle. Das ist teurer als eine fehlende Seite, weil eine fehlende Seite sichtbar fehlt.
Die Verursacherseite ist mit dem Breiten-Auslöser adressiert (instructions/ingest-large-tree.md § A broad source is not cut, wiki-ingest Schritt 7). Dieses Paket liefert die Beobachtungsseite.
Messung (2026-10-04, ersetzt die vom 2026-09-11)
Die erste Messung (2026-09-11: „14 von 30 Subjektseiten aus Source - LLM Wiki v2 unter 150 Wörtern“) hat die 14 Seiten nicht namentlich festgehalten und keine Zählmethode genannt; sie ist nicht reproduzierbar. Neu gemessen an zwei Korpora: dem Demo-Korpus dieses Repos (185 Seiten) und einer privaten Produktivinstanz (225 Seiten, Stack 7.0.0; Titel hier bewusst nicht genannt). Wörter = Fließtext ohne Überschriften, Code, generierte Regionen, Fußnotendefinitionen und ohne Platzhalterzeilen. Platzhalter = TODO-Zeile aus dem Gerüst von wikitool new (Definition unter Entwurf).
Demo-Korpus:
34 Seiten tragen Platzhalter (Liste in #175). Alle 34 sind echte Stubs: höchstens 45 Wörter, und jede hat mindestens zwei ##-Abschnitte, die nur aus Platzhaltern bestehen (33 davon vier oder mehr).
Kürzeste Seite ohne Platzhalter: 105 Wörter (iii Engine), dann ha-core 108, Source - Docker Cheatsheet 126, Rohit Gupta 127 - knapp, aber vollständig.
Produktivinstanz:
Kein einziger Stub. 12 Seiten tragen Platzhalter, aber auf allen zwölf sind es Feldreste in ## Kerndaten neben gefüllten Feldern - **Version:** TODO (nicht erfasst), **Repository:** TODO (falls zutreffend) -, auf Seiten mit 39 bis 443 Wörtern. Kein Abschnitt besteht nur aus Platzhaltern.
Die kürzesten Seiten ohne Platzhalter haben 45, 47, 57, 58 Wörter - und sind vollständig: die Quelle (ein Interview) sagt nicht mehr, und die Seite sagt das ausdrücklich („Weitere Angaben macht die Quelle nicht.“). Das ist genau das Verhalten, das wiki-ingest/wiki-manage verlangen.
Ein TODO steht zusätzlich in Inline-Code auf einer Source-Seite (ein zitierter Konfigurationswert) - kein Platzhalter.
Was daraus folgte:
Wortzahl trennt nicht. Die Demo-Stubs reichen bis 45 Wörter, legitime Produktivseiten beginnen bei 39/45. Es gibt keine Schwelle, die beide Korpora richtig behandelt.
„Seite trägt einen Platzhalter“ trennt auch nicht. Im Demo-Korpus trifft es genau die Stubs, in der Produktivinstanz zwölf vollständige Seiten mit einem offenen Kerndaten-Feld.
„Ein ##-Abschnitt besteht nur aus Platzhaltern“ trennt in beiden Korpora vollständig: 34/34 Stubs im Demo-Korpus, 0 Fehltreffer in der Produktivinstanz. Das ist zugleich der eigentliche Defekt: ein Abschnitt, den das Gerüst vorgab und niemand geschrieben hat. Der gebaute Befund bestätigt beide Zahlen (Kriterien 1 und 3).
Entscheidungen
Metrik: Abschnitte, die nur aus Platzhaltern bestehen. Entschieden durch die Messung an zwei Korpora (oben). Verworfen, mit Grund:
Wortzahl: überlappt zwischen Stubs und legitimen kurzen Seiten (45 vs. 39/45).
Platzhalter je Seite: trifft vollständige Seiten mit einem offenen Kerndaten-Feld.
Zitatzahl: misst Provenance, nicht Substanz - provenance: general-Seiten tragen legitim keine Zitate.
„Behauptet mehr als die Summary“: nicht mechanisch entscheidbar.
Leere Abschnitte (Überschrift ohne jeden Inhalt): Rohit Gupta trägt zwei leere Altüberschriften und ist trotzdem vollständig.
Was der Befund nicht fängt: einen Abschnitt, dessen Platzhalter gelöscht statt gefüllt wurden. Das ist ein Autorenverstoß, kein Gerüstrest, und bleibt beim semantischen Teil von wiki-lint.
Feldreste werden nicht gemeldet. Entschieden (Operator, 2026-10-04). Ein TODO auf einer Feldzeile neben gefüllten Feldern (**Version:** TODO (nicht erfasst)) ist nicht der Defekt dieses Issues - eine 443-Wörter-Seite, der eine Versionsnummer fehlt, liest keine Sitzung fälschlich als abgedeckt -, und TODO (nicht erfasst) ist dort eine bewusste, ehrliche Lückenmarke. Ein Befund darauf würde eine Sitzung drängen, die Marke zu löschen oder einen Wert zu erfinden. Ein zweiter, eigener Befund „Template-Feldreste“ wurde damit ebenfalls verworfen.
Härte: beratend. Wie broken_anchors: der Befund kommt nach Korpora, die ihn schon tragen - hier 34 Seiten -, und ein harter Befund würde lint --fail-on-error jeder solchen Instanz mit genau dem Upgrade rot machen, das ihn einführt. Migrations-Gating entfällt: keine Migration kann eine Seite mechanisch füllen.
Die 34 bestehenden Demo-Stubs: eigenes Korpus-Issue #175, nicht Teil dieses Pakets. 34 Seiten sind nach instructions/dev/corpus-policy.md § What a reactive fix may do eine korpusweite Änderung (Stufe 2: eigenes Issue, work/-Lauf). Ob eine Seite ausgebaut, zusammengelegt oder zurückgezogen wird, entscheidet #175; der neue Befund ist seine Arbeitsliste. Dieses Paket hat keine Seite in kb/ angefasst.
Produktivinstanz ohne Release gemessen. Entschieden (Operator, 2026-10-04): statt auf das 8.0.0-Release zu warten, ruft der Operator lint_core.unfilled_section_pages() aus dem Dev-Checkout über das kb/ der Instanz auf - nur lesend, Ausgabe nur die Anzahl. Zulässig, weil die Prüfung allein am Seitentext hängt, nicht an Stack-Version oder kb_version.
Entwurf (so gebaut)
Platzhalterzeile, definiert: eine Zeile im Seitenkörper, deren Inhalt - nach optionalem Listenmarker (-, *, +, 1.), optionaler Task-Checkbox ([ ]/[x]), optionaler Tabellenzelle (|) und optionalem fettem Label (**Zweck:**) - mit dem Token TODO beginnt, auf das Zeilenende, Leerraum, : , (, ) oder | folgt (nicht ., -, / oder ein Wortzeichen). Vorher ausgeblendet: Code (Fences und Inline-Spans, strip_code_spans), generierte Regionen (<!-- wikitool:... -->, über das neue blocks.mask_regions(), das Offsets und Zeilen erhält), Fußnotendefinitionen (CITE_DEF_RE). Ausgeblendete Regionen und Definitionen zählen als nicht vorhanden; eine Code-Zeile zählt als geschriebener Inhalt. TODO.md, TODO Retirement in einem Wikilink oder TODO mitten im Satz sind keine Platzhalter.
Abweichung vom Design-Stand, im Build entschieden: die Task-Checkbox kam hinzu, weil types/source.md seine Platzhalter so schreibt (- [ ] TODO: Aufgabe 1). Auf dem Demo-Korpus ändert das nur die gemeldeten Abschnitte einer Seite (Aufgaben auf Source - LLM Improvements Production Agent Gaps 2026), nicht die Seitenliste; auf der Produktivinstanz bleibt es bei 0.
Unbeschriebener Abschnitt, definiert: ein ##-Abschnitt (nicht ###; der Abschnitt reicht bis zur nächsten ##-Überschrift), der mindestens eine nicht-leere Zeile hat und dessen nicht-leere Zeilen alle Platzhalterzeilen sind. Eine ###-Überschrift ist eine Nicht-Platzhalterzeile; ein Abschnitt ganz ohne Inhalt zählt nicht; Text vor der ersten ##-Überschrift gehört zu keinem Abschnitt. Eine einzelne Platzhalterzeile neben gefüllten Zeilen macht einen Abschnitt nicht unbeschrieben (Entscheidung 2).
Report-Schlüsselunfilled_sections (lint_core.unfilled_section_pages(), je Seite lint_core.unfilled_sections(body)): ein Eintrag je Seite mit mindestens einem solchen Abschnitt, {"page", "sections": [<Überschriften in Seitenreihenfolge>]}, sortiert nach Titel. Nicht in HARD_ERROR_KEYS, nicht in MIGRATION_GATED_KEYS; Begründung als Kommentarabsatz im Block über HARD_ERROR_KEYS.
Report-Abschnitt „Unfilled Template Sections - advisory, not an error“, Zeile: [[X]] - only template placeholders under: <Abschnitt>, <Abschnitt> - write them from the page's sources (wiki-manage) or retire the page (page-lifecycle).
Scorecard:unfilled_sections in ADVISORY_KEYS (tools/chemenu/evals/scorecard.py).
Der Token ist Vertrag.types/type-spec.md § Template variables sagt: Platzhaltertext in einem Template - Block oder Subtyp-Datei, instanzeigene eingeschlossen - beginnt mit TODO, und lint meldet einen Abschnitt, der auf einer Seite nur noch daraus besteht.
Seiteneigenschaft im Stage-Vertrag.kb/CONTRACT.md § Every page should: keine Gerüst-Sektion bleibt ungeschrieben; Befund, Abhilfe (aus einer Quelle schreiben oder per page-lifecycle zurückziehen) und die Ausnahme für ein Feld, das die Quelle nicht hergibt. Erst in der Abschlussphase nachgezogen - der Stage-Vertrag stellt jede geprüfte Seiteneigenschaft neben ihren Befund, und die Doku-Durchsicht vor dem ersten Publish hatte ihn ausgelassen.
wiki-lint: Schritt 1 nennt den Befund und schließt ihn ausdrücklich aus Schritt 7 aus (Füllen ist Autorenarbeit aus einer Quelle, Zurückziehen ist page-lifecycle; Meldung in Schritt 9). wiki-manage Schritt 5 erwähnt den Befund beim Füllen des Gerüsts; EVALS.md (L0) nennt ihn neben den Platzhalter-Links als erwartetes Signal einer ungeschriebenen Seite.
Geprüft und unverändert gelassen: kein docs/-Text begründet etwas über Lint-Befunde; README.md, tools/README.md, INSTALL.md und DEVELOPMENT.md zählen keine Befunde auf.
Akzeptanzkriterien
lint --json enthält unfilled_sections; auf dem Demo-Korpus nennt er genau die 34 Seiten aus #175 und keine weitere (lokal gemessen vor dem Publish, 2026-10-04).
Er nennt nichtiii Engine, ha-core, Source - Docker Cheatsheet, Rohit Gupta, Chemenu, Issue Label Scheme oder wikitool (selbe Messung).
Auf der Produktivinstanz meldet er keine Seite: 0 (Operator-Lauf 2026-10-04 aus dem Dev-Checkout auf Stand 20a7624, Entscheidung 5).
lint --fail-on-error bleibt mit diesem Befund allein bei Exit 0; "unfilled_sections" not in HARD_ERROR_KEYS (test_unfilled_sections_alone_keep_lint_green).
eval score zählt ihn unter advisories (test_evals.py::test_unfilled_sections_are_counted_as_an_advisory).
Tests in tools/chemenu/tests/test_lint.py decken beide Richtungen ab: frisch mit dem Concept-Template gerüstete Seite gemeldet, mit den Namen der unbeschriebenen Abschnitte (Template aus dem ausgelieferten Type-Spec gerendert, zusätzlich durch das echte wikitool new in test_pipeline_l0.py); dieselbe Seite gefüllt nicht gemeldet; Feldliste mit - **Version:** TODO (nicht erfasst) nicht gemeldet; kurze vollständige Seite nicht gemeldet; Abschnitt ganz ohne Inhalt nicht gemeldet; TODO in Inline-Code, Fence, Wikilink-Titel, Fließtext, TODO.md und generierter Region kein Platzhalter; Listen-, Checkbox-, Label- und Tabellenform sind Platzhalter. blocks.mask_regions hat einen eigenen Test in test_blocks.py. Lokal 2211 bestanden, CI-Runs 533/534 grün.
lint-Record in tools/chemenu/commands/lint.py hat eine Note „Advisory only: Unfilled Template Sections …“; tools/CONTRACT.md per wikitool docs contract --apply neu erzeugt; docs verify grün.
types/type-spec.md nennt TODO als Platzhalter-Token und den Lint-Befund; instructions/wiki-lint/SKILL.md Schritt 1 nennt den Befund und schließt ihn aus Schritt 7 aus; instructions verify grün.
Korpus-Issue für die 34 Demo-Stubs ist angelegt: #175.
Version
--minor, umgesetzt als 8.0.0-beta.37: neuer beratender Befund, ein zusätzlicher Schlüssel in lint --json/MCP-lint, nichts entfernt oder umbenannt, --fail-on-error unverändert. Drop-in in beide Richtungen (version-parts.md Schritt 1); der Kandidat stand bereits auf 8.0.0-beta.N, die Eskalation war damit ein No-op. Der Nachzug in kb/CONTRACT.md kam als --patch (8.0.0-beta.38), weil CIs Version-Gate jeden Commit in einen CONTRACT.md verlangt.
Berührte Dateien
tools/chemenu/lint_core.py (unfilled_sections, unfilled_section_pages, run_lint, render_markdown, Kommentar über HARD_ERROR_KEYS), tools/chemenu/blocks.py (mask_regions), tools/chemenu/commands/lint.py (Note im Record), tools/chemenu/evals/scorecard.py (ADVISORY_KEYS), tools/chemenu/tests/test_lint.py, test_blocks.py, test_evals.py, test_pipeline_l0.py, tools/CONTRACT.md (generiert), types/type-spec.md, kb/CONTRACT.md, instructions/wiki-lint/SKILL.md, instructions/wiki-manage/SKILL.md, EVALS.md, CHANGES.md und VERSION (über version bump).
`wikitool lint` hatte keinen Befund für eine Seite ohne Inhalt. Keiner der Report-Abschnitte in `tools/chemenu/lint_core.py` maß Substanz - geprüft wurden Struktur, Verlinkung, Provenance, Schema, Zitate. Eine Seite, die nur ihr Template-Gerüst und eine Zeile trägt, war damit mechanisch nicht von einer vollständigen zu unterscheiden. Seit 8.0.0-beta.37 meldet `lint` eine solche Seite als *Unfilled Template Sections*.
## Ergebnis
**Erledigt** (2026-10-04). Alle Akzeptanzkriterien erfüllt.
- 8.0.0-beta.37, Commit `a2a6baa` - der Befund selbst; CI-Runs [533](https://gitea.nehmer.net/torben/chemenu/actions/runs/533) und [534](https://gitea.nehmer.net/torben/chemenu/actions/runs/534) grün.
- 8.0.0-beta.38, Commit `20a7624` - Nachzug aus der Abschlussphase: `kb/CONTRACT.md` § Every page should nennt die Seiteneigenschaft und den Befund; CI-Runs [535](https://gitea.nehmer.net/torben/chemenu/actions/runs/535) und [536](https://gitea.nehmer.net/torben/chemenu/actions/runs/536) grün.
- Verifiziert: Demo-Korpus genau die 34 Seiten aus #175 und keine weitere; Produktivinstanz 0 Seiten; lokal 2211 Tests bestanden (auch hermetisch), `docs verify` und `instructions verify` grün, dazu die vier CI-Runs.
## Warum das zählte
Der Schaden ist nicht die einzelne dünne Seite, sondern was sie mit späteren Sitzungen macht: sie steht im Katalog, `search` findet sie, und die nächste Sitzung liest den Gegenstand als abgedeckt und schaut nicht mehr in die Quelle. Das ist teurer als eine fehlende Seite, weil eine fehlende Seite sichtbar fehlt.
Die Verursacherseite ist mit dem Breiten-Auslöser adressiert (`instructions/ingest-large-tree.md` § A broad source is not cut, `wiki-ingest` Schritt 7). Dieses Paket liefert die Beobachtungsseite.
## Messung (2026-10-04, ersetzt die vom 2026-09-11)
Die erste Messung (2026-09-11: „14 von 30 Subjektseiten aus `Source - LLM Wiki v2` unter 150 Wörtern“) hat die 14 Seiten nicht namentlich festgehalten und keine Zählmethode genannt; sie ist nicht reproduzierbar. Neu gemessen an **zwei Korpora**: dem Demo-Korpus dieses Repos (185 Seiten) und einer privaten Produktivinstanz (225 Seiten, Stack 7.0.0; Titel hier bewusst nicht genannt). Wörter = Fließtext ohne Überschriften, Code, generierte Regionen, Fußnotendefinitionen und ohne Platzhalterzeilen. Platzhalter = `TODO`-Zeile aus dem Gerüst von `wikitool new` (Definition unter Entwurf).
**Demo-Korpus:**
- 34 Seiten tragen Platzhalter (Liste in #175). Alle 34 sind echte Stubs: höchstens 45 Wörter, und **jede hat mindestens zwei `##`-Abschnitte, die nur aus Platzhaltern bestehen** (33 davon vier oder mehr).
- Kürzeste Seite ohne Platzhalter: 105 Wörter (`iii Engine`), dann `ha-core` 108, `Source - Docker Cheatsheet` 126, `Rohit Gupta` 127 - knapp, aber vollständig.
**Produktivinstanz:**
- **Kein einziger Stub.** 12 Seiten tragen Platzhalter, aber auf allen zwölf sind es Feldreste in `## Kerndaten` neben gefüllten Feldern - `**Version:** TODO (nicht erfasst)`, `**Repository:** TODO (falls zutreffend)` -, auf Seiten mit 39 bis 443 Wörtern. **Kein Abschnitt besteht nur aus Platzhaltern.**
- Die kürzesten Seiten ohne Platzhalter haben 45, 47, 57, 58 Wörter - und sind vollständig: die Quelle (ein Interview) sagt nicht mehr, und die Seite sagt das ausdrücklich („Weitere Angaben macht die Quelle nicht.“). Das ist genau das Verhalten, das `wiki-ingest`/`wiki-manage` verlangen.
- Ein `TODO` steht zusätzlich in Inline-Code auf einer Source-Seite (ein zitierter Konfigurationswert) - kein Platzhalter.
**Was daraus folgte:**
- **Wortzahl trennt nicht.** Die Demo-Stubs reichen bis 45 Wörter, legitime Produktivseiten beginnen bei 39/45. Es gibt keine Schwelle, die beide Korpora richtig behandelt.
- **„Seite trägt einen Platzhalter“ trennt auch nicht.** Im Demo-Korpus trifft es genau die Stubs, in der Produktivinstanz zwölf vollständige Seiten mit einem offenen Kerndaten-Feld.
- **„Ein `##`-Abschnitt besteht nur aus Platzhaltern“ trennt in beiden Korpora vollständig:** 34/34 Stubs im Demo-Korpus, 0 Fehltreffer in der Produktivinstanz. Das ist zugleich der eigentliche Defekt: ein Abschnitt, den das Gerüst vorgab und niemand geschrieben hat. Der gebaute Befund bestätigt beide Zahlen (Kriterien 1 und 3).
## Entscheidungen
1. **Metrik: Abschnitte, die nur aus Platzhaltern bestehen.** Entschieden durch die Messung an zwei Korpora (oben). Verworfen, mit Grund:
- Wortzahl: überlappt zwischen Stubs und legitimen kurzen Seiten (45 vs. 39/45).
- Platzhalter je Seite: trifft vollständige Seiten mit einem offenen Kerndaten-Feld.
- Zitatzahl: misst Provenance, nicht Substanz - `provenance: general`-Seiten tragen legitim keine Zitate.
- „Behauptet mehr als die Summary“: nicht mechanisch entscheidbar.
- Leere Abschnitte (Überschrift ohne jeden Inhalt): `Rohit Gupta` trägt zwei leere Altüberschriften und ist trotzdem vollständig.
- Was der Befund nicht fängt: einen Abschnitt, dessen Platzhalter gelöscht statt gefüllt wurden. Das ist ein Autorenverstoß, kein Gerüstrest, und bleibt beim semantischen Teil von `wiki-lint`.
2. **Feldreste werden nicht gemeldet.** Entschieden (Operator, 2026-10-04). Ein `TODO` auf einer Feldzeile neben gefüllten Feldern (`**Version:** TODO (nicht erfasst)`) ist nicht der Defekt dieses Issues - eine 443-Wörter-Seite, der eine Versionsnummer fehlt, liest keine Sitzung fälschlich als abgedeckt -, und `TODO (nicht erfasst)` ist dort eine bewusste, ehrliche Lückenmarke. Ein Befund darauf würde eine Sitzung drängen, die Marke zu löschen oder einen Wert zu erfinden. Ein zweiter, eigener Befund „Template-Feldreste“ wurde damit ebenfalls verworfen.
3. **Härte: beratend.** Wie `broken_anchors`: der Befund kommt nach Korpora, die ihn schon tragen - hier 34 Seiten -, und ein harter Befund würde `lint --fail-on-error` jeder solchen Instanz mit genau dem Upgrade rot machen, das ihn einführt. Migrations-Gating entfällt: keine Migration kann eine Seite mechanisch füllen.
4. **Die 34 bestehenden Demo-Stubs: eigenes Korpus-Issue #175, nicht Teil dieses Pakets.** 34 Seiten sind nach `instructions/dev/corpus-policy.md` § What a reactive fix may do eine korpusweite Änderung (Stufe 2: eigenes Issue, `work/`-Lauf). Ob eine Seite ausgebaut, zusammengelegt oder zurückgezogen wird, entscheidet #175; der neue Befund ist seine Arbeitsliste. Dieses Paket hat keine Seite in `kb/` angefasst.
5. **Produktivinstanz ohne Release gemessen.** Entschieden (Operator, 2026-10-04): statt auf das 8.0.0-Release zu warten, ruft der Operator `lint_core.unfilled_section_pages()` aus dem Dev-Checkout über das `kb/` der Instanz auf - nur lesend, Ausgabe nur die Anzahl. Zulässig, weil die Prüfung allein am Seitentext hängt, nicht an Stack-Version oder `kb_version`.
## Entwurf (so gebaut)
- **Platzhalterzeile, definiert:** eine Zeile im Seitenkörper, deren Inhalt - nach optionalem Listenmarker (`-`, `*`, `+`, `1.`), optionaler Task-Checkbox (`[ ]`/`[x]`), optionaler Tabellenzelle (`|`) und optionalem fettem Label (`**Zweck:**`) - mit dem Token `TODO` beginnt, auf das Zeilenende, Leerraum, `:` , `(`, `)` oder `|` folgt (nicht `.`, `-`, `/` oder ein Wortzeichen). Vorher ausgeblendet: Code (Fences und Inline-Spans, `strip_code_spans`), generierte Regionen (`<!-- wikitool:... -->`, über das neue `blocks.mask_regions()`, das Offsets und Zeilen erhält), Fußnotendefinitionen (`CITE_DEF_RE`). Ausgeblendete Regionen und Definitionen zählen als nicht vorhanden; eine Code-Zeile zählt als geschriebener Inhalt. `TODO.md`, `TODO Retirement` in einem Wikilink oder `TODO` mitten im Satz sind keine Platzhalter.
- *Abweichung vom Design-Stand, im Build entschieden:* die Task-Checkbox kam hinzu, weil `types/source.md` seine Platzhalter so schreibt (`- [ ] TODO: Aufgabe 1`). Auf dem Demo-Korpus ändert das nur die gemeldeten Abschnitte einer Seite (`Aufgaben` auf `Source - LLM Improvements Production Agent Gaps 2026`), nicht die Seitenliste; auf der Produktivinstanz bleibt es bei 0.
- **Unbeschriebener Abschnitt, definiert:** ein `##`-Abschnitt (nicht `###`; der Abschnitt reicht bis zur nächsten `##`-Überschrift), der mindestens eine nicht-leere Zeile hat und dessen nicht-leere Zeilen **alle** Platzhalterzeilen sind. Eine `###`-Überschrift ist eine Nicht-Platzhalterzeile; ein Abschnitt ganz ohne Inhalt zählt nicht; Text vor der ersten `##`-Überschrift gehört zu keinem Abschnitt. Eine einzelne Platzhalterzeile neben gefüllten Zeilen macht einen Abschnitt nicht unbeschrieben (Entscheidung 2).
- **Report-Schlüssel** `unfilled_sections` (`lint_core.unfilled_section_pages()`, je Seite `lint_core.unfilled_sections(body)`): ein Eintrag je Seite mit mindestens einem solchen Abschnitt, `{"page", "sections": [<Überschriften in Seitenreihenfolge>]}`, sortiert nach Titel. Nicht in `HARD_ERROR_KEYS`, nicht in `MIGRATION_GATED_KEYS`; Begründung als Kommentarabsatz im Block über `HARD_ERROR_KEYS`.
- **Report-Abschnitt** „Unfilled Template Sections - advisory, not an error“, Zeile: `[[X]] - only template placeholders under: <Abschnitt>, <Abschnitt> - write them from the page's sources (wiki-manage) or retire the page (page-lifecycle)`.
- **Scorecard:** `unfilled_sections` in `ADVISORY_KEYS` (`tools/chemenu/evals/scorecard.py`).
- **Der Token ist Vertrag.** `types/type-spec.md` § Template variables sagt: Platzhaltertext in einem Template - Block oder Subtyp-Datei, instanzeigene eingeschlossen - beginnt mit `TODO`, und `lint` meldet einen Abschnitt, der auf einer Seite nur noch daraus besteht.
- **Seiteneigenschaft im Stage-Vertrag.** `kb/CONTRACT.md` § Every page should: keine Gerüst-Sektion bleibt ungeschrieben; Befund, Abhilfe (aus einer Quelle schreiben oder per `page-lifecycle` zurückziehen) und die Ausnahme für ein Feld, das die Quelle nicht hergibt. Erst in der Abschlussphase nachgezogen - der Stage-Vertrag stellt jede geprüfte Seiteneigenschaft neben ihren Befund, und die Doku-Durchsicht vor dem ersten Publish hatte ihn ausgelassen.
- **`wiki-lint`:** Schritt 1 nennt den Befund und schließt ihn ausdrücklich aus Schritt 7 aus (Füllen ist Autorenarbeit aus einer Quelle, Zurückziehen ist `page-lifecycle`; Meldung in Schritt 9). **`wiki-manage`** Schritt 5 erwähnt den Befund beim Füllen des Gerüsts; **`EVALS.md`** (L0) nennt ihn neben den Platzhalter-Links als erwartetes Signal einer ungeschriebenen Seite.
- **Geprüft und unverändert gelassen:** kein `docs/`-Text begründet etwas über Lint-Befunde; `README.md`, `tools/README.md`, `INSTALL.md` und `DEVELOPMENT.md` zählen keine Befunde auf.
## Akzeptanzkriterien
- [x] `lint --json` enthält `unfilled_sections`; auf dem Demo-Korpus nennt er genau die 34 Seiten aus #175 und keine weitere (lokal gemessen vor dem Publish, 2026-10-04).
- [x] Er nennt **nicht** `iii Engine`, `ha-core`, `Source - Docker Cheatsheet`, `Rohit Gupta`, `Chemenu`, `Issue Label Scheme` oder `wikitool` (selbe Messung).
- [x] Auf der Produktivinstanz meldet er keine Seite: **0** (Operator-Lauf 2026-10-04 aus dem Dev-Checkout auf Stand `20a7624`, Entscheidung 5).
- [x] `lint --fail-on-error` bleibt mit diesem Befund allein bei Exit 0; `"unfilled_sections" not in HARD_ERROR_KEYS` (`test_unfilled_sections_alone_keep_lint_green`).
- [x] `eval score` zählt ihn unter `advisories` (`test_evals.py::test_unfilled_sections_are_counted_as_an_advisory`).
- [x] Tests in `tools/chemenu/tests/test_lint.py` decken beide Richtungen ab: frisch mit dem Concept-Template gerüstete Seite gemeldet, mit den Namen der unbeschriebenen Abschnitte (Template aus dem ausgelieferten Type-Spec gerendert, zusätzlich durch das echte `wikitool new` in `test_pipeline_l0.py`); dieselbe Seite gefüllt nicht gemeldet; Feldliste mit `- **Version:** TODO (nicht erfasst)` nicht gemeldet; kurze vollständige Seite nicht gemeldet; Abschnitt ganz ohne Inhalt nicht gemeldet; `TODO` in Inline-Code, Fence, Wikilink-Titel, Fließtext, `TODO.md` und generierter Region kein Platzhalter; Listen-, Checkbox-, Label- und Tabellenform sind Platzhalter. `blocks.mask_regions` hat einen eigenen Test in `test_blocks.py`. Lokal 2211 bestanden, CI-Runs 533/534 grün.
- [x] `lint`-Record in `tools/chemenu/commands/lint.py` hat eine Note „Advisory only: Unfilled Template Sections …“; `tools/CONTRACT.md` per `wikitool docs contract --apply` neu erzeugt; `docs verify` grün.
- [x] `types/type-spec.md` nennt `TODO` als Platzhalter-Token und den Lint-Befund; `instructions/wiki-lint/SKILL.md` Schritt 1 nennt den Befund und schließt ihn aus Schritt 7 aus; `instructions verify` grün.
- [x] Korpus-Issue für die 34 Demo-Stubs ist angelegt: #175.
## Version
`--minor`, umgesetzt als **8.0.0-beta.37**: neuer beratender Befund, ein zusätzlicher Schlüssel in `lint --json`/MCP-`lint`, nichts entfernt oder umbenannt, `--fail-on-error` unverändert. Drop-in in beide Richtungen (version-parts.md Schritt 1); der Kandidat stand bereits auf 8.0.0-beta.N, die Eskalation war damit ein No-op. Der Nachzug in `kb/CONTRACT.md` kam als `--patch` (**8.0.0-beta.38**), weil CIs Version-Gate jeden Commit in einen `CONTRACT.md` verlangt.
## Berührte Dateien
`tools/chemenu/lint_core.py` (`unfilled_sections`, `unfilled_section_pages`, `run_lint`, `render_markdown`, Kommentar über `HARD_ERROR_KEYS`), `tools/chemenu/blocks.py` (`mask_regions`), `tools/chemenu/commands/lint.py` (Note im Record), `tools/chemenu/evals/scorecard.py` (`ADVISORY_KEYS`), `tools/chemenu/tests/test_lint.py`, `test_blocks.py`, `test_evals.py`, `test_pipeline_l0.py`, `tools/CONTRACT.md` (generiert), `types/type-spec.md`, `kb/CONTRACT.md`, `instructions/wiki-lint/SKILL.md`, `instructions/wiki-manage/SKILL.md`, `EVALS.md`, `CHANGES.md` und `VERSION` (über `version bump`).
Changelog: Messung vom 2026-09-11 (nicht reproduzierbar, Seiten nicht benannt) ersetzt durch eine Messung an Demo-Korpus und einer privaten Produktivinstanz. Entscheidung 1 gefallen: gemeldet werden ##-Abschnitte, die nur aus TODO-Platzhaltern bestehen (unfilled_sections); Wortzahl verworfen, weil sie zwischen Stubs und legitimen kurzen Seiten überlappt, und „Seite trägt Platzhalter“ verworfen, weil es auf der Produktivinstanz zwölf vollständige Seiten trifft. Neu Entscheidung 2 (Operator): Feldreste wie **Version:** TODO (nicht erfasst) werden nicht gemeldet. Härte beratend. Die 34 Demo-Stubs sind nach #175 ausgelagert. Entwurf, Akzeptanzkriterien, Version (--minor) und berührte Dateien ergänzt. kind/decision → kind/build: keine Frage mehr offen.
**Changelog:** Messung vom 2026-09-11 (nicht reproduzierbar, Seiten nicht benannt) ersetzt durch eine Messung an Demo-Korpus und einer privaten Produktivinstanz. Entscheidung 1 gefallen: gemeldet werden `##`-Abschnitte, die nur aus `TODO`-Platzhaltern bestehen (`unfilled_sections`); Wortzahl verworfen, weil sie zwischen Stubs und legitimen kurzen Seiten überlappt, und „Seite trägt Platzhalter“ verworfen, weil es auf der Produktivinstanz zwölf vollständige Seiten trifft. Neu Entscheidung 2 (Operator): Feldreste wie `**Version:** TODO (nicht erfasst)` werden nicht gemeldet. Härte beratend. Die 34 Demo-Stubs sind nach #175 ausgelagert. Entwurf, Akzeptanzkriterien, Version (`--minor`) und berührte Dateien ergänzt. `kind/decision` → `kind/build`: keine Frage mehr offen.
Changelog: Gebaut und veröffentlicht als 8.0.0-beta.37 (a2a6baa), CI-Runs 533/534 grün. Neuer Abschnitt Stand; Entwurf beschreibt jetzt den gebauten Stand: Task-Checkbox (- [ ] TODO) als zusätzliche Platzhalterform (Abweichung, Grund: types/source.md), blocks.mask_regions() als neuer Helfer, wiki-manage und EVALS.md mit nachgezogen. Kriterien 1, 2 und 4-8 abgehakt; Kriterium 3 (Produktivinstanz) wartet auf den Lauf des Operators. Berührte Dateien um blocks.py, drei Testdateien, wiki-manage, EVALS.md und VERSION ergänzt.
**Changelog:** Gebaut und veröffentlicht als 8.0.0-beta.37 (`a2a6baa`), CI-Runs 533/534 grün. Neuer Abschnitt *Stand*; *Entwurf* beschreibt jetzt den gebauten Stand: Task-Checkbox (`- [ ] TODO`) als zusätzliche Platzhalterform (Abweichung, Grund: `types/source.md`), `blocks.mask_regions()` als neuer Helfer, `wiki-manage` und `EVALS.md` mit nachgezogen. Kriterien 1, 2 und 4-8 abgehakt; Kriterium 3 (Produktivinstanz) wartet auf den Lauf des Operators. *Berührte Dateien* um `blocks.py`, drei Testdateien, `wiki-manage`, `EVALS.md` und `VERSION` ergänzt.
Changelog: Abschlussphase. Nachzug kb/CONTRACT.md § Every page should als 8.0.0-beta.38 (20a7624), CI-Runs 535/536 grün. Kriterium 3 abgehakt: Produktivinstanz meldet 0 Seiten (Operator-Lauf aus dem Dev-Checkout, neue Entscheidung 5). Stand ist zu Ergebnis geworden und nennt, was verifiziert wurde. Geschlossen.
**Changelog:** Abschlussphase. Nachzug `kb/CONTRACT.md` § Every page should als 8.0.0-beta.38 (`20a7624`), CI-Runs 535/536 grün. Kriterium 3 abgehakt: Produktivinstanz meldet 0 Seiten (Operator-Lauf aus dem Dev-Checkout, neue Entscheidung 5). *Stand* ist zu *Ergebnis* geworden und nennt, was verifiziert wurde. Geschlossen.
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.
wikitool linthatte keinen Befund für eine Seite ohne Inhalt. Keiner der Report-Abschnitte intools/chemenu/lint_core.pymaß Substanz - geprüft wurden Struktur, Verlinkung, Provenance, Schema, Zitate. Eine Seite, die nur ihr Template-Gerüst und eine Zeile trägt, war damit mechanisch nicht von einer vollständigen zu unterscheiden. Seit 8.0.0-beta.37 meldetlinteine solche Seite als Unfilled Template Sections.Ergebnis
Erledigt (2026-10-04). Alle Akzeptanzkriterien erfüllt.
a2a6baa- der Befund selbst; CI-Runs 533 und 534 grün.20a7624- Nachzug aus der Abschlussphase:kb/CONTRACT.md§ Every page should nennt die Seiteneigenschaft und den Befund; CI-Runs 535 und 536 grün.docs verifyundinstructions verifygrün, dazu die vier CI-Runs.Warum das zählte
Der Schaden ist nicht die einzelne dünne Seite, sondern was sie mit späteren Sitzungen macht: sie steht im Katalog,
searchfindet sie, und die nächste Sitzung liest den Gegenstand als abgedeckt und schaut nicht mehr in die Quelle. Das ist teurer als eine fehlende Seite, weil eine fehlende Seite sichtbar fehlt.Die Verursacherseite ist mit dem Breiten-Auslöser adressiert (
instructions/ingest-large-tree.md§ A broad source is not cut,wiki-ingestSchritt 7). Dieses Paket liefert die Beobachtungsseite.Messung (2026-10-04, ersetzt die vom 2026-09-11)
Die erste Messung (2026-09-11: „14 von 30 Subjektseiten aus
Source - LLM Wiki v2unter 150 Wörtern“) hat die 14 Seiten nicht namentlich festgehalten und keine Zählmethode genannt; sie ist nicht reproduzierbar. Neu gemessen an zwei Korpora: dem Demo-Korpus dieses Repos (185 Seiten) und einer privaten Produktivinstanz (225 Seiten, Stack 7.0.0; Titel hier bewusst nicht genannt). Wörter = Fließtext ohne Überschriften, Code, generierte Regionen, Fußnotendefinitionen und ohne Platzhalterzeilen. Platzhalter =TODO-Zeile aus dem Gerüst vonwikitool new(Definition unter Entwurf).Demo-Korpus:
##-Abschnitte, die nur aus Platzhaltern bestehen (33 davon vier oder mehr).iii Engine), dannha-core108,Source - Docker Cheatsheet126,Rohit Gupta127 - knapp, aber vollständig.Produktivinstanz:
## Kerndatenneben gefüllten Feldern -**Version:** TODO (nicht erfasst),**Repository:** TODO (falls zutreffend)-, auf Seiten mit 39 bis 443 Wörtern. Kein Abschnitt besteht nur aus Platzhaltern.wiki-ingest/wiki-manageverlangen.TODOsteht zusätzlich in Inline-Code auf einer Source-Seite (ein zitierter Konfigurationswert) - kein Platzhalter.Was daraus folgte:
##-Abschnitt besteht nur aus Platzhaltern“ trennt in beiden Korpora vollständig: 34/34 Stubs im Demo-Korpus, 0 Fehltreffer in der Produktivinstanz. Das ist zugleich der eigentliche Defekt: ein Abschnitt, den das Gerüst vorgab und niemand geschrieben hat. Der gebaute Befund bestätigt beide Zahlen (Kriterien 1 und 3).Entscheidungen
provenance: general-Seiten tragen legitim keine Zitate.Rohit Guptaträgt zwei leere Altüberschriften und ist trotzdem vollständig.wiki-lint.TODOauf einer Feldzeile neben gefüllten Feldern (**Version:** TODO (nicht erfasst)) ist nicht der Defekt dieses Issues - eine 443-Wörter-Seite, der eine Versionsnummer fehlt, liest keine Sitzung fälschlich als abgedeckt -, undTODO (nicht erfasst)ist dort eine bewusste, ehrliche Lückenmarke. Ein Befund darauf würde eine Sitzung drängen, die Marke zu löschen oder einen Wert zu erfinden. Ein zweiter, eigener Befund „Template-Feldreste“ wurde damit ebenfalls verworfen.broken_anchors: der Befund kommt nach Korpora, die ihn schon tragen - hier 34 Seiten -, und ein harter Befund würdelint --fail-on-errorjeder solchen Instanz mit genau dem Upgrade rot machen, das ihn einführt. Migrations-Gating entfällt: keine Migration kann eine Seite mechanisch füllen.instructions/dev/corpus-policy.md§ What a reactive fix may do eine korpusweite Änderung (Stufe 2: eigenes Issue,work/-Lauf). Ob eine Seite ausgebaut, zusammengelegt oder zurückgezogen wird, entscheidet #175; der neue Befund ist seine Arbeitsliste. Dieses Paket hat keine Seite inkb/angefasst.lint_core.unfilled_section_pages()aus dem Dev-Checkout über daskb/der Instanz auf - nur lesend, Ausgabe nur die Anzahl. Zulässig, weil die Prüfung allein am Seitentext hängt, nicht an Stack-Version oderkb_version.Entwurf (so gebaut)
-,*,+,1.), optionaler Task-Checkbox ([ ]/[x]), optionaler Tabellenzelle (|) und optionalem fettem Label (**Zweck:**) - mit dem TokenTODObeginnt, auf das Zeilenende, Leerraum,:,(,)oder|folgt (nicht.,-,/oder ein Wortzeichen). Vorher ausgeblendet: Code (Fences und Inline-Spans,strip_code_spans), generierte Regionen (<!-- wikitool:... -->, über das neueblocks.mask_regions(), das Offsets und Zeilen erhält), Fußnotendefinitionen (CITE_DEF_RE). Ausgeblendete Regionen und Definitionen zählen als nicht vorhanden; eine Code-Zeile zählt als geschriebener Inhalt.TODO.md,TODO Retirementin einem Wikilink oderTODOmitten im Satz sind keine Platzhalter.types/source.mdseine Platzhalter so schreibt (- [ ] TODO: Aufgabe 1). Auf dem Demo-Korpus ändert das nur die gemeldeten Abschnitte einer Seite (AufgabenaufSource - LLM Improvements Production Agent Gaps 2026), nicht die Seitenliste; auf der Produktivinstanz bleibt es bei 0.##-Abschnitt (nicht###; der Abschnitt reicht bis zur nächsten##-Überschrift), der mindestens eine nicht-leere Zeile hat und dessen nicht-leere Zeilen alle Platzhalterzeilen sind. Eine###-Überschrift ist eine Nicht-Platzhalterzeile; ein Abschnitt ganz ohne Inhalt zählt nicht; Text vor der ersten##-Überschrift gehört zu keinem Abschnitt. Eine einzelne Platzhalterzeile neben gefüllten Zeilen macht einen Abschnitt nicht unbeschrieben (Entscheidung 2).unfilled_sections(lint_core.unfilled_section_pages(), je Seitelint_core.unfilled_sections(body)): ein Eintrag je Seite mit mindestens einem solchen Abschnitt,{"page", "sections": [<Überschriften in Seitenreihenfolge>]}, sortiert nach Titel. Nicht inHARD_ERROR_KEYS, nicht inMIGRATION_GATED_KEYS; Begründung als Kommentarabsatz im Block überHARD_ERROR_KEYS.[[X]] - only template placeholders under: <Abschnitt>, <Abschnitt> - write them from the page's sources (wiki-manage) or retire the page (page-lifecycle).unfilled_sectionsinADVISORY_KEYS(tools/chemenu/evals/scorecard.py).types/type-spec.md§ Template variables sagt: Platzhaltertext in einem Template - Block oder Subtyp-Datei, instanzeigene eingeschlossen - beginnt mitTODO, undlintmeldet einen Abschnitt, der auf einer Seite nur noch daraus besteht.kb/CONTRACT.md§ Every page should: keine Gerüst-Sektion bleibt ungeschrieben; Befund, Abhilfe (aus einer Quelle schreiben oder perpage-lifecyclezurückziehen) und die Ausnahme für ein Feld, das die Quelle nicht hergibt. Erst in der Abschlussphase nachgezogen - der Stage-Vertrag stellt jede geprüfte Seiteneigenschaft neben ihren Befund, und die Doku-Durchsicht vor dem ersten Publish hatte ihn ausgelassen.wiki-lint: Schritt 1 nennt den Befund und schließt ihn ausdrücklich aus Schritt 7 aus (Füllen ist Autorenarbeit aus einer Quelle, Zurückziehen istpage-lifecycle; Meldung in Schritt 9).wiki-manageSchritt 5 erwähnt den Befund beim Füllen des Gerüsts;EVALS.md(L0) nennt ihn neben den Platzhalter-Links als erwartetes Signal einer ungeschriebenen Seite.docs/-Text begründet etwas über Lint-Befunde;README.md,tools/README.md,INSTALL.mdundDEVELOPMENT.mdzählen keine Befunde auf.Akzeptanzkriterien
lint --jsonenthältunfilled_sections; auf dem Demo-Korpus nennt er genau die 34 Seiten aus #175 und keine weitere (lokal gemessen vor dem Publish, 2026-10-04).iii Engine,ha-core,Source - Docker Cheatsheet,Rohit Gupta,Chemenu,Issue Label Schemeoderwikitool(selbe Messung).20a7624, Entscheidung 5).lint --fail-on-errorbleibt mit diesem Befund allein bei Exit 0;"unfilled_sections" not in HARD_ERROR_KEYS(test_unfilled_sections_alone_keep_lint_green).eval scorezählt ihn unteradvisories(test_evals.py::test_unfilled_sections_are_counted_as_an_advisory).tools/chemenu/tests/test_lint.pydecken beide Richtungen ab: frisch mit dem Concept-Template gerüstete Seite gemeldet, mit den Namen der unbeschriebenen Abschnitte (Template aus dem ausgelieferten Type-Spec gerendert, zusätzlich durch das echtewikitool newintest_pipeline_l0.py); dieselbe Seite gefüllt nicht gemeldet; Feldliste mit- **Version:** TODO (nicht erfasst)nicht gemeldet; kurze vollständige Seite nicht gemeldet; Abschnitt ganz ohne Inhalt nicht gemeldet;TODOin Inline-Code, Fence, Wikilink-Titel, Fließtext,TODO.mdund generierter Region kein Platzhalter; Listen-, Checkbox-, Label- und Tabellenform sind Platzhalter.blocks.mask_regionshat einen eigenen Test intest_blocks.py. Lokal 2211 bestanden, CI-Runs 533/534 grün.lint-Record intools/chemenu/commands/lint.pyhat eine Note „Advisory only: Unfilled Template Sections …“;tools/CONTRACT.mdperwikitool docs contract --applyneu erzeugt;docs verifygrün.types/type-spec.mdnenntTODOals Platzhalter-Token und den Lint-Befund;instructions/wiki-lint/SKILL.mdSchritt 1 nennt den Befund und schließt ihn aus Schritt 7 aus;instructions verifygrün.Version
--minor, umgesetzt als 8.0.0-beta.37: neuer beratender Befund, ein zusätzlicher Schlüssel inlint --json/MCP-lint, nichts entfernt oder umbenannt,--fail-on-errorunverändert. Drop-in in beide Richtungen (version-parts.md Schritt 1); der Kandidat stand bereits auf 8.0.0-beta.N, die Eskalation war damit ein No-op. Der Nachzug inkb/CONTRACT.mdkam als--patch(8.0.0-beta.38), weil CIs Version-Gate jeden Commit in einenCONTRACT.mdverlangt.Berührte Dateien
tools/chemenu/lint_core.py(unfilled_sections,unfilled_section_pages,run_lint,render_markdown, Kommentar überHARD_ERROR_KEYS),tools/chemenu/blocks.py(mask_regions),tools/chemenu/commands/lint.py(Note im Record),tools/chemenu/evals/scorecard.py(ADVISORY_KEYS),tools/chemenu/tests/test_lint.py,test_blocks.py,test_evals.py,test_pipeline_l0.py,tools/CONTRACT.md(generiert),types/type-spec.md,kb/CONTRACT.md,instructions/wiki-lint/SKILL.md,instructions/wiki-manage/SKILL.md,EVALS.md,CHANGES.mdundVERSION(überversion bump).Changelog: Messung vom 2026-09-11 (nicht reproduzierbar, Seiten nicht benannt) ersetzt durch eine Messung an Demo-Korpus und einer privaten Produktivinstanz. Entscheidung 1 gefallen: gemeldet werden
##-Abschnitte, die nur ausTODO-Platzhaltern bestehen (unfilled_sections); Wortzahl verworfen, weil sie zwischen Stubs und legitimen kurzen Seiten überlappt, und „Seite trägt Platzhalter“ verworfen, weil es auf der Produktivinstanz zwölf vollständige Seiten trifft. Neu Entscheidung 2 (Operator): Feldreste wie**Version:** TODO (nicht erfasst)werden nicht gemeldet. Härte beratend. Die 34 Demo-Stubs sind nach #175 ausgelagert. Entwurf, Akzeptanzkriterien, Version (--minor) und berührte Dateien ergänzt.kind/decision→kind/build: keine Frage mehr offen.Changelog: Gebaut und veröffentlicht als 8.0.0-beta.37 (
a2a6baa), CI-Runs 533/534 grün. Neuer Abschnitt Stand; Entwurf beschreibt jetzt den gebauten Stand: Task-Checkbox (- [ ] TODO) als zusätzliche Platzhalterform (Abweichung, Grund:types/source.md),blocks.mask_regions()als neuer Helfer,wiki-manageundEVALS.mdmit nachgezogen. Kriterien 1, 2 und 4-8 abgehakt; Kriterium 3 (Produktivinstanz) wartet auf den Lauf des Operators. Berührte Dateien umblocks.py, drei Testdateien,wiki-manage,EVALS.mdundVERSIONergänzt.Changelog: Abschlussphase. Nachzug
kb/CONTRACT.md§ Every page should als 8.0.0-beta.38 (20a7624), CI-Runs 535/536 grün. Kriterium 3 abgehakt: Produktivinstanz meldet 0 Seiten (Operator-Lauf aus dem Dev-Checkout, neue Entscheidung 5). Stand ist zu Ergebnis geworden und nennt, was verifiziert wurde. Geschlossen.