docs(issues): Phase 3 schneiden, und Verweise zeigen wieder richtig
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s

Vier Meilensteine fuer v0.3.0, 34 h geschaetzt: bedingte Schritte und
Abschnitte (M23), Vier-Augen-Freigabe (M24), PDF-Uebergabeprotokoll (M25),
weitere Schritt-Typen (M26). Die Reihenfolge ist begruendet: M23 zuerst, weil
es als einziges am Datenmodell und an der Abschlussregel arbeitet; M26 zuletzt,
weil UNTERSCHRIFT erst im PDF einen Zweck hat.

Jedes Issue nennt die Entscheidungen, die zu treffen sind, mit Empfehlung und
Begruendung. Bei M23 ist die entscheidende: eine Bedingung auf einer Variable
liesse sich beim Start festschreiben wie bei #031, eine auf einem
Schrittergebnis nicht — die Antwort entsteht erst waehrend der Arbeit.

Beim Nummernvergeben einen Fund: vier Codestellen, sechs Changelog-Zeilen und
der Doku-Pruefer nannten dreistellig die Tracker-Nummern 39 und 40 — gemeint
waren die Issue-Dateien 025 und 026. Solange es diese Dateien nicht gab, fiel es
niemandem auf; mit Phase 3 waere es eine falsche Spur geworden, und zwar in
Kommentaren, die eine Codestelle begruenden.

Behoben, und pruefe:doku prueft es ab jetzt: jeder dreistellige Verweis muss auf
eine Issue-Datei zeigen. Gegenprobe mit einer erfundenen Nummer schlaegt an.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-10-11 15:36:27 +02:00
co-authored by Claude Opus 5
parent 60aaf746cf
commit 2f247b3617
13 changed files with 373 additions and 17 deletions
+55 -1
View File
@@ -141,7 +141,7 @@ function feld(text, name) {
// README fehlte `format:pruefen`, und beide nannten den LDAP-Container nicht, ohne
// den die Suite 22 Tests still ueberspringt. Beides fiel erst bei der Abnahme zu
// #019 auf -- ein gruener Lauf sieht genauso aus. Geprueft wird deshalb der
// Befehlsblock selbst, nicht seine Umgebung (#040).
// Befehlsblock selbst, nicht seine Umgebung (#026).
{
/** Der erste eingezaeunte Block nach einer Ueberschrift. */
const blockNach = (text, ueberschrift) => {
@@ -197,6 +197,60 @@ function feld(text, name) {
}
}
// ---- 7. Jeder (#NNN)-Verweis zeigt auf eine Issue-Datei --------------------
{
/*
* Verweise wie `(#032)` stehen in Kommentaren, im Changelog und in CLAUDE.md
* und sind die einzige Bruecke zwischen einer Codestelle und ihrer
* Begruendung. Zeigt einer ins Leere, ist die Begruendung verloren — und
* schlimmer: zeigt er auf die **falsche** Datei, fuehrt er jemanden in die
* Irre, der ihm vertraut.
*
* Genau das war passiert: vier Codestellen und sechs Changelog-Zeilen nannten
* dreistellig die **Tracker**-Nummern 39 und 40 — gemeint waren die
* Issue-Dateien 025 und 026. Solange es keine Dateien mit diesen Nummern gab,
* fiel es niemandem auf; mit Phase 3 waere es eine falsche Spur geworden.
* Verbindlich ist die **Dateinummer**; die Tracker-Nummer steht in der
* Issue-Datei unter „Im Tracker“.
*
* Diese Datei nennt deshalb selbst keine Nummer in der dreistelligen Form —
* sonst meldete die Pruefung ihren eigenen Kommentar.
*/
const verz = "docs/issues";
const nummern = new Set(
readdirSync(join(wurzel, verz))
.filter((n) => /^\d{3}-.+\.md$/.test(n))
.map((n) => n.slice(0, 3)),
);
const sammeln = (ordner) =>
readdirSync(ordner, { withFileTypes: true }).flatMap((eintrag) => {
if (["node_modules", ".git", ".next", "generated", "test-results"].includes(eintrag.name)) {
return [];
}
const pfad = join(ordner, eintrag.name);
if (eintrag.isDirectory()) return sammeln(pfad);
return /\.(ts|tsx|mjs|md|sql)$/.test(eintrag.name) ? [pfad] : [];
});
for (const datei of sammeln(wurzel)) {
const kurz = datei.replace(`${wurzel}/`, "");
// Der Devlog zitiert Tracker-Nummern aus Pull Requests; dort gilt die Regel nicht.
if (kurz === "docs/devlog.md") continue;
const text = readFileSync(datei, "utf8");
const gemeldet = new Set();
for (const treffer of text.matchAll(/#(\d{3})\b/g)) {
const nummer = treffer[1];
if (nummern.has(nummer) || gemeldet.has(nummer)) continue;
gemeldet.add(nummer);
melde(
`${kurz} verweist auf #${nummer}, aber ${verz}/${nummer}-*.md gibt es nicht. ` +
`Gemeint ist vielleicht eine Tracker-Nummer — verbindlich ist die Dateinummer.`,
);
}
}
}
// ---- Ergebnis --------------------------------------------------------------
if (befunde.length > 0) {
console.error(`\nDokumentation und Code laufen auseinander (${befunde.length}):\n`);