feat: Story 2.3 Code-Review-Patches (Rev 2.0) — Pin-Schärfung + Change-Log-Scope

Code-Review (4 Layer) Story 2.3 — 2 Patch-Findings umgesetzt, 7 deferred.

Patch 1 (schema/compiler.md §5.6 → Revision 2.0):
- Form-Check (Formel 2) um Exklusions-Stufe `grep -vE '^\.'` ergänzt —
  Ziele mit `./`-Präfix werden definiert aus dem Pin ausgenommen statt still
  als "interne .md-Form" durchzugehen (Blind-Hunter BH-8 / Edge-Case EH-4).
- Dangling-Check (Formel 3) case-Muster um `./*|/*` erweitert — konsistent
  zu `../*`-Exklusion (kein DANGLING: ./foo.md-Fehlbenennung mehr).
- Byte-identisch in Spec-Verification gespiegelt (5/5 Formeln, verifiziert).

Patch 2 (spec Change Log / bad_spec-Zeile):
- Scope-Klarstellung der raw/-Zählungen: 30 (log.md-exkludiert, gepinnte
  Baseline) vs. 34 (inkl. log.md) vs. 28 (Zeilen-Metrik) — verschiedene
  Metriken, kein Widerspruch mehr.

Review-Findings-Sektion + Spec-Change-Log-Eintrag in spec-2-3-…md;
7 Defer-Findings unter "## Deferred from: code review" in deferred-work.md
(Image-Scope, Multi-Line-, Reference-Style-, Leading-Space-Ziele,
Area-log.md, Cross-Page-Evidenz, log.md-Exklusion — Story-2.4-Kandidat).

Positiv-Kontrolle nach Patch: Bestands 8, Form 0, Dangling leer, raw/ 30≡30.
sprint-status.yaml: 2-3-… -> done; last_updated 08-17-2026 15:40.

