docs(issues): Phase 3 schneiden, und Verweise zeigen wieder richtig
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:
co-authored by
Claude Opus 5
parent
60aaf746cf
commit
2f247b3617
+55
-1
@@ -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`);
|
||||
|
||||
Reference in New Issue
Block a user