Co-Authored-By: Claude <noreply@anthropic.com>
@
This commit is contained in:
Michael Tamse
2026-08-17 16:06:50 +02:00
parent bb7db2d025
commit 66451b6e6c
4 changed files with 65 additions and 10 deletions
@@ -225,3 +225,40 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein
summary: **Area-Kontext: Bundlerelativ vs. Dateirelativ bei Standard-Tools** — §5.6 Pkt. 1 führt als Rationale an, Standard-Markdown-Tools lösten Links „ohne Konventionswissen" auf; das gilt exakt im flatten Bundle (Root-Concepts), wo datei- und bundlerelativ identisch sind. In künftigen `wiki/<area>/`-Concepts (Story 2.4) löst ein Standard-Tool `](beta/c2.md)` dateirelativ (→ `wiki/alpha/beta/c2.md`, falsch), während die gepinnte Form nach AD-7b bundlerelativ bleibt und der Dangling-Check bundleroot-relativ prüft. Die Spannung zwischen AD-7b (bundlerelativ) und „Standard-Tools-Auflösung" in Areas ist ein Story-2.4-Thema (dort: deterministische Area-Zuordnung + Index-Regel für Areas).
evidence: Step-04-Review (Verification-Gap, Loop 1): Rationale-Satz in §5.6 Pkt. 1 gelesen; Dangling-Check-Auflösung `[ -f "wiki/$t" ]` ist bundleroot-relativ; Synthese-Baum `/tmp/area` zeigt: bundlerelative Area-Links (`beta/c2.md` aus `alpha/c1.md`) lösen im Check korrekt auf, in Standard-Renderern aber nicht.
status: offen — Home: Story 2.4 (deterministische Bereichszuordnung), dort Rationale-Satz präzisieren oder Auflösungsmodell festlegen; **kein Story-2.3-Blocker** (aktuell flattes Bundle, keine Areas).
## Deferred from: code review of spec-2-3-concepts-verlinken-eine-erlaubte-linkform (2026-08-17)
- source_spec: `_bmad-output/implementation-artifacts/spec-2-3-concepts-verlinken-eine-erlaubte-linkform.md`
summary: **`log.md`-Exklusions-Begründung in §5.6 Pkt.2/Verification ist für Formeln 13 gegenstandslos** — die Begründung „sie enthält die Formel-Texte selbst als Zitate und würde die Zählungen verunreinigen" ist im Ist-Zustand unzutreffend: `wiki/log.md` enthält aktuell **0** `](`-Muster, die Exklusion ändert für Formeln 13 nichts; lasttragend ist sie nur für Formel 4 (log.md enthält 4 `(raw/`-Vorkommen — ohne Exklusion 34 statt 30 ggü. Baseline 30). Solange der Story-2.2-`27-Treffer`-Zitat-Zeile (enthält `(raw/`) in log.md bleibt, ist die Formel korrekt re-executierbar; die Begründungs-Formulierung ist präzisierenswert, kein Funktionsfehler.
evidence: bmad-code-review Story 2.3 (2026-08-17, Verification-Gap-Layer): `grep -roE ']\([^)]*\)' wiki/log.md` → 0; `grep -oE '\(raw/' wiki/log.md` → 4.
status: offen — Home: dokumentarische Präzisierung einer späteren Instruktions-Runde; **kein Story-2.3-Blocker** (Formel bleibt AD-17h-re-executierbar).
- source_spec: `_bmad-output/implementation-artifacts/spec-2-3-concepts-verlinken-eine-erlaubte-linkform.md`
summary: **Cross-Page-Defer-Eintrag (L221222) beschreibt Prä-Patch-Dangling-Verhalten als Ist-Zustand** — der Eintrag behauptet, ein Ziel `concepts.md#s1` liefere vom Dangling-Check zusätzlich `DANGLING: concepts.md#s1` (Zieldatei existiert), während die im selben Change shipende §5.6-Pkt.3-/Verification-Formel 3 das Fragment VOR dem Existenztest stripped (`p=${t%%#*}`) und genau diesen Fall als „keine Ausgabe" benennt. Die Evidenz-Zeile dokumentiert den Stand vor Rev 1.9 (Punkt 5 des Patchs); die Beschreibung des Solutions-Verhaltens (Cross-Page-Anker ist Form-Verletzung, normativ offen) bleibt korrekt.
evidence: bmad-code-review Story 2.3 (2026-08-17, Blind-Hunter-Layer): Defer-Text L221222 vs. `schema/compiler.md` §5.6 Pkt.3 (`p=${t%%#*}`) + Verification Formel 3 gelesen; Fragment-Strip ist Teil von Revision 1.9 (gleicher Commit).
status: offen — Home: Eintrag bei nächster Gelegenheit auf Ist-Verhalten (Fragment-Strip → `concepts.md#s1` erzeugt **keine** Dangling-Ausgabe) korrigieren; **kein Story-2.3-Blocker**.
- source_spec: `_bmad-output/implementation-artifacts/spec-2-3-concepts-verlinken-eine-erlaubte-linkform.md`
summary: **Image-/Nicht-Navigations-`](...)` ohne definierten Scope in §5.6** — die Formeln werten `![alt](img.png)` (Markdown-Image) und `[x](./y.md)` als „Concept-Link" und zählen Images als Form-Verletzung; §5.6 Pkt.2 definiert den Geltungsbereich („Beziehungen zwischen Concepts … normale Markdown-Links") ohne `![`-Guard oder Sachlich-Ausnahme. Für das aktuelle Bundle irrelevant (keine Images); bei künftigem Wiki-Media-Einsatz erzwingt die Formel `.md`-Endung für Bildpfade oder erzeugt False-Positives. Ggf. `grep -vE '!\['`-Guard bei Bedarf (Story 2.4/2.5).
evidence: bmad-code-review Story 2.3 (2026-08-17, Edge-Case-Hunter-Layer): Synthese-Test ` ![alt](img.png)` → Form-Check zählt `1`; §5.6-Pkt.2-Scope-Text ohne Image-Ausnahme.
status: offen — Home: spätere Instruktions-/Media-Runde; **kein Story-2.3-Blocker** (aktuell keine Images im Bundle).
- source_spec: `_bmad-output/implementation-artifacts/spec-2-3-concepts-verlinken-eine-erlaubte-linkform.md`
summary: **Multi-Line-Link-Targets für alle §5.6-Formeln unsichtbar**`grep -roE ']\([^)]*\)'` ist ein Ein-Zeilen-Matcher; ein über zwei Zeilen geteiltes Ziel `](nichtda\nbar.md)` wird von Form-Check, Dangling-Check und Bestands-Check nicht erfasst → toter Link passiert **stillschweigend** (NFR-4-Verletzung, kein Fehlalarm). CommonMark erlaubt Zeilenumbrüche in Link-Zielen; bei künftiger Verwendung wäre balanciertes-Parens-/Multi-Line-Matching nötig (D-3-konform, kein Standalone). Für das aktuelle Bundle irrelevant (keine Multi-Line-Links, Kebab-Case-Slug-Konvention, AD-7a).
evidence: bmad-code-review Story 2.3 (2026-08-17, Edge-Case-Hunter-Layer): Synthese-Eingabe `[x](foo.md\nbar.md)` → alle drei Formeln ohne Treffer.
status: offen — Home: Story 2.4-Kandidat (Instruktions-Einschärfung); **kein Story-2.3-Blocker** (aktuell keine Multi-Line-Ziele).
- source_spec: `_bmad-output/implementation-artifacts/spec-2-3-concepts-verlinken-eine-erlaubte-linkform.md`
summary: **Reference-Style-Links (`[x][ref]` + `[ref]: ziel.md`) für die §5.6-Formeln unsichtbar** — keine Formel scannt Definitionszeilen `^\[[^]]+\]:`; ein per Reference-Style verlinktes Ziel passiert Bestands-, Form- und Dangling-Check ohne Meldung (zweite Form der Konzept-Verlinkung, AD-7b-Zwei-Producer-Problem wiederherstellbar). Für das aktuelle Bundle irrelevant (alle Links inline); bei künftiger Nutzung Definitions-Scan ergänzen oder Reference-Form explizit ausschließen.
evidence: bmad-code-review Story 2.3 (2026-08-17, Edge-Case-Hunter-Layer): Synthese-`[x][ref]`/`[ref]: ziel.md` → keine Formel-Ausgabe.
status: offen — Home: spätere Instruktions-Runde; **kein Story-2.3-Blocker** (aktuell keine Reference-Style-Links).
- source_spec: `_bmad-output/implementation-artifacts/spec-2-3-concepts-verlinken-eine-erlaubte-linkform.md`
summary: **Leading-Space-Ziel `]( ziel.md)` wird als Form-konform UND vorhanden gewertet**`grep -oE ']\([^)]*\)'` matcht das Leerzeichen nach `(`; `sed`/`read` strippen es nicht; `^[^#]+\.md$` matcht ` ziel.md` (führendes Leerzeichen ist `[^#]+`), `[ -f "wiki/ ziel.md" ]` schlägt fehl → Form-Check `0` (falsch), Dangling-Check `DANGLING: ziel.md` (getrimmt). CommonMark erlaubt keine Leerzeichen direkt nach `(`. Konservativ richtungsweisend, aber Form-Check-Aussage „0" ist für solch ähnelnde Ziele unzuverlässig. Für das aktuelle Bundle irrelevant (keine solchen Ziele); Whitespace-Verbot vor `-f`-Test ergänzbar.
evidence: bmad-code-review Story 2.3 (2026-08-17, Edge-Case-Hunter-Layer): Synthese-Eingabe `]( ziel.md)` → Form-Check `0` + Dangling `DANGLING: ziel.md`.
status: offen — Home: spätere Instruktions-Runde; **kein Story-2.3-Blocker** (aktuell keine solchen Ziele).
- source_spec: `_bmad-output/implementation-artifacts/spec-2-3-concepts-verlinken-eine-erlaubte-linkform.md`
summary: **künftiges `wiki/<area>/log.md` bricht die Baseline-Extraktion (Formel 4)** — der Baseline-Filter `grep -v "wiki/log.md$"` entfernt nur das Top-Level-log.md; `--exclude=log.md` in der Ist-Zählung schließt aber auch ein zukünftiges Area-log.md aus → Baseline/Ist-Dateimengen divergieren, falscher FAIL (AD-17h-Nicht-Determinismus). Für den aktuellen flachen Bundle-Root irrelevant (keine Areas bis Story 2.4); bei Area-Einführung Filter auf Basename umstellen (`grep -v 'log.md$'` analog zu `--exclude=log.md`).
evidence: bmad-code-review Story 2.3 (2026-08-17, Edge-Case-Hunter-Layer): Synthese-Baum `wiki/alpha/log.md` → Baseline-Filter lässt sie durch, `--exclude=log.md` nicht.
status: offen — Home: Story 2.4 (Area-Einführung) — dort Baseline-Filter-Formulierung anpassen; **kein Story-2.3-Blocker** (flattes Bundle).