From 20fd47624dd6f512296a0cf6614dfa3e0a289dfe Mon Sep 17 00:00:00 2001 From: Michael Tamse Date: Tue, 18 Aug 2026 14:12:25 +0200 Subject: [PATCH 01/16] =?UTF-8?q?feat:=20Story=202.5=20Progressive=20Disco?= =?UTF-8?q?very=20ueber=20index.md=20=E2=80=94=20Konsolidierte=20Zwei-Eben?= =?UTF-8?q?en-Kartografie=20(F-07)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - schema/compiler.md Revision 2.3: neue §5.8 „Progressive Discovery ueber index.md (Story 2.5)". Gewurzelte Erreichbarkeit (Root → Area → Concept), re-executierbarer Zwei-Lauf-Selbsttest (UNREACHABLE AREA / NESTED AREA), §5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3) statt §3.2-Kollisions-Hold (Loopback-1-Renegotiation, Option A), Suche = Consumer-grep, Discovery-Demo optional. - wiki/log.md: Implementierungs-Eintrag Vertrag-§5-Format inkl. Selbsttest-Beleg. - Spec: Loopback-2 bad_spec + Konsistenz-Renegotiation: Verification-Formel byte-identisch zur Instruktion, erfundener Validator-CLI-Befehl entfernt, Formel-4-Baseline auf Run-Kopf 862cf41, stale §3.2-Wording in Design-Notes vervollständigt (frozen-Vervollstaendigung), Suggested Review Order. - deferred-work.md: F-07 geschlossen (status: umgesetzt); Link-Pin-Eintraege unveraendert offen. - sprint-status.yaml: 2-5-progressive-discovery → in-progress (Implementierung) → review (Handoff). - AD-3 gewahrt: schema/wiki-compiler.md, schema/validator.md, raw/ unveraendert; keine neue §7-Klasse (D-3). Co-Authored-By: Claude --- .../implementation-artifacts/deferred-work.md | 1 + ...e-discovery-über-index-md-bereitstellen.md | 120 ++++++++++++++++++ .../sprint-status.yaml | 4 +- schema/compiler.md | 41 +++++- wiki/log.md | 1 + 5 files changed, 161 insertions(+), 6 deletions(-) create mode 100644 _bmad-output/implementation-artifacts/spec-2-5-progressive-discovery-über-index-md-bereitstellen.md diff --git a/_bmad-output/implementation-artifacts/deferred-work.md b/_bmad-output/implementation-artifacts/deferred-work.md index c8be36f..7978701 100644 --- a/_bmad-output/implementation-artifacts/deferred-work.md +++ b/_bmad-output/implementation-artifacts/deferred-work.md @@ -87,6 +87,7 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein - source_spec: `_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md` (F-07) summary: Index-Regel bei verschachtelten Areas/Unter-Ebenen konkretisieren — „Area als eine `index.md` tiefer als `wiki/`" lässt für `wiki/a/b/concept.md` offen, was „Area mit Inhalt" ist. Epic-2-Story 2.5 (progressive Discovery) legt die Antwort fest; vorher gilt die heutige Definition. evidence: Retrospective F-07; Offene Frage 2 der Retro; spec-1-4 Story 2.3-Linkform. + status: umgesetzt (2026-08-18, Story 2.5 — konsolidierte Zwei-Ebenen-Kartografie, §5.8) - source_spec: `_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md` (F-08) summary: Konvention für `.MD`-Großschreibung unter `wiki/` klären (Windows-Portabilität, NFR-1/NFR-5) — heute ist nur exakt `.md` (case-sensitive) ein Concept; auf win32 kann ein Tool `foo.MD` erzeugen. Vor Epic-2-Concepts entscheiden: Ablehnung/FAIL oder case-insensitive Behandlung. diff --git a/_bmad-output/implementation-artifacts/spec-2-5-progressive-discovery-über-index-md-bereitstellen.md b/_bmad-output/implementation-artifacts/spec-2-5-progressive-discovery-über-index-md-bereitstellen.md new file mode 100644 index 0000000..7dee03f --- /dev/null +++ b/_bmad-output/implementation-artifacts/spec-2-5-progressive-discovery-über-index-md-bereitstellen.md @@ -0,0 +1,120 @@ +--- +title: 'Progressive Discovery über index.md bereitstellen (Story 2.5)' +type: 'feature' +created: '2026-08-18' +status: 'done' +review_loop_iteration: 2 +baseline_commit: 64a0f6a6161247c0556f9d1dc2500f2b913fa967 +context: + - _bmad-output/implementation-artifacts/epic-2-context.md +--- + + + +## Intent + +**Problem:** Die progressive Discovery ist im Bundle zwar normiert (Vertrag §6: Bundleroot → Area-`index.md` → Concepts, AD-9/FR-11), aber für den Adressierbaren Anspruch sind drei Lücken offen: (1) §7 Z.253 der Compiler-Instruktion verweist die komplette Discovery ("Navigation, Area-Indizes, Suche") als Vorbehalt an Story 2.5; (2) der Validator prüft weder, dass eine Area von der Bundleroot aus erreichbar ist (Navigation Root → Area, AD-9), noch gibt es einen Selbsttest für die vollständige index-Verkettung; (3) Defer F-07 (verschachtelte Areas/Unter-Ebenen, `wiki/a/b/concept.md`) ist offen und nennt Story 2.5 ausdrücklich als Heimat, die die Antwort festlegt. + +**Approach:** Story 2.5 integriert die progressive Discovery als expliziten Instruktionsabschnitt (§5.8) in `schema/compiler.md` — D-3-konform, kein Vertrag-/Validator-/raw-Change (AD-3). Sie definiert: (a) die bewertbare Discovery-Vollständigkeit (gewurzelte Erreichbarkeit Root → Area-`index.md` → Concept als erfolgreicher Discovery-Pfad, §5.7 Pkt. 5), (b) die Basis-Discovery-Pflicht (frontmatterlose Area-`index.md` verlinkt ihre Area-Concepts) als „Struktur" und nicht nur Soll, (c) eine deterministische textuelle „Such"-Antwort für den Story-2.5-Vorbehalt (Navigation als primäre Discovery, Suche als Consumer-seitige grep-Angelegenheit — AD-13, FR-11, NFR-3), und (d) die Antwort auf Defer F-07: die Kartografie folgt ab Story 2.5 einer konsolidierten Zwei-Ebenen-Struktur (Root-Concepts + Areas mit je einer `index.md`); verschachtelte Areas (`wiki/a/b/`) sind keine zugelassene Anlageform — ein solcher Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten *(Loopback-1-Renegotiation 2026-08-18, menschen-autorisiert — Option A: Träger ist §5.8, nicht §3.2; §3.2 bleibt der Dateikollision bestehender Concepts vorbehalten).* Neue §5.8 + Revisionslog (3.x). Kein Interface-/Backend-/Datenbank-Änderung — reine Instruktions- und Bundle-Demonstrations-Änderung. Keine neue §7-Invaliditätsklasse; validator.md bleibt strukturell unverändert (Punkt 11 bleibt die Index-/Verlinkungs-Prüfung). + +## Boundaries & Constraints + +**Always:** +- **Progressive Discovery ist ein Instruktionsthema (D-3).** Die Discovery-Semantik wird in `schema/compiler.md` (neue §5.8) verankert — einziger Instruktions-Ort. Kein Vertrag-/Validator-/raw-Change (AD-3), keine Erweiterung der §7-Liste, kein Standalone-Tool. Der Validator bleibt bei Punkt 11 als strukturelle Index-/Verlinkungs-Prüfung (Area-Existenz + Concept-in-Index verlinkt); die Discovery-Vollständigkeit (Root → Area → Concept) ist keine neue §7-Invaliditätsklasse — sie wird deterministisch als Instruktions-Selbsttest belegt. +- **Kartografie ist konsolidiert Zwei-Ebenen (befriedet F-07).** Das Bundle-Navigationsmodell besteht aus Root-Concepts + Areas (je eine frontmatterlose `wiki//index.md`, die ihre Area-Concepts in gepinnter §5.6-Form verlinkt; Bundleroot `wiki/index.md` verlinkt die Area-`index.md`, Navigation Root → Area, AD-9). **Verschachtelte Areas sind keine zugelassene Anlageform:** `wiki/a/b/` mit Concept darunter ist kein „Area mit Inhalt" — ein solcher Kandidat (Erstellungskandidat oder Discovery-Ziel) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `; Loopback-1-Korrektur: Träger ist §5.8-lokal, D-3 — nicht §3.2, der bleibt der Dateikollision bestehender Concepts vorbehalten). Die F-07-Frage „was ist Area mit Inhalt" wird damit instruktionsseitig deterministisch beantwortet (Erkennung = Datei-Existenz in Tiefe ≥ 3 unter der Bundleroot; Meldung = Instruktions-Selbsttest-Befund — kein §7-Eingriff). +- **Suche ist konsumenten-/extern-seitig (AD-9, FR-11, AD-13).** Die Discovery braucht keine proprietäre Datenbank: Navigation ist die primäre Discovery (gewurzelte Erreichbarkeit), Suche ist optional konsumenten-seitig — textuell-deterministisch z. B. `grep`/`ripgrep` über `wiki/`. Kein Embedding/Vector, kein Such-Dienst, kein Index-Datei-Format-Erfinden — die bestehenden `index.md` sind die Discovery-Ebene. +- **Die Discovery-Lücke des Validators ist instruktionsseitig deckbar.** Der Validator prüft nicht, dass eine Area von der Bundleroot verlinkt ist (Punkt 11 adressiert Area-Existenz/Concept-Verlinkung, nicht Root→Area-Navigation). Diese Lücke wird durch einen deterministischen, re-executierbaren Instruktions-Selbsttest geschlossen (Discovery-Check: jede Area ist aus der Bundleroot erreichbar; jedes Area-Concept in seiner Area-`index.md` verlinkt — Verlinkung in gepinnter §5.6-Form). Kein Validator-Change (AD-3, D-3). +- **Kein MOVE bestehender Root-Concepts.** Die bestehenden Root-Concepts werden nicht in Areas verschoben (Kuratierung/AD-7d ist Epic-3-Nähe); als Discovery-Demo kann ein neues Root-Concept ergänzt und (a) in der Bundleroot sowie (b) über einen Index-Link „über das Area-Concept" verlinkt werden (nur neue Inhalte). +- **Bundle bleibt ohne geladene Indizes vollständig verständlich (NFR-2/NFR-5)** — alle Discovery-Regeln sind Markdown/Datei-Struktur, kein Server, keine Datenbank, kein laufender Prozess. +- `deferred-work.md` (append-only): Defer F-07 bekommt `status: umgesetzt (Story 2.5…)`; die drei „Home: fokussierte Instruktionsrunde ab Story 2.5"-Einträge (Multi-Line, `)`-blinde Extraktion, Cross-Page-Anker) bleiben offen — sie gehören zur Link-Pin-Runde (§5.6), die Story 2.5 unberührt lässt (kein Scope-Hijack). `sprint-status.yaml`: Key `2-5-…` → `in-progress`. + +**Ask First:** Andere Pin-Wahl als die bestehende gepinnte §5.6-Form · MOVE bestehender Concepts · Validator-/Vertrags-/raw-Änderung · Einführung verschachtelter Areas als Regelfall · Such-Dienst/Index-Datei-Format über die Konsumenten-seitige grep-Antwort hinaus. + +**Never:** Veränderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3) · neue §7-Invaliditätsklasse · Angebot einer zweiten Discovery-Ebene über die Zwei-Ebenen-Struktur hinaus · Embedding/Vector/Such-Dienst (AD-13) · proprietäre Link-/Search-Datenbank (AD-8) · Renames/Redirects (AD-7d). + +## I/O & Edge-Case Matrix + +| Scenario | Input / State | Expected Output / Behavior | Error Handling | +|----------|--------------|---------------------------|----------------| +| HAPPY_PATH | Bundle mit Bundleroot, einer Area (`wissensarchitektur/` mit `index.md` + `source-material.md`), 3 Root-Concepts | Jede Area ist aus der Bundleroot erreichbar; jedes Area-Concept aus seiner Area-`index.md`; jedes Root-Concept aus der Bundleroot — gewurzelte Erreichbarkeit; Discovery-Selbsttest liefert keine Verletzung; Suche = grep | N/A | +| AREA_UNREACHABLE | Area-`index.md` existiert, ist aber von der Bundleroot nicht verlinkt (kein Root→Area-Pfad) | Discovery-Check → `UNREACHABLE AREA: ` als Verletzung — die Area bleibt für die Navigation unsichtbar (AD-9) | Run-FAIL textuell benannt (Instruktions-Selbsttest, kein Validator-Punkt) | +| NESTED_AREA_KANDIDAT | Ein Erstellungskandidat mit Ziel `wiki/a/b/concept.md` (zwei Ebenen, Tiefe ≥ 3) bzw. `wiki/a/b/` | **§5.8-Instruktions-Hold** (Zwei-Ebenen, Tiefe ≥ 3): Kandidat wird angehalten — keine Datei, kein Index-Link, Meldung `NESTED AREA: `; das Zwei-Ebenen-Modell bleibt | Run bricht fürs Gebilde ab: „teilweise erfolgreich" (übrige Einheiten laufen weiter, NFR-4) | +| DISCOVERY_DEMO_ROOT_AREA_LINK | Neues Root-Concept, zusätzlich überdacht in das `source-material.md`-Area-Concept in §5.6-Form verlinkt | Root-Concept ist aus Bundleroot erreichbar; zusätzlicher (rein informierender) Link von der Area aus — kein MOVE, konsolidierte Zwei-Ebenen-Kartografie bleibt | N/A | +| SEARCH_GREP | Consumer führt textuelle Suche nach Begriff `` aus | `grep -n wiki/`-Suche als konsumenten-/extern-seitige Antwort; keine Such-Infrastruktur/Bundle (AD-8, AD-13) | N/A | + + + +## Code Map + +- `schema/compiler.md` — **mutiert**: neue **§5.8 „Progressive Discovery über `index.md` (Story 2.5)"** (nach §5.7 ≈ Z.200, vor §6): (1) Discovery-Pfad — Bundleroot `wiki/index.md` → Area-`index.md` (frontmatterlos) → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot (§5.7 Pkt. 5, AD-9/FR-11); (2) **gewurzelte Erreichbarkeit** als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest — jede Area muss aus `wiki/index.md` verlinkt sein (Root→Area, AD-9); Verletzung → `UNREACHABLE AREA: ` (textuell benannter Instruktions-Selbsttest-Befund, Run-FAIL gemäß §5.6-Pkt.-4-analoger NFR-4-Regel); die Area→Concept-Verlinkung ist durch Validator Punkt 11 mechanisch abgedeckt (`Concept nicht verlinkt=`) und wird hier nicht dupliziert; die §5.6-Formeln (Z.133–166) decken die Link-Form weiter ab; **verlinkt = Ziel in gepinnter §5.6-Form `(a/index.md` bzw. `(./a/index.md` — das `./`-Präfix ist von der Erreichbarkeits-Formel toleriert (die Form-Check-Exklusion `^\.` in §5.6 Pkt. 3 zählt `./`-Ziele nicht als Formverletzung, L2-6-Erkenntnis); (3) **konsolidierte Zwei-Ebenen-Kartografie** (antwortet Defer F-07): Root + eine Area-Ebene; **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** — `wiki/a/b/`-Kandidat (Erstellungskandidat oder Discovery-Ziel) wird angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); §3.2 bleibt der Dateikollision bestehender Concepts vorbehalten; (4) **Suche = Consumer-grep** (`grep`/`ripgrep` über `wiki/`, AD-13 — keine Such-Datenbank, kein Embedding). Nachgeführt: §7 Z.253 (Vorbehalt auf „Suche"-Rest gekürzt), §8-Revisionslog 2.3 + Normreferenzen AD-9/FR-11/AD-13/NFR-3. Kein Vertrag-/Validator-/raw-Change (AD-3); keine neue §7-Klasse. +- `wiki/log.md` — **append**: Eintrag (Vertrag-§5-Format) mit Discovery-Semantik, Zwei-Ebenen-Kartografie (F-07 geschlossen), `sprint-status`-Wechsel `2-5-progressive-discovery-über-index-md-bereitstellen` `backlog` → `in-progress`, Selbsttest-Beleg (keine `UNREACHABLE`-Verletzung). +- `_bmad-output/implementation-artifacts/deferred-work.md` — **mutiert**: F-07-Eintrag (`source_spec` bei L87; `status:`-Zeile bei L90) `status:` → `umgesetzt (2026-08-18, Story 2.5 — konsolidierte Zwei-Ebenen-Kartografie, §5.8)` (append-only); die drei „Home: …ab Story 2.5"-Link-Pin-Einträge (einer bei L218ff mit `status:` bei L224, zwei weitere im Abschnitt „Deferred from: … spec-2-3 …" mit `status:` bei L246/L250) erhalten **keine** Statusänderung (Link-Pin-Runde ist separat). `sprint-status.yaml`: Key `2-5-…` → **in-progress**. +- `wiki/index.md`, `wiki/wissensarchitektur/*`, 3 Root-Concepts, `schema/wiki-compiler.md`, `schema/validator.md`, `raw/…` — **read-only**: keine MOVE-/Inhaltsänderung an Concepts oder `index.md` (Kuratierung/AD-7d ist Epic-3-Nähe); optional: ein neues Root-Concept als Discovery-Demo (angelegt in Bundleroot-Form, kein MOVE). + +## Tasks & Acceptance + +**Execution:** +- [x] `schema/compiler.md` — §5.8 anlegen (Discovery-Pfad, Erreichbarkeits-Kriterium + Selbsttest, konsolidierte Zwei-Ebenen-Kartografie mit F-07-Antwort über den §5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3), Suche = Consumer-grep) + §7 Z.253 gekürzt + §8 Revisionslog 2.3 + Normreferenzen (AD-9/FR-11/AD-13/NFR-3). Kein Vertrag-/Validator-/raw-Change. +- [x] `wiki/log.md` — Eintrag (§5-Format) mit Discovery-Semantik, F-07-Schluss, Statuswechsel, Selbsttest-Beleg. +- [x] `deferred-work.md` — F-07-Eintrag (L88) `status: umgesetzt (…Story 2.5…)`; die drei Link-Pin-Einträge (L219/L223/L249) unverändert lassen; `sprint-status.yaml` — Key `2-5-…` → `in-progress`. +- [x] Discoverability-/Edge-Tests im Sandbox-/tmp-Baum (I/O-Matrix): gewurzelte Erreichbarkeit (kein `UNREACHABLE`), AREA_UNREACHABLE-Negativ-Test (Area ohne Root-Link), NESTED_AREA-Kandidat `wiki/a/b/` → §5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3). + +**Acceptance Criteria:** +- Given ein Bundle mit mehreren Areas, when ein Consumer die Navigation startet, then liest er zunächst die Bundle-Root `wiki/index.md` und dann die relevanten Area-`index.md` (AD-9) — gewurzelte Erreichbarkeit ist instruktionsseitig verankert und deterministisch prüfbar (Discovery-Selbsttest, §5.8-Pkt.-2-Formel an Run-Nachweis gebunden). +- Given die Hierarchie, when ein Concept neu angelegt wird, then wird es passend in `index.md` des zugehörigen Bereichs verlinkt (AD-9, A0-10) — bestehende §5.3/§5.7-Regel bleibt; §5.8 erläutert die Discovery-Semantik (Area-Concept in Area-`index.md` — mechanisch abgedeckt durch Validator Punkt 11 —, Root-Concept in Bundleroot). +- Given eine Suche, when der Consumer sie nutzt, then ist sie klar extern bzw. Consumer-seitig (grep/ripgrep über `wiki/`, AD-13) — die Discovery braucht keine proprietäre Datenbank (AD-9, FR-11). +- Given ein Verzeichnis unter `wiki/`, when es zwei Ebenen tief ist (`wiki/a/b/`), then ist es **keine zugelassene Anlageform** — der Erstellungskandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); Zwei-Ebenen-Kartografie bleibt ($5.8 Pkt. 3). +- Given die Instruktion, when geprüft, then ist §5.8 der einzige Discovery-Instruktions-Ort (D-3), §5.6-Formeln bleiben re-executierbar (AD-17h), der Validator läuft SUCCESS (keine neue §7-Klasse, kein Schema-/Validator-/raw-Change) — mit re-executierbarem Validator-Befehl belegt (BH13). + +## Spec Change Log + +- **2026-08-18 (Erstellung):** Initiale Approve-Baseline. +- **2026-08-18 (Loopback 1, menschlich-autorisierte Renegotiation — intent_gap F-07):** Review-Befund (Blind-Hunter #1/#2/#3/#12, Edge-Case #1/#5/#13): Der Zwei-Ebenen-Kandidat `wiki/a/b/concept.md` war mechanisch nicht erfassbar — die §5.8-Selbsttest-Formel (nur `index.md`-Scan) lieferte dafür keine Meldung, und der benannte Träger **§3.2-Kollisions-Hold** feuerte nur bei Dateikollision eines **existierenden** Ziel-Pfads (ein brandneuer Pfad kollidiert nie). Korrektur (Option A): Der Zwei-Ebenen-Hold wird **§5.8-lokal** verankert („§5.8-Instruktions-Hold, Zwei-Ebenen, Tiefe ≥ 3"), Kandidaten mit Tiefe ≥ 3 unter der Bundleroot werden angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); §3.2 bleibt der Dateikollision bestehender Concepts vorbehalten. **KEEP:** gefrorene Erwartung (keine Datei/kein Index-Link/teilweise erfolgreich/Zwei-Ebenen) bleibt bit-identisch erhalten; Determinismus/AD-17h; D-3 (kein neues Prädikat, kein §7-Eingriff); AD-3 (kein Schema-/Validator-/raw-Change). +- **2026-08-18 (Loopback 1, bad_spec):** (a) Verifikations-Formel war nicht identisch zur implementierten §5.8-Formel und schwächer (VG #1, BH #4) — auf byte-identische §5.8-Pkt.-2-Formel vereinheitlicht; (b) Selbsttest deckt „Area-Concept in Area-`index.md`" nicht (Intention Z.26) — die eigentliche Design-These: diese Koordinate ist durch Validator Punkt 11 (`Concept nicht verlinkt=`) mechanisch abgedeckt und wird bewusst nicht dupliziert; (§5.8-Pkt.-2-Einleitung + Intent-Wortlaut präzisiert; BH #6); (c) Outcome-Kopplung von `UNREACHABLE AREA` an den Run-Nachweis verankert (BH #3/#9); (d) Discovery-Demo als optional/ausgeführt markiert (BH #10); (e) Code-Map-Line-Zahlen postmodern nachgeführt (BH #5); (f) der Validator-SUCCESS-Lauf hat einen re-executierbaren Befehl (BH #13). +- **2026-08-18 (Loopback 2, bad_spec + Konsistenz-Renegotiation — Review-Loop 2, 3 Layer):** (a) **Verification-Formel-Byte-Identität nachprüfbar verfügbar gemacht (Kern-L2-1, EC-L2-6/VG-L2-1/BH-L2-15):** die Verification-Z. 83–85 führen jetzt die §5.8-Pkt.-2-Selbsttest-Formel **wörtlich** als Einzel-Quote-`sh -c '…'`-String und binden sie als „verbindlicher Nachweis = exakt die Instruktions-Formel (byte-identisch)"; (b) die irreführende „identische Formulierung im Instruktionstext"-Behauptung (Verification Z. 84) wurde zur faktisch korrekten Formulierung korrigiert („Identische Formulierung liegt auch im Instruktionstext … die Selbsttest-Formel ist die Instruktion"; VG-L2-1/BH-L2-13); (c) der phantombildende „wörtlicher Einzel-Quote-String"-Verweis im Log-Eintrag wurde präzisiert (die wörtliche Instruktions-Formel liegt in `schema/compiler.md` §5.8 Pkt. 2; VG-L2-2); (d) **erfundener Validator-CLI-Befehl entfernt** (`uv run --no-cache _bmad-bmw40` existiert nirgends; der Validator ist reine Text-Instruktion, human-mechanisch ausgeführt, D-3; VG-L2-3/BH-L2-14); (e) **Formel-4-Baseline von `64a0f6a…` auf den Run-Kopf `862cf41…` korrigiert** (die extrahierte Baseline ist der Kopf des letzten Zuwachs-Runs, nicht der Spec-`baseline_commit`; VG-L2-3/BH-L2-12); (f) die **Frozenschnitt-Renegotiation (Loop-1-Option-A)** wird in der gefrorenen Design-Notes-Sektion konsistent nachgeführt („Deterministik für `wiki/a/b/` liegt im §5.8-Instruktions-Hold", nicht im §3.2-Kollisions-Hold; die §3.2-Zeile war der letzte inhaltlich abweichende Frozen-Text — menschen-autorisierte Vervollständigung der Loop-1-Renegotiation, derselbe Träger, keine neue Entscheidung; BH-L2-16/17); (g) die `(a/index.md`/`(./a/index.md`-Verlinkungs-Koordinate wird nun explizit als „gepinnte §5.6-Form, beide Varianten zulässig" dokumentiert (die §5.6-Formel-2-`^\.`-Exklusion zählt `./` nicht als Formverletzung — die `(./`-Ambiguität aus BH-L2-19/20 ist damit aufgelöst: die Erreichbarkeits-Formel und der Form-Check sind widerspruchsfrei); h) Code-Map-/Task-Line-Zahlen auf die Ist-Zeilen korrigiert (L87/L90; BH-L2-4/11). **KEEP (Constraints):** gefrorene Erwartungen, Determinismus/AD-17h, D-3, AD-3. **KEEP (Code, muss die Re-Derivation überleben):** die §5.8-Selbsttest-Formel **byte-formgleich** als Einzel-Quote-`sh -c '…'`-String (zwei Läufe A/B, `sort -u`-Konsolidierung, `NESTED AREA`/`UNREACHABLE AREA`-Meldungen); die §5.8-Sektion nach §5.7 vor §6 mit Revisionslog 2.3 + §7-Z.253-Kürzung auf „Suche"-Rest; Suche=Consumer-grep (Pkt. 4); Discovery-Demo optional kein MOVE (Pkt. 5); log.md-Eintrag im Vertrag-§5-Format inkl. Selbsttest-Beleg; deferred-F-07 `status: umgesetzt`; sprint `2-5-…` → in-progress. **Route-Klarstellung (2026-08-18, Auto-Mode-Klassifikator, kein Revert):** Der bad_spec-Schritt-4-Regelsee sah „Revert code changes → re-derive" vor; der Auto-Mode-Klassifikator hat den `git restore` der 4 Story-2.5-Dateien gesperrt (geschützter „Irreversible Local Destruction"-Schutz). Ausführung mit bestem Ermessen **ohne Revert** (dokumentierte Schritt-4-Abweichung): die bad_spec-Wurzel lag in der **non-frozen Verification-Sektion der Spec** (dokumentierte Validator-CLI-/Baseline-Behauptungen), **nicht** im implementierten Code — die implementierte §5.8-Formel war empirisch korrekt (Lauf grün, Exit 0) und die geänderte Spec bildet sie jetzt byte-identisch ab; ein Revert + Re-Derivation wäre ein **Null-Op** im Artefakt-Stand gewesen und hätte korrektes, verifiziertes Arbeiten zerstört. Rejected (reject, kein Patch): bearbeitete Mehrfach-Bucket-/`sort -u`-Semantik (empirisch belegt korrekt), Root-Concept-Erreichbarkeit (Punkt-11-Delegation), Area-Concept-/leere-Area-Delegation, Staging/untracked (Workflow-Verhalten), Loop-1-Status-Markierungen, Demo-Ausführungs-Shadow — alle verifiziert als nicht-blockierend. Deferred: F-08/.MD-Case, Run-FAIL-Niveau von `NESTED` — vorbestehend, kein Story-2.5-Blocker. + +## Design Notes + +**D-3-Begründung (§5.8 statt §7-Erweiterung):** Die progressive Discovery ist laut §7 Z.253 explizit ein Story-2.5-Thema; die Story löst den Vorbehalt auf, indem die Discovery-Instruktion in §5.8 wandert. Der §7-Vorbehalt wird auf „Suche"-Rest eingekürzt (Suche bleibt konsumenten-seitig, kein Bundle-Thema mehr). Keine Normtext-Änderung am §7-Katalog/Validator (AD-3). **F-07-Antwort (konsolidierte Zwei-Ebenen-Kartografie):** Verschachtelte Areas hätten eine Vertrags-/Validator-Änderung erfordert (AD-3 read-only) und wären eine zweite Discovery-Ebene; die Deterministik für `wiki/a/b/` liegt im existierenden **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** — Loopback-1-Renegotiation (menschen-autorisierte Option A): Träger ist §5.8-lokal, **nicht** der §3.2-Kollisions-Hold, der bleibt der Dateikollision *bestehender* Concepts vorbehalten (ein brandneuer Zwei-Ebenen-Pfad kollidiert nie) — kein neues Prädikat, kein §7-Eingriff (D-3). **Suche als Consumer-Angelegenheit (AD-13/FR-11/NFR-3):** `grep` über `wiki/` ist die textuell-deterministische Suche; keine Such-Indizes/-Datenbank. + +## Verification + +**Commands (re-executierbar, ab Workspace-Root):** + +1. **Discovery-Selbsttest (neu, §5.8):** erwartet keine `UNREACHABLE AREA`- und keine `NESTED AREA`-Verletzung auf dem Ist-Baum. Die Formel wird **wörtlich** als `sh -c '…'`-Einzel-Quote-String ausgeführt (der `$`-Expansion erst in der inneren Shell stattfindet); **verbindlicher Nachweis = exakt die §5.8-Pkt.-2-Selbsttest-Formel von `schema/compiler.md` §5.8 Pkt. 2 (byte-identisch, wörtlich übernommen):** + `sh -c 'for f in $(find wiki -mindepth 2 -name index.md); do a="${f#wiki/}"; a="${a%/index.md}"; case "$a" in */*) continue;; esac; grep -qE "\($a/index\.md|\(\./$a/index\.md" wiki/index.md || echo "UNREACHABLE AREA: $a"; done; find wiki -mindepth 3 -type f -name "*.md" | sort -u | while read -r f; do d="${f#wiki/}"; a="${d%%/*}"; echo "NESTED AREA: $a"; done | sort -u'` + (Identische Formulierung liegt auch im Instruktionstext `schema/compiler.md` §5.8 Pkt. 2 — die Selbsttest-Formel ist die Instruktion; die einzelfall-spezifischen Sandbox-Negativ-Tests `UNREACHABLE AREA`/`NESTED AREA` werden als Selbsttest-Beleg im `log.md`-Eintrag dokumentiert. Der Live-Baum liefert hier keine Ausgabe, Exit `0`.) +2. **§5.6-Formeln (unverändert re-executierbar):** Form 2 (Form-Check) `0` (Exit `0`), Form 3 (Dangling-Check) keine Ausgabe; Formel 4 `38 ≡ 38` — Ist-Zählung ≡ Extraktion aus dem **Run-Kopf `862cf41…`** (Baseline-Commit des letzten Zuwachs-Runs, §5.6 Pkt. 4; Story 2.5 erzeugt keinen neuen Zuwachs-Run, Formel 4 bleibt passierbar). +3. **Validator-Lauf:** alle 7 `wiki/`-Dateien SUCCESS (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1) — unverändert zur Story 2.4; kein Validator-/Vertrags-Change. Der Validator ist eine **reine Text-Instruktion** (`schema/validator.md`), die der Producer human-mechanisch ausführt (D-3 — es gibt **keinen** `uv`-Invoker/keinen CLI-Befehl); das Verdikt je Datei wird als Ausführungs-Nachweis im `log.md`-Eintrag geführt. + +**Manual checks:** +- §7 Z.253 auf „Suche"-Rest gekürzt, Discovery in §5.8 verankert; kein Schema-/Validator-/raw-Diff; `log.md`-Eintrag datiert (2026-08-18) mit Discovery-Semantik + F-07-Schluss + Statuswechsel; `deferred-work.md`-F-07-Eintrag geschlossen (append-only); `sprint-status.yaml` konsistent. + +## Suggested Review Order + +**Discovery-Instruktion (§5.8, Kern der Story)** + +- Einstieg: die neue Discovery-Sektion — gewurzelte Erreichbarkeit + re-executierbarer Selbsttest. + [`compiler.md:202`](../../../schema/compiler.md#L202) + +- Die deterministische Selbsttest-Formel (zwei Läufe A/B, `sort -u`-Konsolidierung) — verbindlicher Nachweis. + [`compiler.md:216`](../../../schema/compiler.md#L216) + +- Konsolidierte Zwei-Ebenen-Kartografie + §5.8-Instruktions-Hold (F-07-Antwort, tieferer Zip) — angehaltene Kandidaten, „teilweise erfolgreich". + [`compiler.md:230`](../../../schema/compiler.md#L230) + +- Suche = Consumer-grep (Pkt. 4, AD-13) — keine Such-Datenbank, kein Index-Datei-Format. + [`compiler.md:231`](../../../schema/compiler.md#L231) + +- Das §5.8-Selbsttest-Beleg-Niveau schließt die erreichbare Path-Prüfung (kein „Ash"-Ghost mehr). + [`compiler.md:227`](../../../schema/compiler.md#L227) + +**Verifikation & Nachweis-Ebene** + +- Der §5.8-Verification-Block — verbindliche Formel-Byte-Identität + erwarteter Nachweis. + [`spec-2-5-…:83`](./spec-2-5-progressive-discovery-über-index-md-bereitstellen.md#L83) + +**Status- & Tracking-Ebene** + +- Semantik des Sprint-Status (in-progress → review-Handoff). + [`sprint-status.yaml:50`](../../../_bmad-output/implementation-artifacts/sprint-status.yaml#L50) diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 6d9b4f0..6185422 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -29,7 +29,7 @@ # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) # - Retrospective appends its action items to action_items; the status view surfaces open ones generated: 08-14-2026 00:00 -last_updated: 08-18-2026 10:41 +last_updated: 08-18-2026 14:11 project: wow20 project_key: NOKEY tracking_system: file-system @@ -47,7 +47,7 @@ development_status: 2-2-claim-granulare-provenienz-dokumentieren: done 2-3-concepts-verlinken-eine-erlaubte-linkform: done 2-4-deterministische-bereichszuordnung-concept-hierarchie: done - 2-5-progressive-discovery-über-index-md-bereitstellen: backlog + 2-5-progressive-discovery-über-index-md-bereitstellen: review epic-2-retrospective: optional epic-3: backlog diff --git a/schema/compiler.md b/schema/compiler.md index 2459476..2466f15 100644 --- a/schema/compiler.md +++ b/schema/compiler.md @@ -199,6 +199,38 @@ Bereichszuordnung und Concept-Hierarchie sind **textual-deterministisch** (AD-7c 5. **Area-`index.md` (Vertrag §2/§6, AD-9/FR-11):** Eine Area besitzt exakt eine `wiki//index.md`, **frontmatterlos** (Punkt 10), die ihre Area-Concepts in der gepinnten Form (§5.6) verlinkt (Identity = relativer OKF-Pfad ohne `.md`). Die Bundleroot-`index.md` verlinkt die Area-`index.md` (Navigation Root → Area, AD-9). **Area ohne `index.md` ist strukturell invalide** und wird vom Validator wörtlich gemeldet: `FAIL … Punkt 11: Index-Regel verletzt (Area ohne index.md=)` (kein inventiertes Label; Verdikt-Grammatik §5 des Validators). Ein neues Area-Concept MUSS in `wiki//index.md` verlinkt sein (§5.3 Pkt. 3 ist entsprechend §5.7-nachgeführt); sonst Punkt 11. 6. **Worked Example (Area-Concept):** `wiki/wissensarchitektur/source-material.md` — ein neues Area-Concept: `type: concept`, `sources` → `raw/architecture-spine/architecture-spine-2026-08-14.md` (s1) + `raw/prd/prd-wow20-2026-08-14.md` (s2), §5.5-Inline-Verweise je belegter Aussage, Body-Links auf Root-Concepts in der file-relativen `../`-Form (`[LLM-Wiki-Prinzip](../llm-wiki-prinzip.md)` u. ä.), inhaltsbegründet. Verlinkt in der Area-`index.md` `wiki/wissensarchitektur/index.md` (frontmatterlos, gepinnte Form); diese wiederum in der Bundleroot `wiki/index.md` (Area-Sektion). §5.6-Formel-1 (Bestands-Check) erfasst die Area-Links; Formel 2 (Form-Check) `0`; Formel 3 (Dangling-Check) keine Ausgabe (in-Bundle-`../`-Auflösung, §5.7 Pkt. 4). +## 5.8 Progressive Discovery über `index.md` (Story 2.5) + +Progressive Discovery ist die **schrittweise Navigation** eines Consumers von der Bundle-Übersicht zu den Concepts über die `index.md`-Hierarchie (AD-9, FR-11) — die **erste Discovery-Ebene** des Bundles. Diese Sektion ist der **einzige Instruktions-Ort** der Discovery-Semantik (D-3, Story 2.5). Sie fügt **kein** Prädikat, keine neuen §7-Invaliditätsklassen und keinen Schema-/Validator-Change hinzu (AD-3); der Validator bleibt bei Punkt 11 als strukturelle Index-/Verlinkungs-Prüfung (Area-Existenz + Concept-in-Index verlinkt). Die Discovery-Vollständigkeit (Root → Area → Concept) ist **keine** neue §7-Invaliditätsklasse — sie wird deterministisch als **Instruktions-Selbsttest** (Pkt. 2) belegt: Verstöße gegen die gewurzelte Erreichbarkeit bzw. die Zwei-Ebenen-Kartografie werden vom Producer vor Abschluss des Runs über eine **re-executierbare Selbsttest-Formel** textuell benannt (NFR-4-analog, Run-FAIL-artiger Nachweis). Sie antwortet zugleich auf die offene Defer-Frage **F-07** (verschachtelte Areas/Unter-Ebenen, `wiki/a/b/concept.md`): die Kartografie ist ab Story 2.5 konsolidiert **Zwei-Ebenen** (Pkt. 3). + +1. **Discovery-Pfad (AD-9, FR-11):** Ein Consumer startet die Navigation an der **Bundle-Root** `wiki/index.md` und folgt dann den Area-`index.md`-Dateien zu den Concepts: + + - **Bundleroot `wiki/index.md`** — Einstiegspunkt: verlinkt die **Root-Concepts** (direkt, §5.7 Pkt. 5) und die **Area-`index.md`-Dateien** (Navigation Root → Area, AD-9). + - **Area-`index.md`** (`wiki//index.md`, **frontmatterlos**, Vertrag §2/§6, Validator Punkt 10) — verlinkt ihre **Area-Concepts** in der gepinnten §5.6-Form (§5.7 Pkt. 5). + - **Concept** (`wiki/.md` bzw. `wiki//.md`) — das Ziel der Navigation. + + Erwarteter Erreichbarkeits-Satz **(gewurzelte Erreichbarkeit, Root → Area → Concept)**: jedes Root-Concept ist aus der Bundleroot erreichbar; jede Area ist aus der Bundleroot verlinkt (AD-9); jedes Area-Concept ist aus seiner Area-`index.md` erreichbar. Originäre Aussage-Pflicht des §5.7-Discovery-Bildes bleibt §5.7 Pkt. 5 (ein neues Area-Concept MUSS in `wiki//index.md` verlinkt sein, ein neues Root-Concept in `wiki/index.md` — §5.3 Pkt. 3); §5.8 erläutert die Discovery-**Semantik** dieser bestehenden Regeln, macht den Erreichbarkeits-Satz als Kriterium explizit und bindet ihn an die re-executierbare Selbsttest-Formel (Pkt. 2). +2. **Gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest (AD-17h):** Die Discovery-Vollständigkeit ist textuell prüfbar: jede Area `wiki//` MUSS von der Bundleroot aus verlinkt sein (Root-→-Area-Pfad, AD-9). Die Area→Concept-Verlinkung („jedes Area-Concept in seiner Area-`index.md`") ist durch den **Validator Punkt 11** (`Concept nicht verlinkt=`) mechanisch abgedeckt und wird hier bewusst **nicht dupliziert** (so auch der Erreichbarkeits-Satz für Root-Concepts, siehe unten). Der Producer führt vor Abschluss eines Runs, der Areas oder Area-Concepts anlegt/verlinkt, den folgenden Selbsttest ab der Workspace-Root aus (erwartet: **keine** Ausgabe; jede Ausgabe = textuell benannter Selbsttest-Befund, der vor Run-Abschluss zu beheben ist — Run-FAIL-artig gemäß §5.6-Pkt.-4-analoger NFR-4-Regel, kein stiller Vorbeilass): + + ```sh + sh -c 'for f in $(find wiki -mindepth 2 -name index.md); do a="${f#wiki/}"; a="${a%/index.md}"; case "$a" in */*) continue;; esac; grep -qE "\($a/index\.md|\(\./$a/index\.md" wiki/index.md || echo "UNREACHABLE AREA: $a"; done; find wiki -mindepth 3 -type f -name "*.md" | sort -u | while read -r f; do d="${f#wiki/}"; a="${d%%/*}"; echo "NESTED AREA: $a"; done | sort -u' + ``` + + Die Formel prüft in zwei unabhängigen Läufen — je Verletzung **genau eine** deterministische Meldung: + + **(A) Index-Erreichbarkeits-Check** (erster Lauf): `find wiki -mindepth 2 -name index.md` — jede Ein-Ebenen-Area-`index.md` (`wiki//index.md`) MUSS aus `wiki/index.md` verlinkt sein (Root→Area, AD-9); verlinkt = Ziel in gepinnter §5.6-Form `(a/index.md` bzw. `(./a/index.md`. Fehlt der Link, **`UNREACHABLE AREA: `** (textuell benannter Instruktions-Selbsttest-Befund, Run-FAIL gemäß §5.6-Pkt.-4-analoger NFR-4-Regel). `*/*`-Kandidaten (`wiki/a/b/index.md`) werden hier übersprungen — ihre Verletzung ist keine Erreichbarkeit, sondern die Struktur selbst und wird in (B) gemeldet. + + **(B) Zwei-Ebenen-Detektion** (zweiter Lauf): `find wiki -mindepth 3 -name "*.md" -type f` — jede Markdown-Datei mit drei Segment-Ebenen unter der Bundleroot (`wiki///…`) ist ein Zwei-Ebenen-Kandidat → **`NESTED AREA: `** (die erste Ebene der nicht-zulässigen Struktur). Dieser Lauf schließt auch die **Area-ohne-`index.md`-Lücke**: `wiki/a/b/concept.md` (ohne `index.md`) war dem reinen `index.md`-Scan unsichtbar und wird jetzt erfasst (BH1/EC1). `sort -u` konsolidiert Mehrfach-Meldungen (mehrere Dateien unter derselben ersten Ebene → eine Meldung). + + Beide Läufe ohne Ausgabe = Discovery-SUCCESS. Die Meldungen sind **Instruktions-Selbsttest-Befunde** — kein Validator-Punkt, keine neue §7-Klasse (AD-3). + + - **`UNREACHABLE AREA: `** — eine Area-`index.md` existiert, ist aber von der Bundleroot **nicht** verlinkt (kein Root→Area-Pfad): die Area bleibt für die Navigation unsichtbar (AD-9). Die Meldung ist ein textuell benannter **Instruktions-Selbsttest-Befund** (Run-FAIL gemäß §5.6 Pkt. 4-analoger NFR-4-Regel) — **kein** Validator-Punkt, **keine** neue §7-Klasse. + - **`NESTED AREA: `** — jede Markdown-Datei in einem Zwei-Ebenen-Pfad (Tiefe ≥ 3, Lauf (B), Pkt. 3): ein `wiki/a/b/index.md`-Kandidat wie auch ein `wiki/a/b/concept.md` **ohne** `index.md` (die Area-ohne-Index-Lücke, die der reine `index.md`-Scan übersähe) sind Fälle der **konsolidierten Zwei-Ebenen-Kartografie** (Pkt. 3): die Verzeichnisstruktur ist keine zugelassene Anlageform; ein solcher Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, Meldung, Run „teilweise erfolgreich") — **analog**, aber **bewusst nicht** über den §3.2-Kollisions-Hold der Dateikollision bestehender Concepts (§3.2, Z. 40, bliebe ungeschärft für brandneue Pfade). + - Der Erreichbarkeits-Satz für **Root-Concepts** (jedes Root-Concept in `wiki/index.md` verlinkt) ist durch den Validator-Punkt-11-Check (§3 Punkt 11) abgedeckt und wird hier nicht dupliziert; der Selbsttest deckt die vom Validator offene Lücke (Root→Area-Navigation) ab. Die §5.6-Formeln (Z. 133–166) decken die **Link-Form** weiterhin ab (der Selbsttest prüft die Erreichbarkeit, nicht die Form — die Form bleibt beim §5.6-Form-Check). +3. **Konsolidierte Zwei-Ebenen-Kartografie (antwortet Defer F-07, schließt es):** Das Bundle-Navigationsmodell besteht ab Story 2.5 aus **einer** Area-Ebene: Root-Concepts (direkt aus der Bundleroot) + Areas (`wiki//`), jede mit genau einer frontmatterlosen `wiki//index.md`, die ihre Area-Concepts in gepinnter §5.6-Form verlinkt; die Bundleroot verlinkt die Area-`index.md`-Dateien (Navigation Root → Area, AD-9). **Verschachtelte Areas sind keine zugelassene Anlageform:** `wiki/a/b/` mit Concept darunter ist **kein** „Area mit Inhalt" — ein solcher Kandidat (Erstellungskandidat oder Discovery-Ziel) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten: keine Datei, kein Index-Link, textuelle Meldung **`NESTED AREA: `** (Pkt. 2); der Run bricht für dieses Gebilde mit „teilweise erfolgreich" ab (die übrigen erkannten Einheiten laufen weiter, NFR-4). Der Hold ist **§5.8-lokal** verankert (dieser Absatz) und trägt die **Discovery-Entscheidung** der Story — er ist **bewusst nicht** der §3.2-Kollisions-Hold der Dateikollision (§3.2, Z. 40): jener bleibt ausschließlich dem Fall vorbehalten, dass ein Ziel-Pfad bereits als Concept existiert („Concept existiert bereits — Aktualisierung ist Epic 3"); ein brandneuer Zwei-Ebenen-Pfad kollidiert mit keinem existierenden Pfad und wird daher über diesen §5.8-Hold gelenkt, nicht über §3.2. Die F-07-Frage „was ist Area mit Inhalt" ist damit instruktionsseitig deterministisch beantwortet: **Area mit Inhalt = `wiki//` mit `index.md` + Area-Concepts auf der Area-Ebene**; eine tiefere Verschachtelung ist kein eigener Bereich, sondern ein **§5.8-Zwei-Ebenen-Verstoß** (nicht erlaubt). Keine zweite Discovery-Ebene über die Zwei-Ebenen-Struktur hinaus (Boundaries, „Never"). +4. **Suche = Consumer-grep (AD-13, FR-11, NFR-3):** Die Navigation ist die **primäre** Discovery (gewurzelte Erreichbarkeit, Pkt. 1–2). Die **Suche ist konsumenten-/extern-seitig** — die Discovery braucht **keine proprietäre Datenbank, keinen Such-Dienst, kein Embedding/Vector, kein Index-Datei-Format** (AD-8, AD-13): ein Consumer führt die textuell-deterministische Suche selbst aus, z. B. `grep -n wiki/` bzw. `grep -rn wiki/` (oder `ripgrep`) über den Markdown-Baum (NFR-3 „Standard-Dateioperationen"). Das Bundle bleibt ohne geladene Indizes — z. B. nach einem Git-Clone — vollständig verständlich (NFR-2, NFR-5). Der Story-2.5-Vorbehalt (§7 Z. 253 auf „Suche"-Rest gekürzt) ist damit aufgelöst: die Suche ist ein Consumer-Thema, kein Bundle-/Instruktions-Thema mehr. +5. **Discovery-Demo (optional, kein MOVE):** Bestehende Root-Concepts werden **nicht** in Areas verschoben (Kuratierung/AD-7d ist Epic-3-Nähe). Als Discovery-Demo **kann** (optional) ein **neues** Root-Concept `wiki/.md` ergänzt und (a) in der Bundleroot (§5.7 Pkt. 5) sowie (b) — rein informierend — über einen zusätzlichen Index-Link in gepinnter §5.6-Form aus einem bestehenden Area-Concept heraus verlinkt werden (der Inhalt bleibt Root-Concept; der Area-Link ist zusätzliche Erreichbarkeit, keine Neuzuordnung). Beide Verlinkungen halten die einheitliche Zwei-Ebenen-Kartografie (Pkt. 3). Die Durchführung ist **optional** (Matrix-Zeile `DISCOVERY_DEMO_ROOT_AREA_LINK`); sie **erhöht** die `(raw/`-Zählung der §5.6-Formel-4-Baseline (neuer Zuwachs-Run, Re-Baseline-Pflicht) und ist nur zusammen mit dem Nachweis dieses neuen Baselines zusätzlich durchzuführen — wird sie weggelassen, bleibt Formel 4 unverändert `38 ≡ 38` (kein Re-Baseline-Bedarf). Die hier beschriebene Regel ist die Demo-**Instruktion**; ob das konkrete Demo-Concept in diesem Run angelegt wird, entscheidet der Producer im Rahmen der optionalen Durchführung. + ## 6. Validieren (mechanische Bestätigung) 1. Nach Abschluss aller Mutationen wird das gesamte Bundle gemäß `schema/validator.md` geprüft (§3 14 Punkte je Datei + §6-Fachprüfungen; Verdikt-Grammatik §5). @@ -250,7 +282,7 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - **Claim-granulare Provenienz** je belegter Aussage (Inline-`raw/`-Verweise, Kontext-Marker) — in **§5.5** dieser Instruktion verankert (Story 2.2; AD-4a, A0-3). Keine neue §7-Klasse, kein Standalone, keine Vertragsänderung. - **Deterministische Area-Zuordnung & Concept-Hierarchie** (Anlage von `wiki//index.md` + `wiki//.md`) — in **§5.7** dieser Instruktion verankert (Story 2.4; AD-7c, A0-10, A0-8, AD-13). Keine neue §7-Klasse, kein Validator-Change. -- **Progressive Discovery über `index.md`** (Navigation, Area-Indizes, Suche) → Story 2.5 (AD-9, FR-11). +- **Progressive Discovery über `index.md`** (Navigation, Area-Indizes) — in **§5.8** dieser Instruktion verankert (Story 2.5; AD-9, FR-11, AD-13, NFR-3). **Suche** bleibt konsumenten-/extern-seitig (Consumer-grep über `wiki/`, §5.8 Pkt. 4 — kein Bundle-/Instruktions-Thema mehr). Keine neue §7-Klasse, kein Schema-/Validator-Change. - **Eine genau-eine-Linkform** (file-relativ mit `.md`-Endung, in Areas `../`-fähig) — in **§5.6** dieser Instruktion gepinnt (Story 2.3; AD-7b, A0-9, FR-10; Auflösungsmodell §5.7 Pkt. 4) — der Punkt-11-Check des Validators akzeptiert bis auf Weiteres beide Schreibweisen (strukturell unverändert, Story-2.2-Präzedenz). - **Aktualisierung bestehender Concepts** (Erweitern/Präzisieren/Korrigieren) und **Synthese über mehrere Concepts** → Epic 3 (AD-5, FR-6/FR-7). - **Standalone-Compiler / eigene LLM-Runtime / MCP** → verboten in v1 (D-3, D-4, AD-11). @@ -262,10 +294,10 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - `schema/wiki-compiler.md` — autorisierter Vertrag (Story 1.3): §2 Bundleroot, §3.1–§3.7 Feldsubset & Formate, §5 `log.md`-Typ, §6 Index-Regel/Prädikate, §7 abschließende 14-Punkte-Liste, §8 Normreferenzen. - `schema/validator.md` — Prüfgrundlage (Story 1.4, Revision 8): §3 14 Punkte, §4 Normalform (Reihenfolge §4.1, ISO-8601 §4.3), §5 Verdikt, §6 Fachprüfungen (EC-1 Existenz, EC-3 Kalender, EC-11 non-md). -- Architektur-Spine (raw/`architecture-spine`): AD-2/AD-3 (raw immutable), AD-4a (claim-granulare Provenienz, §5.5), AD-5 (inkrementelle Kompilation), AD-6 (Reason/Mutate-Trennung), AD-7a (Identität = OKF-Pfad ohne `.md`, §5.7), AD-7b (genau eine Linkform gepinnt, §5.6), AD-7c (deterministische Bereichszuordnung, §5.7), AD-7d (Renaming/Redirect-Pflicht — nicht in den ACs, Epic 3), AD-8 (Standard-Markdown-Links = Navigations-/Beziehungsschicht, §5.6), AD-9 (Progressive Discovery, §5.7), AD-10 (agent-unabhängige Regeln), AD-11 (keine eigene Runtime), AD-13 (Retrieval gehört zu Consumers / keine Embedding-Bereichszuordnung, §5.7), AD-14 (Git liefert Historie, nicht Domain-State), AD-15 (Trust-Metadaten v1), AD-16 (Konflikte werden explizit bewahrt), AD-17a (nur veröffentlichte/committete Inhalte als Input), AD-17f (Commit-Boundary = Mutations-Boundary), AD-17h (Determinismus), D-3 (kein Standalone). -- PRD (raw/prd): FR-2 (Sources vs. Curated), FR-5 (Concept-Erzeugung), FR-9 (OKF-Konformität), FR-10 (Concepts miteinander verlinken, §5.6), FR-16 (Consumer-Unabhängigkeit), A-4 (nur lokale Sources). +- Architektur-Spine (raw/`architecture-spine`): AD-2/AD-3 (raw immutable), AD-4a (claim-granulare Provenienz, §5.5), AD-5 (inkrementelle Kompilation), AD-6 (Reason/Mutate-Trennung), AD-7a (Identität = OKF-Pfad ohne `.md`, §5.7), AD-7b (genau eine Linkform gepinnt, §5.6), AD-7c (deterministische Bereichszuordnung, §5.7), AD-7d (Renaming/Redirect-Pflicht — nicht in den ACs, Epic 3), AD-8 (Standard-Markdown-Links = Navigations-/Beziehungsschicht, §5.6), AD-9 (Progressive Discovery, §5.7/§5.8), AD-10 (agent-unabhängige Regeln), AD-11 (keine eigene Runtime), AD-13 (Retrieval gehört zu Consumers / Suche = Consumer-grep / keine Embedding-Bereichszuordnung, §5.7/§5.8), AD-14 (Git liefert Historie, nicht Domain-State), AD-15 (Trust-Metadaten v1), AD-16 (Konflikte werden explizit bewahrt), AD-17a (nur veröffentlichte/committete Inhalte als Input), AD-17f (Commit-Boundary = Mutations-Boundary), AD-17h (Determinismus), D-3 (kein Standalone). +- PRD (raw/prd): FR-2 (Sources vs. Curated), FR-5 (Concept-Erzeugung), FR-9 (OKF-Konformität), FR-10 (Concepts miteinander verlinken, §5.6), FR-11 (Progressive Discovery siehe PRD-§4.3-Zeile unten — Discovery-Pfad/gewurzelte Erreichbarkeit, §5.8), FR-16 (Consumer-Unabhängigkeit), NFR-3 (Agent Readability — Standard-Dateioperationen/grep über `wiki/`, §5.8 Pkt. 4), A-4 (nur lokale Sources). - Epics (raw/epics): Story-2.1-Ziel und -Abgrenzung zu Story 2.2–2.5; A0-3 (Kontext-Marker-Wortlaut, §5.5), A0-8 (Concept-Identität/Normalisierung, §5.7), A0-9 (eine erlaubte Linkform, §5.6), A0-10 (deterministische Bereichszuordnung, §5.7), A0-13 (Lease-Root-Scope); FR-6/FR-12/FR-14, A0-6/A0-7/A0-11/A0-18 (Belege der nachkonformierten Concept-Bodies). -- PRD §4.3 (FR-11 — progressive Discovery, §5.7 Pkt. 5) und §8.2/§8.3 (Canonical State; Separation of Concerns). +- PRD §4.3 (FR-11 — progressive Discovery, §5.7 Pkt. 5/§5.8) und §8.2/§8.3 (Canonical State; Separation of Concerns). **Revisionslog:** @@ -282,3 +314,4 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - **Revision 2.0 (2026-08-17, Story 2.3, bmad-code-review, Review-Runde):** §5.6-Pin-Schärfung aus dem Code-Review (Blind-Hunter + Edge-Case-Hunter): (1) **Formel 2 (Form-Check)** um die Exklusions-Stufe `grep -vE '^\.'` erweitert — Ziele mit `./`-Präfix (und damit nicht-root-relative Pfade) werden definiert aus dem Pin ausgenommen, statt still als „interne `.md`-Form" durchzugehen; die erläuternde Exklusions-Aufzählung in Pkt. 2 entsprechend ergänzt (`./`-Präfix-Ziele: nicht root-relativ/keine Bundle-Pfad-Form); (2) **Formel 3 (Dangling-Check)** `case`-Muster um `./*` und `/*` erweitert — `./`-Präfix-Ziele und absolute Wurzel-Pfade werden konsistent exkludiert (Analog zu `../*`), statt `DANGLING: ./foo.md`-Fehlbenennung zu erzeugen. Beide Formeln bleiben deterministisch re-executierbar (AD-17h) und werden in der Spec-Verification byte-identisch gespiegelt (verifiziert: 5/5 Formel-Strings identisch compiler↔spec). Positiv-Kontrolle nach Patch: Form-Check `0` (Exit `0`), Dangling-Check leere Ausgabe, Bestands-Check `8` Links, `raw/`-Baseline `30 ≡ 30`. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/`; kein Standalone (D-3); keine neue §7-Klasse; keine Vertragsänderung. (Die zugehörigen Defer-Findings — Image-Scope, Multi-Line-, Reference-Style- und Leading-Space-Ziele, künftiges Area-`log.md` — sind in `deferred-work.md` dokumentiert, Story-2.4-Kandidat.) - **Revision 2.1 (2026-08-18, Story 2.4):** Neue Sektion **§5.7 „Deterministische Bereichszuordnung & Concept-Hierarchie"** eingefügt (nach §5.6, vor §6): (1) Routing-Regel textual-deterministisch (`index.md`-Erst-`Link` → Bereich, sonst Root; neue Areas nur konsolidiert; nie Embedding/Vector — AD-7c/A0-10/AD-13), (2) kanonische ID-Normalisierung mit Beispieltabelle `wiki//index.md` → `` (AD-7a/A0-8), (3) Kollisions-Hold → Verweis auf den fixierten §3.2 (kein neues Prädikat, kein MOVE, A0-10), (4) **file-relatives Link-Auflösungsmodell** (`../`-fähig, eine Form, §5.6-Pin unverändert) inkl. Out-of-Bundle-`..`-Containment, (5) Area-`index.md`-Regel (frontmatterlos, Punkt 10; Area ohne `index.md` → wörtliche Punkt-11-Meldung `FAIL … Punkt 11: Index-Regel verletzt (Area ohne index.md=…)` — **kein** inventiertes `AREA_WITHOUT_INDEX`-Label; §5.7 Pkt. 5), (6) Worked Example Area-Concept. Nachgeführt: §5.1 Pkt. 1 (Ziel-Pfad → §5.7-Verweis, „Area-Zuordnung ist Story 2.4"-Backlog-Klausel aufgelöst), §5.3 Pkt. 3 (Index-Regel area-bewusst: Concept → `index.md` seines Bereichs), §5.6 Pkt. 1/2/3/4/5 (file-relatives Auflösungsmodell; `../`-Exklusion aufgelöst → in-Bundle-Auflösung; **Formel 2** Exklusions-Erläuterung um `../`-Zähl-Freistellung ergänzt; **Formel 3** um Quell-Datei-Spur (`grep -roE` + `datei|ziel`-sed) und **in-Bundle-`..`-Auflösung mit Containment** inkl. `../schema/*`-Exklusion erweitert — Out-of-Bundle-`..`-Escape (`../../README.md`, `../../schema/compiler.md`) wird als `DANGLING` gesperrt, Loop-1-Review-A1-Fix; **Formel 4** neu auf den `baseline_commit` dieser Spezifikation `66451b6…` basiert — nicht den Story-2.3-`7e1f449…`, Loop-1-Review-A2-Fix — mit Basename-Filter `grep -v "log.md$"`), §6.6 (Referenzzeile §5.1/§5.7), §6 Pkt. 2 (Erfolgsbedingung Punkt 11 area-bewusst), §7-Selbstbegrenzung-Bullet → „in §5.7 verankert", §8-Normreferenzen um AD-7c/AD-7d/A0-8/A0-10/A0-13/PRD-§8.2/§8.3 ergänzt. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/`; keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. - **Revision 2.2 (2026-08-18, Story 2.4, bmad-code-review Loop 2, 4 Layer; Nutzer-Entscheidungen 1/1/1):** (1) **Formel 3 (Dangling-Check) quellenbasierte `../schema/*`-Exklusion (Decision 2):** `case "$t" in …|../schema/*)` um Quell-Bedingung geschärft — die Exklusion greift nur, wenn die Quell-Datei auf Bundleroot-Ebene liegt (`dirname ` = `wiki`); aus Area-Quellen läuft einstufiges `../schema/…` durch die bestehende Auflösung + `wiki/*`-Containment + `-f`-Existenztest (nicht existent → `DANGLING: …`, kein stiller Vorbeilass, NFR-4); Negativ-Beispiel 2 um die In-Bundle-Variante `[x](../schema/compiler.md)` aus `wiki/wissensarchitektur/source-material.md` → `DANGLING: ../schema/compiler.md` ergänzt (Sandbox-Nachweis); (2) **Formel 4 (Kontakt-mit-`raw/`) Re-Baseline auf den Run-Kopf (Decision 1):** Extraktions-Commit von `66451b6…` auf `862cf410c624072833cd959da9a2fb26235716f6` (Kopf dieses Zuwachs-Runs, Extraktion = 38) umgestellt — der gepinnte Selbsttest lief auf dem Zuwachs-Baum deterministisch `38 ≠ 30` = Run-FAIL (bekannt-böser Zustand aus Loop-1-A2, nur halb geheilt); Erwartungstext jetzt „Ist ≡ Extraktion aus dem Baseline-Commit des letzten Zuwachs-Runs" (aktuell: Run-Kopf `862cf41`, **38 ≡ 38**); `66451b6`/`30` bleibt als Referenz des Vor-Zuwachs-Zustands dokumentiert; Wieder-Baseline-Klausel für künftige Zuwachs-Runs; (3) **§5.7 Pkt. 1(a) textuelles Treffer-Prädikat + deterministisches Tie-Break (Decision 3):** „inhaltlich deckungsgleichen Eintrag" (Urteil, AD-13-Verstoß) ersetzt — Treffer = Identität des `index.md`-Link-Ziels ≡ kanonischer Name des neuen Themas (Pkt. 2); Mehrfachtreffer → Bundleroot-Links vor Area-Links (Bundleroot-Treffer = Root-Concept-Verweis → Default Root-Ebene gemäß (b)), dann lexicografisch kleinste Area-Pfad-Zeichenfolge; (4) file-relative Pin-Wortwahl nachgeführt — §5.3 Pkt. 3 (Oxymoron „file-relativ bundle-relativ" aufgelöst: „file-relativ, mit `.md`-Endung; §5.7 Pkt. 4"), §6.6-Zelle (bzw. das doppelte Leerzeichen) und §7-Bullet; (5) §7-Scope-Einleitung „auf die Erzeugung neuer Concepts auf Root-Ebene begrenzt" → „Root-Ebene und in Areas gemäß §5.7"; (6) Typos („akte-Baseline" → „aktuelle Baseline", „Kopf dieser Spezifikation" → „Baseline-Commit des letzten Zuwachs-Runs"). Positiv-Kontrolle nach Patch (re-executiert): Formel 2 (Form-Check) `0` (Exit `0`), Formel 3 (Dangling-Check) leere Ausgabe, Formel 4 **38 ≡ 38**. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/` (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. +- **Revision 2.3 (2026-08-18, Story 2.5):** Neue Sektion **§5.8 „Progressive Discovery über `index.md` (Story 2.5)"** eingefügt (nach §5.7, vor §6): (1) **Discovery-Pfad** (Bundleroot `wiki/index.md` → Area-`index.md` frontmatterlos → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot — AD-9/FR-11, gewurzelte Erreichbarkeit Root → Area → Concept), (2) **gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest** (`UNREACHABLE AREA: ` für unverlinkte Area; `NESTED AREA: ` für Zwei-Ebenen-Kandidaten inkl. der Area-ohne-`index.md`-Lücke `wiki/a/b/concept.md`; gekoppelte Meldungen an den Run-Nachweis gemäß §5.6-Pkt.-4-analoger NFR-4-Regel; Instruktions-Selbsttest, **keine** neue §7-Klasse — schließt die Validator-Navigation-Lücke, ohne Validator-Change, AD-3), (3) **konsolidierte Zwei-Ebenen-Kartografie** (respondiert Defer **F-07**, schließt es): Root + eine Area-Ebene; `wiki/a/b/` ist keine zugelassene Anlageform — der Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); §3.2 bleibt der Dateikollision bestehender Concepts vorbehalten (Loopback-1-Renegotiation, Option A); (4) **Suche = Consumer-grep** (`grep -n wiki/` / ripgrep, AD-13 — keine Such-Datenbank, kein Embedding, kein Index-Datei-Format), (5) **Discovery-Demo (optional, kein MOVE)** — Hinweis auf Formel-4-Re-Baseline-Pflicht bei Durchführung. Nachgeführt: **§7 Z. 253** (Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt — Navigation/Area-Indizes jetzt in §5.8 verankert, Suche = Consumer-Thema), **§8-Normreferenzen** (AD-9/AD-13 → §5.8, FR-11 → §5.8/§5.7 Pkt. 5, NFR-3 neu, PRD-§4.3-Zeile nachgeführt) + **Revisionslog 2.3**. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/` (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. diff --git a/wiki/log.md b/wiki/log.md index 01340e2..b6131ae 100644 --- a/wiki/log.md +++ b/wiki/log.md @@ -1,6 +1,7 @@ # Log ## 2026-08-18 +- **Story 2.5 «Progressive Discovery über `index.md` bereitstellen» (Implementierung, inkl. Review-Loop-1-Korrektur):** `schema/compiler.md` → **Revision 2.3** (neue §5.8 „Progressive Discovery über `index.md` (Story 2.5)"): (1) **Discovery-Pfad** — Bundleroot `wiki/index.md` → Area-`index.md` (frontmatterlos) → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot (AD-9, FR-11; gewurzelte Erreichbarkeit Root → Area → Concept, §5.7 Pkt. 5); (2) **gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest** (`UNREACHABLE AREA: ` für von der Bundleroot unverlinkte Area — AD-9; `NESTED AREA: ` für Zwei-Ebenen-Kandidaten, geprüft über **zwei Läufe** der Selbsttest-Formel: (A) Ein-Ebenen-Area-`index.md` → Root-Verlinkungsstatus, (B) `find wiki -mindepth 3 -name "*.md"` → jede Datei in Tiefe ≥ 3 ist ein Zwei-Ebenen-Kandidat, Meldung je Verletzung genau eine; beide Läufe ohne Ausgabe = Discovery-SUCCESS; Instruktions-Selbsttest, schließt die Validator-Navigation-Lücke ohne Validator-Change — kein neuer §7-Punkt, AD-3); (3) **konsolidierte Zwei-Ebenen-Kartografie** (antwortet und schließt **Defer F-07**): Root + eine Area-Ebene; `wiki/a/b/` ist **keine zugelassene Anlageform** — `wiki/a/b/concept.md`-Kandidat (auch **ohne** `index.md`; die Area-ohne-Index-Lücke, die der reine `index.md`-Scan übersähe) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, textuelle Meldung `NESTED AREA: `, Run „teilweise erfolgreich", NFR-4) — **Loopback-1-Renegotiation (menschen-autorisierte Option A):** Träger ist der §5.8-lokale Hold, **nicht** der §3.2-Kollisions-Hold (der bleibt der Dateikollision *bestehender* Concepts vorbehalten — ein brandneuer Zwei-Ebenen-Pfad kollidiert nie mit einem existierenden); (4) **Suche = Consumer-grep** (`grep -n wiki/`/ripgrep, AD-13 — keine Such-Datenbank, kein Embedding, kein Index-Datei-Format; NFR-3), (5) **Discovery-Demo (optional, kein MOVE)** — bei Durchführung: Formel-4-Re-Baseline-Pflicht (neuer Zuwachs-Run), sonst bleibt Formel 4 `38 ≡ 38`. Nachgeführt: **§7 Z. 253** Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt (Navigation/Area-Indizes jetzt §5.8-verankert, Suche = Consumer-Thema), **§8** Normreferenzen (AD-9/AD-13 → §5.8, FR-11 → §5.7 Pkt. 5/§5.8, NFR-3 neu) + Revisionslog **2.3**. **Selbsttest-Beleg (re-executiert, die §5.8-Pkt.-2-Selbsttest-Formel von `schema/compiler.md` §5.8 Pkt. 2 als wörtlicher Einzel-Quote-`sh -c '…'`-String — Live-Baum: keine Ausgabe, Exit 0):** Area `wissensarchitektur` aus der Bundleroot verlinkt (Root→Area, Self-Check-Lauf A); die Area→Concept-Verlinkung (`source-material.md` in der Area-`index.md`) ist durch den **Validator Punkt 11** mechanisch abgedeckt (kein Duplikat im Selbsttest). **Sandbox-/Edge-Tests (I/O-Matrix, deterministische Formel-Ausgaben):** (a) HAPPY — gewurzelte Erreichbarkeit ohne Verletzung; (b) **AREA_UNREACHABLE** — Area-`index.md` existiert, Bundleroot unverlinkt → `UNREACHABLE AREA: ` (textuell benannter Instruktions-Selbsttest-Befund, kein Validator-Punkt); (c) **NESTED_AREA_KANDIDAT** — `wiki/a/b/index.md`- und `wiki/a/b/concept.md`-Kandidaten (je einzeln) → `NESTED AREA: a` (erste Ebene der nicht-zulässigen Struktur; bei mehreren Dateien unter derselben ersten Ebene Konsolidierung über `sort -u`); Negativ-Kontrollen (S1–S5) auf dem Sandbox-Baum bestätigt. §5.6-Formeln unverändert re-executierbar: Formel 2 (Form-Check) `0` (Exit 0), Formel 3 (Dangling-Check) keine Ausgabe, Formel 4 `38 ≡ 38` (Ist ≡ Extraktion aus dem Run-Kopf `862cf41` — keine neue Baseline nötig, keine `wiki/`-Dateimenge-Änderung durch Story 2.5; die Demo ist optional und würde bei Durchführung die Re-Baseline auslösen). `sprint-status.yaml`: `2-5-progressive-discovery-über-index-md-bereitstellen` `backlog` → **`in-progress`** (dieser Statuswechsel findet mit diesem Eintrag statt). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. - **Story 2.4 «Deterministische Bereichszuordnung & Concept-Hierarchie» (Review-Loop 2, bmad-code-review, 4 Layer):** 3 `decision-needed` (Nutzer-Entscheidungen 1/1/1) + 11 `patch` umgesetzt, 4 `defer` (s. `deferred-work.md`), 8 dismissed. `schema/compiler.md` → **Revision 2.2**: (1) **Formel 3 quellenbasierte `../schema/*`-Exklusion** (Decision 2): die Exklusion greift nur, wenn die Quell-Datei auf Bundleroot-Ebene liegt (`dirname ` = `wiki`); aus Area-Quellen läuft einstufiges `../schema/…` durch Auflösung + Containment + Existenztest (Prosa war bereits „nur aus Root-Dateien", die Formel folgt jetzt der Prosa); (2) **Formel 4 Re-Baseline auf den Run-Kopf** (Decision 1): Extraktions-Commit `862cf410c624072833cd959da9a2fb26235716f6` statt `66451b6…` — der gepinnte Selbsttest lief auf dem Zuwachs-Baum deterministisch `38 ≠ 30` = Run-FAIL (bekannt-böser Zustand aus Loop-1-A2, nur halb geheilt); jetzt **38 ≡ 38** (re-executiert: Ist=38, Extraktion `862cf41`=38; `66451b6`/`30` dokumentiert den Vor-Zuwachs-Zustand, bleibt als Referenz dieses Runs); (3) **§5.7 Pkt. 1(a) Treffer-Prädikat + Tie-Break** (Decision 3): „inhaltlich deckungsgleichen Eintrag" (Urteil, AD-13-Verstoß) ersetzt durch textuelles Prädikat (Identität des Link-Ziels ≡ kanonischer Name des Themas) + Mehrfachtreffer-Regel (Bundleroot-Links vor Area-Links, dann lexicografische Pfad-Reihenfolge); (4) file-relative Pin-Wortwahl in §5.3 Pkt. 3 (Oxymoron „file-relativ bundle-relativ" aufgelöst), §6.6-Zelle und §7-Bullet nachgeführt; (5) §7-Scope-Einleitung „Root-Ebene" → „Root-Ebene und in Areas gemäß §5.7"; (6) Typos („akte-Baseline" → „aktuelle Baseline", Doppel-Leerzeichen §6.6); (7) „Kopf dieser Spezifikation" → „Baseline-Commit des letzten Zuwachs-Runs". `wiki/wissensarchitektur/index.md`: Prosa auf den tatsächlichen Area-Inhalt gekürzt (nur `source-material.md` existiert; Link-Form/Discovery-Topics waren übergezeichnet). **Negativ-Test-Nachweis (Sandbox-Baum, exakte Formel-Ausgabe):** (a) **TOP_LEVEL_COLLISION** — Kandidat mit ID `llm-wiki-prinzip`: `wiki/llm-wiki-prinzip.md` existiert → §3.2-Hold „Concept existiert bereits — Aktualisierung ist Epic 3" (keine Datei, kein Index-Link, kein `log.md`-Eintrag); (b) **AREA_WITHOUT_INDEX** — Sandbox-`wiki/foo/` ohne `index.md`: wörtliche Punkt-11-Meldung `FAIL wiki/foo/ Punkt 11: Index-Regel verletzt (Area ohne index.md=foo)` (Validator-§7.1-Fixture-Wortlaut, kein inventiertes `AREA_WITHOUT_INDEX`-Label); (c) **DIVING_NON_EXISTENT** — `[v](../fehlt.md)` aus Area-Concept → `DANGLING: ../fehlt.md`; (d) **Out-of-Bundle-Escape** (Loop-1-A1-Kontrolle) — `[x](../../README.md)` → `DANGLING: ../../README.md`, `[y](../../schema/compiler.md)` → `DANGLING: ../../schema/compiler.md`; (e) **In-Bundle-`../schema/` aus Area (Loop-2-Kontrolle)** — `[z](../schema/compiler.md)` aus `wiki/wissensarchitektur/source-material.md` → `DANGLING: ../schema/compiler.md` (vor dem Loop-2-Patch: still exkludiert, leere Ausgabe — Sandbox-Nachweis des gefixten Löchs). Positiv-Kontrolle nach allen Patches: Formel 2 (Form-Check) = `0` (Exit 0), Formel 3 (Dangling) = keine Ausgabe, Formel 4 = `38 ≡ 38` (beide re-executiert). Status-Nachführung (korrigiert zum obigen Implementierungs-Eintrag): `sprint-status.yaml` `2-4-…` `backlog` → `in-progress` (Implementierungs-Eintrag) → **`review`** (Review-Handoff, dieser Eintrag); die gefrorene Spec-Vorgabe („→ `in-progress`") beschreibt den Implementierungsstand, der Review-Handoff ist der übliche Folgezustand (s. Sprint-Status-Workflow-Kommentar „Dev moves story to 'review'"). Loop-Abschluss mit diesem Review: `review` → **`done`** (Sprint-Status synchronisiert, `sprint-status.yaml` `last_updated` nachgeführt; spec-Frontmatter `status: 'done'` deckungsgleich, `review_loop_iteration` → 2). Validator-Lauf-Korrektur zum obigen Eintrag: die gültige Datei-Zählung ist **7** `wiki/`-Dateien (Bundleroot, `log.md`, 3 Root-Concepts, Area-`index.md`, Area-Concept) — der obige Verweis auf „Punkt 9/10" für die Differenz zur Spec-Zahl 6 war falsch belegt (Punkt 9 = `okf_version`/`type: bundle`-Verbot außerhalb der Bundleroot; `log.md` wird über Punkt 10/V-2 mitvalidiert); die Spec-Zahl 6 ist eine frozen-Defizitzählung (Defer in `deferred-work.md`). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3). - **Story 2.4 «Deterministische Bereichszuordnung & Concept-Hierarchie» (Implementierung):** `schema/compiler.md` → **Revision 2.1** (neue §5.7 „Deterministische Bereichszuordnung & Concept-Hierarchie": Routing-Regel textual-deterministisch — (a) First-Class-Link aus dem bestehenden `index.md`-Baum → Bereich `wiki//.md`, (b) Default Root-Ebene, neue Areas nur konsolidiert; nie Embedding/Vector, AD-7c/A0-10/AD-13; kanonische ID-Normalisierung AD-7a/A0-8 mit Beispieltabelle; Top-Level-Kollisions-Hold → fixierter §3.2, kein neues Prädikat, kein MOVE; file-relatives Link-Auflösungsmodell inkl. Out-of-Bundle-`..`-Containment; Area-`index.md`-Regel mit wörtlicher Punkt-11-Meldung `FAIL … Punkt 11: Index-Regel verletzt (Area ohne index.md=)` — kein inventiertes Label; Worked Example). Nachgeführt: §5.1 Pkt. 1, §5.3 Pkt. 3 (Index-Regel area-bewusst), §5.6 Pkt. 1/2/3/4/5 (file-relativ; `../`-Exklusion aufgelöst; Formel 3 mit Quell-Datei-Spur + in-Bundle-`..`-Auflösung + Containment — Out-of-Bundle-`..`-Escape wird `DANGLING`; Formel 4 neu auf `baseline_commit` `66451b6e6c9e139fb3aa3bbf4b01291e1e2d273a` (deklarierte `baseline_commit`-Werte der Spec-Frontmatter, nicht mehr Story-2.3-`7e1f449…`; Loop-2: Re-Baseline auf den Run-Kopf `862cf41`, s. obiger Review-Eintrag), Basename-Filter `grep -v "log.md$"`), §6 Pkt. 2, §6.6, §7, §8. `deferred-work.md`: drei Story-2.4-namige Einträge geschlossen (`umgesetzt`): bundlerelativ-vs-dateirelativ (→ §5.7 Pkt. 4 file-relativ), Cross-Page-Anker-Stale-Evidenz (→ Ist-Verhalten Fragment-Strip, keine Dangling-Ausgabe), künftiges Area-`log.md`-Baseline-Bruch (→ Formel 4 Basename-Filter). Neue Area `wiki/wissensarchitektur/` angelegt: `wiki/wissensarchitektur/index.md` (frontmatterlos, Vertrag §2/§6, Validator Punkt 10; verlinkt das Area-Concept in der gepinnten §5.6-Form) + `wiki/wissensarchitektur/source-material.md` (Area-Concept `type: concept`, `sources` s1=architecture-spine + s2=prd, §5.5-Inline-Verweise + Kontext-Marker, Body-Links auf Root-Concepts in file-relativer `../`-Form: `llm-wiki-prinzip.md`, `wissensarchitektur-trennung-states.md`, `knowledge-kompilation-inkrementell.md`). `wiki/index.md`: neue **Area-Sektion** verlinkt `wissensarchitektur/index.md` (die 3 bestehenden Root-Concept-Links + die 3 `../schema/`-Links byte-identisch, Null-Migration). **Formel-4-Re-Baseline:** Ist-Zählung auf dem neuen Baum = **38** (`log.md`-exkludiert; `grep -roE '\(raw/'`), Baseline-Extraktion aus `66451b6` = **30** (alter Baum, 4 nicht-`log.md`-Dateien: `index.md` + 3 Root-Concepts; `git ls-tree -r + git show`, Basename-`log.md`-Filter) — Dokumentation verlangt die aktuelle Baseline aus `66451b6` (`38 ≠ 30`, kein Fehlalarm: Zuwachs-Re-Baseline; Loop-2-Korrektur: Re-Baseline auf den Run-Kopf `862cf41`, `38 ≡ 38`, s. obiger Review-Eintrag); die exakte Ist-Zahl hängt am finalen Concept/Body-Stand und wird in der Spec-Verification des Runs belegt. `sprint-status.yaml`: `2-4-deterministische-bereichszuordnung-concept-hierarchie` `backlog` → **`in-progress`** (dieser Statuswechsel findet mit diesem Eintrag statt). Validator-Lauf: alle **7** `wiki/`-Dateien SUCCESS (`index.md` + `log.md` + 3 Root-Concepts + Area-`index.md` + Area-Concept; Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1; die Spec-Verification nennt erwartungsseitig „6 `wiki/`-Dateien" — die Differenz erklärt sich durch das reservierte `log.md` (Protokoll, wird mitvalidiert, Punkt 9/10), die Validator-Effort-Zahl dieser erfolgten Ausführung ist 7). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3). -- 2.54.0 From f41ac71a385d63b6d150956f0680780a17ad91f2 Mon Sep 17 00:00:00 2001 From: Michael Tamse Date: Tue, 18 Aug 2026 16:48:46 +0200 Subject: [PATCH 02/16] =?UTF-8?q?feat:=20Story=202.5=20Code-Review-Patches?= =?UTF-8?q?=20(Loop=203,=204=20Layer;=20Nutzer-Entscheidungen=201/1)=20?= =?UTF-8?q?=E2=80=94=20geh=C3=A4rtete=20=C2=A75.8-Selbsttest-Formel=20+=20?= =?UTF-8?q?Zwei-Zustands-Klarstellung=20NESTED=5FAREA=5FKANDIDAT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- .../implementation-artifacts/deferred-work.md | 14 +++++ ...e-discovery-über-index-md-bereitstellen.md | 55 +++++++++++++++---- .../sprint-status.yaml | 6 +- schema/compiler.md | 24 ++++---- wiki/log.md | 2 +- 5 files changed, 74 insertions(+), 27 deletions(-) diff --git a/_bmad-output/implementation-artifacts/deferred-work.md b/_bmad-output/implementation-artifacts/deferred-work.md index 7978701..cfd1469 100644 --- a/_bmad-output/implementation-artifacts/deferred-work.md +++ b/_bmad-output/implementation-artifacts/deferred-work.md @@ -285,3 +285,17 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein summary: **Spec-These „Validator Punkt 11 akzeptiert bereits Areas" wird vom read-only-Validator-Text nicht gedeckt** — Punkt 11 (validator.md L70) verlangt, die Concept-Identität sei „als relativer Bundle-Pfad referenziert (mit oder ohne `.md`-Endung)"; die Area-`index.md` verlinkt file-relativ `source-material.md`, die Bundle-Identität `wissensarchitektur/source-material` erscheint in der Area-`index.md` textuell weder mit noch ohne Endung → ein wörtlicher mechanischer Punkt-11-Check meldete `Concept nicht verlinkt=wissensarchitektur/source-material`; der SUCCESS-Nachweis der Log (7/7 SUCCESS inkl. Punkt 11) ist damit nicht unabhängig überprüfbar. Fix = autorisierte Validator-Revision (Punkt 11 um die Area-Lesart schärfen: Area-Index erfüllt den Link per Area-localem Pfad der Concept-Datei) — AD-3-Blocker. evidence: bmad-code-review Story 2.4 (2026-08-18, Acceptance-Auditor-Layer): validator.md L70 (Punkt 11, read-only) vs. `wiki/wissensarchitektur/index.md` L9 (`[Source Material…](source-material.md)`) + Spec-Always-Bullet „Validator Punkt 11 akzeptiert bereits Areas … strukturell unverändert". status: offen — Home: Rev-9-Aktionsitem (`code-review-2-1-item-2`, open) — dort um Punkt-11-Area-Lesart ergänzen. + +## Deferred from: code review of spec-2-5-progressive-discovery-über-index-md-bereitstellen (2026-08-18) + +- source_spec: `_bmad-output/implementation-artifacts/spec-2-5-progressive-discovery-über-index-md-bereitstellen.md` + summary: **Spec-Frontmatter `status: 'done'` bei offenem Review-Zyklus** (spec Z. 5) — Story-2.4-Präzedenz (deferred-work.md Z. 269–272): `done` erst nach Review-Freigabe; mit dem Abschluss dieses Review-Loops synchron (s. Step 6), kein separates Patch. + evidence: bmad-code-review Story 2.5 (2026-08-18, Loop 3, 4 Layer: Blind-Hunter + Edge-Case-Hunter + Verification-Gap + Acceptance-Auditor): Review-Findings-Sektion der Spec (2026-08-18). + status: umgesetzt (2026-08-18, Loop-3-Abschluss) — Status synchronisiert: Spec-Frontmatter `status: 'done'` + `review_loop_iteration: 3` deckungsgleich mit `sprint-status.yaml` (Key `2-5-…` → `done`, `last_updated` nachgeführt); alle `decision-needed` und `patch`-Befunde aufgelöst/umgesetzt. + +- source_spec: `_bmad-output/implementation-artifacts/spec-2-5-progressive-discovery-über-index-md-bereitstellen.md` + summary: **Frozen-Text-Wortfehl- und Konsistenz-Kandidaten (nur per menschlicher Renegotiation änderbar)** (spec Z. 18/42/43) — Änderungskandidaten für die nächste Renegotiationsrunde (Story-2.4-Präzedenz): (a) Intent Z. 18 „Revisionslog **(3.x)**" — implementiert ist **2.3** (Reihenfolge 2.0/2.1/2.2/2.3); (b) I/O-Matrix `DISCOVERY_DEMO_ROOT_AREA_LINK` Z. 42: „zusätzlich **überdacht** in das Area-Concept" — Wortfehler + Verlinkungsrichtung unauflösbar (nicht-gefrorene Seite s. Patch „Index-Link-Oxymoron"); (c) I/O-Matrix `SEARCH_GREP` Z. 43: `grep -n wiki/` nicht ausführbar (nicht-gefrorene Seite s. Patch „Consumer-Suchbeispiel"); (d) Intent Z. 18 „Kein Interface-/Backend-/Datenbank-**Änderung**" (Grammatik: „Keine … Änderungen"). + evidence: bmad-code-review Story 2.5 (2026-08-18, Loop 3, 4 Layer: Blind-Hunter + Edge-Case-Hunter + Verification-Gap + Acceptance-Auditor): Review-Findings-Sektion der Spec (2026-08-18). + status: offen + + diff --git a/_bmad-output/implementation-artifacts/spec-2-5-progressive-discovery-über-index-md-bereitstellen.md b/_bmad-output/implementation-artifacts/spec-2-5-progressive-discovery-über-index-md-bereitstellen.md index 7dee03f..1df88df 100644 --- a/_bmad-output/implementation-artifacts/spec-2-5-progressive-discovery-über-index-md-bereitstellen.md +++ b/_bmad-output/implementation-artifacts/spec-2-5-progressive-discovery-über-index-md-bereitstellen.md @@ -3,7 +3,7 @@ title: 'Progressive Discovery über index.md bereitstellen (Story 2.5)' type: 'feature' created: '2026-08-18' status: 'done' -review_loop_iteration: 2 +review_loop_iteration: 3 baseline_commit: 64a0f6a6161247c0556f9d1dc2500f2b913fa967 context: - _bmad-output/implementation-artifacts/epic-2-context.md @@ -38,7 +38,7 @@ context: |----------|--------------|---------------------------|----------------| | HAPPY_PATH | Bundle mit Bundleroot, einer Area (`wissensarchitektur/` mit `index.md` + `source-material.md`), 3 Root-Concepts | Jede Area ist aus der Bundleroot erreichbar; jedes Area-Concept aus seiner Area-`index.md`; jedes Root-Concept aus der Bundleroot — gewurzelte Erreichbarkeit; Discovery-Selbsttest liefert keine Verletzung; Suche = grep | N/A | | AREA_UNREACHABLE | Area-`index.md` existiert, ist aber von der Bundleroot nicht verlinkt (kein Root→Area-Pfad) | Discovery-Check → `UNREACHABLE AREA: ` als Verletzung — die Area bleibt für die Navigation unsichtbar (AD-9) | Run-FAIL textuell benannt (Instruktions-Selbsttest, kein Validator-Punkt) | -| NESTED_AREA_KANDIDAT | Ein Erstellungskandidat mit Ziel `wiki/a/b/concept.md` (zwei Ebenen, Tiefe ≥ 3) bzw. `wiki/a/b/` | **§5.8-Instruktions-Hold** (Zwei-Ebenen, Tiefe ≥ 3): Kandidat wird angehalten — keine Datei, kein Index-Link, Meldung `NESTED AREA: `; das Zwei-Ebenen-Modell bleibt | Run bricht fürs Gebilde ab: „teilweise erfolgreich" (übrige Einheiten laufen weiter, NFR-4) | +| NESTED_AREA_KANDIDAT | Ein Erstellungskandidat mit Ziel `wiki/a/b/concept.md` (zwei Ebenen, Tiefe ≥ 3) bzw. `wiki/a/b/` | **Zwei Zustände:** (1) **Hold-Zeitpunkt** — der Erstellungskandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten: keine Datei, kein Index-Link; (2) **Formel-Befund** — existiert eine Markdown-Datei in Tiefe ≥ 3 unter der Bundleroot (z. B. nachträglich angelegt), meldet die §5.8-Selbsttest-Formel (Lauf B) **`NESTED AREA: `** (erste Ebene); der Sandbox-Nachweis belegt die Detektion auf einem synthetischen Baum mit angelegter Testdatei | Run bricht fürs Gebilde ab: „teilweise erfolgreich" (übrige Einheiten laufen weiter, NFR-4) — *Zwei-Zustands-Klarstellung per menschlicher Renegotiation 2026-08-18 (Loop-3-Decision 2)* | | DISCOVERY_DEMO_ROOT_AREA_LINK | Neues Root-Concept, zusätzlich überdacht in das `source-material.md`-Area-Concept in §5.6-Form verlinkt | Root-Concept ist aus Bundleroot erreichbar; zusätzlicher (rein informierender) Link von der Area aus — kein MOVE, konsolidierte Zwei-Ebenen-Kartografie bleibt | N/A | | SEARCH_GREP | Consumer führt textuelle Suche nach Begriff `` aus | `grep -n wiki/`-Suche als konsumenten-/extern-seitige Antwort; keine Such-Infrastruktur/Bundle (AD-8, AD-13) | N/A | @@ -46,9 +46,9 @@ context: ## Code Map -- `schema/compiler.md` — **mutiert**: neue **§5.8 „Progressive Discovery über `index.md` (Story 2.5)"** (nach §5.7 ≈ Z.200, vor §6): (1) Discovery-Pfad — Bundleroot `wiki/index.md` → Area-`index.md` (frontmatterlos) → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot (§5.7 Pkt. 5, AD-9/FR-11); (2) **gewurzelte Erreichbarkeit** als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest — jede Area muss aus `wiki/index.md` verlinkt sein (Root→Area, AD-9); Verletzung → `UNREACHABLE AREA: ` (textuell benannter Instruktions-Selbsttest-Befund, Run-FAIL gemäß §5.6-Pkt.-4-analoger NFR-4-Regel); die Area→Concept-Verlinkung ist durch Validator Punkt 11 mechanisch abgedeckt (`Concept nicht verlinkt=`) und wird hier nicht dupliziert; die §5.6-Formeln (Z.133–166) decken die Link-Form weiter ab; **verlinkt = Ziel in gepinnter §5.6-Form `(a/index.md` bzw. `(./a/index.md` — das `./`-Präfix ist von der Erreichbarkeits-Formel toleriert (die Form-Check-Exklusion `^\.` in §5.6 Pkt. 3 zählt `./`-Ziele nicht als Formverletzung, L2-6-Erkenntnis); (3) **konsolidierte Zwei-Ebenen-Kartografie** (antwortet Defer F-07): Root + eine Area-Ebene; **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** — `wiki/a/b/`-Kandidat (Erstellungskandidat oder Discovery-Ziel) wird angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); §3.2 bleibt der Dateikollision bestehender Concepts vorbehalten; (4) **Suche = Consumer-grep** (`grep`/`ripgrep` über `wiki/`, AD-13 — keine Such-Datenbank, kein Embedding). Nachgeführt: §7 Z.253 (Vorbehalt auf „Suche"-Rest gekürzt), §8-Revisionslog 2.3 + Normreferenzen AD-9/FR-11/AD-13/NFR-3. Kein Vertrag-/Validator-/raw-Change (AD-3); keine neue §7-Klasse. +- `schema/compiler.md` — **mutiert**: neue **§5.8 „Progressive Discovery über `index.md` (Story 2.5)"** (nach §5.7 ≈ Z.200, vor §6): (1) Discovery-Pfad — Bundleroot `wiki/index.md` → Area-`index.md` (frontmatterlos) → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot (§5.7 Pkt. 5, AD-9/FR-11); (2) **gewurzelte Erreichbarkeit** als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest — jede Area muss aus `wiki/index.md` verlinkt sein (Root→Area, AD-9); Verletzung → `UNREACHABLE AREA: ` (textuell benannter Instruktions-Selbsttest-Befund, Run-FAIL gemäß §5.6-Pkt.-4-analoger NFR-4-Regel); die Area→Concept-Verlinkung ist durch Validator Punkt 11 mechanisch abgedeckt (`Concept nicht verlinkt=`) und wird hier nicht dupliziert; die §5.6-Formeln (Z.133–166) decken die Link-Form weiter ab; **verlinkt = Ziel in gepinnter §5.6-Form `(a/index.md` bzw. `(./a/index.md` — das `./`-Präfix ist von der Erreichbarkeits-Formel toleriert (die Form-Check-Exklusion `^\.` in §5.6 Pkt. 3 zählt `./`-Ziele nicht als Formverletzung, L2-6-Erkenntnis); (3) **konsolidierte Zwei-Ebenen-Kartografie** (antwortet Defer F-07): Root + eine Area-Ebene; **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** — `wiki/a/b/`-Kandidat (Erstellungskandidat oder Discovery-Ziel) wird angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); §3.2 bleibt der Dateikollision bestehender Concepts vorbehalten; (4) **Suche = Consumer-grep** (`grep`/`ripgrep` über `wiki/`, AD-13 — keine Such-Datenbank, kein Embedding). Nachgeführt: §7 (Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt — die Vorbehalt-Zeile lag in der Baseline `main` bei Z. 253, nach dem §5.8-Einschub bei Z. 285), §8-Revisionslog 2.3 + Normreferenzen AD-9/FR-11/AD-13/NFR-3. Kein Vertrag-/Validator-/raw-Change (AD-3); keine neue §7-Klasse. - `wiki/log.md` — **append**: Eintrag (Vertrag-§5-Format) mit Discovery-Semantik, Zwei-Ebenen-Kartografie (F-07 geschlossen), `sprint-status`-Wechsel `2-5-progressive-discovery-über-index-md-bereitstellen` `backlog` → `in-progress`, Selbsttest-Beleg (keine `UNREACHABLE`-Verletzung). -- `_bmad-output/implementation-artifacts/deferred-work.md` — **mutiert**: F-07-Eintrag (`source_spec` bei L87; `status:`-Zeile bei L90) `status:` → `umgesetzt (2026-08-18, Story 2.5 — konsolidierte Zwei-Ebenen-Kartografie, §5.8)` (append-only); die drei „Home: …ab Story 2.5"-Link-Pin-Einträge (einer bei L218ff mit `status:` bei L224, zwei weitere im Abschnitt „Deferred from: … spec-2-3 …" mit `status:` bei L246/L250) erhalten **keine** Statusänderung (Link-Pin-Runde ist separat). `sprint-status.yaml`: Key `2-5-…` → **in-progress**. +- `_bmad-output/implementation-artifacts/deferred-work.md` — **mutiert**: F-07-Eintrag (`source_spec` bei L87; `status:`-Zeile bei L90) `status:` → `umgesetzt (2026-08-18, Story 2.5 — konsolidierte Zwei-Ebenen-Kartografie, §5.8)` (append-only); die drei „Home: …ab Story 2.5"-Link-Pin-Einträge (`status:`-Zeilen bei L220, L224, L250) erhalten **keine** Statusänderung (Link-Pin-Runde ist separat). `sprint-status.yaml`: Key `2-5-…` → **in-progress**. - `wiki/index.md`, `wiki/wissensarchitektur/*`, 3 Root-Concepts, `schema/wiki-compiler.md`, `schema/validator.md`, `raw/…` — **read-only**: keine MOVE-/Inhaltsänderung an Concepts oder `index.md` (Kuratierung/AD-7d ist Epic-3-Nähe); optional: ein neues Root-Concept als Discovery-Demo (angelegt in Bundleroot-Form, kein MOVE). ## Tasks & Acceptance @@ -56,7 +56,7 @@ context: **Execution:** - [x] `schema/compiler.md` — §5.8 anlegen (Discovery-Pfad, Erreichbarkeits-Kriterium + Selbsttest, konsolidierte Zwei-Ebenen-Kartografie mit F-07-Antwort über den §5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3), Suche = Consumer-grep) + §7 Z.253 gekürzt + §8 Revisionslog 2.3 + Normreferenzen (AD-9/FR-11/AD-13/NFR-3). Kein Vertrag-/Validator-/raw-Change. - [x] `wiki/log.md` — Eintrag (§5-Format) mit Discovery-Semantik, F-07-Schluss, Statuswechsel, Selbsttest-Beleg. -- [x] `deferred-work.md` — F-07-Eintrag (L88) `status: umgesetzt (…Story 2.5…)`; die drei Link-Pin-Einträge (L219/L223/L249) unverändert lassen; `sprint-status.yaml` — Key `2-5-…` → `in-progress`. +- [x] `deferred-work.md` — F-07-Eintrag (`source_spec` bei L87, `status:`-Zeile bei L90) `status: umgesetzt (…Story 2.5…)`; die drei Link-Pin-Einträge (`status:`-Zeilen L220/L224/L250) unverändert lassen; `sprint-status.yaml` — Key `2-5-…` → `in-progress`. - [x] Discoverability-/Edge-Tests im Sandbox-/tmp-Baum (I/O-Matrix): gewurzelte Erreichbarkeit (kein `UNREACHABLE`), AREA_UNREACHABLE-Negativ-Test (Area ohne Root-Link), NESTED_AREA-Kandidat `wiki/a/b/` → §5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3). **Acceptance Criteria:** @@ -64,7 +64,7 @@ context: - Given die Hierarchie, when ein Concept neu angelegt wird, then wird es passend in `index.md` des zugehörigen Bereichs verlinkt (AD-9, A0-10) — bestehende §5.3/§5.7-Regel bleibt; §5.8 erläutert die Discovery-Semantik (Area-Concept in Area-`index.md` — mechanisch abgedeckt durch Validator Punkt 11 —, Root-Concept in Bundleroot). - Given eine Suche, when der Consumer sie nutzt, then ist sie klar extern bzw. Consumer-seitig (grep/ripgrep über `wiki/`, AD-13) — die Discovery braucht keine proprietäre Datenbank (AD-9, FR-11). - Given ein Verzeichnis unter `wiki/`, when es zwei Ebenen tief ist (`wiki/a/b/`), then ist es **keine zugelassene Anlageform** — der Erstellungskandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); Zwei-Ebenen-Kartografie bleibt ($5.8 Pkt. 3). -- Given die Instruktion, when geprüft, then ist §5.8 der einzige Discovery-Instruktions-Ort (D-3), §5.6-Formeln bleiben re-executierbar (AD-17h), der Validator läuft SUCCESS (keine neue §7-Klasse, kein Schema-/Validator-/raw-Change) — mit re-executierbarem Validator-Befehl belegt (BH13). +- Given die Instruktion, when geprüft, then ist §5.8 der einzige Discovery-Instruktions-Ort (D-3), §5.6-Formeln bleiben re-executierbar (AD-17h), der Validator läuft SUCCESS (keine neue §7-Klasse, kein Schema-/Validator-/raw-Change) — mit dem per-Datei-Verdikt-Nachweis in `wiki/log.md` belegt. ## Spec Change Log @@ -73,6 +73,8 @@ context: - **2026-08-18 (Loopback 1, bad_spec):** (a) Verifikations-Formel war nicht identisch zur implementierten §5.8-Formel und schwächer (VG #1, BH #4) — auf byte-identische §5.8-Pkt.-2-Formel vereinheitlicht; (b) Selbsttest deckt „Area-Concept in Area-`index.md`" nicht (Intention Z.26) — die eigentliche Design-These: diese Koordinate ist durch Validator Punkt 11 (`Concept nicht verlinkt=`) mechanisch abgedeckt und wird bewusst nicht dupliziert; (§5.8-Pkt.-2-Einleitung + Intent-Wortlaut präzisiert; BH #6); (c) Outcome-Kopplung von `UNREACHABLE AREA` an den Run-Nachweis verankert (BH #3/#9); (d) Discovery-Demo als optional/ausgeführt markiert (BH #10); (e) Code-Map-Line-Zahlen postmodern nachgeführt (BH #5); (f) der Validator-SUCCESS-Lauf hat einen re-executierbaren Befehl (BH #13). - **2026-08-18 (Loopback 2, bad_spec + Konsistenz-Renegotiation — Review-Loop 2, 3 Layer):** (a) **Verification-Formel-Byte-Identität nachprüfbar verfügbar gemacht (Kern-L2-1, EC-L2-6/VG-L2-1/BH-L2-15):** die Verification-Z. 83–85 führen jetzt die §5.8-Pkt.-2-Selbsttest-Formel **wörtlich** als Einzel-Quote-`sh -c '…'`-String und binden sie als „verbindlicher Nachweis = exakt die Instruktions-Formel (byte-identisch)"; (b) die irreführende „identische Formulierung im Instruktionstext"-Behauptung (Verification Z. 84) wurde zur faktisch korrekten Formulierung korrigiert („Identische Formulierung liegt auch im Instruktionstext … die Selbsttest-Formel ist die Instruktion"; VG-L2-1/BH-L2-13); (c) der phantombildende „wörtlicher Einzel-Quote-String"-Verweis im Log-Eintrag wurde präzisiert (die wörtliche Instruktions-Formel liegt in `schema/compiler.md` §5.8 Pkt. 2; VG-L2-2); (d) **erfundener Validator-CLI-Befehl entfernt** (`uv run --no-cache _bmad-bmw40` existiert nirgends; der Validator ist reine Text-Instruktion, human-mechanisch ausgeführt, D-3; VG-L2-3/BH-L2-14); (e) **Formel-4-Baseline von `64a0f6a…` auf den Run-Kopf `862cf41…` korrigiert** (die extrahierte Baseline ist der Kopf des letzten Zuwachs-Runs, nicht der Spec-`baseline_commit`; VG-L2-3/BH-L2-12); (f) die **Frozenschnitt-Renegotiation (Loop-1-Option-A)** wird in der gefrorenen Design-Notes-Sektion konsistent nachgeführt („Deterministik für `wiki/a/b/` liegt im §5.8-Instruktions-Hold", nicht im §3.2-Kollisions-Hold; die §3.2-Zeile war der letzte inhaltlich abweichende Frozen-Text — menschen-autorisierte Vervollständigung der Loop-1-Renegotiation, derselbe Träger, keine neue Entscheidung; BH-L2-16/17); (g) die `(a/index.md`/`(./a/index.md`-Verlinkungs-Koordinate wird nun explizit als „gepinnte §5.6-Form, beide Varianten zulässig" dokumentiert (die §5.6-Formel-2-`^\.`-Exklusion zählt `./` nicht als Formverletzung — die `(./`-Ambiguität aus BH-L2-19/20 ist damit aufgelöst: die Erreichbarkeits-Formel und der Form-Check sind widerspruchsfrei); h) Code-Map-/Task-Line-Zahlen auf die Ist-Zeilen korrigiert (L87/L90; BH-L2-4/11). **KEEP (Constraints):** gefrorene Erwartungen, Determinismus/AD-17h, D-3, AD-3. **KEEP (Code, muss die Re-Derivation überleben):** die §5.8-Selbsttest-Formel **byte-formgleich** als Einzel-Quote-`sh -c '…'`-String (zwei Läufe A/B, `sort -u`-Konsolidierung, `NESTED AREA`/`UNREACHABLE AREA`-Meldungen); die §5.8-Sektion nach §5.7 vor §6 mit Revisionslog 2.3 + §7-Z.253-Kürzung auf „Suche"-Rest; Suche=Consumer-grep (Pkt. 4); Discovery-Demo optional kein MOVE (Pkt. 5); log.md-Eintrag im Vertrag-§5-Format inkl. Selbsttest-Beleg; deferred-F-07 `status: umgesetzt`; sprint `2-5-…` → in-progress. **Route-Klarstellung (2026-08-18, Auto-Mode-Klassifikator, kein Revert):** Der bad_spec-Schritt-4-Regelsee sah „Revert code changes → re-derive" vor; der Auto-Mode-Klassifikator hat den `git restore` der 4 Story-2.5-Dateien gesperrt (geschützter „Irreversible Local Destruction"-Schutz). Ausführung mit bestem Ermessen **ohne Revert** (dokumentierte Schritt-4-Abweichung): die bad_spec-Wurzel lag in der **non-frozen Verification-Sektion der Spec** (dokumentierte Validator-CLI-/Baseline-Behauptungen), **nicht** im implementierten Code — die implementierte §5.8-Formel war empirisch korrekt (Lauf grün, Exit 0) und die geänderte Spec bildet sie jetzt byte-identisch ab; ein Revert + Re-Derivation wäre ein **Null-Op** im Artefakt-Stand gewesen und hätte korrektes, verifiziertes Arbeiten zerstört. Rejected (reject, kein Patch): bearbeitete Mehrfach-Bucket-/`sort -u`-Semantik (empirisch belegt korrekt), Root-Concept-Erreichbarkeit (Punkt-11-Delegation), Area-Concept-/leere-Area-Delegation, Staging/untracked (Workflow-Verhalten), Loop-1-Status-Markierungen, Demo-Ausführungs-Shadow — alle verifiziert als nicht-blockierend. Deferred: F-08/.MD-Case, Run-FAIL-Niveau von `NESTED` — vorbestehend, kein Story-2.5-Blocker. +- **2026-08-18 (Loop 3, bmad-code-review, 4 Layer; Nutzer-Entscheidungen 1/1):** (a) **Decision 1 — §5.8-Selbsttest-Formel gehärtet (Edge-Case-Hunter #1–#8):** Erreichbarkeits-Check auf echte Markdown-Linksyntax geschärft (Muster `\](` statt `\(` — Lücke (c) Stiller-Vorbeilass auf Prosa-Treffer beseitigt), `grep -qE` → `grep -qF` (Fix-String — ERE-Metazeichen-Lücken (a)/(b) für beliebige Area-Namen geschlossen), CWD-Präguard `[ -f wiki/index.md ]` (Lücke (e) — falscher SUCCESS bei fehlendem Baum beseitigt), `LC_ALL=C sort -u` (Lücke (f) — AD-17h-Nachweis-Byte-Identität über Umgebungen), POSIX-sh/GNU-`find`-Prämisse in Pkt. 2 explizit dokumentiert (Lücke (g)); Meldungstokens `UNREACHABLE AREA: ` / `NESTED AREA: ` bit-identisch erhalten (frozen I/O-Matrix intakt); die gehärtete Formel wird **byte-identisch** in dieser Verification-Sektion gespiegelt (Pkt. 1) und der Log-Selbsttest-Beleg aktualisiert. (b) **Decision 2 — frozen-Matrix-Zeile `NESTED_AREA_KANDIDAT` Zwei-Zustands-Klarstellung (menschlich-autorisierte Renegotiation, VG #4):** Hold-Zeitpunkt (Kandidat angehalten, keine Datei, kein Index-Link) von der Formel-Meldung (`NESTED AREA: ` für existierende Tiefe-≥-3-Dateien, Sandbox-Nachweis = synthetischer Baum) getrennt — keine gefrorene Erwartung geändert. (c) **16 Patches umgesetzt** (s. Review-Findings-Sektion): §5.8 (Hold-Trigger im Run-Flow, Punkt-11-Rev-9-Lücken-Verweis, Outcome-Klassifizierung vereinheitlicht, Prosa-Formel-Zitat, Body-Link-Terminologie, Tiefen-Definition, Ankerkorrektur §5.3 Pkt. 3, Consumer-grep-Beispiel), log.md (Review-Handoff-Nachführung, per-Datei-Validator-Verdikt-Zeile, I/O-Matrix-Szenariobeleg statt S1–S5, „Selbsttest-Lauf A"), spec (AC 5 Wortung, Zeilen-Zitate L220/L224/L250, „Ash"-Phantom, §7-Zeilenreferenz, Suggested-Review-Order-Anker), Defer (2). **KEEP (Constraints):** gefrorene Erwartungen (Meldungstokens, Zwei-Ebenen, „teilweise erfolgreich"), Determinismus/AD-17h, D-3, AD-3 (kein Schema-/Validator-/raw-Change). + ## Design Notes **D-3-Begründung (§5.8 statt §7-Erweiterung):** Die progressive Discovery ist laut §7 Z.253 explizit ein Story-2.5-Thema; die Story löst den Vorbehalt auf, indem die Discovery-Instruktion in §5.8 wandert. Der §7-Vorbehalt wird auf „Suche"-Rest eingekürzt (Suche bleibt konsumenten-seitig, kein Bundle-Thema mehr). Keine Normtext-Änderung am §7-Katalog/Validator (AD-3). **F-07-Antwort (konsolidierte Zwei-Ebenen-Kartografie):** Verschachtelte Areas hätten eine Vertrags-/Validator-Änderung erfordert (AD-3 read-only) und wären eine zweite Discovery-Ebene; die Deterministik für `wiki/a/b/` liegt im existierenden **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** — Loopback-1-Renegotiation (menschen-autorisierte Option A): Träger ist §5.8-lokal, **nicht** der §3.2-Kollisions-Hold, der bleibt der Dateikollision *bestehender* Concepts vorbehalten (ein brandneuer Zwei-Ebenen-Pfad kollidiert nie) — kein neues Prädikat, kein §7-Eingriff (D-3). **Suche als Consumer-Angelegenheit (AD-13/FR-11/NFR-3):** `grep` über `wiki/` ist die textuell-deterministische Suche; keine Such-Indizes/-Datenbank. @@ -82,13 +84,13 @@ context: **Commands (re-executierbar, ab Workspace-Root):** 1. **Discovery-Selbsttest (neu, §5.8):** erwartet keine `UNREACHABLE AREA`- und keine `NESTED AREA`-Verletzung auf dem Ist-Baum. Die Formel wird **wörtlich** als `sh -c '…'`-Einzel-Quote-String ausgeführt (der `$`-Expansion erst in der inneren Shell stattfindet); **verbindlicher Nachweis = exakt die §5.8-Pkt.-2-Selbsttest-Formel von `schema/compiler.md` §5.8 Pkt. 2 (byte-identisch, wörtlich übernommen):** - `sh -c 'for f in $(find wiki -mindepth 2 -name index.md); do a="${f#wiki/}"; a="${a%/index.md}"; case "$a" in */*) continue;; esac; grep -qE "\($a/index\.md|\(\./$a/index\.md" wiki/index.md || echo "UNREACHABLE AREA: $a"; done; find wiki -mindepth 3 -type f -name "*.md" | sort -u | while read -r f; do d="${f#wiki/}"; a="${d%%/*}"; echo "NESTED AREA: $a"; done | sort -u'` - (Identische Formulierung liegt auch im Instruktionstext `schema/compiler.md` §5.8 Pkt. 2 — die Selbsttest-Formel ist die Instruktion; die einzelfall-spezifischen Sandbox-Negativ-Tests `UNREACHABLE AREA`/`NESTED AREA` werden als Selbsttest-Beleg im `log.md`-Eintrag dokumentiert. Der Live-Baum liefert hier keine Ausgabe, Exit `0`.) + `sh -c '[ -f wiki/index.md ] || { echo "SELBSTTEST-SETUP-Fehler: Workspace-Root (wiki/index.md fehlt)"; exit 1; }; find wiki -mindepth 2 -name index.md | while IFS= read -r f; do a="${f#wiki/}"; a="${a%/index.md}"; case "$a" in */*) continue;; esac; grep -qF "]($a/index.md" wiki/index.md || grep -qF "](./$a/index.md" wiki/index.md || echo "UNREACHABLE AREA: $a"; done; find wiki -mindepth 3 -type f -name "*.md" | LC_ALL=C sort -u | while IFS= read -r f; do d="${f#wiki/}"; a="${d%%/*}"; echo "NESTED AREA: $a"; done | LC_ALL=C sort -u'` + (Identische Formulierung liegt auch im Instruktionstext `schema/compiler.md` §5.8 Pkt. 2 — die Selbsttest-Formel ist die Instruktion; die einzelfall-spezifischen Sandbox-Negativ-Tests `UNREACHABLE AREA`/`NESTED AREA` werden als Selbsttest-Beleg im `log.md`-Eintrag dokumentiert (Sandbox-Nachweis auf einem synthetischen Baum mit angelegter Testdatei, s. Loop-3-Decision-2-Zwei-Zustands-Klarstellung). Der Live-Baum liefert hier keine Ausgabe, Exit `0`; Ausführung außerhalb der Workspace-Root liefert `SELBSTTEST-SETUP-Fehler: …` + Exit `1` (CWD-Präguard, Loop-3-Decision-1).) 2. **§5.6-Formeln (unverändert re-executierbar):** Form 2 (Form-Check) `0` (Exit `0`), Form 3 (Dangling-Check) keine Ausgabe; Formel 4 `38 ≡ 38` — Ist-Zählung ≡ Extraktion aus dem **Run-Kopf `862cf41…`** (Baseline-Commit des letzten Zuwachs-Runs, §5.6 Pkt. 4; Story 2.5 erzeugt keinen neuen Zuwachs-Run, Formel 4 bleibt passierbar). 3. **Validator-Lauf:** alle 7 `wiki/`-Dateien SUCCESS (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1) — unverändert zur Story 2.4; kein Validator-/Vertrags-Change. Der Validator ist eine **reine Text-Instruktion** (`schema/validator.md`), die der Producer human-mechanisch ausführt (D-3 — es gibt **keinen** `uv`-Invoker/keinen CLI-Befehl); das Verdikt je Datei wird als Ausführungs-Nachweis im `log.md`-Eintrag geführt. **Manual checks:** -- §7 Z.253 auf „Suche"-Rest gekürzt, Discovery in §5.8 verankert; kein Schema-/Validator-/raw-Diff; `log.md`-Eintrag datiert (2026-08-18) mit Discovery-Semantik + F-07-Schluss + Statuswechsel; `deferred-work.md`-F-07-Eintrag geschlossen (append-only); `sprint-status.yaml` konsistent. +- §7 (Z. 285; in der Baseline `main` Z. 253) auf „Suche"-Rest gekürzt, Discovery in §5.8 verankert; kein Schema-/Validator-/raw-Diff; `log.md`-Eintrag datiert (2026-08-18) mit Discovery-Semantik + F-07-Schluss + Statuswechsel; `deferred-work.md`-F-07-Eintrag geschlossen (append-only); `sprint-status.yaml` konsistent. ## Suggested Review Order @@ -106,15 +108,46 @@ context: - Suche = Consumer-grep (Pkt. 4, AD-13) — keine Such-Datenbank, kein Index-Datei-Format. [`compiler.md:231`](../../../schema/compiler.md#L231) -- Das §5.8-Selbsttest-Beleg-Niveau schließt die erreichbare Path-Prüfung (kein „Ash"-Ghost mehr). +- Das §5.8-Selbsttest-Beleg-Niveau schließt die erreichbare Path-Prüfung ab. [`compiler.md:227`](../../../schema/compiler.md#L227) **Verifikation & Nachweis-Ebene** - Der §5.8-Verification-Block — verbindliche Formel-Byte-Identität + erwarteter Nachweis. - [`spec-2-5-…:83`](./spec-2-5-progressive-discovery-über-index-md-bereitstellen.md#L83) + [`spec-2-5-…:84`](./spec-2-5-progressive-discovery-über-index-md-bereitstellen.md#L84) **Status- & Tracking-Ebene** - Semantik des Sprint-Status (in-progress → review-Handoff). [`sprint-status.yaml:50`](../../../_bmad-output/implementation-artifacts/sprint-status.yaml#L50) + +## Review Findings (bmad-code-review, 2026-08-18 — Loop 3, 4 Layer) + +### Decision-Needed + +- [x] [Review][Decision] §5.8-Selbsttest-Formel: realistische Edge-Case-Lücken (Edge-Case-Hunter #1–#8) — die gepinnte Formel (Z. 216) ist fragil gegen: (a) Area-Namen mit Leerzeichen (`for f in $(find …)` splittet den Pfad → korrektt verlinkte Area erzeugt je Wortteil falsche `UNREACHABLE AREA`), (b) ERE-Metazeichen im Area-Namen (`.`, `*`, `+` unescaped in `grep -qE` → unverlinkte Area besteht still, weil ein Link einer anderen Area den Regex trifft; unbalanciertes `(`/`[` → Regex-Fehler nur in stderr), (c) Prosa-Ausdruck `(a/index.md` ohne Markdown-Linksyntax `](` in der Bundleroot besteht den Erreichbarkeits-Check still (Muster `\(` statt `\](`), (d) Groß-/Kleinschreibungs-Abweichung Verzeichnis↔Link (win32, F-08-Umfeld), (e) Ausführung außerhalb der Workspace-Root → nur stderr, Exit 0 = falscher SUCCESS statt Setup-Befund, (f) `sort -u` ohne `LC_ALL=C` → meldungsreihenfolge-Umgebungsabhängigkeit (AD-17h-Byte-Identität der Nachweise bricht), (g) implizite POSIX-`sh`/GNU-`find`-Prämisse (NFR-1/NFR-5) nicht dokumentiert. Minderung im Ist-Baum: Area-Namen sind kebab-case-Slugs (§5.1 Pkt. 1, AD-7a) → (a)/(b)/(d) sind für konforme Bäume strukturell nicht erreichbar; verbleibende reale Lücken: (c) Stiller-Vorbeilass auf Prosa-Treffer, (e) falscher SUCCESS bei falschem CWD, (f) Nachweis-Byte-Identität über Umgebungen. Ein Formel-Change bricht die byte-identische Spec↔compiler-Spiegelung (Verification Pkt. 1) und den Log-Selbsttest-Beleg — beides müsste neu belegt werden. **Option 1:** Formel härten (z. B. `grep -qF -- "(/index.md"` + `"(.//index.md"`, Muster auf `\](` schärfen, CWD-Präguard, `LC_ALL=C sort -u`, POSIX-sh-Prämisse in Pkt. 2 dokumentieren) + byte-identisch in der Spec neu spiegeln + Log-Beleg aktualisieren. **Option 2:** Formel unverändert lassen + Prämissen explizit dokumentieren (kebab-case-Area-Namen nach §5.1/AD-7a, Ausführung ab Workspace-Root, POSIX-sh/GNU-Tools-Umgebung, C-Locale) — Lücken (c)/(e) bleiben dann als bekannt-konservativ dokumentiert. — **Aufgelöst (Nutzer, 2026-08-18, Option 1):** Formel härten — (a) Erreichbarkeits-Check auf echte Markdown-Linksyntax `\](` geschärft (Lücke (c) Stiller-Vorbeilass beseitigt), (b) `grep -qF` (Fix-String statt ERE — Metazeichen-Lücken (a)/(b) für beliebige Area-Namen geschlossen), (c) CWD-Präguard `[ -f wiki/index.md ]` (Lücke (e) falscher SUCCESS beseitigt), (d) `LC_ALL=C sort -u` (Lücke (f) AD-17h-Byte-Identität über Umgebungen), (e) POSIX-sh/GNU-Prämisse in Pkt. 2 dokumentiert (Lücke (g)); Meldungstokens `UNREACHABLE AREA: ` / `NESTED AREA: ` bit-identisch erhalten (frozen I/O-Matrix intakt); byte-identische Spec↔compiler-Spiegelung + Log-Selbsttest-Beleg neu belegt (Patches unten). +- [x] [Review][Decision] Gefrorene I/O-Matrix-Zeile `NESTED_AREA_KANDIDAT` ist mechanisch selbstwidersprüchlich (VG #4, BH #12) — die Zeile verlangt zugleich „Kandidat wird angehalten — **keine Datei**, kein Index-Link" und „Meldung `NESTED AREA: `"; unter der gepinnten Formel (Lauf B: `find wiki -mindepth 3 -type f -name "*.md"`) kann die Meldung aber nur entstehen, wenn eine Datei in Tiefe ≥ 3 **existiert**. Der Log-Sandbox-Nachweis („Kandidaten → `NESTED AREA: a`") ist nur mit angelegten Testdateien möglich. Der §5.8-Text (Pkt. 2/3) definiert `NESTED AREA` ausschließlich als Formel-Output und unterscheidet nicht zwischen dem **Hold-Zeitpunkt** (Producer hält den Kandidaten an, keine Datei) und dem **nachträglichen Formel-Befund** (existierende Tiefe-≥-3-Datei wird gemeldet). Die gefrorene Matrix ist nur per menschlicher Renegotiation änderbar. **Option 1:** Renegotiation der Matrix-Zeile — Zwei-Zustands-Klarstellung (Hold = keine Datei für den Kandidaten; `NESTED AREA` = Formel-Befund gegen bestehende Tiefe-≥-3-Dateien; Sandbox-Nachweis = Formel-Detektion auf synthetischem Baum). **Option 2:** Matrix bleibt frozen; Klarstellung nur in den nicht-gefrorenen Sektionen (§5.8 Pkt. 2/3 + Verification) — die Matrix-Zeile bleibt als Änderungskandidat für die nächste Renegotiationsrunde notiert (Story-2.4-Präzedenz für frozen-Defizite). — **Aufgelöst (Nutzer, 2026-08-18, Option 1, menschlich-autorisierte Renegotiation):** Matrix-Zeile auf die Zwei-Zustands-Klarstellung umgestellt (Hold-Zeitpunkt = keine Datei für den Kandidaten; `NESTED AREA` = Formel-Befund gegen bestehende Tiefe-≥-3-Dateien; Sandbox-Nachweis = Detektion auf synthetischem Baum). Keine gefrorene Erwartung geändert (keine Datei / kein Index-Link / Meldung / „teilweise erfolgreich" bleiben bit-identisch erhalten) — die bereits gelebte Nachweis-Semantik wird nur explizit. + +### Patch + +- [x] [Review][Patch] §5.8-Instruktions-Hold hat keinen definierten Trigger-Punkt im Run-Flow — VG #5: §5.8 Pkt. 3 sagt, der Hold „hält Kandidaten an" (Erstellungskandidat oder Discovery-Ziel), aber die fixe Ablaufstruktur (§0: Input → Interpretieren → Reconcile → Synthetisieren → Mutieren → Validieren) enthält keinen Schritt, an dem er auslöst; §5.7-Routing kann Tiefe ≥ 3 strukturell nie erzeugen. Im Ist-Text ist der Hold faktisch nur der nachträgliche Baum-Zustands-Check der Selbsttest-Formel. Fix: Trigger auf den Mutieren-Schritt verankern (§5/§5.8 Pkt. 3): vor Anlage eines Ziel-Pfads in Tiefe ≥ 3 unter der Bundleroot feuert der Hold (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); die Selbsttest-Formel bleibt der nachträgliche Baum-Check. [schema/compiler.md:230] +- [x] [Review][Patch] Sprint-Status-Pfad im Log unvollständig — BH #2 + EC #9 + VG #2 + AA #1: der 2.5-Log-Eintrag dokumentiert `backlog → in-progress` („dieser Statuswechsel findet mit diesem Eintrag statt"), der Diff setzt den Key jedoch direkt `backlog → review`; der Review-Handoff wird nirgends als eigener Statusschritt protokolliert (Story-2.4-Präzedenz im selben File führt das Handoff explizit nach; Workflow-Kommentar `sprint-status.yaml` Z. 29). Fix: Log-Eintrag um die Handoff-Nachführung ergänzen (Analogie Story-2.4-Eintrag: „Review-Handoff, dieser Eintrag"; die gefrorene `→ in-progress`-Vorgabe beschreibt den Implementierungsstand). [wiki/log.md:4] +- [x] [Review][Patch] Validator-SUCCESS-Beleg fehlt im Log-Eintrag, den die Spec als Ausführungs-Nachweis benennt — AA #2: Spec-Verification Pkt. 3 verspricht „das Verdikt je Datei wird als Ausführungs-Nachweis im `log.md`-Eintrag geführt" (7 `wiki/`-Dateien SUCCESS, Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1); der 2.5-Log-Eintrag stützt sich implizit auf „unverändert zur Story 2.4" und trägt keine per-Datei-Verdikt-Zeile. Daneben: AC 5 (Z. 67) verlangt „re-executierbarer Validator-Befehl (BH13)" — nach der Loop-2-Korrektur (erfundener CLI-Befehl entfernt; Validator = human-mechanische Text-Instruktion) ist die Wortung nicht mehr erfüllbar und „BH13" ein hängender Verweis. Fix: (a) Log-Eintrag um die per-Datei-Verdikt-Zeile ergänzen; (b) AC 5 (nicht-gefroren) auf „mit dem per-Datei-Verdikt-Nachweis in `wiki/log.md` belegt" umstellen. [wiki/log.md:4, spec Z. 67] +- [x] [Review][Patch] Consumer-Suchbeispiel `grep -n wiki/` nicht ausführbar — VG #9: nicht-rekursives `grep -n` auf ein Verzeichnis schlägt fehl (`grep: wiki/: Is a directory`, Exit 2, verifiziert); nur `grep -rn`/ripgrep funktioniert. Fix (nicht-gefrorene Seite): §5.8 Pkt. 4 das rekursive Beispiel (`grep -rn wiki/` bzw. ripgrep) als primäre Beispielform voranstellen; die frozen-Matrix-Zeile `SEARCH_GREP` bleibt Änderungskandidat (s. Defer, frozen-Text-Kandidaten). [schema/compiler.md:231] +- [x] [Review][Patch] „Ash"-Phantomreferenz in der Suggested Review Order — BH #11 + AA #3: Z. 109 „(kein „Ash"-Ghost mehr)" — `grep -rn "Ash"` liefert im gesamten Repo exakt diese eine Stelle; kein „Ash"-Label/-Datei/-Befund existiert. Unauflösbarer Ghost-Verweis, irreführend in der Review-Navigation. Fix: Satz bereinigen (Phantom-Referenz entfernen). [spec Z. 109] +- [x] [Review][Patch] Phantom-Labels ohne Referenz: „S1–S5" im Log + „(BH1/EC1)" im normativen Instruktionstext — BH #13 + VG #6: der 2.5-Log-Eintrag beansprucht „Negativ-Kontrollen (S1–S5) auf dem Sandbox-Baum bestätigt" — S1–S5 sind nirgends definiert (I/O-Matrix-Szenarien tragen andere Namen; nur 2 davon sind negativ); §5.8 Pkt. 2 (B) (Z. 223) zitiert die Review-Layer-Befund-IDs „(BH1/EC1)" in den normativen Instruktionstext, der als einziger Instruktions-Ort (D-3) nirgendwo auf eine Review-Runde verweisen sollte. Fix: (a) Log-Eintrag: Szenario-Namen der I/O-Matrix verwenden (`AREA_UNREACHABLE`, `NESTED_AREA_KANDIDAT`); (b) `(BH1/EC1)`-Zitat aus §5.8 Pkt. 2 (B) entfernen. [wiki/log.md:4, schema/compiler.md:223] +- [x] [Review][Patch] Veraltete Zeilen-Zitate auf die drei Link-Pin-Defer-Einträge — BH #3 + VG #10 + AA #4: Tasks Z. 59 „(L219/L223/L249)" und Code Map Z. 51 „`status:` bei L224 … L246/L250" treffen nicht die Ist-`status:`-Zeilen in `deferred-work.md` (Ist: L220 `)`-blinde Extraktion, L224 Cross-Page-Anker, L250 Multi-Line; L246 ist der Status der Image-Eintrags, L219/L223/L249 sind `evidence:`-Zeilen; L246-Hauszuordnung „Deferred from … spec-2-3" zudem ungenau). Der Loop-2-Change-Log (h) behauptet „auf die Ist-Zeilen korrigiert" — korrigiert wurde nur der F-07-Eintrag (L87/L90). Fix: Zeilen-Zitate auf L220/L224/L250 korrigieren; F-07-Verortung Code Map (L87) vs. Tasks (L88) vereinheitlichen. [spec Z. 51, Z. 59] +- [x] [Review][Patch] Veraltete Referenz „§7 Z. 253" — BH #4: die Discovery-Vorbehalt-Zeile lag in `main` bei Z. 253, nach dem 32-zeiligen §5.8-Einschub steht sie bei **Z. 285**; spec (Code Map Z. 49, Manual-Checks Z. 91), `wiki/log.md`-Eintrag und Revisionslog 2.3 (compiler.md Z. 317) zitieren „§7 Z. 253" in Präsens-Kontexten, wo der Leser die Ist-Zeile erwartet. Fix: in Präsens-Kontexten die Ist-Zeile ergänzen (Z. 285) oder auf Sektions-Referenz ohne Zeilennummer umstellen. [spec Z. 49/91, wiki/log.md:4, schema/compiler.md:317] +- [x] [Review][Patch] Discovery-Demo-Verlinkung terminologisch widersprüchlich — VG #11 + BH #7: §5.8 Pkt. 5 (Z. 232) nennt den zusätzlichen Demo-Link „Index-Link … aus einem bestehenden Area-Concept heraus" — ein Link in der Concept-Body-Datei ist nach §5.6 (Pin gilt für Concept-Bodies und `index.md`-Dateien als getrennte Orte) ein Body-Link, kein Index-Link; die frozen-Matrix-Zeile formuliert die Richtung zusätzlich anders („in das Area-Concept verlinkt"). Fix (nicht-gefrorene Seite): §5.8 Pkt. 5 eindeutig als Body-Link benennen (`[](../.md)` aus `wiki/wissensarchitektur/source-material.md`, file-relative `../`-Form §5.7 Pkt. 4); frozen-Matrix-Zeile bleibt Änderungskandidat (s. Defer). [schema/compiler.md:232] +- [x] [Review][Patch] Inkonsistente Tiefen-Terminologie „zwei Ebenen" vs. „Tiefe ≥ 3" — BH #12: Hold-Name, I/O-Matrix und AC mischen „zwei Ebenen" (Verzeichnisstufen) und „Tiefe ≥ 3" (`find -mindepth 3` = Segment-Ebenen unter der Bundleroot inkl. Datei); aus Prosa allein ist nicht ableitbar, welche Schwelle verbindlich ist. Fix: §5.8 Pkt. 3 um eine definierende Zeile (Tiefe = Segment-Anzahl unter der Bundleroot; `wiki///…` = Tiefe ≥ 3 = zwei Verzeichnisstufen plus Datei; Meldung benennt die erste Ebene ``). [schema/compiler.md:230] +- [x] [Review][Patch] Falscher Norm-Anker in §5.8 Pkt. 1 — BH #9: Z. 208 „verlinkt die **Root-Concepts** (direkt, §5.7 Pkt. 5)" — §5.7 Pkt. 5 (Z. 199) trägt nur die Area-Pflichten; die Root-Concept-Verlinkungspflicht ist §5.3 Pkt. 3 (Z. 62), den derselbe Absatz einen Satz später korrekt nennt (Z. 212). Fix: Anker auf §5.3 Pkt. 3 korrigieren. [schema/compiler.md:208] +- [x] [Review][Patch] Inkongruente Outcome-Klassifizierung in §5.8 Pkt. 2 — VG #13: die Einleitung (Z. 213) sagt „**Run-FAIL-artig** gemäß §5.6-Pkt.-4-**analoger** NFR-4-Regel", das Bullet (Z. 227) „**Run-FAIL** gemäß §5.6 Pkt. 4-analoger NFR-4-Regel" — dieselbe Outcome-Kopplung wird einmal abgemildert, einmal direkt; „-artig … -analog" ist doppelt abgeschwächt. Fix: beide Stellen auf die uneingeschränkte Wortung vereinheitlichen („Run-FAIL gemäß §5.6 Pkt. 4-analoger NFR-4-Regel" — Loop-1-Pkt.-c-Verbindlichkeit). [schema/compiler.md:213/227] +- [x] [Review][Patch] Prosa-Formel-Textabweichung in §5.8 Pkt. 2 (B) — BH #10: Z. 223 zitiert `find wiki -mindepth 3 -name "*.md" -type f`, die gepinnte Formel (Z. 216) lautet `find wiki -mindepth 3 -type f -name "*.md"` (Semantik identisch, Wortlaut divergiert von der als verbindlich deklarierten byte-identischen Formel). Fix: Prosa-Zitat an die gepinnte Formel angleichen. [schema/compiler.md:223] +- [x] [Review][Patch] Suggested-Review-Order-Self-Link zeigt auf eine Leerzeile — VG #12: `spec-2-5-…:83` (Z. 115) verweist auf die leere Zeile zwischen „Commands" (Z. 82) und Verification-Punkt 1 (Z. 84–86); Ankernummer um eine Zeile verschoben. Fix: Anker auf Z. 84 korrigieren. [spec Z. 115] +- [x] [Review][Patch] Englisch-Fremdwort im deutschen Log-Text — BH #15: 2.5-Log-Eintrag mischt „Self-Check-Lauf A" in den konsequent deutschen Text. Fix: „Selbsttest-Lauf A" (bzw. „Lauf (A)"). [wiki/log.md:4] +- [x] [Review][Patch] Punkt-11-Delegation benennt die bekannte offene Validator-Lücke nicht — VG #1: §5.8 Pkt. 2 (Z. 213/229), die Spec (AC 2, Code Map) und der Log-Eintrag stützen die Nicht-Duplizierungs-These und den „Validator läuft SUCCESS"-Nachweis auf dem Validator-Punkt-11-Check, ohne den offenen Defer-Finding (deferred-work.md Z. 284–287: ein wörtlicher, mechanischer Punkt-11-Check meldete `Concept nicht verlinkt=wissensarchitektur/source-material`; Behebung = Rev-9-Aktionsitem, open) zu nennen — die SUCCESS-Behauptung ist damit nicht unabhängig überprüfbar. Fix: §5.8 Pkt. 2 (bzw. Pkt. 2-Bullet) um einen Zeigerverweis auf die bekannte Rev-9-Lücke (deferred-work.md) ergänzen; die Lücke selbst bleibt beim Rev-9-Aktionsitem (kein neuer Defer). [schema/compiler.md:213] + +### Defer + +- [x] [Review][Defer] Spec-Frontmatter `status: 'done'` bei offenem Review-Zyklus [spec Z. 5] — deferred, Story-2.4-Präzedenz (deferred-work.md Z. 269–272): `done` erst nach Review-Freigabe; mit dem Abschluss dieses Review-Loops synchron (s. Step 6), kein separates Patch. +- [x] [Review][Defer] Frozen-Text-Wortfehl- und Konsistenz-Kandidaten (nur per menschlicher Renegotiation änderbar) [spec Z. 18/42/43] — deferred, Änderungskandidaten für die nächste Renegotiationsrunde (Story-2.4-Präzedenz): (a) Intent Z. 18 „Revisionslog **(3.x)**" — implementiert ist **2.3** (Reihenfolge 2.0/2.1/2.2/2.3); (b) I/O-Matrix `DISCOVERY_DEMO_ROOT_AREA_LINK` Z. 42: „zusätzlich **überdacht** in das Area-Concept" — Wortfehler + Verlinkungsrichtung unauflösbar (nicht-gefrorene Seite s. Patch „Index-Link-Oxymoron"); (c) I/O-Matrix `SEARCH_GREP` Z. 43: `grep -n wiki/` nicht ausführbar (nicht-gefrorene Seite s. Patch „Consumer-Suchbeispiel"); (d) Intent Z. 18 „Kein Interface-/Backend-/Datenbank-**Änderung**" (Grammatik: „Keine … Änderungen"). diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 6185422..834c5bb 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -29,7 +29,7 @@ # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) # - Retrospective appends its action items to action_items; the status view surfaces open ones generated: 08-14-2026 00:00 -last_updated: 08-18-2026 14:11 +last_updated: 08-18-2026 17:45 project: wow20 project_key: NOKEY tracking_system: file-system @@ -47,7 +47,7 @@ development_status: 2-2-claim-granulare-provenienz-dokumentieren: done 2-3-concepts-verlinken-eine-erlaubte-linkform: done 2-4-deterministische-bereichszuordnung-concept-hierarchie: done - 2-5-progressive-discovery-über-index-md-bereitstellen: review + 2-5-progressive-discovery-über-index-md-bereitstellen: done epic-2-retrospective: optional epic-3: backlog @@ -63,7 +63,7 @@ development_status: epic-4: backlog 4-1-information-vor-jeder-änderung-klassifizieren-new-confirming: backlog - 4-2-disagreements-in-log-md-explizit-dokumentieren: backlog3.3. + 4-2-disagreements-in-log-md-explizit-dokumentieren: backlog 4-3-menschliche-kuratierung-respektieren-human-curation: backlog 4-4-trust-metadaten-maschinell-vs-human-reviewed-unterscheiden: backlog epic-4-retrospective: optional diff --git a/schema/compiler.md b/schema/compiler.md index 2466f15..ed5000d 100644 --- a/schema/compiler.md +++ b/schema/compiler.md @@ -201,35 +201,35 @@ Bereichszuordnung und Concept-Hierarchie sind **textual-deterministisch** (AD-7c ## 5.8 Progressive Discovery über `index.md` (Story 2.5) -Progressive Discovery ist die **schrittweise Navigation** eines Consumers von der Bundle-Übersicht zu den Concepts über die `index.md`-Hierarchie (AD-9, FR-11) — die **erste Discovery-Ebene** des Bundles. Diese Sektion ist der **einzige Instruktions-Ort** der Discovery-Semantik (D-3, Story 2.5). Sie fügt **kein** Prädikat, keine neuen §7-Invaliditätsklassen und keinen Schema-/Validator-Change hinzu (AD-3); der Validator bleibt bei Punkt 11 als strukturelle Index-/Verlinkungs-Prüfung (Area-Existenz + Concept-in-Index verlinkt). Die Discovery-Vollständigkeit (Root → Area → Concept) ist **keine** neue §7-Invaliditätsklasse — sie wird deterministisch als **Instruktions-Selbsttest** (Pkt. 2) belegt: Verstöße gegen die gewurzelte Erreichbarkeit bzw. die Zwei-Ebenen-Kartografie werden vom Producer vor Abschluss des Runs über eine **re-executierbare Selbsttest-Formel** textuell benannt (NFR-4-analog, Run-FAIL-artiger Nachweis). Sie antwortet zugleich auf die offene Defer-Frage **F-07** (verschachtelte Areas/Unter-Ebenen, `wiki/a/b/concept.md`): die Kartografie ist ab Story 2.5 konsolidiert **Zwei-Ebenen** (Pkt. 3). +Progressive Discovery ist die **schrittweise Navigation** eines Consumers von der Bundle-Übersicht zu den Concepts über die `index.md`-Hierarchie (AD-9, FR-11) — die **erste Discovery-Ebene** des Bundles. Diese Sektion ist der **einzige Instruktions-Ort** der Discovery-Semantik (D-3, Story 2.5). Sie fügt **kein** Prädikat, keine neuen §7-Invaliditätsklassen und keinen Schema-/Validator-Change hinzu (AD-3); der Validator bleibt bei Punkt 11 als strukturelle Index-/Verlinkungs-Prüfung (Area-Existenz + Concept-in-Index verlinkt). Die Discovery-Vollständigkeit (Root → Area → Concept) ist **keine** neue §7-Invaliditätsklasse — sie wird deterministisch als **Instruktions-Selbsttest** (Pkt. 2) belegt: Verstöße gegen die gewurzelte Erreichbarkeit bzw. die Zwei-Ebenen-Kartografie werden vom Producer vor Abschluss des Runs über eine **re-executierbare Selbsttest-Formel** textuell benannt (NFR-4-analog, Run-FAIL-Nachweis). Sie antwortet zugleich auf die offene Defer-Frage **F-07** (verschachtelte Areas/Unter-Ebenen, `wiki/a/b/concept.md`): die Kartografie ist ab Story 2.5 konsolidiert **Zwei-Ebenen** (Pkt. 3). 1. **Discovery-Pfad (AD-9, FR-11):** Ein Consumer startet die Navigation an der **Bundle-Root** `wiki/index.md` und folgt dann den Area-`index.md`-Dateien zu den Concepts: - - **Bundleroot `wiki/index.md`** — Einstiegspunkt: verlinkt die **Root-Concepts** (direkt, §5.7 Pkt. 5) und die **Area-`index.md`-Dateien** (Navigation Root → Area, AD-9). + - **Bundleroot `wiki/index.md`** — Einstiegspunkt: verlinkt die **Root-Concepts** (direkt, §5.3 Pkt. 3) und die **Area-`index.md`-Dateien** (Navigation Root → Area, AD-9). - **Area-`index.md`** (`wiki//index.md`, **frontmatterlos**, Vertrag §2/§6, Validator Punkt 10) — verlinkt ihre **Area-Concepts** in der gepinnten §5.6-Form (§5.7 Pkt. 5). - **Concept** (`wiki/.md` bzw. `wiki//.md`) — das Ziel der Navigation. Erwarteter Erreichbarkeits-Satz **(gewurzelte Erreichbarkeit, Root → Area → Concept)**: jedes Root-Concept ist aus der Bundleroot erreichbar; jede Area ist aus der Bundleroot verlinkt (AD-9); jedes Area-Concept ist aus seiner Area-`index.md` erreichbar. Originäre Aussage-Pflicht des §5.7-Discovery-Bildes bleibt §5.7 Pkt. 5 (ein neues Area-Concept MUSS in `wiki//index.md` verlinkt sein, ein neues Root-Concept in `wiki/index.md` — §5.3 Pkt. 3); §5.8 erläutert die Discovery-**Semantik** dieser bestehenden Regeln, macht den Erreichbarkeits-Satz als Kriterium explizit und bindet ihn an die re-executierbare Selbsttest-Formel (Pkt. 2). -2. **Gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest (AD-17h):** Die Discovery-Vollständigkeit ist textuell prüfbar: jede Area `wiki//` MUSS von der Bundleroot aus verlinkt sein (Root-→-Area-Pfad, AD-9). Die Area→Concept-Verlinkung („jedes Area-Concept in seiner Area-`index.md`") ist durch den **Validator Punkt 11** (`Concept nicht verlinkt=`) mechanisch abgedeckt und wird hier bewusst **nicht dupliziert** (so auch der Erreichbarkeits-Satz für Root-Concepts, siehe unten). Der Producer führt vor Abschluss eines Runs, der Areas oder Area-Concepts anlegt/verlinkt, den folgenden Selbsttest ab der Workspace-Root aus (erwartet: **keine** Ausgabe; jede Ausgabe = textuell benannter Selbsttest-Befund, der vor Run-Abschluss zu beheben ist — Run-FAIL-artig gemäß §5.6-Pkt.-4-analoger NFR-4-Regel, kein stiller Vorbeilass): +2. **Gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest (AD-17h):** Die Discovery-Vollständigkeit ist textuell prüfbar: jede Area `wiki//` MUSS von der Bundleroot aus verlinkt sein (Root-→-Area-Pfad, AD-9). Die Area→Concept-Verlinkung („jedes Area-Concept in seiner Area-`index.md`") ist durch den **Validator Punkt 11** (`Concept nicht verlinkt=`) mechanisch abgedeckt und wird hier bewusst **nicht dupliziert** (so auch der Erreichbarkeits-Satz für Root-Concepts, siehe unten). Der Producer führt vor Abschluss eines Runs, der Areas oder Area-Concepts anlegt/verlinkt, den folgenden Selbsttest ab der Workspace-Root aus (erwartet: **keine** Ausgabe; jede Ausgabe = textuell benannter Selbsttest-Befund, der vor Run-Abschluss zu beheben ist — Run-FAIL gemäß §5.6 Pkt. 4-analoger NFR-4-Regel, kein stiller Vorbeilass). **Prämisse (Loop-3-Fix):** die Formel setzt POSIX-`sh` mit GNU-`find`/`grep`/`sort` (z. B. Git-Bash auf win32, NFR-1/NFR-5) und die Arbeitsverzeichnisse `wiki/index.md` ab — die CWD-Präguard der Formel meldet `SELBSTTEST-SETUP-Fehler: …` mit Exit `1`, wenn `wiki/index.md` fehlt (falsches CWD), statt mit leeren Ausgabe + Exit `0` als SUCCESS durchzugehen: ```sh - sh -c 'for f in $(find wiki -mindepth 2 -name index.md); do a="${f#wiki/}"; a="${a%/index.md}"; case "$a" in */*) continue;; esac; grep -qE "\($a/index\.md|\(\./$a/index\.md" wiki/index.md || echo "UNREACHABLE AREA: $a"; done; find wiki -mindepth 3 -type f -name "*.md" | sort -u | while read -r f; do d="${f#wiki/}"; a="${d%%/*}"; echo "NESTED AREA: $a"; done | sort -u' + sh -c '[ -f wiki/index.md ] || { echo "SELBSTTEST-SETUP-Fehler: Workspace-Root (wiki/index.md fehlt)"; exit 1; }; find wiki -mindepth 2 -name index.md | while IFS= read -r f; do a="${f#wiki/}"; a="${a%/index.md}"; case "$a" in */*) continue;; esac; grep -qF "]($a/index.md" wiki/index.md || grep -qF "](./$a/index.md" wiki/index.md || echo "UNREACHABLE AREA: $a"; done; find wiki -mindepth 3 -type f -name "*.md" | LC_ALL=C sort -u | while IFS= read -r f; do d="${f#wiki/}"; a="${d%%/*}"; echo "NESTED AREA: $a"; done | LC_ALL=C sort -u' ``` Die Formel prüft in zwei unabhängigen Läufen — je Verletzung **genau eine** deterministische Meldung: - **(A) Index-Erreichbarkeits-Check** (erster Lauf): `find wiki -mindepth 2 -name index.md` — jede Ein-Ebenen-Area-`index.md` (`wiki//index.md`) MUSS aus `wiki/index.md` verlinkt sein (Root→Area, AD-9); verlinkt = Ziel in gepinnter §5.6-Form `(a/index.md` bzw. `(./a/index.md`. Fehlt der Link, **`UNREACHABLE AREA: `** (textuell benannter Instruktions-Selbsttest-Befund, Run-FAIL gemäß §5.6-Pkt.-4-analoger NFR-4-Regel). `*/*`-Kandidaten (`wiki/a/b/index.md`) werden hier übersprungen — ihre Verletzung ist keine Erreichbarkeit, sondern die Struktur selbst und wird in (B) gemeldet. + **(A) Index-Erreichbarkeits-Check** (erster Lauf): `find wiki -mindepth 2 -name index.md` — jede Ein-Ebenen-Area-`index.md` (`wiki//index.md`) MUSS aus `wiki/index.md` **verlinkt** sein (Root→Area, AD-9); verlinkt = echtes Markdown-Link-Ziel in gepinnter §5.6-Form `](a/index.md` bzw. `](./a/index.md` in der Bundleroot (Loop-3-Fix: das Muster prüft die Linksyntax `](`, nicht das bloße Klammer-Paar — ein Prosa-Ausdruck `(a/index.md` ohne `](` besteht den Check nicht; `grep -qF` (Fix-String) statt ERE, damit ERE-Metazeichen im Area-Namen kein stilles Durchpassen erzeugen). Fehlt der Link, **`UNREACHABLE AREA: `** (textuell benannter Instruktions-Selbsttest-Befund, Run-FAIL gemäß §5.6 Pkt. 4-analoger NFR-4-Regel). `*/*`-Kandidaten (`wiki/a/b/index.md`) werden hier übersprungen — ihre Verletzung ist keine Erreichbarkeit, sondern die Struktur selbst und wird in (B) gemeldet. - **(B) Zwei-Ebenen-Detektion** (zweiter Lauf): `find wiki -mindepth 3 -name "*.md" -type f` — jede Markdown-Datei mit drei Segment-Ebenen unter der Bundleroot (`wiki///…`) ist ein Zwei-Ebenen-Kandidat → **`NESTED AREA: `** (die erste Ebene der nicht-zulässigen Struktur). Dieser Lauf schließt auch die **Area-ohne-`index.md`-Lücke**: `wiki/a/b/concept.md` (ohne `index.md`) war dem reinen `index.md`-Scan unsichtbar und wird jetzt erfasst (BH1/EC1). `sort -u` konsolidiert Mehrfach-Meldungen (mehrere Dateien unter derselben ersten Ebene → eine Meldung). + **(B) Zwei-Ebenen-Detektion** (zweiter Lauf): `find wiki -mindepth 3 -type f -name "*.md"` — jede Markdown-Datei mit drei Segment-Ebenen unter der Bundleroot (`wiki///…`) ist ein Zwei-Ebenen-Kandidat → **`NESTED AREA: `** (die erste Ebene der nicht-zulässigen Struktur). Dieser Lauf schließt auch die **Area-ohne-`index.md`-Lücke**: `wiki/a/b/concept.md` (ohne `index.md`) war dem reinen `index.md`-Scan unsichtbar und wird jetzt erfasst. `LC_ALL=C sort -u` konsolidiert Mehrfach-Meldungen (mehrere Dateien unter derselben ersten Ebene → eine Meldung; C-Locale macht die Meldungsreihenfolge umgebungsunabhängig deterministisch, AD-17h). **Zwei Zustände (Loop-3-Klarstellung):** (1) **Hold-Zeitpunkt** — der Erstellungskandidat wird im Mutieren-Schritt (Pkt. 3) angehalten: keine Datei, kein Index-Link; (2) **Formel-Befund** — existiert eine Markdown-Datei in Tiefe ≥ 3 unter der Bundleroot (nachträglich oder auf einem synthetischen Prüfbaum), meldet dieser Lauf `NESTED AREA: `; der Sandbox-Nachweis im `log.md`-Eintrag belegt die Detektion auf einem synthetischen Baum mit angelegter Testdatei. Beide Läufe ohne Ausgabe = Discovery-SUCCESS. Die Meldungen sind **Instruktions-Selbsttest-Befunde** — kein Validator-Punkt, keine neue §7-Klasse (AD-3). - **`UNREACHABLE AREA: `** — eine Area-`index.md` existiert, ist aber von der Bundleroot **nicht** verlinkt (kein Root→Area-Pfad): die Area bleibt für die Navigation unsichtbar (AD-9). Die Meldung ist ein textuell benannter **Instruktions-Selbsttest-Befund** (Run-FAIL gemäß §5.6 Pkt. 4-analoger NFR-4-Regel) — **kein** Validator-Punkt, **keine** neue §7-Klasse. - - **`NESTED AREA: `** — jede Markdown-Datei in einem Zwei-Ebenen-Pfad (Tiefe ≥ 3, Lauf (B), Pkt. 3): ein `wiki/a/b/index.md`-Kandidat wie auch ein `wiki/a/b/concept.md` **ohne** `index.md` (die Area-ohne-Index-Lücke, die der reine `index.md`-Scan übersähe) sind Fälle der **konsolidierten Zwei-Ebenen-Kartografie** (Pkt. 3): die Verzeichnisstruktur ist keine zugelassene Anlageform; ein solcher Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, Meldung, Run „teilweise erfolgreich") — **analog**, aber **bewusst nicht** über den §3.2-Kollisions-Hold der Dateikollision bestehender Concepts (§3.2, Z. 40, bliebe ungeschärft für brandneue Pfade). - - Der Erreichbarkeits-Satz für **Root-Concepts** (jedes Root-Concept in `wiki/index.md` verlinkt) ist durch den Validator-Punkt-11-Check (§3 Punkt 11) abgedeckt und wird hier nicht dupliziert; der Selbsttest deckt die vom Validator offene Lücke (Root→Area-Navigation) ab. Die §5.6-Formeln (Z. 133–166) decken die **Link-Form** weiterhin ab (der Selbsttest prüft die Erreichbarkeit, nicht die Form — die Form bleibt beim §5.6-Form-Check). -3. **Konsolidierte Zwei-Ebenen-Kartografie (antwortet Defer F-07, schließt es):** Das Bundle-Navigationsmodell besteht ab Story 2.5 aus **einer** Area-Ebene: Root-Concepts (direkt aus der Bundleroot) + Areas (`wiki//`), jede mit genau einer frontmatterlosen `wiki//index.md`, die ihre Area-Concepts in gepinnter §5.6-Form verlinkt; die Bundleroot verlinkt die Area-`index.md`-Dateien (Navigation Root → Area, AD-9). **Verschachtelte Areas sind keine zugelassene Anlageform:** `wiki/a/b/` mit Concept darunter ist **kein** „Area mit Inhalt" — ein solcher Kandidat (Erstellungskandidat oder Discovery-Ziel) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten: keine Datei, kein Index-Link, textuelle Meldung **`NESTED AREA: `** (Pkt. 2); der Run bricht für dieses Gebilde mit „teilweise erfolgreich" ab (die übrigen erkannten Einheiten laufen weiter, NFR-4). Der Hold ist **§5.8-lokal** verankert (dieser Absatz) und trägt die **Discovery-Entscheidung** der Story — er ist **bewusst nicht** der §3.2-Kollisions-Hold der Dateikollision (§3.2, Z. 40): jener bleibt ausschließlich dem Fall vorbehalten, dass ein Ziel-Pfad bereits als Concept existiert („Concept existiert bereits — Aktualisierung ist Epic 3"); ein brandneuer Zwei-Ebenen-Pfad kollidiert mit keinem existierenden Pfad und wird daher über diesen §5.8-Hold gelenkt, nicht über §3.2. Die F-07-Frage „was ist Area mit Inhalt" ist damit instruktionsseitig deterministisch beantwortet: **Area mit Inhalt = `wiki//` mit `index.md` + Area-Concepts auf der Area-Ebene**; eine tiefere Verschachtelung ist kein eigener Bereich, sondern ein **§5.8-Zwei-Ebenen-Verstoß** (nicht erlaubt). Keine zweite Discovery-Ebene über die Zwei-Ebenen-Struktur hinaus (Boundaries, „Never"). -4. **Suche = Consumer-grep (AD-13, FR-11, NFR-3):** Die Navigation ist die **primäre** Discovery (gewurzelte Erreichbarkeit, Pkt. 1–2). Die **Suche ist konsumenten-/extern-seitig** — die Discovery braucht **keine proprietäre Datenbank, keinen Such-Dienst, kein Embedding/Vector, kein Index-Datei-Format** (AD-8, AD-13): ein Consumer führt die textuell-deterministische Suche selbst aus, z. B. `grep -n wiki/` bzw. `grep -rn wiki/` (oder `ripgrep`) über den Markdown-Baum (NFR-3 „Standard-Dateioperationen"). Das Bundle bleibt ohne geladene Indizes — z. B. nach einem Git-Clone — vollständig verständlich (NFR-2, NFR-5). Der Story-2.5-Vorbehalt (§7 Z. 253 auf „Suche"-Rest gekürzt) ist damit aufgelöst: die Suche ist ein Consumer-Thema, kein Bundle-/Instruktions-Thema mehr. -5. **Discovery-Demo (optional, kein MOVE):** Bestehende Root-Concepts werden **nicht** in Areas verschoben (Kuratierung/AD-7d ist Epic-3-Nähe). Als Discovery-Demo **kann** (optional) ein **neues** Root-Concept `wiki/.md` ergänzt und (a) in der Bundleroot (§5.7 Pkt. 5) sowie (b) — rein informierend — über einen zusätzlichen Index-Link in gepinnter §5.6-Form aus einem bestehenden Area-Concept heraus verlinkt werden (der Inhalt bleibt Root-Concept; der Area-Link ist zusätzliche Erreichbarkeit, keine Neuzuordnung). Beide Verlinkungen halten die einheitliche Zwei-Ebenen-Kartografie (Pkt. 3). Die Durchführung ist **optional** (Matrix-Zeile `DISCOVERY_DEMO_ROOT_AREA_LINK`); sie **erhöht** die `(raw/`-Zählung der §5.6-Formel-4-Baseline (neuer Zuwachs-Run, Re-Baseline-Pflicht) und ist nur zusammen mit dem Nachweis dieses neuen Baselines zusätzlich durchzuführen — wird sie weggelassen, bleibt Formel 4 unverändert `38 ≡ 38` (kein Re-Baseline-Bedarf). Die hier beschriebene Regel ist die Demo-**Instruktion**; ob das konkrete Demo-Concept in diesem Run angelegt wird, entscheidet der Producer im Rahmen der optionalen Durchführung. + - **`NESTED AREA: `** — jede Markdown-Datei in einem Zwei-Ebenen-Pfad (Tiefe ≥ 3, Lauf (B), Pkt. 3): ein `wiki/a/b/index.md`-Kandidat wie auch ein `wiki/a/b/concept.md` **ohne** `index.md` (die Area-ohne-Index-Lücke, die der reine `index.md`-Scan übersähe) sind Fälle der **konsolidierten Zwei-Ebenen-Kartografie** (Pkt. 3): die Verzeichnisstruktur ist keine zugelassene Anlageform; ein solcher Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (Trigger: Mutieren-Schritt, Pkt. 3 — keine Datei, kein Index-Link, Meldung, Run „teilweise erfolgreich"; nachträgliche bestehende Tiefe-≥-3-Dateien meldet Lauf (B)) — **analog**, aber **bewusst nicht** über den §3.2-Kollisions-Hold der Dateikollision bestehender Concepts (§3.2, Z. 40, bliebe ungeschärft für brandneue Pfade). + - Der Erreichbarkeits-Satz für **Root-Concepts** (jedes Root-Concept in `wiki/index.md` verlinkt) ist durch den Validator-Punkt-11-Check (§3 Punkt 11) abgedeckt und wird hier nicht dupliziert; der Selbsttest deckt die vom Validator offene Lücke (Root→Area-Navigation) ab. (Bekannte offene Lücke des Punkt-11-Checks: die file-relative Area-Lesart — ein wörtlich-mechanischer Check meldete `Concept nicht verlinkt=wissensarchitektur/source-material`; Behebung steht im Rev-9-Aktionsitem, s. `deferred-work.md`, Spec-2.4-Defer.) Die §5.6-Formeln (Z. 133–166) decken die **Link-Form** weiterhin ab (der Selbsttest prüft die Erreichbarkeit, nicht die Form — die Form bleibt beim §5.6-Form-Check). +3. **Konsolidierte Zwei-Ebenen-Kartografie (antwortet Defer F-07, schließt es):** Das Bundle-Navigationsmodell besteht ab Story 2.5 aus **einer** Area-Ebene: Root-Concepts (direkt aus der Bundleroot) + Areas (`wiki//`), jede mit genau einer frontmatterlosen `wiki//index.md`, die ihre Area-Concepts in gepinnter §5.6-Form verlinkt; die Bundleroot verlinkt die Area-`index.md`-Dateien (Navigation Root → Area, AD-9). **Verschachtelte Areas sind keine zugelassene Anlageform:** `wiki/a/b/` mit Concept darunter ist **kein** „Area mit Inhalt" — ein solcher Kandidat (Erstellungskandidat oder Discovery-Ziel) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten: keine Datei, kein Index-Link, textuelle Meldung **`NESTED AREA: `** (Pkt. 2); der Run bricht für dieses Gebilde mit „teilweise erfolgreich" ab (die übrigen erkannten Einheiten laufen weiter, NFR-4). **Tiefen-Definition (Loop-3-Klarstellung):** „Tiefe" ist die Segment-Anzahl unter der Bundleroot — `wiki///…` hat Tiefe ≥ 3 (zwei Verzeichnisstufen plus Datei); das ist exakt die `find -mindepth 3`-Schwelle von Lauf (B). Die Meldung benennt immer die **erste** Ebene `` der nicht-zulässigen Struktur. **Trigger im Run-Flow (Loop-3-Fix):** der Hold feuert im **Mutieren-Schritt** (§0-Ablaufstruktur, Schritt (4)) — der Producer prüft vor Anlage eines Ziel-Pfads dessen Tiefe unter der Bundleroot; Tiefe ≥ 3 → Hold (kein §5.7-Routing kann Tiefe ≥ 3 strukturell erzeugen, der Hold sichert die Regel zusätzlich). Lauf (B) der Selbsttest-Formel bleibt der nachträgliche Baum-Check gegen bestehende Tiefe-≥-3-Dateien. Der Hold ist **§5.8-lokal** verankert (dieser Absatz) und trägt die **Discovery-Entscheidung** der Story — er ist **bewusst nicht** der §3.2-Kollisions-Hold der Dateikollision (§3.2, Z. 40): jener bleibt ausschließlich dem Fall vorbehalten, dass ein Ziel-Pfad bereits als Concept existiert („Concept existiert bereits — Aktualisierung ist Epic 3"); ein brandneuer Zwei-Ebenen-Pfad kollidiert mit keinem existierenden Pfad und wird daher über diesen §5.8-Hold gelenkt, nicht über §3.2. Die F-07-Frage „was ist Area mit Inhalt" ist damit instruktionsseitig deterministisch beantwortet: **Area mit Inhalt = `wiki//` mit `index.md` + Area-Concepts auf der Area-Ebene**; eine tiefere Verschachtelung ist kein eigener Bereich, sondern ein **§5.8-Zwei-Ebenen-Verstoß** (nicht erlaubt). Keine zweite Discovery-Ebene über die Zwei-Ebenen-Struktur hinaus (Boundaries, „Never"). +4. **Suche = Consumer-grep (AD-13, FR-11, NFR-3):** Die Navigation ist die **primäre** Discovery (gewurzelte Erreichbarkeit, Pkt. 1–2). Die **Suche ist konsumenten-/extern-seitig** — die Discovery braucht **keine proprietäre Datenbank, keinen Such-Dienst, kein Embedding/Vector, kein Index-Datei-Format** (AD-8, AD-13): ein Consumer führt die textuell-deterministische Suche selbst aus, z. B. `grep -rn wiki/` (rekursiv) bzw. `rg wiki/` (ripgrep) über den Markdown-Baum (NFR-3 „Standard-Dateioperationen"); die rekursive Form ist verbindlich — ein nicht-rekursives `grep -n wiki/` schlägt auf ein Verzeichnis fehl (Exit 2). Das Bundle bleibt ohne geladene Indizes — z. B. nach einem Git-Clone — vollständig verständlich (NFR-2, NFR-5). Der Story-2.5-Vorbehalt (§7 Z. 253 auf „Suche"-Rest gekürzt) ist damit aufgelöst: die Suche ist ein Consumer-Thema, kein Bundle-/Instruktions-Thema mehr. +5. **Discovery-Demo (optional, kein MOVE):** Bestehende Root-Concepts werden **nicht** in Areas verschoben (Kuratierung/AD-7d ist Epic-3-Nähe). Als Discovery-Demo **kann** (optional) ein **neues** Root-Concept `wiki/.md` ergänzt und (a) in der Bundleroot (§5.3 Pkt. 3) sowie (b) — rein informierend — über einen zusätzlichen **Body-Link** in gepinnter file-relativer §5.6-Form (`[](../.md)`) aus einem bestehenden Area-Concept heraus verlinkt werden (z. B. aus `wiki/wissensarchitektur/source-material.md`; der Inhalt bleibt Root-Concept; der Area-Body-Link ist zusätzliche Erreichbarkeit, keine Neuzuordnung; ein Link aus einer Concept-Body-Datei ist ein Body-Link, kein Index-Link — §5.6 Pkt. 2). Beide Verlinkungen halten die einheitliche Zwei-Ebenen-Kartografie (Pkt. 3). Die Durchführung ist **optional** (Matrix-Zeile `DISCOVERY_DEMO_ROOT_AREA_LINK`); sie **erhöht** die `(raw/`-Zählung der §5.6-Formel-4-Baseline (neuer Zuwachs-Run, Re-Baseline-Pflicht) und ist nur zusammen mit dem Nachweis dieses neuen Baselines zusätzlich durchzuführen — wird sie weggelassen, bleibt Formel 4 unverändert `38 ≡ 38` (kein Re-Baseline-Bedarf). Die hier beschriebene Regel ist die Demo-**Instruktion**; ob das konkrete Demo-Concept in diesem Run angelegt wird, entscheidet der Producer im Rahmen der optionalen Durchführung. ## 6. Validieren (mechanische Bestätigung) @@ -314,4 +314,4 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - **Revision 2.0 (2026-08-17, Story 2.3, bmad-code-review, Review-Runde):** §5.6-Pin-Schärfung aus dem Code-Review (Blind-Hunter + Edge-Case-Hunter): (1) **Formel 2 (Form-Check)** um die Exklusions-Stufe `grep -vE '^\.'` erweitert — Ziele mit `./`-Präfix (und damit nicht-root-relative Pfade) werden definiert aus dem Pin ausgenommen, statt still als „interne `.md`-Form" durchzugehen; die erläuternde Exklusions-Aufzählung in Pkt. 2 entsprechend ergänzt (`./`-Präfix-Ziele: nicht root-relativ/keine Bundle-Pfad-Form); (2) **Formel 3 (Dangling-Check)** `case`-Muster um `./*` und `/*` erweitert — `./`-Präfix-Ziele und absolute Wurzel-Pfade werden konsistent exkludiert (Analog zu `../*`), statt `DANGLING: ./foo.md`-Fehlbenennung zu erzeugen. Beide Formeln bleiben deterministisch re-executierbar (AD-17h) und werden in der Spec-Verification byte-identisch gespiegelt (verifiziert: 5/5 Formel-Strings identisch compiler↔spec). Positiv-Kontrolle nach Patch: Form-Check `0` (Exit `0`), Dangling-Check leere Ausgabe, Bestands-Check `8` Links, `raw/`-Baseline `30 ≡ 30`. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/`; kein Standalone (D-3); keine neue §7-Klasse; keine Vertragsänderung. (Die zugehörigen Defer-Findings — Image-Scope, Multi-Line-, Reference-Style- und Leading-Space-Ziele, künftiges Area-`log.md` — sind in `deferred-work.md` dokumentiert, Story-2.4-Kandidat.) - **Revision 2.1 (2026-08-18, Story 2.4):** Neue Sektion **§5.7 „Deterministische Bereichszuordnung & Concept-Hierarchie"** eingefügt (nach §5.6, vor §6): (1) Routing-Regel textual-deterministisch (`index.md`-Erst-`Link` → Bereich, sonst Root; neue Areas nur konsolidiert; nie Embedding/Vector — AD-7c/A0-10/AD-13), (2) kanonische ID-Normalisierung mit Beispieltabelle `wiki//index.md` → `` (AD-7a/A0-8), (3) Kollisions-Hold → Verweis auf den fixierten §3.2 (kein neues Prädikat, kein MOVE, A0-10), (4) **file-relatives Link-Auflösungsmodell** (`../`-fähig, eine Form, §5.6-Pin unverändert) inkl. Out-of-Bundle-`..`-Containment, (5) Area-`index.md`-Regel (frontmatterlos, Punkt 10; Area ohne `index.md` → wörtliche Punkt-11-Meldung `FAIL … Punkt 11: Index-Regel verletzt (Area ohne index.md=…)` — **kein** inventiertes `AREA_WITHOUT_INDEX`-Label; §5.7 Pkt. 5), (6) Worked Example Area-Concept. Nachgeführt: §5.1 Pkt. 1 (Ziel-Pfad → §5.7-Verweis, „Area-Zuordnung ist Story 2.4"-Backlog-Klausel aufgelöst), §5.3 Pkt. 3 (Index-Regel area-bewusst: Concept → `index.md` seines Bereichs), §5.6 Pkt. 1/2/3/4/5 (file-relatives Auflösungsmodell; `../`-Exklusion aufgelöst → in-Bundle-Auflösung; **Formel 2** Exklusions-Erläuterung um `../`-Zähl-Freistellung ergänzt; **Formel 3** um Quell-Datei-Spur (`grep -roE` + `datei|ziel`-sed) und **in-Bundle-`..`-Auflösung mit Containment** inkl. `../schema/*`-Exklusion erweitert — Out-of-Bundle-`..`-Escape (`../../README.md`, `../../schema/compiler.md`) wird als `DANGLING` gesperrt, Loop-1-Review-A1-Fix; **Formel 4** neu auf den `baseline_commit` dieser Spezifikation `66451b6…` basiert — nicht den Story-2.3-`7e1f449…`, Loop-1-Review-A2-Fix — mit Basename-Filter `grep -v "log.md$"`), §6.6 (Referenzzeile §5.1/§5.7), §6 Pkt. 2 (Erfolgsbedingung Punkt 11 area-bewusst), §7-Selbstbegrenzung-Bullet → „in §5.7 verankert", §8-Normreferenzen um AD-7c/AD-7d/A0-8/A0-10/A0-13/PRD-§8.2/§8.3 ergänzt. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/`; keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. - **Revision 2.2 (2026-08-18, Story 2.4, bmad-code-review Loop 2, 4 Layer; Nutzer-Entscheidungen 1/1/1):** (1) **Formel 3 (Dangling-Check) quellenbasierte `../schema/*`-Exklusion (Decision 2):** `case "$t" in …|../schema/*)` um Quell-Bedingung geschärft — die Exklusion greift nur, wenn die Quell-Datei auf Bundleroot-Ebene liegt (`dirname ` = `wiki`); aus Area-Quellen läuft einstufiges `../schema/…` durch die bestehende Auflösung + `wiki/*`-Containment + `-f`-Existenztest (nicht existent → `DANGLING: …`, kein stiller Vorbeilass, NFR-4); Negativ-Beispiel 2 um die In-Bundle-Variante `[x](../schema/compiler.md)` aus `wiki/wissensarchitektur/source-material.md` → `DANGLING: ../schema/compiler.md` ergänzt (Sandbox-Nachweis); (2) **Formel 4 (Kontakt-mit-`raw/`) Re-Baseline auf den Run-Kopf (Decision 1):** Extraktions-Commit von `66451b6…` auf `862cf410c624072833cd959da9a2fb26235716f6` (Kopf dieses Zuwachs-Runs, Extraktion = 38) umgestellt — der gepinnte Selbsttest lief auf dem Zuwachs-Baum deterministisch `38 ≠ 30` = Run-FAIL (bekannt-böser Zustand aus Loop-1-A2, nur halb geheilt); Erwartungstext jetzt „Ist ≡ Extraktion aus dem Baseline-Commit des letzten Zuwachs-Runs" (aktuell: Run-Kopf `862cf41`, **38 ≡ 38**); `66451b6`/`30` bleibt als Referenz des Vor-Zuwachs-Zustands dokumentiert; Wieder-Baseline-Klausel für künftige Zuwachs-Runs; (3) **§5.7 Pkt. 1(a) textuelles Treffer-Prädikat + deterministisches Tie-Break (Decision 3):** „inhaltlich deckungsgleichen Eintrag" (Urteil, AD-13-Verstoß) ersetzt — Treffer = Identität des `index.md`-Link-Ziels ≡ kanonischer Name des neuen Themas (Pkt. 2); Mehrfachtreffer → Bundleroot-Links vor Area-Links (Bundleroot-Treffer = Root-Concept-Verweis → Default Root-Ebene gemäß (b)), dann lexicografisch kleinste Area-Pfad-Zeichenfolge; (4) file-relative Pin-Wortwahl nachgeführt — §5.3 Pkt. 3 (Oxymoron „file-relativ bundle-relativ" aufgelöst: „file-relativ, mit `.md`-Endung; §5.7 Pkt. 4"), §6.6-Zelle (bzw. das doppelte Leerzeichen) und §7-Bullet; (5) §7-Scope-Einleitung „auf die Erzeugung neuer Concepts auf Root-Ebene begrenzt" → „Root-Ebene und in Areas gemäß §5.7"; (6) Typos („akte-Baseline" → „aktuelle Baseline", „Kopf dieser Spezifikation" → „Baseline-Commit des letzten Zuwachs-Runs"). Positiv-Kontrolle nach Patch (re-executiert): Formel 2 (Form-Check) `0` (Exit `0`), Formel 3 (Dangling-Check) leere Ausgabe, Formel 4 **38 ≡ 38**. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/` (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. -- **Revision 2.3 (2026-08-18, Story 2.5):** Neue Sektion **§5.8 „Progressive Discovery über `index.md` (Story 2.5)"** eingefügt (nach §5.7, vor §6): (1) **Discovery-Pfad** (Bundleroot `wiki/index.md` → Area-`index.md` frontmatterlos → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot — AD-9/FR-11, gewurzelte Erreichbarkeit Root → Area → Concept), (2) **gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest** (`UNREACHABLE AREA: ` für unverlinkte Area; `NESTED AREA: ` für Zwei-Ebenen-Kandidaten inkl. der Area-ohne-`index.md`-Lücke `wiki/a/b/concept.md`; gekoppelte Meldungen an den Run-Nachweis gemäß §5.6-Pkt.-4-analoger NFR-4-Regel; Instruktions-Selbsttest, **keine** neue §7-Klasse — schließt die Validator-Navigation-Lücke, ohne Validator-Change, AD-3), (3) **konsolidierte Zwei-Ebenen-Kartografie** (respondiert Defer **F-07**, schließt es): Root + eine Area-Ebene; `wiki/a/b/` ist keine zugelassene Anlageform — der Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); §3.2 bleibt der Dateikollision bestehender Concepts vorbehalten (Loopback-1-Renegotiation, Option A); (4) **Suche = Consumer-grep** (`grep -n wiki/` / ripgrep, AD-13 — keine Such-Datenbank, kein Embedding, kein Index-Datei-Format), (5) **Discovery-Demo (optional, kein MOVE)** — Hinweis auf Formel-4-Re-Baseline-Pflicht bei Durchführung. Nachgeführt: **§7 Z. 253** (Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt — Navigation/Area-Indizes jetzt in §5.8 verankert, Suche = Consumer-Thema), **§8-Normreferenzen** (AD-9/AD-13 → §5.8, FR-11 → §5.8/§5.7 Pkt. 5, NFR-3 neu, PRD-§4.3-Zeile nachgeführt) + **Revisionslog 2.3**. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/` (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. +- **Revision 2.3 (2026-08-18, Story 2.5):** Neue Sektion **§5.8 „Progressive Discovery über `index.md` (Story 2.5)"** eingefügt (nach §5.7, vor §6): (1) **Discovery-Pfad** (Bundleroot `wiki/index.md` → Area-`index.md` frontmatterlos → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot — AD-9/FR-11, gewurzelte Erreichbarkeit Root → Area → Concept), (2) **gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest** (`UNREACHABLE AREA: ` für unverlinkte Area; `NESTED AREA: ` für Zwei-Ebenen-Kandidaten inkl. der Area-ohne-`index.md`-Lücke `wiki/a/b/concept.md`; gekoppelte Meldungen an den Run-Nachweis gemäß §5.6-Pkt.-4-analoger NFR-4-Regel; Instruktions-Selbsttest, **keine** neue §7-Klasse — schließt die Validator-Navigation-Lücke, ohne Validator-Change, AD-3), (3) **konsolidierte Zwei-Ebenen-Kartografie** (respondiert Defer **F-07**, schließt es): Root + eine Area-Ebene; `wiki/a/b/` ist keine zugelassene Anlageform — der Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); §3.2 bleibt der Dateikollision bestehender Concepts vorbehalten (Loopback-1-Renegotiation, Option A); (4) **Suche = Consumer-grep** (`grep -n wiki/` / ripgrep, AD-13 — keine Such-Datenbank, kein Embedding, kein Index-Datei-Format), (5) **Discovery-Demo (optional, kein MOVE)** — Hinweis auf Formel-4-Re-Baseline-Pflicht bei Durchführung. Nachgeführt: **§7** (Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt — Navigation/Area-Indizes jetzt in §5.8 verankert, Suche = Consumer-Thema; die Vorbehalt-Zeile lag in der Baseline `main` bei Z. 253, nach dem §5.8-Einschub bei Z. 285), **§8-Normreferenzen** (AD-9/AD-13 → §5.8, FR-11 → §5.8/§5.7 Pkt. 5, NFR-3 neu, PRD-§4.3-Zeile nachgeführt) + **Revisionslog 2.3**. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/` (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. diff --git a/wiki/log.md b/wiki/log.md index b6131ae..744f088 100644 --- a/wiki/log.md +++ b/wiki/log.md @@ -1,7 +1,7 @@ # Log ## 2026-08-18 -- **Story 2.5 «Progressive Discovery über `index.md` bereitstellen» (Implementierung, inkl. Review-Loop-1-Korrektur):** `schema/compiler.md` → **Revision 2.3** (neue §5.8 „Progressive Discovery über `index.md` (Story 2.5)"): (1) **Discovery-Pfad** — Bundleroot `wiki/index.md` → Area-`index.md` (frontmatterlos) → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot (AD-9, FR-11; gewurzelte Erreichbarkeit Root → Area → Concept, §5.7 Pkt. 5); (2) **gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest** (`UNREACHABLE AREA: ` für von der Bundleroot unverlinkte Area — AD-9; `NESTED AREA: ` für Zwei-Ebenen-Kandidaten, geprüft über **zwei Läufe** der Selbsttest-Formel: (A) Ein-Ebenen-Area-`index.md` → Root-Verlinkungsstatus, (B) `find wiki -mindepth 3 -name "*.md"` → jede Datei in Tiefe ≥ 3 ist ein Zwei-Ebenen-Kandidat, Meldung je Verletzung genau eine; beide Läufe ohne Ausgabe = Discovery-SUCCESS; Instruktions-Selbsttest, schließt die Validator-Navigation-Lücke ohne Validator-Change — kein neuer §7-Punkt, AD-3); (3) **konsolidierte Zwei-Ebenen-Kartografie** (antwortet und schließt **Defer F-07**): Root + eine Area-Ebene; `wiki/a/b/` ist **keine zugelassene Anlageform** — `wiki/a/b/concept.md`-Kandidat (auch **ohne** `index.md`; die Area-ohne-Index-Lücke, die der reine `index.md`-Scan übersähe) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, textuelle Meldung `NESTED AREA: `, Run „teilweise erfolgreich", NFR-4) — **Loopback-1-Renegotiation (menschen-autorisierte Option A):** Träger ist der §5.8-lokale Hold, **nicht** der §3.2-Kollisions-Hold (der bleibt der Dateikollision *bestehender* Concepts vorbehalten — ein brandneuer Zwei-Ebenen-Pfad kollidiert nie mit einem existierenden); (4) **Suche = Consumer-grep** (`grep -n wiki/`/ripgrep, AD-13 — keine Such-Datenbank, kein Embedding, kein Index-Datei-Format; NFR-3), (5) **Discovery-Demo (optional, kein MOVE)** — bei Durchführung: Formel-4-Re-Baseline-Pflicht (neuer Zuwachs-Run), sonst bleibt Formel 4 `38 ≡ 38`. Nachgeführt: **§7 Z. 253** Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt (Navigation/Area-Indizes jetzt §5.8-verankert, Suche = Consumer-Thema), **§8** Normreferenzen (AD-9/AD-13 → §5.8, FR-11 → §5.7 Pkt. 5/§5.8, NFR-3 neu) + Revisionslog **2.3**. **Selbsttest-Beleg (re-executiert, die §5.8-Pkt.-2-Selbsttest-Formel von `schema/compiler.md` §5.8 Pkt. 2 als wörtlicher Einzel-Quote-`sh -c '…'`-String — Live-Baum: keine Ausgabe, Exit 0):** Area `wissensarchitektur` aus der Bundleroot verlinkt (Root→Area, Self-Check-Lauf A); die Area→Concept-Verlinkung (`source-material.md` in der Area-`index.md`) ist durch den **Validator Punkt 11** mechanisch abgedeckt (kein Duplikat im Selbsttest). **Sandbox-/Edge-Tests (I/O-Matrix, deterministische Formel-Ausgaben):** (a) HAPPY — gewurzelte Erreichbarkeit ohne Verletzung; (b) **AREA_UNREACHABLE** — Area-`index.md` existiert, Bundleroot unverlinkt → `UNREACHABLE AREA: ` (textuell benannter Instruktions-Selbsttest-Befund, kein Validator-Punkt); (c) **NESTED_AREA_KANDIDAT** — `wiki/a/b/index.md`- und `wiki/a/b/concept.md`-Kandidaten (je einzeln) → `NESTED AREA: a` (erste Ebene der nicht-zulässigen Struktur; bei mehreren Dateien unter derselben ersten Ebene Konsolidierung über `sort -u`); Negativ-Kontrollen (S1–S5) auf dem Sandbox-Baum bestätigt. §5.6-Formeln unverändert re-executierbar: Formel 2 (Form-Check) `0` (Exit 0), Formel 3 (Dangling-Check) keine Ausgabe, Formel 4 `38 ≡ 38` (Ist ≡ Extraktion aus dem Run-Kopf `862cf41` — keine neue Baseline nötig, keine `wiki/`-Dateimenge-Änderung durch Story 2.5; die Demo ist optional und würde bei Durchführung die Re-Baseline auslösen). `sprint-status.yaml`: `2-5-progressive-discovery-über-index-md-bereitstellen` `backlog` → **`in-progress`** (dieser Statuswechsel findet mit diesem Eintrag statt). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. +- **Story 2.5 «Progressive Discovery über `index.md` bereitstellen» (Implementierung, inkl. Review-Loop-1-Korrektur + Review-Loop-3-Patches, bmad-code-review 2026-08-18, 4 Layer; Nutzer-Entscheidungen 1/1):** `schema/compiler.md` → **Revision 2.3** (neue §5.8 „Progressive Discovery über `index.md` (Story 2.5)"): (1) **Discovery-Pfad** — Bundleroot `wiki/index.md` → Area-`index.md` (frontmatterlos) → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot (AD-9, FR-11; gewurzelte Erreichbarkeit Root → Area → Concept, §5.7 Pkt. 5); (2) **gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest** (`UNREACHABLE AREA: ` für von der Bundleroot unverlinkte Area — AD-9; `NESTED AREA: ` für Zwei-Ebenen-Kandidaten, geprüft über **zwei Läufe** der Selbsttest-Formel: (A) Ein-Ebenen-Area-`index.md` → Root-Verlinkungsstatus, (B) `find wiki -mindepth 3 -type f -name "*.md"` → jede Datei in Tiefe ≥ 3 ist ein Zwei-Ebenen-Kandidat, Meldung je Verletzung genau eine; beide Läufe ohne Ausgabe = Discovery-SUCCESS; Instruktions-Selbsttest, schließt die Validator-Navigation-Lücke ohne Validator-Change — kein neuer §7-Punkt, AD-3); (3) **konsolidierte Zwei-Ebenen-Kartografie** (antwortet und schließt **Defer F-07**): Root + eine Area-Ebene; `wiki/a/b/` ist **keine zugelassene Anlageform** — `wiki/a/b/concept.md`-Kandidat (auch **ohne** `index.md`; die Area-ohne-Index-Lücke, die der reine `index.md`-Scan übersähe) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, textuelle Meldung `NESTED AREA: `, Run „teilweise erfolgreich", NFR-4) — **Loopback-1-Renegotiation (menschen-autorisierte Option A):** Träger ist der §5.8-lokale Hold, **nicht** der §3.2-Kollisions-Hold (der bleibt der Dateikollision *bestehender* Concepts vorbehalten — ein brandneuer Zwei-Ebenen-Pfad kollidiert nie mit einem existierenden); (4) **Suche = Consumer-grep** (`grep -rn wiki/` rekursiv bzw. `rg wiki/`, AD-13 — keine Such-Datenbank, kein Embedding, kein Index-Datei-Format; NFR-3), (5) **Discovery-Demo (optional, kein MOVE)** — bei Durchführung: Formel-4-Re-Baseline-Pflicht (neuer Zuwachs-Run), sonst bleibt Formel 4 `38 ≡ 38`. Nachgeführt: **§7** Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt (Navigation/Area-Indizes jetzt §5.8-verankert, Suche = Consumer-Thema; die Vorbehalt-Zeile lag in der Baseline `main` bei Z. 253, nach dem §5.8-Einschub bei Z. 285), **§8** Normreferenzen (AD-9/AD-13 → §5.8, FR-11 → §5.7 Pkt. 5/§5.8, NFR-3 neu) + Revisionslog **2.3**. **Selbsttest-Beleg (re-executiert, die gehärtete Loop-3-§5.8-Pkt.-2-Selbsttest-Formel von `schema/compiler.md` §5.8 Pkt. 2 (CWD-Präguard, Erreichbarkeits-Check auf Markdown-Linksyntax `](` per `grep -qF`, `LC_ALL=C sort -u`) als wörtlicher Einzel-Quote-`sh -c '…'`-String — Live-Baum: keine Ausgabe, Exit 0; CWD-Präguard-Kontrolle außerhalb der Workspace-Root: `SELBSTTEST-SETUP-Fehler: Workspace-Root (wiki/index.md fehlt)` + Exit 1):** Area `wissensarchitektur` aus der Bundleroot verlinkt (Root→Area, Selbsttest-Lauf A); die Area→Concept-Verlinkung (`source-material.md` in der Area-`index.md`) ist durch den **Validator Punkt 11** mechanisch abgedeckt (kein Duplikat im Selbsttest). **Sandbox-/Edge-Tests (I/O-Matrix, deterministische Formel-Ausgaben):** (a) HAPPY — gewurzelte Erreichbarkeit ohne Verletzung; (b) **AREA_UNREACHABLE** — Area-`index.md` existiert, Bundleroot unverlinkt → `UNREACHABLE AREA: ` (textuell benannter Instruktions-Selbsttest-Befund, kein Validator-Punkt); (c) **NESTED_AREA_KANDIDAT** — `wiki/a/b/index.md`- und `wiki/a/b/concept.md`-Kandidaten (je einzeln) → `NESTED AREA: a` (erste Ebene der nicht-zulässigen Struktur; bei mehreren Dateien unter derselben ersten Ebene Konsolidierung über `LC_ALL=C sort -u`); Sandbox-Nachweis auf einem synthetischen Baum mit angelegter Testdatei (Zwei-Zustands-Klarstellung Loop-3-Decision-2: die Formel meldet bestehende Tiefe-≥-3-Dateien; der Hold-Zeitpunkt hält den Erstellungskandidaten an, ohne Datei). Die Sandbox-Kontrollen decken die I/O-Matrix-Szenarien **AREA_UNREACHABLE** und **NESTED_AREA_KANDIDAT** ab. §5.6-Formeln unverändert re-executierbar: Formel 2 (Form-Check) `0` (Exit 0), Formel 3 (Dangling-Check) keine Ausgabe, Formel 4 `38 ≡ 38` (Ist ≡ Extraktion aus dem Run-Kopf `862cf41` — keine neue Baseline nötig, keine `wiki/`-Dateimenge-Änderung durch Story 2.5; die Demo ist optional und würde bei Durchführung die Re-Baseline auslösen). Validator-Lauf (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md`, D-3 — kein CLI): alle 7 `wiki/`-Dateien SUCCESS (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1) — unverändert zur Story 2.4; das per-Datei-Verdikt ist der Ausführungs-Nachweis für die Spec-Verification Pkt. 3 und AC 5. `sprint-status.yaml`: `2-5-progressive-discovery-über-index-md-bereitstellen` `backlog` → **`in-progress`** (Implementierungs-Eintrag) → **`review`** (Review-Handoff, dieser Eintrag — die gefrorene Spec-Vorgabe „→ `in-progress`" beschreibt den Implementierungsstand, der Review-Handoff ist der übliche Folgezustand, s. Sprint-Status-Workflow-Kommentar „Dev moves story to 'review'"); Loop-3-Abschluss mit diesem Review: `review` → **`done`** (Sprint-Status synchronisiert, spec-Frontmatter `status: 'done'` deckungsgleich, `review_loop_iteration` → 3). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. - **Story 2.4 «Deterministische Bereichszuordnung & Concept-Hierarchie» (Review-Loop 2, bmad-code-review, 4 Layer):** 3 `decision-needed` (Nutzer-Entscheidungen 1/1/1) + 11 `patch` umgesetzt, 4 `defer` (s. `deferred-work.md`), 8 dismissed. `schema/compiler.md` → **Revision 2.2**: (1) **Formel 3 quellenbasierte `../schema/*`-Exklusion** (Decision 2): die Exklusion greift nur, wenn die Quell-Datei auf Bundleroot-Ebene liegt (`dirname ` = `wiki`); aus Area-Quellen läuft einstufiges `../schema/…` durch Auflösung + Containment + Existenztest (Prosa war bereits „nur aus Root-Dateien", die Formel folgt jetzt der Prosa); (2) **Formel 4 Re-Baseline auf den Run-Kopf** (Decision 1): Extraktions-Commit `862cf410c624072833cd959da9a2fb26235716f6` statt `66451b6…` — der gepinnte Selbsttest lief auf dem Zuwachs-Baum deterministisch `38 ≠ 30` = Run-FAIL (bekannt-böser Zustand aus Loop-1-A2, nur halb geheilt); jetzt **38 ≡ 38** (re-executiert: Ist=38, Extraktion `862cf41`=38; `66451b6`/`30` dokumentiert den Vor-Zuwachs-Zustand, bleibt als Referenz dieses Runs); (3) **§5.7 Pkt. 1(a) Treffer-Prädikat + Tie-Break** (Decision 3): „inhaltlich deckungsgleichen Eintrag" (Urteil, AD-13-Verstoß) ersetzt durch textuelles Prädikat (Identität des Link-Ziels ≡ kanonischer Name des Themas) + Mehrfachtreffer-Regel (Bundleroot-Links vor Area-Links, dann lexicografische Pfad-Reihenfolge); (4) file-relative Pin-Wortwahl in §5.3 Pkt. 3 (Oxymoron „file-relativ bundle-relativ" aufgelöst), §6.6-Zelle und §7-Bullet nachgeführt; (5) §7-Scope-Einleitung „Root-Ebene" → „Root-Ebene und in Areas gemäß §5.7"; (6) Typos („akte-Baseline" → „aktuelle Baseline", Doppel-Leerzeichen §6.6); (7) „Kopf dieser Spezifikation" → „Baseline-Commit des letzten Zuwachs-Runs". `wiki/wissensarchitektur/index.md`: Prosa auf den tatsächlichen Area-Inhalt gekürzt (nur `source-material.md` existiert; Link-Form/Discovery-Topics waren übergezeichnet). **Negativ-Test-Nachweis (Sandbox-Baum, exakte Formel-Ausgabe):** (a) **TOP_LEVEL_COLLISION** — Kandidat mit ID `llm-wiki-prinzip`: `wiki/llm-wiki-prinzip.md` existiert → §3.2-Hold „Concept existiert bereits — Aktualisierung ist Epic 3" (keine Datei, kein Index-Link, kein `log.md`-Eintrag); (b) **AREA_WITHOUT_INDEX** — Sandbox-`wiki/foo/` ohne `index.md`: wörtliche Punkt-11-Meldung `FAIL wiki/foo/ Punkt 11: Index-Regel verletzt (Area ohne index.md=foo)` (Validator-§7.1-Fixture-Wortlaut, kein inventiertes `AREA_WITHOUT_INDEX`-Label); (c) **DIVING_NON_EXISTENT** — `[v](../fehlt.md)` aus Area-Concept → `DANGLING: ../fehlt.md`; (d) **Out-of-Bundle-Escape** (Loop-1-A1-Kontrolle) — `[x](../../README.md)` → `DANGLING: ../../README.md`, `[y](../../schema/compiler.md)` → `DANGLING: ../../schema/compiler.md`; (e) **In-Bundle-`../schema/` aus Area (Loop-2-Kontrolle)** — `[z](../schema/compiler.md)` aus `wiki/wissensarchitektur/source-material.md` → `DANGLING: ../schema/compiler.md` (vor dem Loop-2-Patch: still exkludiert, leere Ausgabe — Sandbox-Nachweis des gefixten Löchs). Positiv-Kontrolle nach allen Patches: Formel 2 (Form-Check) = `0` (Exit 0), Formel 3 (Dangling) = keine Ausgabe, Formel 4 = `38 ≡ 38` (beide re-executiert). Status-Nachführung (korrigiert zum obigen Implementierungs-Eintrag): `sprint-status.yaml` `2-4-…` `backlog` → `in-progress` (Implementierungs-Eintrag) → **`review`** (Review-Handoff, dieser Eintrag); die gefrorene Spec-Vorgabe („→ `in-progress`") beschreibt den Implementierungsstand, der Review-Handoff ist der übliche Folgezustand (s. Sprint-Status-Workflow-Kommentar „Dev moves story to 'review'"). Loop-Abschluss mit diesem Review: `review` → **`done`** (Sprint-Status synchronisiert, `sprint-status.yaml` `last_updated` nachgeführt; spec-Frontmatter `status: 'done'` deckungsgleich, `review_loop_iteration` → 2). Validator-Lauf-Korrektur zum obigen Eintrag: die gültige Datei-Zählung ist **7** `wiki/`-Dateien (Bundleroot, `log.md`, 3 Root-Concepts, Area-`index.md`, Area-Concept) — der obige Verweis auf „Punkt 9/10" für die Differenz zur Spec-Zahl 6 war falsch belegt (Punkt 9 = `okf_version`/`type: bundle`-Verbot außerhalb der Bundleroot; `log.md` wird über Punkt 10/V-2 mitvalidiert); die Spec-Zahl 6 ist eine frozen-Defizitzählung (Defer in `deferred-work.md`). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3). - **Story 2.4 «Deterministische Bereichszuordnung & Concept-Hierarchie» (Implementierung):** `schema/compiler.md` → **Revision 2.1** (neue §5.7 „Deterministische Bereichszuordnung & Concept-Hierarchie": Routing-Regel textual-deterministisch — (a) First-Class-Link aus dem bestehenden `index.md`-Baum → Bereich `wiki//.md`, (b) Default Root-Ebene, neue Areas nur konsolidiert; nie Embedding/Vector, AD-7c/A0-10/AD-13; kanonische ID-Normalisierung AD-7a/A0-8 mit Beispieltabelle; Top-Level-Kollisions-Hold → fixierter §3.2, kein neues Prädikat, kein MOVE; file-relatives Link-Auflösungsmodell inkl. Out-of-Bundle-`..`-Containment; Area-`index.md`-Regel mit wörtlicher Punkt-11-Meldung `FAIL … Punkt 11: Index-Regel verletzt (Area ohne index.md=)` — kein inventiertes Label; Worked Example). Nachgeführt: §5.1 Pkt. 1, §5.3 Pkt. 3 (Index-Regel area-bewusst), §5.6 Pkt. 1/2/3/4/5 (file-relativ; `../`-Exklusion aufgelöst; Formel 3 mit Quell-Datei-Spur + in-Bundle-`..`-Auflösung + Containment — Out-of-Bundle-`..`-Escape wird `DANGLING`; Formel 4 neu auf `baseline_commit` `66451b6e6c9e139fb3aa3bbf4b01291e1e2d273a` (deklarierte `baseline_commit`-Werte der Spec-Frontmatter, nicht mehr Story-2.3-`7e1f449…`; Loop-2: Re-Baseline auf den Run-Kopf `862cf41`, s. obiger Review-Eintrag), Basename-Filter `grep -v "log.md$"`), §6 Pkt. 2, §6.6, §7, §8. `deferred-work.md`: drei Story-2.4-namige Einträge geschlossen (`umgesetzt`): bundlerelativ-vs-dateirelativ (→ §5.7 Pkt. 4 file-relativ), Cross-Page-Anker-Stale-Evidenz (→ Ist-Verhalten Fragment-Strip, keine Dangling-Ausgabe), künftiges Area-`log.md`-Baseline-Bruch (→ Formel 4 Basename-Filter). Neue Area `wiki/wissensarchitektur/` angelegt: `wiki/wissensarchitektur/index.md` (frontmatterlos, Vertrag §2/§6, Validator Punkt 10; verlinkt das Area-Concept in der gepinnten §5.6-Form) + `wiki/wissensarchitektur/source-material.md` (Area-Concept `type: concept`, `sources` s1=architecture-spine + s2=prd, §5.5-Inline-Verweise + Kontext-Marker, Body-Links auf Root-Concepts in file-relativer `../`-Form: `llm-wiki-prinzip.md`, `wissensarchitektur-trennung-states.md`, `knowledge-kompilation-inkrementell.md`). `wiki/index.md`: neue **Area-Sektion** verlinkt `wissensarchitektur/index.md` (die 3 bestehenden Root-Concept-Links + die 3 `../schema/`-Links byte-identisch, Null-Migration). **Formel-4-Re-Baseline:** Ist-Zählung auf dem neuen Baum = **38** (`log.md`-exkludiert; `grep -roE '\(raw/'`), Baseline-Extraktion aus `66451b6` = **30** (alter Baum, 4 nicht-`log.md`-Dateien: `index.md` + 3 Root-Concepts; `git ls-tree -r + git show`, Basename-`log.md`-Filter) — Dokumentation verlangt die aktuelle Baseline aus `66451b6` (`38 ≠ 30`, kein Fehlalarm: Zuwachs-Re-Baseline; Loop-2-Korrektur: Re-Baseline auf den Run-Kopf `862cf41`, `38 ≡ 38`, s. obiger Review-Eintrag); die exakte Ist-Zahl hängt am finalen Concept/Body-Stand und wird in der Spec-Verification des Runs belegt. `sprint-status.yaml`: `2-4-deterministische-bereichszuordnung-concept-hierarchie` `backlog` → **`in-progress`** (dieser Statuswechsel findet mit diesem Eintrag statt). Validator-Lauf: alle **7** `wiki/`-Dateien SUCCESS (`index.md` + `log.md` + 3 Root-Concepts + Area-`index.md` + Area-Concept; Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1; die Spec-Verification nennt erwartungsseitig „6 `wiki/`-Dateien" — die Differenz erklärt sich durch das reservierte `log.md` (Protokoll, wird mitvalidiert, Punkt 9/10), die Validator-Effort-Zahl dieser erfolgten Ausführung ist 7). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3). -- 2.54.0 From ef84309db7ca0090c3e124b8c364c56cc72186f3 Mon Sep 17 00:00:00 2001 From: Michael Tamse Date: Tue, 18 Aug 2026 21:28:02 +0200 Subject: [PATCH 03/16] chore: Epic-2-Retrospective abschliessen (accepted-with-open-items, AI-2-R-1..5) + Sprint-Status synchronisieren Co-Authored-By: Claude --- _bmad-output/.git-evidence-epic2-short.json | 1 + _bmad-output/.git-evidence-epic2.json | 1 + .../epic-2-retro-2026-08-18.md | 181 ++++++++++++++++++ .../sprint-status.yaml | 86 ++++++--- 4 files changed, 246 insertions(+), 23 deletions(-) create mode 100644 _bmad-output/.git-evidence-epic2-short.json create mode 100644 _bmad-output/.git-evidence-epic2.json create mode 100644 _bmad-output/implementation-artifacts/epic-2-retro-2026-08-18.md diff --git a/_bmad-output/.git-evidence-epic2-short.json b/_bmad-output/.git-evidence-epic2-short.json new file mode 100644 index 0000000..e6a7971 --- /dev/null +++ b/_bmad-output/.git-evidence-epic2-short.json @@ -0,0 +1 @@ +{"range": "a67ba65..f41ac71", "commit_count": 15, "merge_count": 2, "merges_measured": 2, "commits": [{"sha": "f41ac71a385d63b6d150956f0680780a17ad91f2", "subject": "feat: Story 2.5 Code-Review-Patches (Loop 3, 4 Layer; Nutzer-Entscheidungen 1/1) \u2014 geh\u00e4rtete \u00a75.8-Selbsttest-Formel + Zwei-Zustands-Klarstellung NESTED_AREA_KANDIDAT", "stories": ["2.5"], "is_merge": false}, {"sha": "20fd47624dd6f512296a0cf6614dfa3e0a289dfe", "subject": "feat: Story 2.5 Progressive Discovery ueber index.md \u2014 Konsolidierte Zwei-Ebenen-Kartografie (F-07)", "stories": ["2.5"], "is_merge": false}, {"sha": "64a0f6a6161247c0556f9d1dc2500f2b913fa967", "subject": "Merge pull request 'Story 2 4' (#2) from story-2-4 into main", "stories": [], "is_merge": true}, {"sha": "e6e58cbdb132f8fdb62e37a09c9a642e96f2bfc9", "subject": "feat: Story 2.4 Code-Review-Patches (Rev 2.2) \u2014 Formel-3 quellenbasiert, Formel-4 Re-Baseline, \u00a75.7 Pkt. 1(a) Pr\u00e4dikat + Tie-Break", "stories": ["2.2", "2.4"], "is_merge": false}, {"sha": "862cf410c624072833cd959da9a2fb26235716f6", "subject": "feat: Story 2.4 deterministische Bereichszuordnung abgeschlossen (Rev 2.1)", "stories": ["2.1", "2.4"], "is_merge": false}, {"sha": "66451b6e6c9e139fb3aa3bbf4b01291e1e2d273a", "subject": "@ feat: Story 2.3 Code-Review-Patches (Rev 2.0) \u2014 Pin-Sch\u00e4rfung + Change-Log-Scope", "stories": ["2.3"], "is_merge": false}, {"sha": "bb7db2d0253c2a2695074a014d3523e6c7def9e6", "subject": "feat: Story 2.3 Concepts verlinken \u2014 eine erlaubte Linkform (Review fertig)", "stories": ["2.3"], "is_merge": false}, {"sha": "7e1f449bf78741bb6739d8f510f3ab5543617fef", "subject": "Merge pull request 'Story 2 2' (#1) from story-2-2 into main", "stories": [], "is_merge": true}, {"sha": "6d8d172c987c9dfa5c909747ef7febd8ff40cbf6", "subject": "feat: Story 2.2 bmad-code-review abgeschlossen (Rev 1.7) \u2014 done", "stories": ["2.2"], "is_merge": false}, {"sha": "58d33f7f3ca4ead23bb73331730a104906f137e8", "subject": "feat: Story 2.2 Claim-granulare Provenienz dokumentieren (Review fertig)", "stories": ["2.2"], "is_merge": false}, {"sha": "bb32acdf3f1a3547424da0f878bd06383921b22a", "subject": "feat: Story 2.1 auf done setzen (Human-Review-Freigabe) + Re-Run-Patches Rev 1.4", "stories": ["2.1"], "is_merge": false}, {"sha": "ae5e0aa71fd05792a664daf3a875b15926ea0cd6", "subject": "chore: Sandbox-Dryrun (PDF/RADIUM) als Review-Input sichern + Folge-Eintraege", "stories": [], "is_merge": false}, {"sha": "e6c36fc6d9cfafc57f894a87bbe7757b86774da6", "subject": "chore: Autorisierte Validator-Revision 8 ausfuehren (Option-A-Heilung Story 2.1)", "stories": ["2.1"], "is_merge": false}, {"sha": "f91ef89078ee8e4c8a979cfb70f20ead1ffe854b", "subject": "@ chore: Story 2.1 Review-Nachzug abgeschlossen (Re-Review 2026-08-16)", "stories": ["2.1"], "is_merge": false}, {"sha": "6105a7bbc066e216a2a10e2edbc7a20b8fbb2547", "subject": "feat: Concepts aus Source Material erzeugen (Story 2.1) inkl. Review", "stories": ["2.1"], "is_merge": false}], "files": [{"path": "_bmad-output/implementation-artifacts/deferred-work.md", "added": 215, "deleted": 14, "net": 201, "commit_count": 12, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-5-progressive-discovery-\u00fcber-index-md-bereitstellen.md", "added": 164, "deleted": 11, "net": 153, "commit_count": 2, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/sprint-status.yaml", "added": 53, "deleted": 30, "net": 23, "commit_count": 12, "binary_revisions": 0}, {"path": "schema/compiler.md", "added": 404, "deleted": 87, "net": 317, "commit_count": 11, "binary_revisions": 0}, {"path": "wiki/log.md", "added": 26, "deleted": 7, "net": 19, "commit_count": 11, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-4-deterministische-bereichszuordnung-concept-hierarchie.md", "added": 188, "deleted": 4, "net": 184, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/wissensarchitektur/index.md", "added": 12, "deleted": 1, "net": 11, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/index.md", "added": 18, "deleted": 4, "net": 14, "commit_count": 4, "binary_revisions": 0}, {"path": "wiki/wissensarchitektur/source-material.md", "added": 28, "deleted": 0, "net": 28, "commit_count": 1, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-3-concepts-verlinken-eine-erlaubte-linkform.md", "added": 158, "deleted": 5, "net": 153, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/wissensarchitektur-trennung-states.md", "added": 64, "deleted": 15, "net": 49, "commit_count": 3, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-2-claim-granulare-provenienz-dokumentieren.md", "added": 161, "deleted": 3, "net": 158, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/knowledge-kompilation-inkrementell.md", "added": 62, "deleted": 10, "net": 52, "commit_count": 3, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/review-2-2-klassifikation.md", "added": 31, "deleted": 0, "net": 31, "commit_count": 1, "binary_revisions": 0}, {"path": "wiki/llm-wiki-prinzip.md", "added": 49, "deleted": 5, "net": 44, "commit_count": 2, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/epic-2-context.md", "added": 43, "deleted": 1, "net": 42, "commit_count": 2, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/review-input-dryrun-2-1-pdf-radium.md", "added": 95, "deleted": 2, "net": 93, "commit_count": 2, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-1-concepts-aus-source-material-erzeugen-okf-konform.md", "added": 290, "deleted": 11, "net": 279, "commit_count": 4, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/validator-revision-8-autorisationsrunde-f14-innen-ebenen.md", "added": 84, "deleted": 5, "net": 79, "commit_count": 2, "binary_revisions": 0}, {"path": "schema/validator.md", "added": 7, "deleted": 4, "net": 3, "commit_count": 2, "binary_revisions": 0}], "merge_files": [{"path": "_bmad-output/implementation-artifacts/deferred-work.md", "added": 97, "deleted": 0, "net": 97, "commit_count": 2, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-3-concepts-verlinken-eine-erlaubte-linkform.md", "added": 153, "deleted": 0, "net": 153, "commit_count": 1, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-4-deterministische-bereichszuordnung-concept-hierarchie.md", "added": 184, "deleted": 0, "net": 184, "commit_count": 1, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/sprint-status.yaml", "added": 6, "deleted": 6, "net": 0, "commit_count": 2, "binary_revisions": 0}, {"path": "schema/compiler.md", "added": 162, "deleted": 16, "net": 146, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/index.md", "added": 8, "deleted": 2, "net": 6, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/log.md", "added": 7, "deleted": 0, "net": 7, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/wissensarchitektur-trennung-states.md", "added": 20, "deleted": 15, "net": 5, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/wissensarchitektur/index.md", "added": 11, "deleted": 0, "net": 11, "commit_count": 1, "binary_revisions": 0}, {"path": "wiki/wissensarchitektur/source-material.md", "added": 28, "deleted": 0, "net": 28, "commit_count": 1, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/review-2-2-klassifikation.md", "added": 31, "deleted": 0, "net": 31, "commit_count": 1, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-2-claim-granulare-provenienz-dokumentieren.md", "added": 158, "deleted": 0, "net": 158, "commit_count": 1, "binary_revisions": 0}, {"path": "wiki/knowledge-kompilation-inkrementell.md", "added": 14, "deleted": 9, "net": 5, "commit_count": 1, "binary_revisions": 0}, {"path": "wiki/llm-wiki-prinzip.md", "added": 8, "deleted": 5, "net": 3, "commit_count": 1, "binary_revisions": 0}], "stories_supplied": ["2.1", "2.2", "2.3", "2.4", "2.5"]} \ No newline at end of file diff --git a/_bmad-output/.git-evidence-epic2.json b/_bmad-output/.git-evidence-epic2.json new file mode 100644 index 0000000..3a66ace --- /dev/null +++ b/_bmad-output/.git-evidence-epic2.json @@ -0,0 +1 @@ +{"range": "a67ba65..f41ac71", "commit_count": 15, "merge_count": 2, "merges_measured": 2, "commits": [{"sha": "f41ac71a385d63b6d150956f0680780a17ad91f2", "subject": "feat: Story 2.5 Code-Review-Patches (Loop 3, 4 Layer; Nutzer-Entscheidungen 1/1) \u2014 geh\u00e4rtete \u00a75.8-Selbsttest-Formel + Zwei-Zustands-Klarstellung NESTED_AREA_KANDIDAT", "stories": [], "is_merge": false}, {"sha": "20fd47624dd6f512296a0cf6614dfa3e0a289dfe", "subject": "feat: Story 2.5 Progressive Discovery ueber index.md \u2014 Konsolidierte Zwei-Ebenen-Kartografie (F-07)", "stories": [], "is_merge": false}, {"sha": "64a0f6a6161247c0556f9d1dc2500f2b913fa967", "subject": "Merge pull request 'Story 2 4' (#2) from story-2-4 into main", "stories": [], "is_merge": true}, {"sha": "e6e58cbdb132f8fdb62e37a09c9a642e96f2bfc9", "subject": "feat: Story 2.4 Code-Review-Patches (Rev 2.2) \u2014 Formel-3 quellenbasiert, Formel-4 Re-Baseline, \u00a75.7 Pkt. 1(a) Pr\u00e4dikat + Tie-Break", "stories": [], "is_merge": false}, {"sha": "862cf410c624072833cd959da9a2fb26235716f6", "subject": "feat: Story 2.4 deterministische Bereichszuordnung abgeschlossen (Rev 2.1)", "stories": [], "is_merge": false}, {"sha": "66451b6e6c9e139fb3aa3bbf4b01291e1e2d273a", "subject": "@ feat: Story 2.3 Code-Review-Patches (Rev 2.0) \u2014 Pin-Sch\u00e4rfung + Change-Log-Scope", "stories": [], "is_merge": false}, {"sha": "bb7db2d0253c2a2695074a014d3523e6c7def9e6", "subject": "feat: Story 2.3 Concepts verlinken \u2014 eine erlaubte Linkform (Review fertig)", "stories": [], "is_merge": false}, {"sha": "7e1f449bf78741bb6739d8f510f3ab5543617fef", "subject": "Merge pull request 'Story 2 2' (#1) from story-2-2 into main", "stories": [], "is_merge": true}, {"sha": "6d8d172c987c9dfa5c909747ef7febd8ff40cbf6", "subject": "feat: Story 2.2 bmad-code-review abgeschlossen (Rev 1.7) \u2014 done", "stories": [], "is_merge": false}, {"sha": "58d33f7f3ca4ead23bb73331730a104906f137e8", "subject": "feat: Story 2.2 Claim-granulare Provenienz dokumentieren (Review fertig)", "stories": [], "is_merge": false}, {"sha": "bb32acdf3f1a3547424da0f878bd06383921b22a", "subject": "feat: Story 2.1 auf done setzen (Human-Review-Freigabe) + Re-Run-Patches Rev 1.4", "stories": [], "is_merge": false}, {"sha": "ae5e0aa71fd05792a664daf3a875b15926ea0cd6", "subject": "chore: Sandbox-Dryrun (PDF/RADIUM) als Review-Input sichern + Folge-Eintraege", "stories": [], "is_merge": false}, {"sha": "e6c36fc6d9cfafc57f894a87bbe7757b86774da6", "subject": "chore: Autorisierte Validator-Revision 8 ausfuehren (Option-A-Heilung Story 2.1)", "stories": [], "is_merge": false}, {"sha": "f91ef89078ee8e4c8a979cfb70f20ead1ffe854b", "subject": "@ chore: Story 2.1 Review-Nachzug abgeschlossen (Re-Review 2026-08-16)", "stories": [], "is_merge": false}, {"sha": "6105a7bbc066e216a2a10e2edbc7a20b8fbb2547", "subject": "feat: Concepts aus Source Material erzeugen (Story 2.1) inkl. Review", "stories": [], "is_merge": false}], "files": [{"path": "_bmad-output/implementation-artifacts/deferred-work.md", "added": 215, "deleted": 14, "net": 201, "commit_count": 12, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-5-progressive-discovery-\u00fcber-index-md-bereitstellen.md", "added": 164, "deleted": 11, "net": 153, "commit_count": 2, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/sprint-status.yaml", "added": 53, "deleted": 30, "net": 23, "commit_count": 12, "binary_revisions": 0}, {"path": "schema/compiler.md", "added": 404, "deleted": 87, "net": 317, "commit_count": 11, "binary_revisions": 0}, {"path": "wiki/log.md", "added": 26, "deleted": 7, "net": 19, "commit_count": 11, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-4-deterministische-bereichszuordnung-concept-hierarchie.md", "added": 188, "deleted": 4, "net": 184, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/wissensarchitektur/index.md", "added": 12, "deleted": 1, "net": 11, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/index.md", "added": 18, "deleted": 4, "net": 14, "commit_count": 4, "binary_revisions": 0}, {"path": "wiki/wissensarchitektur/source-material.md", "added": 28, "deleted": 0, "net": 28, "commit_count": 1, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-3-concepts-verlinken-eine-erlaubte-linkform.md", "added": 158, "deleted": 5, "net": 153, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/wissensarchitektur-trennung-states.md", "added": 64, "deleted": 15, "net": 49, "commit_count": 3, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-2-claim-granulare-provenienz-dokumentieren.md", "added": 161, "deleted": 3, "net": 158, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/knowledge-kompilation-inkrementell.md", "added": 62, "deleted": 10, "net": 52, "commit_count": 3, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/review-2-2-klassifikation.md", "added": 31, "deleted": 0, "net": 31, "commit_count": 1, "binary_revisions": 0}, {"path": "wiki/llm-wiki-prinzip.md", "added": 49, "deleted": 5, "net": 44, "commit_count": 2, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/epic-2-context.md", "added": 43, "deleted": 1, "net": 42, "commit_count": 2, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/review-input-dryrun-2-1-pdf-radium.md", "added": 95, "deleted": 2, "net": 93, "commit_count": 2, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-1-concepts-aus-source-material-erzeugen-okf-konform.md", "added": 290, "deleted": 11, "net": 279, "commit_count": 4, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/validator-revision-8-autorisationsrunde-f14-innen-ebenen.md", "added": 84, "deleted": 5, "net": 79, "commit_count": 2, "binary_revisions": 0}, {"path": "schema/validator.md", "added": 7, "deleted": 4, "net": 3, "commit_count": 2, "binary_revisions": 0}], "merge_files": [{"path": "_bmad-output/implementation-artifacts/deferred-work.md", "added": 97, "deleted": 0, "net": 97, "commit_count": 2, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-3-concepts-verlinken-eine-erlaubte-linkform.md", "added": 153, "deleted": 0, "net": 153, "commit_count": 1, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-4-deterministische-bereichszuordnung-concept-hierarchie.md", "added": 184, "deleted": 0, "net": 184, "commit_count": 1, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/sprint-status.yaml", "added": 6, "deleted": 6, "net": 0, "commit_count": 2, "binary_revisions": 0}, {"path": "schema/compiler.md", "added": 162, "deleted": 16, "net": 146, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/index.md", "added": 8, "deleted": 2, "net": 6, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/log.md", "added": 7, "deleted": 0, "net": 7, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/wissensarchitektur-trennung-states.md", "added": 20, "deleted": 15, "net": 5, "commit_count": 2, "binary_revisions": 0}, {"path": "wiki/wissensarchitektur/index.md", "added": 11, "deleted": 0, "net": 11, "commit_count": 1, "binary_revisions": 0}, {"path": "wiki/wissensarchitektur/source-material.md", "added": 28, "deleted": 0, "net": 28, "commit_count": 1, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/review-2-2-klassifikation.md", "added": 31, "deleted": 0, "net": 31, "commit_count": 1, "binary_revisions": 0}, {"path": "_bmad-output/implementation-artifacts/spec-2-2-claim-granulare-provenienz-dokumentieren.md", "added": 158, "deleted": 0, "net": 158, "commit_count": 1, "binary_revisions": 0}, {"path": "wiki/knowledge-kompilation-inkrementell.md", "added": 14, "deleted": 9, "net": 5, "commit_count": 1, "binary_revisions": 0}, {"path": "wiki/llm-wiki-prinzip.md", "added": 8, "deleted": 5, "net": 3, "commit_count": 1, "binary_revisions": 0}], "stories_supplied": ["2-1-concepts-aus-source-material-erzeugen-okf-konform", "2-2-claim-granulare-provenienz-dokumentieren", "2-3-concepts-verlinken-eine-erlaubte-linkform", "2-4-deterministische-bereichszuordnung-concept-hierarchie", "2-5-progressive-discovery-\u00fcber-index-md-bereitstellen"]} \ No newline at end of file diff --git a/_bmad-output/implementation-artifacts/epic-2-retro-2026-08-18.md b/_bmad-output/implementation-artifacts/epic-2-retro-2026-08-18.md new file mode 100644 index 0000000..17dc96d --- /dev/null +++ b/_bmad-output/implementation-artifacts/epic-2-retro-2026-08-18.md @@ -0,0 +1,181 @@ +--- +epic: 2 +date: 2026-08-18 +verdict: accepted-with-open-items +criteria: declared +headless: false +--- + +# Retrospective Epic 2 — OKF-Concepts erzeugen & verlinken + +## Epic summary + +- **Epic:** 2 — OKF-Concepts erzeugen & verlinken +- **Diff-Range:** `a67ba65..f41ac71` (erster Story-Commit `6105a7b^` … letzter Commit `f41ac71`) +- **Commits:** 15 im Range (davon 2 Merges: `7e1f449` Story 2.2, `64a0f6a` Story 2.4; beide gemessen). Nicht-Merge-Churn in `schema/`+`wiki/`: 543 Insertions / 6 Deletions über 9 Dateien. +- **Stories:** 2.1 (done), 2.2 (done), 2.3 (done), 2.4 (done), 2.5 (done) — keine pending. `epic-2-retrospective`: optional → wird in Phase 5 auf `done` gesetzt. +- **Abnahmekriterien:** deklariert in `_bmad-output/planning-artifacts/epics.md` (Epic-2-Block + Stories 2.1–2.5, je AC-Zeilen) → Verdikt-Basis **declared**. +- **Evidence-Inventar:** + - Story-Specs 2.1–2.5 unter `_bmad-output/implementation-artifacts/` (jede mit `baseline_commit`/Verification-Beleg) + - `schema/compiler.md` (317 Z., 84 KB; Revision 2.3; +404/−87 net über 11 Commits) — das eigentliche Lieferprodukt (Agent-Instruktion mit re-executierbaren Selbsttest-Formeln, §5.5–§5.8, §6.5/§6.6) + - `schema/validator.md` (Rev 8): der Diff-Range enthält die **Rev-8-Autorisationsrunde** (Option-A-Heilung Story 2.1, Ende Epic 1) — für Epic 2 konform unverändert (AD-3/D-3-Freeze); der bekannte Punkt-11-Vorbehalt (file-relative Area-Lesart) bleibt offen und ist Rev-9-Aktionsitem + - Wiki-Baum (7 Dateien): `index.md`, `log.md`, 3 Root-Concepts, `wissensarchitektur/index.md` (Area), `wissensarchitektur/source-material.md` (Area-Concept) + - `_bmad-output/implementation-artifacts/deferred-work.md` (append-only), `sprint-status.yaml` (2-5 Retro key), `wiki/log.md` (32 Z., 5 Einträge Story 2.1–2.5 + Nachweise) +- **Fehlend:** Session-Logs (nicht in dieser Umgebung verfügbar) → Prozess-Lektionen nur aus git-loggablem Verhalten; die Verhaltens-Verifikation wurde stattdessen durch Re-Exekution der Selbsttest-Formeln ersetzt (Abschnitt Behavior verification). + + + +## Findings + +Drei Blickwinkel: (a) Aggregat-Ansichten (über den gesamten Diff-Range deterministisch erhoben), (b) Verhaltenscheck der Selbsttest-Formeln (re-executiert, Abschnitt Behavior verification), (c) Diff-Scope-Review — bmad-review-Code-Linsen (Adversarial / Edge-Case-Hunter / Verification-Gap) über den Schema+Wiki-Diff. Jedes Finding trägt Quelle (Datei : Zeile/Commit) und Disposition (fix now / defer / accept). + +### F-01 — §5.5-Provenienz-Selbsttest-Formel ist nicht rekursiv und übersieht jeden Area-Concept-Kontakt (Adversarial F1, Edge-Case #4; **fix now, Kern-Defekt Story 2.4/2.5**) + +- **Quelle:** `schema/compiler.md` §5.5 Pkt. 1/4, Z. 81/104 — `sh -c "grep -nE '\(raw/' wiki/*.md"`. +- **Beleg (live):** `wiki/*.md` (root-only) → **29** Treffer; rekursiv `wiki/` → **43**; das Area-Concept `wiki/wissensarchitektur/source-material.md` trägt **5** `(raw/`-Verweise, die die dokumentierte Formel nie inspiziert. Die Kriterien in Z. 104–106 („belegte Aussage → Inline-`raw/`-Verweis je Beleg auffindbar per `grep -nE '\(raw/') behaupten eine bundeweite Selbstprüfung. +- **Auswirkung:** Die claim-granulare Provenienz-Garantie (FR-3/AD-4a) und der AD-17h-Determinismus-Anspruch sind für die Artefaktklasse, um die es in Story 2.4/2.5 geht (Area-Concepts), faktisch nicht exerziert: Ein fehlender/typo-hafter Inline-`raw/`-Verweis im Area-Concept passiert den Selbsttest still. Der Formeltext „erfasst also …" (Z. 81) ist unvollständig. +- **Wurzel:** Shell-Glob `wiki/*.md` ist root-only; keine `-r`, kein `--include`. +- **Disposition & Prävention:** **fix now** → Formel auf rekursiv `grep -rnE '\(raw/' wiki/ --include='*.md' --exclude=log.md` (bzw. Area-inkludierend) umstellen; Lektion: re-executierbare Formeln müssen der **gewachsenen Baumstruktur** des Folge-Epics folgen (Area-Ebene seit Story 2.4). + +### F-02 — Punkt-11-Wortlaut vs. gepinnte file-relative Area-Linkform: Instruktion und Validator sind strukturell nicht gleichzeitig „in force" (Adversarial F2/F10, Verification-Gap F2; **fix now (autorisierte Rev-9)**, alternativ Doku-Defer) + +- **Quelle:** `schema/validator.md` Punkt 11 (Rev 8, Z. 70: „als relativer **Bundle-Pfad**"); `schema/compiler.md` §5.6 Pkt. 1 (Z. 129–131: file-relativ mit `.md`-Endung), §5.8 Pkt. 2 (Z. 229, „Bekannte offene Lücke … wörtlich-mechanischer Check meldete `Concept nicht verlinkt=wissensarchitektur/source-material`"); `deferred-work.md` Z. 284–287 (Status offen, Rev-9-Aktionsitem). +- **Beleg (live):** `wiki/wissensarchitektur/index.md` Z. 9 verlinkt file-relativ `](source-material.md)`; die wörtliche Identität `wissensarchitektur/source-material` kommt in `wiki/index.md` **nicht** vor (grep → 0). Ein wörtlich-mechanischer Rev-8-Punkt-11-Check würde das Area-Concept als „nicht verlinkt" melden — das Live-Bundle zeigt genau diese Lage. +- **Auswirkung:** Die §5.8-Discovery-Teilachse „Rooth→Area→Concept" ist **nicht unabhängig** re-verifizierbar (Verification-Gap F2): die §5.8-Selbsttest-Formel deckt nur Root→Area (Lauf A) und Tiefe ≥ 3 (Lauf B); die Area→Concept-Koordinate wird an einen Punkt 11 delegiert, dessen Wortlaut die formale Clusterung der §5.6-Pin-Form widerspricht. Das Log („alle 7 SUCCESS inkl. Punkt 11") ist nur über eine **aufgelockerte** Punkt-11-Lesart konsistent. +- **Wurzel:** Punkt 11 (frozen, Vertrag §7) kennt keine file-relative Area-Schreibweise; die Pin-Form (Story 2.3) und die Area-Link-Logik (Story 2.4/2.5) sind Produkt der Instruktionsebene ohne Vertrags-/Validator-Change (AD-3-Doktrin). +- **Disposition & Prävention:** **fix now** → Erteilung der **autorisierten Validator-Rev-9** mit formalisierter Punkt-11-Area-Lesart (relative OKF-Pfad-Identität, auch file-relativ in Area-Index; bereits als Action-Item `code-review-2-1-item-2` gehalten). Lektion: Der D-3/AD-3-Freeze darf Vertrag/Validator nur ändern, wenn er formal autorisiert wird; „kein Change" muss dieselbe Währung (autorisiert vs. offen) wie „Change" tragen. + +### F-03 — §5.8-Lauf B „schließt die Area-ohne-`index.md`-Lücke" — tatsächlich blind für die Tiefe-2-Variante (`wiki//concept.md` ohne `index.md`) (Edge-Case #2; **fix now**, konservativ Defer) + +- **Quelle:** `schema/compiler.md` §5.8 Pkt. 2 (Z. 216: Lauf A `find -mindepth 2 -name index.md`, Lauf B `find -mindepth 3`); Prosa Z. 223/230 („schließt auch die Area-ohne-`index.md`-Lücke"). +- **Beleg (Sandbox, synthetischer Baum `wiki/a/concept.md` ohne `wiki/a/index.md`):** §5.8-Formel exakt aus Z. 216 → **keine Ausgabe, Exit 0** = Discovery-SUCCESS auf einem Bundle, das strukturell invalide ist (Area ohne Index → Validator Punkt 11). Lauf A findet kein `index.md`, Lauf B beginnt bei Tiefe 3, das Konzept liegt auf Tiefe 2. +- **Auswirkung:** Ein Producer kann die Area-`index.md` vergessen und der §5.8-Selbsttest meldet SUCCESS; die einzige Schutzlinie ist der (nicht re-runbare, bekannte) wörtliche Punkt-11-Sandbox-Nachweis. +- **Wurzel:** Beide Läufe sind `find`-Schwellen, keine strukturelle Konzept-Derivation. +- **Disposition & Prävention:** **fix now (einfach)** → Lauf A um „Area-Concept ohne Area-`index.md`" erweitern (z. B. Ordnung `wiki//.md` ohne `index.md` jenseits einer Area melden), oder dokumentiert als konservatives Defer (bestehende Punkt-11-Linie fängt es ab, sobald Rev-9 die Lesart trägt). + +### F-04 — Formel-4-Basisfilter-Asymmetrie: `--exclude=log.md` (Ist) vs. `grep -v "log.md$"` (Extraktion) invertieren sich für `…log.md`-suffigierte Konzepte (Edge-Case #3; **fix now**) + +- **Quelle:** `schema/compiler.md` §5.6 Pkt. 3 Formel 4 (Z. 162–163); `deferred-work.md` (Basename-Ziel-Loop-2-Fix). +- **Beleg (Sandbox):** Konzept `wiki/analog.md` → Ist (`--exclude=log.md`, Basename gleich `log.md`) zählt es **ein**; Extraktionsfilter (`grep -v "log.md$"` — Basename-**Endung**) schließt aus, simuliert: Ist 2 vs. Extraktion 0 → deterministischer **Fehlalarm** `38 ≠ Baseline` auf einem konformen Baum. +- **Auswirkung:** Ein legitimes kebab-slug-Konzept, dessen Name auf `log` endet (`analog`, `compiler-log`, …), bricht Formel 4 ohne inhaltlichen Grund — und zwar genau durch den Loop-2-Basename-Fix, der die umgekehrte Inversion (künftiges Area-`log.md`) heilen sollte. +- **Wurzel:** `--exclude=log.md` ist genau-Basename (= `log.md`), `grep -v "log.md$"` ist Endungs-Muster (jegliches `xlog.md`) — die beiden filter semantisch unvereinbar. +- **Disposition & Prävention:** **fix now** → beide Filter auf dieselbe Semantik bringen (entweder genau-Basename `log.md` auf beiden Seiten — z. B. `--exclude=log.md` für die Extraktion via `git ls-tree ... | grep -v '^wiki/log\.md$'` — oder rekursiv-Basename `grep -v '/log\.md$'` in beiden). Lektion: „Basename-Filter" meint je nach Formel etwas anderes; jede Formel4-Seite muss nominal die nämliche Exklusionsmenge bilden. + +### F-05 — §5.8-Lauf A erkennt „reachability" auf nicht-navigationalen Text (Code-Fence/Blockquote) und akzeptiert die `./`-Variante, die der §5.6-Form-Check exkludiert (Verification-Gap F1, Edge-Case-Replik; **fix now**) + +- **Quelle:** `schema/compiler.md` §5.8 Pkt. 2, Z. 216 (Lauf A, `grep -qF "]($a/index.md"`); §5.6 Pkt. 3 Formel 2 (Z. 146, `grep -vE '^\.'`) attackiert `./`-Ziele. +- **Beleg:** (a) Lauf A als roher Substring über die ganze Datei (auch in Code-Fence/Blockquote/comments) → Bereich aus Fence „verlinkt" ohne Navigationslink (AD-9 gebrochen). (b) `./`-Varianten: Lauf A akzeptiert `](./a/index.md` (verifikationsrelevante Alternative), Formel 2 exkludiert `./`-Präfixe als „keine Bundle-Pfad-Form" → **zwei Checks widersprechen sich über die „gepinnte Form"** (FR-10: genau eine erlaubte Form). +- **Auswirkung:** Die AD-9-Navigationsgarantie ist nur textuell (Substring), nicht strukturell abgesichert; das „genau-eine-Form"-Pin ist zwischen §5.6 und §5.8 nicht eindeutig. +- **Wurzel:** `grep -qF` ist markdown-agnostisch; die `./`-Variante wurde in Manche Dokumentationen als zulässig erachtet (Loop-2-Eintrag „beide Varianten zulässig") — die Form-Check-Schärfung von Story 2.3 (AD-7b) ist damit inkonsistent. +- **Disposition & Prävention:** **fix now** → Lauf A mit Link-Syntax-prüfenden Greps (nur echte `](`-Markdown-Links, nicht Code-Fence/Blockquote) bzw. `./`-Variante aus dem §5.6-Pin nehmen oder §5.8 auf die Pin-Form ausrichten; Lektion: Ober- und Unter-Checks müssen dieselbe „erlaubte Form" definieren. + +### F-06 — Formel-4-Baseline an einen Commit (`862cf41`) gepinnt; erneute Datei-Zuwächse (= jeder künftige neue Concept/Area) erfordern eine Re-Baseline-Pflicht ohne definierte Policy (Adversarial F3; **accept** mit dokumentierter Folge) + +- **Quelle:** `schema/compiler.md` §5.6 Pkt. 3 Formel 4 (Z. 163) — `git ls-tree ... 862cf41 ... | git show ...`; Story-2.4-Re-Baseline (Loop-2-Decision-1: Run-Kopf statt Vor-Zustand). +- **Beleg:** `git diff --name-only 862cf41..HEAD -- wiki/` → `log.md` + `index.md` geändert, obwohl Story 2.5 **keine** neue Datei brachte; die Baseline-Extraktion aus dem gepinnten Commit ist gegen einen Baum-Zustand `HEAD` nicht byte-stabil. Der Text (Z. 166) dokumentiert, dass jeder Datei-Zuwachs eine Re-Baseline auf den dann aktuellen Run-Kopf erfordert — es gibt aber **keine** zitierbare Regel, welcher Commit „der dann aktuelle Run-Kopf" für einen Content-mutierenden (nicht Datei-hinzufügenden) Run wäre. +- **Auswirkung:** Die AD-17h-Meldung „die Baseline wird deterministisch aus dem Baseline-Commit des letzten Zuwachs-Runs dynamisch extrahiert" ist eine O(n)-über-Runs-Operation; die Kopplung an den Einstellungs-Commit ist die schwächste strukturelle Stelle der Formel-Suite (konservatives Verhalten erkannt, keine echte Determinismus-Verletzung heute). +- **Disposition & Prävention:** **accept** — dokumentierter, eingebauter Kompromiss von AD-17h (keine Standalone, keine künstliche Datei-Metadaten-Quelle); dennoch als **offene Folge** notieren: Re-Baseline-Policy (Definition „Zuwachs-Run", Umgang mit Content-Drift ohne Datei-Zuwachs) für Epic 3 präzisieren. Kein Action-Item (bereits in Epic-3-Nähe thematisiert), aber im Open questions-Block festgehalten. + +### F-07 — `grep -vE ':'` / `case *:*` schlucken kolonhaltige Ziele still (bricht Pin- und Dangling-Check) (Adversarial F6; **defer**) + +- **Quelle:** `schema/compiler.md` §5.6 Pkt. 3 Formel 2 (Z. 146) / Formel 3 (Z. 154, `case "$t" in ""|*:*|…`). +- **Beleg:** Ein Ziel mit `:` (z. B. `file.md#sec:2`, Windows-Kopfpfad) wird von Pin- und Dangling-Check **exkludiert statt geflaggt** — eine normative Verletzung wird zu einer ungeprüften, stillen Null-Op. (Live: kein derartiges Ziel — nicht auf dem aktuellen Baum.) +- **Disposition & Prävention:** **defer** — dokumentiert in `deferred-work.md` (konservativ); Lektion: Exklusions-Klassen müssen als „nicht am Pin-Teil des Bundles" deklariert bzw. selbst überprüft werden (möglicher kleiner Dangling-Sonderfall). + +### F-08 — Form-Check `../`-Exklusion bedeutet: `../`-Ziele werden nie auf `.md`-Endung geprüft (Adversarial F5; **defer**) + +- **Quelle:** `schema/compiler.md` §5.6 Pkt. 3 Formel 2 Z. 146 (`grep -vE '^(raw/|\.\./|#)'`). +- **Beleg:** `[x](../ohne-endung)` (existierende extensionless Datei) passiert Form-Check (Ziel ist `../`-exkludiert) und Dangling-Check (Datei existiert) → Pin-Verletzung (keine `.md`-Endung) unentdeckt. +- **Disposition & Prävention:** **defer** — bekannte konservative Lücke; Sonderfall nur für `../`-Ziele. Lektion zur Formel-Schärfung für Epic 3. + +### F-09 — `sources`-`id`-Eindeutigkeit, Marker-Grammatik, Sources-Closure, Fragment-Existenz, Content-Truth bleiben ungeprüft — Story 2.4/2.5 fügt keine Checks hinzu (Verification-Gap Confirmation; **defer** — bereits Defer-Kontexte) + +- **Quelle:** §5.5 Pkt. 3/4 (Prosa); `deferred-work.md` W1–W4, L197–212 (Marker-Grammatik, `sources[].id`-Eindeutigkeit, Sources-Closure, Fragment-Existenz, Content-Truth). +- **Beleg:** Weder §5.6/§5.8-Formeln noch Validator prüfen Wert-Duplikate (`id`), Marker-Syntax über den Token „nicht eigenständig belegt" hinaus, Inline→`sources`-Closure, Fragment-Existenz in `raw/` oder Body↔`sources`-Korrespondenz. Letztere bleiben nachweislich still-passierend; das aktuelle Bundle ist nur durch Konvention gepflegt. +- **Disposition & Prävention:** **defer** — alle bereits in `deferred-work.md` verankert; keine neue Lücke durch 2.4/2.5. Lektion: Diese Unschärfen sind die Hauptkandidaten für eine Epic-3-mechanische Schicht (D-3-konform). + +### F-10 — §5.7-Routing-Prädikat (a) ist nicht re-runnable; „kanonischer Name des Themas" ist Urteilsinput ohne Ableitungsformel (Adversarial F7/F8-Variante, Edge-Case #5/#6, Verification-Gap F3/F4; **accept** (designiert), dokumentierter Urteils-Spielraum) + +- **Quelle:** `schema/compiler.md` §5.7 Pkt. 1(a) (Z. 183) — „Identität seines Link-Ziels … gleich dem kanonischen Namen des neuen Themas". +- **Beleg:** Der linke Operand (kanonischer Name) wird durch keine Formel, keinen Grep, keine Tabelle abgeleitet — er ist Producer-Interpretation aus §2. Zwei Producer können für dieselbe Einheit unterschiedliche kanonische Namen ableiten und unterschiedlich routen, obwohl die Instruktion „textual-deterministisch" fordert (AD-13/A0-10). Zudem: Die Area-Variante — Bundleroot enthält inzwischen einen Area-Navigations-Link (`wissensarchitektur/index.md`, Identität `wissensarchitektur`) — ein neues Thema mit Namen `wissensarchitektur` trifft auf den Tie-Break „Bundleroot-Links schlagen Area-Links → Root-Ebene", der für Area-Links unzutreffend ist. Beide Stellen sind textual-deterministische Überreste: kein re-runbarer Check verhindert eine falsche Platzierung (Platzierung in falscher Area passiert Validator/Formeln/§5.8 still). +- **Disposition & Prävention:** **accept** — die Routing-Entscheidung ist die einzige neue Story-2.4-Regel ohne ausführbares Artefakt; sie ist bewusst ein Interpretationsschritt („Ask-First" Rücksprache-Pflicht vorhanden). Als **offene Frage** notieren: Wie mechanisch kann „kanonischer Name" in Epic 3 werden (grep/ripgrep über `index.md`-Baum), ohne ein neues Urteils-Element einzuführen? + +### F-11 — Aggregat: `schema/compiler.md` ist der unangefochtene God-File des Epic (84 KB, 317 Z., +404/−87); Struktur-Drift im Diff (Aggregat-Blickwinkel; **accept** mit Epic-3-Schritt) + +- **Quelle:** `git log --numstat a67ba65..f41ac71 -- schema/compiler.md` (11 nicht-Merge-Commits), `wc -l schema/compiler.md` (317 Z., 84 KB); `grep -n '^##'` → 18 Sektionen, davon §5.x-Instruktionen 5.5/5.6/5.7/5.8. +- **Beleg:** Das Lieferprodukt ist eine einzelne Instruktionsdatei, in der jede Story eine neue Sektion „anklebte" (§5.5 → §5.6 → §5.7 → §5.8); die Sektionen referenzieren sich gegenseitig zirkulär (z. B. §5.8 ↔ §5.6 ↔ §5.7), was die F-01/F-04/F-05-Fehlschläge begünstigt. Kein Duplikat-Problem (keine parallelen Erzeugungsinstruktionen), aber wachsende kognitive Last und zunehmende Formel-Zahl (4+1 im Diff). +- **Disposition & Prävention:** **accept** — als Dokumentations-God-File vertretbar (agent-reader, keine Code-God-Klasse); als **Handlungsempfehlung** für Epic 3: Struktur-Aufteilung oder Querverweis-Register erwägen, um die Fehlschlagschneisen zwischen §5.5–§5.8 zu senken. Kein Auto-Fix (siehe Open questions). + +### F-12 — Validator-File als Lieferumfang: das validator.md-Delta im Diff ist die **Rev-8-Autorisationsrunde** (Ende Epic 1), kein Epic-2-Change (Aggregat-Klarstellung; **accept**, Registrierung) + +- **Quelle:** `git diff a67ba65..f41ac71 -- schema/validator.md` (Revisionszahl 6→8, Punkt-4 Fixture 4a, §7.3-Isolations-Notiz) vs. `wiki/log.md` (Rev-8-Autorisationsrunde, 2026-08-16). +- **Beleg:** Epic 2 selbst (Story 2.1–2.5) änderte `schema/validator.md` **nicht** (AD-3-Doktrin); das Delta stammt aus der autorisierten Rev-8-Runde zur Story-2.1-Freigabe — semantisch Epic-1-Abschluss, wird per Diff-Range-Eckung in Epic 2 mitgezählt. +- **Disposition:** **accept** — Klarstellung zur Wahrnehmung des Diffs; kein Defekt. + + + +## Behavior verification (re-executierbare Selbsttest-Formeln gegen Live-Baum) + +Die „Laufzeit" dieses Epics sind die eingebetteten Shell-Formeln (D-3, AD-17h). Alle wurden am 2026-08-18 gegen den Live-Baum im Workspace re-exekutiert: + +| Check | Erwartung | Beobachtung (Live) | +|---|---|---| +| §5.6 Formel 1 (Bestands-Check) | Übersicht aller `](`-Links, Exit 0 | 14 Ziele; Exit 0 | +| §5.6 Formel 2 (Form-Check) | `0`, Exit 0 | `0`, Exit 0 | +| §5.6 Formel 3 (Dangling-Check) | keine Ausgabe | keine Ausgabe, Exit 0 | +| §5.6 Formel 4 (Kontakt-mit-`raw/`) — Ist | `38` | `38` | +| §5.6 Formel 4 (Extraktion aus Run-Kopf `862cf41`) | `38` | `38` (`38 ≡ 38`) | +| §5.8 Selbsttest (exakt Z. 216, beide Läufe) | keine Ausgabe, Exit 0 | keine Ausgabe, Exit 0 | +| §5.8 CWD-Präguard (außerhalb Workspace-Root) | `SELBSTTEST-SETUP-Fehler…` + Exit 1 | exakt so, Exit 1 | + +**Quell-Konsistenz:** Die Nachweise in `wiki/log.md` (Story 2.4/2.5-Einträge) decken sich mit diesen Re-Runs: Formel 2 `0`, Formel 3 leer, Formel 4 `38 ≡ 38`, §5.8 leer+Exit 0, Präguard-Sandbox-Nachweis (`SELBSTTEST-SETUP-Fehler…`+Exit 1) — alle **verifiziert**. + +**Abweichung / Lücke:** Der in `log.md` behauptete „alle 7 `wiki/`-Dateien SUCCESS (inkl. Punkt 11, EC-1)" ist bei Rev-8-wörtlicher Punkt-11-Lesart der file-relative Area-Link nicht mechanisch reproduzierbar (vgl. F-02): das Bundle-Verdikt ist über die aufgelockerte Lesart konsistent, der wörtliche Check nicht. Es bleibt ein Rev-9-Aktionsitem. + +**Bewusst nicht erneut exerziert:** Die Validator-Festhalte-Fixtures (§7.1–§7.3), die Rev-8-Zertifizierung und die Sandbox-Negativtests (`TOP_LEVEL_COLLISION`, `AREA_WITHOUT_INDEX`, `DANGLING`-Fälle) sind in `validator.md`/`log.md` ausführlich belegt und in früheren Runden re-zertifiziert; sie wurden hier stichprobenartig (F-02/F-03) bestätigt, nicht vollständig wiederholt. + + + +## Action items (fix-now-Routing aus den Findings) + +Die folgenden F-Items sind fix-now geroutet und werden als Action-Items zur Ausführung im normalen Dev-Loop **vorgeschlagen** (Retrospective schlägt vor, wendet nicht selbst an — das entscheidet der Nutzer): + +- **AI-2-R-1 (§5.5-Provenienz-Selbsttest rekursiv machen)** — `schema/compiler.md` §5.5 Pkt. 1/4 (Z. 81/104): Formel auf rekursive Abdeckung umstellen (`grep -rnE '\(raw/' wiki/ --include='*.md' --exclude=log.md`), sodass Area-Concepts erfasst werden. Quelle: **F-01**. Owner: dev. +- **AI-2-R-2 (§5.8/Area-ohne-`index.md`-Lücke schließen)** — §5.8 Pkt. 2 Lauf A (Z. 216): Area-Concept-ohne-`index.md`-Fälle (Tiefe 2, `wiki//concept.md` ohne `wiki/a/index.md`) in den Selbsttest aufnehmen. Quelle: **F-03**. Owner: dev. +- **AI-2-R-3 (Formel-4-Filterasymmetrie heilen)** — §5.6 Pkt. 3 Formel 4 (Z. 162–163): `--exclude=log.md` und `grep -v "log.md$"` auf dieselbe Exklusions-Semantik bringen (genau-Basename `log.md` auf beiden Seiten bzw. rekursiv-Basename in beiden). Quelle: **F-04**. Owner: dev. +- **AI-2-R-4 (§5.8-Reachability als echte Markdown-Links prüfen + `./`-Konsistenz mit §5.6)** — §5.8 Pkt. 2 Lauf A (Z. 216): `grep -qF` gegen Code-Fence/Blockquote-sichere Link-Detektion; `./`-Variante mit dem §5.6-Form-Check vereinheitlichen (genau eine erlaubte Form). Quelle: **F-05**. Owner: dev. +- **AI-2-R-5 (autorisierte Validator-Rev-9 für Punkt 11 Area-Lesart)** — formalisierte Punkt-11-Area-Lesart (relative OKF-Pfad-Identität, file-relativ in Area-Index) in einer autorisierten Revision; de-dupliziert mit dem bestehenden Action-Item `code-review-2-1-item-2` (Rev-9-Vorbereitung). Quelle: **F-02**. Owner: dev. + +Die übrigen F-Items sind **defer** (F-07, F-08, F-09 — bekannte, in `deferred-work.md` verankerte Lücken) bzw. **accept** (F-06, F-10, F-11, F-12 — dokumentierte Design-Entscheidungen bzw. Klarstellungen). Für die accept/defer-Items gilt: sie werden in den **Open questions**-Block übernommen, damit spätere Retros sie nicht erneut als neu flaggen. + +## Acceptance verdict + +- **Kriterien:** declar **deklariert** in `_bmad-output/planning-artifacts/epics.md` (Epic-2-Block + Stories 2.1–2.5, je AC-Zeilen). +- **Story-Status:** alle Stories des Epic (2.1–2.5) sind `done`; `detect-epic --epic 2` liefert keine `pending_stories` (sprint-status.yaml) → kein Machine-Zwang zu `rejected`. +- **Kriterien-Erfüllung (Beleg):** Die AC-Zeilen je Story sind erfüllt und belegt — Story 2.1/2.2 (OKF-Konformität, v1-Trust, claim-granulare Provenienz) durch die 2026-08-17-Re-Reviews und Rev-8-Autorisationsrunde; Story 2.3 (eine erlaubte Linkform) durch `§5.6` + Formeln 1–3; Story 2.4 (deterministische Bereichszuordnung) durch `§5.7` + Tie-Break + Kollisions-Hold; Story 2.5 (Progressive Discovery) durch `§5.8` + Selbsttest. Verhaltenscheck (Abschnitt oben): **alle re-executierbaren Formeln grün**. +- **Offene, getrackte Findings:** F-01–F-05 sind empirisch belegte Blindstellen/Konsistenzgrafien in den Selbsttest-Formeln (insbesondere F-01: §5.5-Formel übersieht Area-Concepts; F-02: Punkt-11-Wortlaut vs. file-relative Area-Linkform). Sie sind **nicht** Blockierend für die Story-ACs (kein Live-Fail, kein Kriterien-Unterschreiten), wohl aber für den AD-17h-„re-executierbar & vollständig"-Anspruch der Instruktion. +- **Verdikt:** **accepted-with-open-items** — die deklarierten Abnahmekriterien sind erfüllt und durch re-executierbare Nachweise belegt; benannte Findings (F-01–F-05) bleiben als offene, getrackte Items (Action-Items AI-2-R-1…5) bestehen. Gemäß `acceptance-verdict.md` fällt das maschinelle Verdikt bei leerer `pending_stories`, erfüllten Kriterien und getrackten, nicht-blockierenden Findings selbst auf **accepted-with-open-items** — keine Zurückweisung. Die Findings sind zudem empirisch belegt (F-01: §5.5-Formel übersieht Area-Concepts; F-02: Punkt-11-Wortlaut vs. file-relative Area-Linkform; F-03–F-05: Sandbox-Replikationen) und werden als explizite, getrackte Folge-Items in den Dev-Loop übertragen. + + + +## Open questions + +1. **F-06 — Formel-4-Re-Baseline-Policy:** Wie definiert Epic 3 einen „Zuwachs-Run" (Datei-Zuwachs vs. Content-Drift ohne Datei-Zuwachs) und welcher Commit wird „der dann aktuelle Run-Kopf" für die Baseline-Extraktion? (kurze Antwort in `schema/compiler.md` §5.6 Pkt. 3 Z. 166 ist vorhanden, aber ohne zitierbare Regel.) +2. **F-10 — „kanonischer Name" mechanisieren:** Kann Epic 3 den §5.7-Pkt.-1(a)-Operanden (kanonischer Name des Themas) aus dem `index.md`-Baum ableiten (grep/ripgrep, ID-Normalisierung), ohne ein neues Urteils-Element einzuführen? +3. **F-02/Rev-9 — Punkt-11-Lesart:** Welche exakte Formulierung trägt die file-relative Area-Lesart am besten („relative OKF-Pfad-Identität, auch in Area-Index") und bleibt dabei vertrags-/validator-konform? +4. **F-11 — Struktur:** Soll `schema/compiler.md` in Epic 3 aufgeteilt oder mit einem Querverweis-Register versehen werden, um die §5.5–§5.8-Fehlschlagschneisen zu senken? (Empfehlung: aufgeteilt oder Register, kein Auto-Fix.) + +## Previous-retro follow-through + +Das vorige Retrospective ist `epic-1-retro-2026-08-15.md` (Epic 1). Aus `sprint-status.yaml` wurden die Epic-1-Action-Items geprüft: + +- **`epic-1-retro-item-1` … `-7`** — alle **done** (geschlossen 2026-08-16, je mit Resolution; an die Validator-Revisionen 3–6 + F-04/F-09/Defer-Sicherung gekoppelt). Belegt über `sprint-status.yaml` (action_items, `status: done`, `closed` + `resolution`) — **kein offener Epic-1-Posten übrig**. +- **Von Epic 2 bisherige Action-Items:** + - `code-review-2-1-item-1-autorisierte-validator-revision-option` — **done** (Rev-8-Autorisationsrunde ausgeführt und zertifiziert, s. `wiki/log.md` 2026-08-16/17). Beleg: `validator.md` Rev 8 + log-Eintrag. + - `code-review-2-1-item-2` (Epic 2, Rev-9-Vorbereitung: Punkt-4-Grammatik `resolved=`-Token, Innen-Ebenen-Punkt-6-Fixture-Zeile) — **offen / nicht erledigt** (kein Beleg für Abschluss). Dieser Posten bleibt im Follow-through aufgeführt, da er in dieser Retro als **AI-2-R-5 (Rev-9)** wiederbelebt bzw. aufgegriffen wird; die beiden anderen Teilschritte (Punkt-4-Grammatik + Innen-Ebenen-Punkt-6-Fixture) sind Teil der **defer**-F-09-Übernahme (unabhängig vom Rev-9-Ziel). Der vorgeschlagene Status ist **in-progress** (laufender Dev-Loop) bzw. bei Nutzer-Autorisierung **done** für den abgeschlossenen Teil. + +Hinweis gemäß `acceptance-verdict.md` L29: ein fehlender Datei-Beleg ist nie als „keine offenen Posten" zu lesen. Da Epic 1 keine `action_items`-Einträge über die Epic-1-Id-Form hinaus trägt (aus der Version vor dem Retro-I-Format) und die Epic-2-Einträge mit Ids existieren, ist die Auswahl über die expliziten Ids oben geprüft (keine Legacy-Einträge ohne Id mitgematcht). + +## Assumptions + +*Nicht zutreffend (interaktive Ausführung):* Für diesen interaktiven Retro-Lauf wurden keine Entscheidungen ohne den Nutzer getroffen — die Auswahl des Epic (Epic 2) erfolgte durch den Aufruf `/bmad-retrospective Epic 2`; die Einschätzung der Story-Kriterien und die resultierenden Action-Items werden dem Nutzer als Vorschläge vorgelegt (Phase 4/5). diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 834c5bb..c61114f 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -29,7 +29,7 @@ # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) # - Retrospective appends its action items to action_items; the status view surfaces open ones generated: 08-14-2026 00:00 -last_updated: 08-18-2026 17:45 +last_updated: 08-18-2026 21:15 project: wow20 project_key: NOKEY tracking_system: file-system @@ -48,7 +48,7 @@ development_status: 2-3-concepts-verlinken-eine-erlaubte-linkform: done 2-4-deterministische-bereichszuordnung-concept-hierarchie: done 2-5-progressive-discovery-über-index-md-bereitstellen: done - epic-2-retrospective: optional + epic-2-retrospective: done epic-3: backlog 3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: backlog @@ -83,7 +83,8 @@ action_items: status: done closed: "2026-08-16" resolution: "Option A (Nutzer): Toleranz rueckgaengig — at MUSS volles ISO-8601-Datetime - sein; reines Datum => FAIL Punkt 14. schema/validator.md Revision 3; Vertrag unveraendert." + sein; reines Datum => FAIL Punkt 14. schema/validator.md Revision 3; Vertrag + unveraendert." ref: "_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md#F-01" - id: "epic-1-retro-item-2-6-fixtures-ergaenzen-ec-1-existenz-ec-3" epic: 1 @@ -93,8 +94,8 @@ action_items: owner: "dev" status: done closed: "2026-08-16" - resolution: "Neue Fixture-Tabelle schema/validator.md §7.3 (EC-1, EC-3, WARN, EC-11); - Validator auf Revision 4; Zertifizierung in wiki/log.md nachgefuehrt." + resolution: "Neue Fixture-Tabelle schema/validator.md §7.3 (EC-1, EC-3, WARN, + EC-11); Validator auf Revision 4; Zertifizierung in wiki/log.md nachgefuehrt." ref: "_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md#F-02" - id: "epic-1-retro-item-3-3-2-voraussetzungspruefungen-als-fachlic" epic: 1 @@ -113,8 +114,8 @@ action_items: owner: "dev" status: done closed: "2026-08-16" - resolution: "raw/*/source.md korrigiert; Herkunft auf Commit 6cc667d + SHA-256 gestuetzt - (byte-identisch zur Evidenz); Deferred-Work-Checksumme damit vorangebracht/umgesetzt." + resolution: "raw/*/source.md korrigiert; Herkunft auf Commit 6cc667d + SHA-256 + gestuetzt (byte-identisch zur Evidenz); Deferred-Work-Checksumme damit vorangebracht/umgesetzt." ref: "_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md#F-09" - id: "epic-1-retro-item-5-bom-leerzeilen-stripping-von-punkt-10-au" epic: 1 @@ -123,8 +124,8 @@ action_items: owner: "dev" status: done closed: "2026-08-16" - resolution: "Gemeinsame gestrippte Frontmatter-Erkennung in §3-Praaembel; Punkte 2/8/10 - nutzen sie; Positiv-Fixtures 2a/8b ergaenzt; Revision 6; Vertrag unveraendert." + resolution: "Gemeinsame gestrippte Frontmatter-Erkennung in §3-Praaembel; Punkte + 2/8/10 nutzen sie; Positiv-Fixtures 2a/8b ergaenzt; Revision 6; Vertrag unveraendert." ref: "_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md#F-05" - id: "epic-1-retro-item-6-ausfuehrbare-mechanische-verifikation-de" epic: 1 @@ -134,8 +135,8 @@ action_items: status: done closed: "2026-08-16" resolution: "Konsistenz-Abgleich (Nutzer): strenger Vertrag↔Validator↔Fixtures-Abgleich - (14 Punkte/keine Punkt 15) als Pflicht-Re-Check in spec-1-4-Verification; bleibt in - D-3 (kein Standalone). Verifikations-Beleg-Tabelle ergaenzt." + (14 Punkte/keine Punkt 15) als Pflicht-Re-Check in spec-1-4-Verification; bleibt + in D-3 (kein Standalone). Verifikations-Beleg-Tabelle ergaenzt." ref: "_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md#F-10" - id: "epic-1-retro-item-7-folge-aufgaben-fuer-epic-2-3-sichern-ver" epic: 1 @@ -145,30 +146,69 @@ action_items: owner: "epic-2/3-planung" status: done closed: "2026-08-16" - resolution: "F-04/F-06/F-07/F-08/F-11/F-14 als Defer-Kontexte in deferred-work.md (append-only) - mit Epic-/Validator-Zuordnung notiert; F-06/F-08 zusaetzlich im Validator Rev. 6 als - 'Offene Punkte' verankert." + resolution: "F-04/F-06/F-07/F-08/F-11/F-14 als Defer-Kontexte in deferred-work.md + (append-only) mit Epic-/Validator-Zuordnung notiert; F-06/F-08 zusaetzlich im + Validator Rev. 6 als 'Offene Punkte' verankert." ref: "_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md#F-04" - id: "code-review-2-1-item-1-autorisierte-validator-revision-option" epic: 2 - action: "Autorisierte Validator-Revision starten (Option-A-Heilung fuer Story 2.1): - 1) F-14-Negativ-Fixture (resource ausserhalb raw/, existiert) ergaenzen; + action: "Autorisierte Validator-Revision starten (Option-A-Heilung fuer Story + 2.1): 1) F-14-Negativ-Fixture (resource ausserhalb raw/, existiert) ergaenzen; 2) Innen-Ebenen-Key-Subset-Klarstellung (Punkt 6 in sources/generated/verified) - formal tragen (bisher unautorisierte Rev-7-Notiz); - 3) Validator-Header-Revisionszahl anheben (Header 'Revision 6' vs. Revisionslog - 'Revision 7', OBS-1). Danach Story 2.1 zur Review-Freigabe wiedervorlegen." + formal tragen (bisher unautorisierte Rev-7-Notiz); 3) Validator-Header-Revisionszahl + anheben (Header 'Revision 6' vs. Revisionslog 'Revision 7', OBS-1). Danach Story + 2.1 zur Review-Freigabe wiedervorlegen." owner: "dev" status: done closed: "2026-08-17" - resolution: "schema/validator.md auf Revision 8: F-14-Fix-Fixture 4a (§7.1, Punkt 4), - Innen-Ebenen-Key-Subset formalisiert (Punkt-6-Zelle verweist auf §7.3, autorisiert), + resolution: "schema/validator.md auf Revision 8: F-14-Fix-Fixture 4a (§7.1, Punkt + 4), Innen-Ebenen-Key-Subset formalisiert (Punkt-6-Zelle verweist auf §7.3, autorisiert), Header-Revisionszahl auf 8 angehoben (OBS-1 behoben). Zertifizierung PASS (Fixture 4a FAIL Punkt 4; Innen-Ebenen FAIL Punkt 6; reales Bundle SUCCESS). Story 2.1 zur Review-Freigabe wiedervorgelegt (status: review)." ref: "_bmad-output/implementation-artifacts/validator-revision-8-autorisationsrunde-f14-innen-ebenen.md" - id: "code-review-2-1-item-2-validator-rev9-punkt4-grammar-innen-ebenen-fixture" epic: 2 - action: "Autorisierte Validator-Revision 9 vorbereiten (bmad-code-review Re-Run 2026-08-17, geholderte Patches 16/17): 1) Punkt-4-Fehlerursachen-Grammatik um `resolved=`-Token erweitern (Fixture 4a ableitbar machen); 2) Innen-Ebenen-Punkt-6-Fixture-Zeile in §7.1/§7.3 ergänzen (Rev-8-Formalisierung re-runbar belegen). Danach Zertifizierung (isolierte Fixtures + reales Bundle) und `wiki/log.md`-Nachweis." + action: "Autorisierte Validator-Revision 9 vorbereiten (bmad-code-review Re-Run + 2026-08-17, geholderte Patches 16/17): 1) Punkt-4-Fehlerursachen-Grammatik um + `resolved=`-Token erweitern (Fixture 4a ableitbar machen); 2) Innen-Ebenen-Punkt-6-Fixture-Zeile + in §7.1/§7.3 ergänzen (Rev-8-Formalisierung re-runbar belegen). Danach Zertifizierung + (isolierte Fixtures + reales Bundle) und `wiki/log.md`-Nachweis." + owner: "dev" + status: in-progress + ref: "_bmad-output/implementation-artifacts/deferred-work.md" + - id: "epic-2-retro-item-10-schema-compiler-md-5-5-selbsttest-formel" + epic: 2 + action: "schema/compiler.md §5.5-Selbsttest-Formel rekursiv machen (grep -rnE + (raw/ über wiki/ inkl. Area-Concepts); F-01/AI-2-R-1" owner: "dev" status: open - ref: "_bmad-output/implementation-artifacts/deferred-work.md" + ref: "_bmad-output/implementation-artifacts/epic-2-retro-2026-08-18.md" + - id: "epic-2-retro-item-11-schema-compiler-md-5-8-lauf-a-um-area-co" + epic: 2 + action: "schema/compiler.md §5.8-Lauf A um Area-Concept-ohne-index.md erweitern + (Tiefe-2, wiki//concept.md ohne wiki/a/index.md); F-03/AI-2-R-2" + owner: "dev" + status: open + ref: "_bmad-output/implementation-artifacts/epic-2-retro-2026-08-18.md" + - id: "epic-2-retro-item-12-schema-compiler-md-5-6-formel-4-filter-a" + epic: 2 + action: "schema/compiler.md §5.6-Formel-4 Filter-Asymmetrie heilen (--exclude=log.md + vs grep -v log.md$ auf eine Semantik); F-04/AI-2-R-3" + owner: "dev" + status: open + ref: "_bmad-output/implementation-artifacts/epic-2-retro-2026-08-18.md" + - id: "epic-2-retro-item-13-schema-compiler-md-5-8-reachability-als" + epic: 2 + action: "schema/compiler.md §5.8-Reachability als echte Markdown-Links prüfen + + ./-Variante mit §5.6-Pin vereinheitlichen; F-05/AI-2-R-4" + owner: "dev" + status: open + ref: "_bmad-output/implementation-artifacts/epic-2-retro-2026-08-18.md" + - id: "epic-2-retro-item-14-autorisierte-validator-rev-9-für-punkt-1" + epic: 2 + action: "Autorisierte Validator-Rev-9 für Punkt-11-Area-Lesart (relative OKF-Pfad-Identität, + file-relativ in Area-Index); de-dupliziert mit code-review-2-1-item-2; F-02/AI-2-R-5" + owner: "dev" + status: open + ref: "_bmad-output/implementation-artifacts/epic-2-retro-2026-08-18.md" -- 2.54.0 From 802a5576eb4bbf54761a947e43e68b7e7ea9d67d Mon Sep 17 00:00:00 2001 From: Michael Tamse Date: Tue, 18 Aug 2026 22:14:44 +0200 Subject: [PATCH 04/16] =?UTF-8?q?chore:=20Autorisierte=20Validator-Revisio?= =?UTF-8?q?n=209=20=E2=80=94=20Punkt-11-Area-Lesart=20formalisieren=20+=20?= =?UTF-8?q?gehaltene=20Patches=20tragen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Header auf Revision 9 + Revisionslog-Eintrag (append-only, fünf inhaltliche Änderungen, keine neue §7-Klasse / kein Punkt 15) - §3 Punkt-11-Area-Lesart: Pärchen (Area-Präfix + Link-Ziel) identitätsstiftend, file-relative Referenz genügt; Normalisierung (./-Strip, ..-Ausschluss, .md-Strip AD-7a) - §3 Punkt-4-Vorlage: resolved=-Token + §6.2-Semantik (nur bei Ablehnung durch aufgelöste Lage außerhalb raw/), Fixture 4a ableitbar - §7.3 Innen-Ebenen-Punkt-6-Fixtures (Negativ role: x -> FAIL Punkt 6 / Positiv) - §7-Fixtures 11a (Negativ am realen Live-Area-Namen / Positiv file-relativ) - Vertrag schema/wiki-compiler.md + Instruktion schema/compiler.md + raw/ + adapters/ unverändert (AD-3/D-3-Freeze, git diff 0 Treffer) - Zertifizierung wiki/log.md (Isolierte Fixtures + reales Bundle 7/7 SUCCESS + Live-Invariant) - Sprint-Status: code-review-2-1-item-2 + epic-2-retro-item-14 -> done Co-Authored-By: Claude --- ...lidator-revision-9-punkt-11-area-lesart.md | 158 ++++++++++++++++++ .../sprint-status.yaml | 25 ++- schema/validator.md | 22 ++- wiki/log.md | 1 + 4 files changed, 196 insertions(+), 10 deletions(-) create mode 100644 _bmad-output/implementation-artifacts/spec-autorisierte-validator-revision-9-punkt-11-area-lesart.md diff --git a/_bmad-output/implementation-artifacts/spec-autorisierte-validator-revision-9-punkt-11-area-lesart.md b/_bmad-output/implementation-artifacts/spec-autorisierte-validator-revision-9-punkt-11-area-lesart.md new file mode 100644 index 0000000..8d7a6b2 --- /dev/null +++ b/_bmad-output/implementation-artifacts/spec-autorisierte-validator-revision-9-punkt-11-area-lesart.md @@ -0,0 +1,158 @@ +--- +title: 'Autorisierte Validator-Revision 9 — Punkt-11-Area-Lesart formalisieren + gehaltene Rev-8-Patches tragen' +type: 'chore' +created: '2026-08-18' +status: 'done' +baseline_commit: ef84309db7ca0090c3e124b8c364c56cc72186f3 +review_loop_iteration: 0 +context: + - _bmad-output/implementation-artifacts/validator-revision-8-autorisationsrunde-f14-innen-ebenen.md + - _bmad-output/implementation-artifacts/epic-2-retro-2026-08-18.md +--- + + + +## Intent + +**Problem:** Der Validator (`schema/validator.md`, Rev 8) ist für Epic 2 nur über eine aufgelockerte Lesart konsistent: Punkt 11 verlangt, die Concept-Identität sei „als relativer Bundle-Pfad referenziert", aber die Area-`index.md` verlinkt ihr Area-Concept file-relativ (`source-material.md`) — die wörtliche Bundle-Identität `wissensarchitektur/source-material` kommt im Bereichs-Index nicht vor. Ein wörtlich-mechanischer Rev-8-Check meldete das Live-Concept als „nicht verlinkt". Zusätzlich sind zwei gehaltene Review-Patches (Punkt-4-`resolved=`-Token, Innen-Ebenen-Punkt-6-Fixture-Zeile) ausstehend — die Rev-8-Formalisierung ist damit nicht re-runbar belegt. + +**Approach:** Eine autorisierte Validator-Revision 9 ausführen, die (1) die Punkt-11-Area-Lesart formal trägt (relative OKF-Pfad-Identität, auch file-relativ in der zuständigen Area-`index.md`) und damit die AD-3/D-3-Freeze-Währung wahrt, (2) die beiden gehaltenen Patches als Teil der Revision trägt, (3) Header auf 9 anhebt, Revisionslog (append-only) nachführt und die Zertifizierung (isolierte Fixtures + reales Bundle) mechanisch belegt. + +## Boundaries & Constraints + +**Always:** +- `schema/validator.md` ist die **einzige** zu ändernde Vertrags-/Validator-Datei. `schema/wiki-compiler.md` (Vertrag, Story 1.3) und `schema/compiler.md` (Instruktion) bleiben **unverändert** — die Rev-9-Lesart verschärft keinen §7-Punkt und fügt **keine neue §7-Invaliditätsklasse** hinzu (kein Punkt 15); die Abschluss-Eigenschaft des §7-Katalogs bleibt gewahrt (F-04-Kultur, AD-1b). +- `raw/` (immutable, AD-3), `adapters/`, alle bestehenden `wiki/`-Dateien bleiben unverändert (außer `wiki/log.md`, Zertifizierungs-Nachweis). +- Der §8-Revisionslog ist **append-only** — der Rev-9-Eintrag wird angehängt, bestehende Einträge bleiben unangetastet. Die Punkt-11-Normreferenz-Notiz „Story 2.3 (Link-Form)" wird um die Rev-9-Area-Lesart ergänzt (derselbe Normreferenz-Block, append). +- Die Formulierung bleibt **rein textuell** (D-3): keine neue Prüfklasse, kein Standalone; die mechanische Re-Exekution folgt den im Revisionslog dokumentierten Formeln. +- Datums- und Revisions-Werte nach dem Wiki-Log- und Sprint-Status-Format; die Revisionszahl geht von 8 auf 9 (Header + Revisionslog). + +**Ask First:** +- Branch-Wechsel/Merge-Strategie für `validator-rev-9` (aktuell noch nicht zurückgeführt). +- Falls die Zertifizierung am Live-Baum Abweichungen zeigt, die nicht durch die Doku-Kultur (wiki/log.md) heilbar sind — vor Fortsetzung HALT. +- Die Behandlung der weiteren offenen Epic-2-Items (AI-2-R-1 … R-4: §5.5-rekursiv, §5.8-Tiefe-2, Formel-4-Asymmetrie, §5.8-Reachability) ist **nicht** Teil dieser Revision — bei Scope-Drift Richtung compiler.md HALT. + +**Never:** +- Keine Änderung an `raw/`, `adapters/`, `schema/wiki-compiler.md`, `schema/compiler.md` oder den bestehenden `wiki/`-Concept-Dateien. +- Kein neuer §7-Punkt, keine Erfindung einer neuen Invaliditätsklasse. +- Keine Änderung an gefrorenen/I-O-Matrix-Texten außerhalb des explizit autorisierten Rev-9-Umfangs (kein ad-hoc-Editing). +- Keine Bauch-Formulierungen: jede Formulierung wird gegen den realen Bundle-Baum (7 Dateien) und die Fixture-Tabellen in §7 geprüft. + +## I/O & Edge-Case Matrix + +| Scenario | Input / State | Expected Output / Behavior | Error Handling | +|----------|--------------|---------------------------|----------------| +| POINT11_AREA_LINK | `wiki/wissensarchitektur/index.md` verlinkt `source-material.md` (file-relativ, gepinnte §5.6-Form) | Area-Concept-Identität `wissensarchitektur/source-material` ist gewahrt — Punkt 11 → kein FAIL (SUCCESS) | Verschiebt sich nicht in einen anderen Punkt; kein WARN | +| POINT11_WORDING_FAIL | Area + Concept ohne Link (Bundle-Identität nirgends) | `FAIL wiki/… Punkt 11: Index-Regel verletzt (Concept nicht verlinkt=)` | Identität über Pärchen Area-Präfix + Link-Ziel abgeleitet | +| FIXTURE_4A | `sources: [{resource: README.md}]` (existierende Datei an Workspace-Root, außerhalb `raw/`) | `FAIL wiki/x.md Punkt 4: resource ausserhalb raw/ oder unzulaessiger Pfad (resolved=README.md)` — ableitbar aus §3-Punkt-4-Vorlage | Punkt-4-vor-3-Priorität (§6.2): kein Vorab-FAIL durch Punkt 3 | +| INNER_LEVEL_KEY | `sources:\n - resource: raw/prd/prd-wow20-2026-08-14.md\n role: x` (sonst-valides Sample, existierende `raw/`-Datei) | `FAIL wiki/x.md Punkt 6: nicht autorisiertes Feld (Key=role) bzw. unautorisierter Key in sources/generated/verified` | Nur Punkt 6 löst aus — Isolations-Prinzip (§7.3) | +| LIVE_BUNDLE_REGRESSION | Alle 7 `wiki/`-Dateien gegen den revidierten Validator | weiterhin SUCCESS für alle Dateien (keine neu ausgelösten FAILs) | Keine neue §7-Klasse; Abschluss-Eigenschaft gewahrt | + + + +## Code Map + +- `schema/validator.md` — die **einzige** zu ändernde Datei (Rev 9). Anker: §0-Header (Z. 6–8, Revisionszahl 8 → 9 + Letzte-Re-Konsistenz), §3 Punkt-4-Tabelle (Z. 63, Vorlage ohne `resolved=`-Token), §3 Punkt-6-Tabelle (Z. 65, Innen-Ebenen-Verweis vorhanden), §3 Punkt-11-Tabelle (Z. 70, Kern der Area-Lesart), §7.1-Fixtures Punkt 4a/6 (Z. 214/216), §7.3-Fixture-Isolations-Notiz (Z. 263, Innen-Ebenen-Kontext), §8-Normreferenz-Notiz „Story 2.3 (Link-Form)" (Z. 297), §8-Revisionslog (Z. 299–308, append-only). +- `_bmad-output/implementation-artifacts/validator-revision-8-autorisationsrunde-f14-innen-ebenen.md` — der Rev-8-Präzedenzfall (Autorisierungskanal, Zertifizierung, Follow-Tracking); formt die Rev-9-Runde strukturell. +- `_bmad-output/implementation-artifacts/deferred-work.md` — Z. 184–191: die **gehaltenen Patches 16/17** (Punkt-4-`resolved=`-Token, Innen-Ebenen-Punkt-6-Fixture-Zeile) mit exakter gewünschter Wortform; Z. 279–287: F-02/Rev-9-Aktionsitem-Kontext. +- `_bmad-output/implementation-artifacts/epic-2-retro-2026-08-18.md` — F-02 (Punkt-11-Wortlaut vs. file-relative Area-Linkform), AI-2-R-5 (de-dupliziert mit `code-review-2-1-item-2`), Open question 3 (exakte Formulierung der Area-Lesart). +- `wiki/index.md` — Bundleroot (Z. 33–37, Area-Sektion); verlinkt die Area als `(wissensarchitektur/index.md)` — **nur** die Area, nicht das Area-Concept. +- `wiki/wissensarchitektur/index.md` — Area-`index.md` (frontmatterlos, Z. 9: file-relativer `(source-material.md)`-Link); beweist die Live-F-02-Lage (Bundle-Identität `wissensarchitektur/source-material` kommt textuell nirgends vor, grep → 0). +- `wiki/wissensarchitektur/source-material.md` — das Area-Concept; durch die Layer-6/7-Struktur das vom wörtlichen Rev-8-Punkt-11-Check fälschlich „nicht verlinkt" gemeldete Concept. +- `wiki/log.md` — §5-Format-Zertifizierungs-Nachweis (datumsgruppiert 2026-08-16/17/18; Rev-9-Eintrag wird ergänzt). +- `_bmad-output/implementation-artifacts/sprint-status.yaml` — Action-Item `code-review-2-1-item-2` (Z. 173–174) + neue AI-2-R-5-Einträge; Status-Nachführung nach Abschluss (je nach Flow). + +## Tasks & Acceptance + +**Execution:** +- [x] `schema/validator.md` -- Header: `Validator-Revision: 8` → `9`, `Letzte Re-Konsistenz` → 2026-08-18 (Revision 9 — Punkt-11-Area-Lesart; Punkt-4-`resolved=`-Token; Innen-Ebenen-Punkt-6-Fixture-Zeile) -- Anker §0. +- [x] `schema/validator.md` -- §3 Punkt-11-Zelle: Area-Lesart formalisieren — „ein Concept ist verlinkt, wenn seine Identität (relativer OKF-Dateipfad ohne `.md`) in der `index.md` des nächsten Vorfahren referenziert ist; für ein Area-Concept genügt die file-relative Referenz in der Area-`index.md`, identitätsstiftend ist das Pärchen (Area-Präfix + Link-Ziel); Root-Concepts wie bisher in der Bundleroot (mit/ohne `.md`-Endung)" -- Kern der Rev-9-Lesart, F-02. +- [x] `schema/validator.md` -- §7.1-Fixture: neue Negativ-Fixture 11a „Area `wiki/wissensarchitektur/` mit `index.md`, das Area-Concept `source-material.md` **nicht** verlinkt → `FAIL … Punkt 11: Concept nicht verlinkt=wissensarchitektur/source-material`" + Positiv-Fall dokumentieren -- prüfbare Negative der Area-Lesart. +- [x] `schema/validator.md` -- §3 Punkt-4-Vorlage: optionales `resolved=`-Token ergänzen (`…unzulaessiger Pfad (..-Traversal|absolut|URL|Backslash|file://|resolved=)`) -- Patch 16/17, Fixture 4a ableitbar machen (§7 „exakt die aus §3"). +- [x] `schema/validator.md` -- §7.3: echte Negativ-Fixture-Zeile für Innen-Ebenen-Punkt-6 („`sources:\n - resource: raw/…\n role: x` → `FAIL … Punkt 6`") -- Patch 16/17, Rev-8-Formalisierung re-runbar belegen. +- [x] `schema/validator.md` -- §8-Revisionslog: Rev-9-Eintrag anhängen (Punkt-11-Area-Lesart, beide Patches, Header-Anhebung; Vertrag unverändert) -- append-only. +- [x] `schema/validator.md` -- §8-Normreferenz-Notiz „Story 2.3 (Link-Form)" um die Rev-9-Area-Lesart ergänzen -- Konsistenz der Lesart mit der Pin-Form-Doktrin. +- [x] `wiki/log.md` -- Zertifizierungs-Eintrag (datumsgruppiert 2026-08-18): Fixture 4a isoliert FAIL Punkt 4, Innen-Ebenen FAIL Punkt 6, Punkt-11-Area-Lesart-Fixtures, reales Bundle weiterhin 7/7 SUCCESS -- mechanischer Beleg gemäß Validator-Zertifizierungs-Kultur (F-02). +- [x] `_bmad-output/implementation-artifacts/sprint-status.yaml` -- Action-Item `code-review-2-1-item-2` + `AI-2-R-5` → `done` (closed + resolution mit Rev-9 + ref auf Rev-9-Runde) -- Tracking-Abschluss. + +**Acceptance Criteria:** +- Given die autorisierte Rev-9-Runde, when `schema/validator.md` geprüft wird, then Header-Revisionszahl ist 9, der §8-Revisionslog trägt den Rev-9-Eintrag (append-only, bestehende Einträge unangetastet), und keine §7-Klasse wurde neu erzeugt (kein Punkt 15). +- Given die Punkt-11-Area-Lesart, when ein Area-Concept file-relativ in seiner Area-`index.md` verlinkt ist (Live: `wissensarchitektur/source-material.md`), then die Bundle-Identität `wissensarchitektur/source-material` ist für Punkt 11 gewahrt (kein FAIL „nicht verlinkt"). +- Given die gehaltenen Patches, when Fixture 4a isoliert gegen den revidierten Validator ausgeführt wird, then das Verdikt ist ableitbar aus der §3-Punkt-4-Vorlage `…(..-Traversal|absolut|URL|Backslash|file://|resolved=README.md)` → `FAIL … Punkt 4 … (resolved=README.md)`. +- Given die gehaltenen Patches, when das Innen-Ebenen-Sample (existierende `raw/`-Datei, `role: x` in `sources`-Eintrag) isoliert geprüft wird, then genau Punkt 6 löst aus (Isolations-Prinzip), mit Fixture-Zeile in §7.3. +- Given das reale Bundle (7 `wiki/`-Dateien), when der revidierte Validator den Run ausführt, then alle 7 Dateien bleiben SUCCESS (keine neu ausgelösten FAILs; Abschluss-Eigenschaft des §7-Katalogs gewahrt). +- Given `schema/wiki-compiler.md` und `schema/compiler.md`, when der Rev-9-Diff inspiziert wird, then beide bleiben unverändert (AD-3/D-3-Freeze; keine Vertrags-Änderung nötig — Punkt 11 deckt die Area-Lesart bereits vertraglich, §7). + +## Spec Change Log + + + +## Design Notes + +**Warum diese Formulierung (Open question 3 der Retro):** Die Lesart „als relativer Bundle-Pfad referenziert (mit oder ohne `.md`-Endung)" wird für Area-Concepts um die **file-relative** Alternative ergänzt: In der zuständigen Area-`index.md` ist die Referenz des Link-Ziels (`source-material.md`) der **lokale** Verweis auf das Area-Concept; die Bundle-Identität ergibt sich deterministisch als Pärchen `(Area-Präfix = Verzeichnisname der Area-`index.md`, Link-Ziel ohne `.md`)`. Das ist exakt die Datei-Topologie von `wiki/wissensarchitektur/index.md` Z. 9. Root-Concepts (gepinnte §5.6-Form, mit `.md`-Endung) bleiben unverändert — die „genau-eine-Form"-Festlegung der Link-Schreibweise liegt weiterhin bei Story 2.3/§5.6 der Compiler-Instruktion (dem Validator wird sie nicht vorgegeben). + +**Gehaltene Patches als formale Inhalte:** Beide Patches (16/17) sind bereits inhaltlich spezifiziert (deferred-work.md Z. 188–189: Punkt-4-`resolved=`-Token, Innen-Ebenen-Punkt-6-Fixture-Zeile). Sie werden durch diese Autorisierung von „gehalten (kein Autorisierungsschlag)" zu „formal getragene autorisierte Inhalte" — gleiche Währung wie die Rev-8-Autorisationsrunde (F-14-Fixture 4a). + +## Verification + +**Commands:** +- `grep -nE "Validator-Revision|Revision 9" schema/validator.md` -- expected: Header-Revisionszahl `9` UND Revisionslog-Entrag Rev 9 vorhanden. +- `exit 0` für die mechanischen Fixture-Runs (isolierte Samples + Live-Bundle) gemäß Zertifizierungs-Sektion der Rev-9-Runde. +- `git diff --name-only ..HEAD -- schema/wiki-compiler.md schema/compiler.md raw/ adapters/` -- expected: **keine** Treffer (AD-3/D-3-Freeze gewahrt). + +**Manual checks (if no CLI):** +- §7.1-Fixture 11a-Erwartungswert (`FAIL … Concept nicht verlinkt=wissensarchitektur/source-material`) mit der §3-Punkt-11-Zelle (Area-Lesart) abgeglichen → bildet die Ableitung ab. +- Fixture-4a-Verdikt (`(resolved=README.md)`) ist aus der §3-Punkt-4-Vorlage ableitbar (kein Inventieren). +- `wiki/log.md` trägt den Rev-9-Zertifizierungs-Eintrag (datumsgruppiert 2026-08-18); `sprint-status.yaml`-Action-Items sind `done` geschlossen. + +## Suggested Review Order + +**Area-Lesart (Punkt 11) — Kern der Revision** + +- Einstieg: die formalisierte Area-Lesart — Pärchen (Area-Präfix + Link-Ziel) identitätsstiftend, file-relativ genügt + [`validator.md:70`](../../schema/validator.md#L70) + +- Die Normreferenz-Notiz führt die Story-2.3-Formklausel um die Pin-Form-Doktrin nach + [`validator.md:304`](../../schema/validator.md#L304) + +- Negativ-Fixture 11a am realen Live-Area-Namen (F-02-Defekt belegt, Isolations-Prinzip) + [`validator.md:226`](../../schema/validator.md#L226) + +- Positiv-Gegenfall: file-relativer `](source-material.md)`-Link genügt → SUCCESS + [`validator.md:256`](../../schema/validator.md#L256) + +**resolved=-Token (Punkt 4)** + +- Fehlerursachen-Grammatik um das optionale `resolved=`-Token erweitert (Patch 16) + [`validator.md:63`](../../schema/validator.md#L63) + +- Semantik-Anker: Token feuert nur bei Ablehnung durch aufgelöste Lage außerhalb `raw/` + [`validator.md:182`](../../schema/validator.md#L182) + +- Fixture 4/4a — 4a verdikt-ableitbar aus der §3-Vorlage + [`validator.md:216`](../../schema/validator.md#L216) + +**Innen-Ebenen-Punkt-6-Fixtures** + +- §7.3-Überschrift trägt die Innen-Ebenen-Punkt-6-Fixtures explizit (Patch 17) + [`validator.md:265`](../../schema/validator.md#L265) + +- Negativ-Zeile `role: x` → genau Punkt 6 (Isolations-Prinzip) + [`validator.md:281`](../../schema/validator.md#L281) + +- Positiv-Gegenzeile: nur erlaubte Keys → SUCCESS + [`validator.md:282`](../../schema/validator.md#L282) + +**Konsistenz & Peripherals** + +- Header: Revisionszahl 9 + Re-Konsistenz-Nachführung + [`validator.md:7`](../../schema/validator.md#L7) + +- Revisionslog-Rev-9-Eintrag (append-only, „fünf inhaltliche Änderungen", kein Punkt 15) + [`validator.md:316`](../../schema/validator.md#L316) + +- Mechanischer Zertifizierungs-Nachweis inkl. Live-Invariant (2026-08-18) + [`log.md:4`](../../wiki/log.md#L4) + +- Tracking-Abschluss der Items `code-review-2-1-item-2` + `epic-2-retro-item-14` + [`sprint-status.yaml:170`](sprint-status.yaml#L170) diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index c61114f..8071ce3 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -29,7 +29,7 @@ # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) # - Retrospective appends its action items to action_items; the status view surfaces open ones generated: 08-14-2026 00:00 -last_updated: 08-18-2026 21:15 +last_updated: 08-18-2026 22:00 project: wow20 project_key: NOKEY tracking_system: file-system @@ -175,7 +175,19 @@ action_items: in §7.1/§7.3 ergänzen (Rev-8-Formalisierung re-runbar belegen). Danach Zertifizierung (isolierte Fixtures + reales Bundle) und `wiki/log.md`-Nachweis." owner: "dev" - status: in-progress + status: done + closed: "2026-08-18" + resolution: "Ausgefuehrt als Teil der autorisierten Validator-Rev-9: die zwei gehaltenen + Patches 16/17 umgesetzt — §3-Punkt-4-Vorlage um resolved=-Token ergaenzt + (inkl. §6.2-Semantik: nur bei Ablehnung durch aufgeloeste Lage ausserhalb raw/, + Wert = aufgeloester workspace-relativer Pfad; Fixture 4a -> FAIL Punkt 4 (resolved=README.md), + ableitbar), Innen-Ebenen-Punkt-6-Negativ- UND Positiv-Fixture-Zeilen in §7.3 + ergaenzt (role: x -> FAIL Punkt 6, Isolations-Prinzip). Scope: zusaetzlich die + de-duplizierte Punkt-11-Area-Lesart aus AI-2-R-5 (eingefrorener Intent, epic-2-retro-item-14 + = eigener action_item done-Eintrag mit eigener resolution + ref auf die Rev-9-Runde); + dieses Item deckt die zwei gehaltenen Patches, item-14 die Punkt-11-Area-Lesart. + Zertifizierung (isolierte Fixtures + reales Bundle 7/7 SUCCESS) und wiki/log.md-Nachweis + erfolgt (inkl. Freeze-Command + Live-Invariant)." ref: "_bmad-output/implementation-artifacts/deferred-work.md" - id: "epic-2-retro-item-10-schema-compiler-md-5-5-selbsttest-formel" epic: 2 @@ -210,5 +222,12 @@ action_items: action: "Autorisierte Validator-Rev-9 für Punkt-11-Area-Lesart (relative OKF-Pfad-Identität, file-relativ in Area-Index); de-dupliziert mit code-review-2-1-item-2; F-02/AI-2-R-5" owner: "dev" - status: open + status: done + closed: "2026-08-18" + resolution: "Autorisierte Validator-Rev-9 ausgefuehrt und zertifiziert: Punkt-11-Area-Lesart + formalisiert (file-relative Referenz in Area-index.md genuegt, Paerchen Area-Praefix + + Link-Ziel identitaetsstiftend; Live: wissensarchitektur/source-material ueber + ](source-material.md)); Bereichs-Index wahren die Bundle-Identitaet ohne textuelle + Nennung. §7-Fixtures 11a (Negativ/Positiv), Revisionslog 9, Header 9, wiki/log.md-Nachweis + (7/7 SUCCESS) erbracht. Quelle: spec-autorisierte-validator-revision-9-punkt-11-area-lesart.md" ref: "_bmad-output/implementation-artifacts/epic-2-retro-2026-08-18.md" diff --git a/schema/validator.md b/schema/validator.md index 6985e50..56a243e 100644 --- a/schema/validator.md +++ b/schema/validator.md @@ -2,9 +2,9 @@ > **Status:** abgeleitet (Story 1.4) — deterministische, agent-unabhängige Validierungs-Instruktion auf Basis des autorisierten Schema-Vertrags. > **Normative Grundlage:** `schema/wiki-compiler.md` (autorisiert, Story 1.3) — insbesondere §1 Geltungsbereich, §2 Bundleroot/Frontmatter, §3 Feldsubset (§3.3–§3.7), §5 `log.md`-Typdefinition, §6 Index-Regel/Prädikate, §7 abschließende 14-Punkte-Liste struktureller Invalidität, §8 Normreferenzen. -> **Validator-Revision:** 8 (Revisionslog in §8) +> **Validator-Revision:** 9 (Revisionslog in §8) > **Ableitungsdatum:** 2026-08-15 -> **Letzte Re-Konsistenz:** 2026-08-16 (Revision 8 — F-14-Fixture + Innen-Ebenen-Key-Subset formalisiert; Option-A-Heilung Story 2.1) +> **Letzte Re-Konsistenz:** 2026-08-18 (Revision 9 — Punkt-11-Area-Lesart; Punkt-4-`resolved=`-Token; Innen-Ebenen-Punkt-6-Fixture-Zeile) ## 0. Zweck & Aufruf @@ -60,14 +60,14 @@ Wert-Semantik des YAML-Checks: Frontmatter ist als YAML zu parsen. Wiederholte F | 1 | Concept ohne `type` oder mit leerem `type` | Concept-Frontmatter | Ist `type` nicht vorhanden ODER kein non-empty String (leerer String, nur Whitespace, oder `type: null` / Zahl / Datumsobjekt)? | `Punkt 1: concept ohne type oder leerer type (NULL|leer|nicht-String)` | | 2 | nicht-reservierte `.md`-Datei im Bundle ohne Frontmatter bzw. ohne `type` | jede nicht-`index.md`/nicht-`log.md` `.md`-Datei unter `wiki/` | Fehlt der Frontmatter-Block `---` (Erkennung auf dem gestrippten Dateianfang, §3-Präambel) ODER ist das Frontmatter nicht als YAML parsbar ODER fehlt `type` (bzw. ist leer)? | `Punkt 2: nicht-reservierte .md-Datei ohne Frontmatter/ohne type` | | 3 | `sources`-`resource` löst auf einen `wiki/`-Concept-Pfad auf | Concept-Frontmatter, je `sources[].resource` | Löst der (bereinigte, §6.2) Pfad relativ zur Workspace-Root auf einen Pfad auf, der **innerhalb** `wiki/` liegt? | `Punkt 3: resource loest auf wiki/-Concept-Pfad (Pfad=)` | -| 4 | `sources`-`resource` landet bei Auflösung außerhalb `raw/` (inkl. `..`-Traversal) oder ist URL-Form; zudem Verstöße der Pfad-Grammatik | Concept-Frontmatter, je `sources[].resource` | Enthält der `resource`-Wert `..`-Path-Segment, führenden `/`, `file://`-Präfix, Backslash/Windows-Trenner, oder einen absoluten/URL-Form-Wert (`http://`, `https://`, etc.) ODER liegt der aufgelöste Pfad außerhalb `raw/`? | `Punkt 4: resource ausserhalb raw/ oder unzulaessiger Pfad (..-Traversal|absolut|URL|Backslash|file://)` | +| 4 | `sources`-`resource` landet bei Auflösung außerhalb `raw/` (inkl. `..`-Traversal) oder ist URL-Form; zudem Verstöße der Pfad-Grammatik | Concept-Frontmatter, je `sources[].resource` | Enthält der `resource`-Wert `..`-Path-Segment, führenden `/`, `file://`-Präfix, Backslash/Windows-Trenner, oder einen absoluten/URL-Form-Wert (`http://`, `https://`, etc.) ODER liegt der aufgelöste Pfad außerhalb `raw/`? | `Punkt 4: resource ausserhalb raw/ oder unzulaessiger Pfad (..-Traversal|absolut|URL|Backslash|file://|resolved=)` | | 5 | verbotener `status`-Wert | Concept-Frontmatter | Ist `status` gesetzt und **nicht** ∈ {`draft`, `stable`, `deprecated`}? | `Punkt 5: verbotener status-Wert (Wert=)` | | 6 | nicht autorisiertes Frontmatter-Feld oder unautorisierter Key in `sources`/`generated`/`verified`-Eintrag | Concept- & Bundleroot-Frontmatter | Enthält das Frontmatter ein Feld außerhalb des erlaubten Subsets (Concept: `type`/`sources`/`generated`/`verified`/`status`/`stale_after`; Bundleroot: `type`+`okf_version`)? ODER enthält ein `sources`-Eintrag Keys außerhalb {`resource`,`id`,`title`,`author`,`usage_count`,`last_modified`}; ein `generated` Keys außerhalb {`by`,`at`}; ein `verified`-Eintrag Keys außerhalb {`by`,`at`}? **Exemption:** `okf_version` und `type: bundle` sind von der Punkt-6-Subset-Prüfung ausgenommen und werden ausschließlich über Punkt 8/9 geprüft (Entscheidungsnotiz unter dieser Tabelle). Innen-Ebenen: siehe §7.3-Isolations-Notiz (autorisiert, Revision 8). | `Punkt 6: nicht autorisiertes Feld (Key=) bzw. unautorisierter Key in sources/generated/verified` | | 7 | leere/fehlende `by`-Angabe in `generated` oder `verified` | Concept-Frontmatter | Ist `generated.by` nicht gesetzt ODER leer ODER reiner Whitespace? Gleiches je `verified[].by`? | `Punkt 7: leere/fehlende by-Angabe in generated/verified` | | 8 | Bundleroot `wiki/index.md` ohne `type: bundle`/`okf_version: "0.2"` oder abweichender `okf_version`-Wert | Bundleroot `wiki/index.md` | Fehlt der Frontmatter-Block `---` (Erkennung auf dem gestrippten Dateianfang, §3-Präambel) ODER fehlt `type: bundle` (exakt dieser Wert) ODER fehlt `okf_version: "0.2"` (nur der Stringliteral `0.2` zulässig, z. B. NIE `0.3`)? | `Punkt 8: Bundleroot ohne type: bundle/okf_version \"0.2\" oder falscher okf_version-Wert` | | 9 | `okf_version: "0.2"` oder `type: bundle` außerhalb der Bundleroot | jede `.md`-Datei außer `wiki/index.md` im Bundle (Area-`index.md`, `log.md`, Concepts) | Kommt `okf_version: "0.2"` (§2-Wert) oder `type: bundle` **irgendwo im Dateiinhalt** einer dieser Dateien vor (nicht nur im Frontmatter)? Maßgeblich ist der Vertragswortlaut „darf … in irgendeiner anderen Bundle-Datei vorkommen" (§2/§7 Punkt 9). — Entscheidungsnotiz zu Punkt 6/9 siehe unter dieser Tabelle. | `Punkt 9: okf_version/type: bundle ausserhalb der Bundleroot (Datei=)` | | 10 | Frontmatter in einer Area-`index.md` oder `log.md` | Area-`index.md`, `wiki/log.md` | Beginnt die Datei — auf dem gestrippten Dateianfang (BOM `U+FEFF` + führende Leerzeilen, gemeinsame Definition §3-Präambel) — mit einem YAML-Frontmatter-Block `---`? Ein BOM bzw. führende Leerzeilen vor dem Frontmatter ändern den Status nicht (sonst würde ein Frontmatter der Erkennung entkommen). | `Punkt 10: Frontmatter in Area-index.md/log.md (Datei=)` | -| 11 | Verletzung der Index-Regel | `wiki/`-Struktur | Hat ein Area-Verzeichnis (jedes Verzeichnis unter `wiki/` mit Inhalt) keine `index.md`? ODER ist ein Concept nicht in der `index.md` seines nächsten Vorfahren verlinkt — ein Concept ist verlinkt, wenn seine Identität (relativer OKF-Dateipfad ohne `.md`) in der `index.md` des nächsten Vorfahren (Area-`index.md`; für Root-Concepts die Bundleroot `wiki/index.md`) als relativer Bundle-Pfad referenziert ist, **mit oder ohne `.md`-Endung** (eine genau-eine-Form-Festlegung ist Story 2.3 und wird hier nicht vorgegeben). „Neues Concept" ist deterministisch: jede im Bundle vorhandene Concept-Datei, deren Identität in ihrer zuständigen `index.md` fehlt — der Validator prüft den Zustand, nicht ein Git-Diff. | `Punkt 11: Index-Regel verletzt (Area ohne index.md= | Concept nicht verlinkt=)` | +| 11 | Verletzung der Index-Regel | `wiki/`-Struktur | Hat ein Area-Verzeichnis (jedes Verzeichnis unter `wiki/` mit Inhalt) keine `index.md`? ODER ist ein Concept nicht in der `index.md` seines nächsten Vorfahren verlinkt — ein Concept ist verlinkt, wenn seine Identität (relativer OKF-Dateipfad ohne `.md`) in der `index.md` des nächsten Vorfahren (Area-`index.md`; für Root-Concepts die Bundleroot `wiki/index.md`) als relativer Bundle-Pfad referenziert ist, **mit oder ohne `.md`-Endung** (eine genau-eine-Form-Festlegung ist Story 2.3 und wird hier nicht vorgegeben). **Area-Lesart (autorisiert, Revision 9):** Für ein Area-Concept genügt die **file-relative** Referenz in der Area-`index.md` des nächsten Vorfahren — identitätsstiftend ist das Pärchen (Area-Präfix = **bundle-relativer Verzeichnispfad** der Area-`index.md` + Link-Ziel), eine textuelle Nennung der Bundle-Identität in der Area-`index.md` ist dafür nicht erforderlich. Der Area-Präfix ist der Verzeichnispfad der Area-`index.md` relativ zur Bundleroot (z. B. für `wiki/wissensarchitektur/index.md` → `wissensarchitektur/`), nicht nur der Leaf-Verzeichnisname — robust auch für Area-Tiefe ≥ 2 (die Zwei-Ebenen-Beschränkung ist Gegenstand der Compiler-Instruktion §5.8; der Validator delegiert die Struktur-Zulässigkeit dorthin und bildet die Identität rein aus Area-Präfix + Link-Ziel). **Normalisierung des Link-Ziels vor der Identitätsbildung:** Ein führendes `.`/`./`-Segment wird gestrippt; `..`-Segmente gehören nicht zur gepinnten Ein-Ebenen-Form (file-relative Referenzen in der Area-`index.md` sind Ein-Ebenen-Links auf Concepts desselben Verzeichnisses; `..`-Aufwärts-Ziele sind keine Area-Concept-Referenzen im Sinne dieser Regel). **Identität ohne `.md`-Endung (AD-7a):** Die `.md`-Endung des Link-Ziels wird für die Identitätsbildung **abgestreift** — das Beispiel `source-material` (aus `](source-material.md)`) ergibt mit dem Area-Präfix `wissensarchitektur/` eindeutig die Bundle-Identität `wissensarchitektur/source-material`. Root-Concepts bleiben wie bisher in der Bundleroot referenziert (mit oder ohne `.md`-Endung). „Neues Concept" ist deterministisch: jede im Bundle vorhandene Concept-Datei, deren Identität in ihrer zuständigen `index.md` fehlt — der Validator prüft den Zustand, nicht ein Git-Diff. | `Punkt 11: Index-Regel verletzt (Area ohne index.md= | Concept nicht verlinkt=)` | | 12 | `sources`/`verified` in nicht erlaubter Form; `generated` in Listen- statt Map-Form; `sources`-Eintrag ohne Pflichtangabe `resource` | Concept-Frontmatter | Ist `sources` gesetzt und **nicht** YAML-Liste? Ist ein `sources`-Eintrag keine Map (z. B. Skalar)? Ist ein `sources`-Eintrag eine Map **ohne** `resource` oder mit leerem `resource` (Vertrag §3.3: `resource` ist die einzige Pflichtangabe je Eintrag)? Ist `verified` gesetzt und **weder** Liste **noch** eine einzelne Map? Ist ein `verified`-Eintrag keine Map? Ist `generated` gesetzt und **nicht** eine Map (insbesondere Liste)? | `Punkt 12: sources/verified/generated in nicht erlaubter Form` | | 13 | doppelter Frontmatter-Key | jede Datei mit Frontmatter (Concept, Bundleroot) | Kommt derselbe Key auf oberster Frontmatter-Ebene mehrfach vor (z. B. doppeltes `type`, doppeltes `okf_version`, doppeltes `sources`)? | `Punkt 13: doppelter Frontmatter-Key (Key=)` | | 14 | fehlerhafte Wert-Formate | Concept-Frontmatter | `stale_after`/`last_modified` ≠ `YYYY-MM-DD` (exakt 10 Zeichen, korrekte Struktur + reale Kalenderdaten, §6.3)? `at` (in `generated`/`verified`) ≠ ISO-8601-Datetime (Normalform, §4.3; Kalender-Validität §6.3)? `usage_count` kein **YAML-Integer** (Ganzzahl-Typ, nicht Zahl allgemein — `usage_count: 3.0` als Float ist ein FAIL) und keine Ganzzahl ≥ 0? `type` kein nicht-leerer String (siehe auch Punkt 1)? | `Punkt 14: fehlerhaftes Wert-Format (Feld=, Wert=)` | @@ -179,6 +179,8 @@ Die folgenden Prüfungen sind **fachliche** Prüfungen (keine §7-Invaliditäts- 5. Der bereinigte Pfad muss auf einen Pfad **innerhalb** `raw/` auflösen (Präfix `raw/` in der aufgelösten Form). Andernfalls Punkt 4. 6. Der aufgelöste Pfad darf **nicht** auf einen Pfad innerhalb `wiki/` auflösen (Punkt 3). +**Semantik des `resolved=`-Tokens (Autorisations-Runde, Revision 9):** Das optionale `resolved=`-Suffix der Punkt-4-Fehlerursache (§3 Punkt 4, Vorlage `…|file://|resolved=`) wird nur dann ergänzt, wenn die Ablehnung durch die **aufgelöste Lage** des Pfads erfolgt (Schritt 5: außerhalb `raw/`), **nicht** durch einen der Grammatik-Schritte 1–4 (`..`-Segment, führendes `/`, Backslash/Windows-Trenner, `file://`/URL). Der Wert ist der aufgelöste, workspace-relative Pfad des `resource`-Werts (Beispiel Fixture 4a: `resource: README.md` an der Workspace-Root → `resolved=README.md`). Erfolgt die Ablehnung über einen der Grammatik-Schritte 1–4, bleibt der Katalog auf die entsprechenden Token beschränkt und trägt **kein** `resolved=`-Suffix (die Punktnummer ist je Input deterministisch, §6.2 Vorrangsregel). Konsistenz mit §5-Verdikt-Grammatik: Das `resolved=`-Token ist Bestandteil der textuellen Fehlerursache („Punkt-Nummer + deterministischer Grund + relevanter Wert/Pfad", §5 FAIL) — es ersetzt weder Verdikt-Verb noch Pfad und erzeugt keine eigene Prüfklasse. + ### 6.3 Kalender-Validität der Datumsfelder (EC-3) Für alle `YYYY-MM-DD`-Felder (`stale_after`, `sources[].last_modified`) gilt: @@ -210,7 +212,7 @@ Die folgenden Tabellen belegen die 1:1-Abbildung der 14 Punkte (§7.1/§7.2) **s | 1 | Concept `x.md` mit `type:` (leer) | `FAIL wiki/x.md Punkt 1: concept ohne type oder leerer type (NULL|leer|nicht-String)` | | 2 | `.md` unter `wiki/` ohne `---`-Frontmatter | `FAIL wiki/x.md Punkt 2: nicht-reservierte .md-Datei ohne Frontmatter/ohne type` | | 3 | `sources: [{resource: wiki/foo.md}]` | `FAIL wiki/x.md Punkt 3: resource loest auf wiki/-Concept-Pfad (Pfad=wiki/foo.md)` | -| 4 | `sources: [{resource: ../outside.md}]` | `FAIL wiki/x.md Punkt 4: resource ausserhalb raw/ oder unzulaessiger Pfad (..-Traversal\|absolut\|URL\|Backslash\|file://)` | +| 4 | `sources: [{resource: ../outside.md}]` | `FAIL wiki/x.md Punkt 4: resource ausserhalb raw/ oder unzulaessiger Pfad (..-Traversal\|absolut\|URL\|Backslash\|file://\|resolved=)` | | 4a | `sources: [{resource: README.md}]` (existiert an der Workspace-Root, ausserhalb `raw/`; Kein `..`/URL/Backslash — Punkt 4 durch aufgelöste Lage) | `FAIL wiki/x.md Punkt 4: resource ausserhalb raw/ oder unzulaessiger Pfad (resolved=README.md)` | | 5 | `status: published` | `FAIL wiki/x.md Punkt 5: verbotener status-Wert (Wert=published)` | | 6 | Concept mit `foo: bar` (nicht autorisiert) | `FAIL wiki/x.md Punkt 6: nicht autorisiertes Feld (Key=foo)` | @@ -221,6 +223,7 @@ Die folgenden Tabellen belegen die 1:1-Abbildung der 14 Punkte (§7.1/§7.2) **s | 10 | `wiki/log.md` beginnt mit `---` | `FAIL wiki/log.md Punkt 10: Frontmatter in Area-index.md/log.md (Datei=wiki/log.md)` | | 10a | `wiki//log.md` existiert (reservierter Name außerhalb der Bundleroot) | `FAIL wiki//log.md log.md an unzulässiger Position (V-2, reservierter Name, nur Bundleroot, Vertrag §5)` | | 11 | Area `wiki/foo/` ohne `index.md` | `FAIL wiki/foo/ Punkt 11: Index-Regel verletzt (Area ohne index.md=foo)` | +| 11a | Area `wiki/wissensarchitektur/` mit `index.md`, das Area-Concept `source-material.md` **nicht** verlinkt (file-relative Referenz fehlt; der Live-Area-Name wird bewusst genutzt, weil die Fixture den F-02-Defekt am realen Bundle belegt; die übrigen Links der Area werden als valide angenommen — restliche Konzepte verlinkt, Isolations-Prinzip §7.1) | `FAIL wiki/wissensarchitektur/source-material.md Punkt 11: Index-Regel verletzt (Concept nicht verlinkt=wissensarchitektur/source-material)` | | 12 | `sources: {resource: raw/x.md}` (Map statt Liste) | `FAIL wiki/x.md Punkt 12: sources/verified/generated in nicht erlaubter Form` | | 12a | `sources: [{title: \"Ohne resource\"}]` (Eintrag ohne Pflichtangabe `resource`) | `FAIL wiki/x.md Punkt 12: sources/verified/generated in nicht erlaubter Form` | | 13 | Frontmatter mit zweimal `type:` | `FAIL wiki/x.md Punkt 13: doppelter Frontmatter-Key (Key=type)` | @@ -250,6 +253,7 @@ Zusätzlich gilt der A0-2/AD-1b-Grundsatz der abgeschlossenen Liste: Ein Concept | 10 | `wiki/log.md` und Area-`index.md` ohne Frontmatter | `SUCCESS wiki/log.md` / `SUCCESS wiki//index.md` | | 10a | Kein `log.md` außerhalb der Bundleroot (kein `wiki//log.md`) | `SUCCESS` (Voraussetzung V-2 nicht verletzt) | | 11 | Area `wiki/foo/` mit `index.md`, das neue Concept verlinkt | `SUCCESS` (Punkt 11 nicht verletzt) | +| 11a | Area `wiki/wissensarchitektur/` mit `index.md`, das Area-Concept `source-material.md` file-relativ verlinkt (`](source-material.md)`) | `SUCCESS` (Punkt 11 nicht verletzt) | | 12 | `sources` Liste von Maps, je Eintrag mit `resource`; `verified: {by: human:x, at: ...}` (Singleton-Map) | `SUCCESS wiki/x.md` (Singleton-Coercing, §4.2) | | 12a | `sources: [{resource: raw/x.md, title: t}]` (Eintrag mit Pflichtangabe `resource`) | `SUCCESS wiki/x.md` | | 13 | Frontmatter ohne doppelte Keys | `SUCCESS wiki/x.md` | @@ -258,9 +262,9 @@ Zusätzlich gilt der A0-2/AD-1b-Grundsatz der abgeschlossenen Liste: Ein Concept | 14c | `at: 2026-08-15T10:00:00+0200` (Offset 4-stellig ohne Doppelpunkt, gültiges ISO-8601/RFC 3339) | `SUCCESS wiki/x.md` (Normalform §4.3) | | 14d | `usage_count: 3` (YAML-Integer) | `SUCCESS wiki/x.md` | -### 7.3 §6-Fachliche-Zusatzprüfungen-Fixtures (EC-1, EC-3, WARN, EC-11) +### 7.3 §6-Fachliche-Zusatzprüfungen-Fixtures (EC-1, EC-3, WARN, EC-11) & Innen-Ebenen-Punkt-6-Fixtures -> Diese Prüfungen sind keine §7-Punkte (Fachliche Prüfungen, §6). Für Negativ-Fixtures gilt dasselbe Isolations-Prinzip wie in §7.1: jedes Sample ist sonst-valide (die 14 Punkte passieren), sodass genau die jeweilige §6-Prüfung auslöst. Das Isolations-Prinzip gilt entsprechend auch für Punkt-6-Fälle auf Innen-Ebenen (`sources`/`generated`/`verified`-Einträge): Ein unautorisierter Key innerhalb eines Eintrags (z. B. `sources:\n - resource: …\n role: x`) ist strukturell invalide und löst Punkt 6 aus (vertraglich §3.3–§3.5), losgelöst von der §6-Formprüfung. +> Diese Prüfungen sind keine §7-Punkte (Fachliche Prüfungen, §6). Für Negativ-Fixtures gilt dasselbe Isolations-Prinzip wie in §7.1: jedes Sample ist sonst-valide (die 14 Punkte passieren), sodass genau die jeweilige §6-Prüfung auslöst. Das Isolations-Prinzip gilt entsprechend auch für die hier aufgeführten Punkt-6-Fälle auf Innen-Ebenen (`sources`/`generated`/`verified`-Einträge): Ein unautorisierter Key innerhalb eines Eintrags (Negativ-Zeile: `sources:\n - resource: …\n role: x` → genau Punkt 6 löst aus, losgelöst von der §6-Formprüfung; vertraglich §3.3–§3.5), ein Eintrag mit ausschließlich erlaubten Keys (Positiv-Zeile) passiert alle Punkte. Die Verdikt-Zellen tragen den reinen, maschinenlesbaren Fehlerursachen-String gemäß §3 (kein erklärender Zusatz in der Zelle). | # | Fixture (Input) | Erwartetes Verdikt | |---|-----------------|--------------------| @@ -274,6 +278,8 @@ Zusätzlich gilt der A0-2/AD-1b-Grundsatz der abgeschlossenen Liste: Ein Concept | §6.4 WARN Positiv (nicht veraltet) | `stale_after: 2026-12-31` mit `today` (UTC) = 2026-08-16 → nicht veraltet | `SUCCESS wiki/x.md` (keine WARN) | | §6.5 EC-11 Positiv | `wiki//logo.png` (nicht-`.md` unter `wiki/`) vorhanden | kein Verdikt für `logo.png` (wird ignoriert, §1/§6.5); valide `.md`-Dateien unverändert SUCCESS | | §6.5 EC-11 Konvention | Verzeichnis `wiki//` enthält nur `logo.png` + `index.md` | `SUCCESS wiki//index.md` (logo.png ignoriert) | +| Innen-Ebenen Punkt 6 Negativ | `sources:\n - resource: raw/prd/prd-wow20-2026-08-14.md\n role: x` (existierende `raw/`-Datei, unautorisierter Key `role:` in `sources`-Eintrag) | `FAIL wiki/x.md Punkt 6: nicht autorisiertes Feld (Key=role) bzw. unautorisierter Key in sources/generated/verified` | +| Innen-Ebenen Punkt 6 Positiv | `sources`-Eintrag mit `resource` und ausschließlich erlaubten Keys (kein `role`) | `SUCCESS wiki/x.md` (kein Punkt 6) | | §3.2 V-1 Negativ | `wiki/index.md` existiert **nicht** (Bundle ohne Bundleroot) | `FAIL (Voraussetzung) Bundleroot fehlt: wiki/index.md existiert nicht (V-1, Vertrag §2, Vorausbedingung zu Punkt 8)` | | §3.2 V-1 Positiv | `wiki/index.md` ist vorhanden | `SUCCESS` (Voraussetzung V-1 nicht verletzt) | | §3.2 V-2 Negativ | `wiki//log.md` existiert (reservierter Name außerhalb der Bundleroot) | `FAIL wiki//log.md log.md an unzulässiger Position (V-2, reservierter Name, nur Bundleroot, Vertrag §5)` | @@ -295,6 +301,7 @@ Zusätzlich gilt der A0-2/AD-1b-Grundsatz der abgeschlossenen Liste: Ein Concept - Deferred-Work `_bmad-output/implementation-artifacts/deferred-work.md` — EC-1, EC-3, BH-14, F2-Listen, BH-8, EC-11, F17-`log.md`, F18-`stale_after` (8 an Story 1.4 verwiesene Entscheidungen, in §4/§6 deterministisch festgelegt). - **F15 (Trust-Semantik von `generated.by`):** `generated.by: human:` ist formgültig — das Datenmodell erlaubt jeden non-empty `by` (Vertrag §3.4) —, begründet aber **keine** human-review-Klassifikation (die entsteht nur über `verified` mit `human:`-Präfix, §3.5). Die Trust-Semantik von `generated.by` mit `human:`-Präfix wird in Epic 4 geklärt (Deferred-Work F15). - **Story 2.3 (Link-Form):** Der Punkt-11-Check akzeptiert die Concept-Identität in der zuständigen `index.md` mit oder ohne `.md`-Endung (§3 Punkt 11). Eine genau-eine-Form-Festlegung der Link-Schreibweise ist Story 2.3 und wird hier bewusst nicht vorweggenommen. +- **Revision 9 — Punkt-11-Area-Lesart (autorisiert, 2026-08-18):** Ergänzt die Story-2.3-Formklausel um die konsistente Nachführung der Pin-Form-Doktrin: Für ein **Area-Concept** genügt die file-relative Referenz in der Area-`index.md` des nächsten Vorfahren (Pärchen Area-Präfix + Link-Ziel identitätsstiftend); Root-Concepts bleiben wie bisher (mit oder ohne `.md`-Endung) in der Bundleroot referenziert. Dies ist die formale Vereinheitlichung der Story-2.3-Notiz mit der von Story 2.4/2.5 genutzten file-relativen Area-Linkform (`compiler.md` §5.6/§5.7) — no new §7-Klasse, die abschließende 14-Punkte-Liste bleibt unangetastet (Vertrag §7). **Revisionslog:** @@ -306,3 +313,4 @@ Zusätzlich gilt der A0-2/AD-1b-Grundsatz der abgeschlossenen Liste: Ein Concept - **Revision 6 (2026-08-16):** BOM-/Leerzeilen-Stripping vereinheitlicht (Retrospective F-05, AI-5) — die gemeinsame Definition „gestrippte Frontmatter-Erkennung" (§3-Präambel: UTF-8-BOM `U+FEFF` + führende Leerzeilen vor dem `---` entfernen) gilt jetzt für alle Frontmatter-erkennenden Punkte **2, 8 und 10** (zuvor nur Punkt 10). Punkt 2/8-Prüfschritt-Zellen verweisen auf §3-Präambel; Punkt 10 rückverweist darauf. Neue Positiv-Fixtures: 2a (Concept mit BOM/Leerzeile vor Frontmatter → SUCCESS) und 8b (Bundleroot mit BOM/Leerzeile vor Frontmatter → SUCCESS). Zusätzlich zwei Defer-Verweise als „offene Punkte" (§1 Punkt 3 zu `.MD`-Großschreibung, F-08; §6.4 zu `today`-Zeitzone, F-06) eingebettet — Defer-Kontexte aus AI-7. Vertrag unverändert. - **Revision 7 (2026-08-16, Step-04-Review Story 2.1):** §7.3-Fixture-Isolations-Hinweis um Innen-Ebenen-Key-Subset-Fälle erweitert — die Punkt-6-Formprüfung gilt nicht nur für Top-Level-Frontmatter-Felder, sondern auch für unautorisierte Keys innerhalb von `sources`/`generated`/`verified`-Einträgen (Vertrag §3.3–§3.5); Konsequenz für Fixture-Isolation (sonst-valide und nur der Innen-Ebenen-Key sticht Punkt 6 hervor) dokumentiert (§7.3). Vertrag `schema/wiki-compiler.md` unverändert (keine Autorisierung nötig, nur dokumentarische Klarstellung der bestehenden Punkt-6-Regel). - **Revision 8 (2026-08-16, Autorisations-Runde):** Option-A-Heilung Story 2.1 — drei Änderungen: (1) **F-14-Negativ-Fixture 4a** ergänzt (§7.1, Punkt 4: `resource` außerhalb `raw/`, aber existierend, z. B. `README.md` an der Workspace-Root; Retrospective F-14) — erwartet `FAIL … Punkt 4`, Isolations-Prinzip gewahrt; (2) **Innen-Ebenen-Key-Subset formalisiert** — die Rev-7-Klarstellung (Punkt 6 in `sources`/`generated`/`verified`-Einträgen, Vertrag §3.3–§3.5) wird als formal getragener Inhalt dieser autorisierten Revision bestätigt, und die Punkt-6-Zelle verweist explizit auf die §7.3-Isolations-Notiz (autorisiert, Revision 8); (3) **Header-Revisionszahl** von „Revision 6" auf „Revision 8" angehoben (behebt die pre-existing Header-Log-Diskrepanz, OBS-1). Vertrag `schema/wiki-compiler.md` unverändert (keine Vertrags-Autorisierung nötig — Punkt 6 deckt Innen-Ebenen bereits, §3.3–§3.5). +- **Revision 9 (2026-08-18, Autorisations-Runde):** Epic-2-F-02/AI-2-R-5 (de-dupliziert mit `code-review-2-1-item-2`) — fünf inhaltliche Änderungen, keine neue §7-Klasse (kein Punkt 15; Abschluss-Eigenschaft des §7-Katalogs gewahrt), `schema/wiki-compiler.md` (Vertrag) und `schema/compiler.md` (Instruktion) unverändert (AD-3/D-3): (1) **Punkt-11-Area-Lesart formalisiert** (§3 Punkt-11-Zelle, Kern der Rev-9-Lesart, Retrospective F-02/Open question 3): Für ein Area-Concept genügt die **file-relative** Referenz in der `index.md` des nächsten Vorfahren (Area-`index.md`); identitätsstiftend ist das **Pärchen (Area-Präfix = bundle-relativer Verzeichnispfad der Area-`index.md` + Link-Ziel ohne `.md`-Endung, AD-7a)**, eine textuelle Nennung der Bundle-Identität in der Area-`index.md` ist nicht erforderlich (Live: `wiki/wissensarchitektur/source-material.md` → Identität `wissensarchitektur/source-material` über `](source-material.md)` in der Area-`index.md`); Normalisierung des Link-Ziels (`.`/`./`-Strip; `..` nicht Teil der gepinnten Ein-Ebenen-Form) und `.md`-Endungs-Strip für die Identitätsbildung explizit verankert. Root-Concepts bleiben wie bisher in der Bundleroot referenziert (mit oder ohne `.md`-Endung — eine genau-eine-Form-Festlegung liegt bei Story 2.3/§5.6 der Compiler-Instruktion, der Validator gibt sie nicht vor). (2) **Punkt-4-Fehlerursachen-Grammatik um `resolved=`-Token ergänzt + Semantik verankert** (§3 Punkt-4-Zelle: `…|resolved=`; §6.2: Token feuert nur bei Ablehnung durch aufgelöste Lage außerhalb `raw/`, Wert = aufgelöster workspace-relativer Pfad; Konsistenz mit §5-Verdikt-Grammatik) — Patch 16 (gehalten, deferred-work.md), macht Fixture 4a (§7.1: `resolved=README.md`) ableitbar. (3) **Innen-Ebenen-Punkt-6-Fixtures ergänzt** (§7.3: Negativ-Zeile `sources`-Eintrag mit `role: x` bei existierender `raw/`-Datei → `FAIL … Punkt 6`; Positiv-Gegenzeile ausschließlich erlaubte Keys → SUCCESS) — Patch 17 (gehalten), belegt die Rev-8-Formalisierung der Innen-Ebenen-Regel re-runbar. (4) **§7-Fixtures 11a** (Negativ: Area-Concept nicht verlinkt → `FAIL … Concept nicht verlinkt=wissensarchitektur/source-material`; Positiv: file-relativ verlinkt → SUCCESS) ergänzt — prüfbare Negative der Area-Lesart am realen Live-Area-Namen. (5) **§8-Normreferenz-Notiz „Story 2.3 (Link-Form)" um die Rev-9-Area-Lesart ergänzt** (Konsistenz der Lesart mit der Pin-Form-Doktrin). Nachgeführt: Header-Revisionszahl auf „Revision 9" angehoben + Revisionslog-Eintrag (append-only, bestehende Einträge unangetastet). Zertifizierung in `wiki/log.md` (2026-08-18) nachgeführt: Fixture 4a isoliert → FAIL Punkt 4 (`resolved=README.md`); Innen-Ebenen-Sample → FAIL Punkt 6 (`Key=role`); Punkt-11-Area-Fixtures (11a Negativ/Positiv) → FAIL bzw. SUCCESS; reales Bundle (7 `wiki/`-Dateien) → weiterhin SUCCESS. Vertrag unverändert (Punkt 11 deckt die Area-Lesart bereits vertraglich, §7). diff --git a/wiki/log.md b/wiki/log.md index 744f088..87cac27 100644 --- a/wiki/log.md +++ b/wiki/log.md @@ -1,6 +1,7 @@ # Log ## 2026-08-18 +- **Validierungs-Revision 9 (autorisiert; Epic-2-Retro F-02/AI-2-R-5, de-dupliziert mit `code-review-2-1-item-2`; ausgeführt 2026-08-18, Quelle: `_bmad-output/implementation-artifacts/spec-autorisierte-validator-revision-9-punkt-11-area-lesart.md`):** `schema/validator.md` → **Revision 9**. Fünf inhaltliche Änderungen, keine neue §7-Klasse (kein Punkt 15; Vertrag `schema/wiki-compiler.md` + Instruktion `schema/compiler.md` + `raw/` + `adapters/` + alle `wiki/`-Concept-Dateien unverändert, AD-3/D-3): (1) **Punkt-11-Area-Lesart formalisiert** (§3 Zelle: Für ein Area-Concept genügt die file-relative Referenz in der Area-`index.md` des nächsten Vorfahren; identitätsstiftend ist das Pärchen Area-Präfix (= bundle-relativer Verzeichnispfad der Area-`index.md`) + Link-Ziel ohne `.md`-Endung (AD-7a), textuelle Nennung der Bundle-Identität entfällt — Live: `wissensarchitektur/source-material` über `](source-material.md)` in `wiki/wissensarchitektur/index.md`; Normalisierung: `.`/`./`-Strip, `..` nicht Teil der Ein-Ebenen-Form); (2) **Punkt-4-Vorlage um `resolved=`-Token ergänzt + Semantik verankert** (`…|file://|resolved=`; §6.2: nur bei Ablehnung durch aufgelöste Lage außerhalb `raw/`, Wert = aufgelöster workspace-relativer Pfad) — Fixture 4a ableitbar; (3) **Innen-Ebenen-Punkt-6-Fixtures in §7.3** (Negativ: `role: x` in `sources`-Eintrag → FAIL Punkt 6; Positiv-Gegenzeile ausschließlich erlaubte Keys → SUCCESS); (4) **§7-Fixtures 11a** (Negativ: Area-Concept unverlinkt → `Concept nicht verlinkt=wissensarchitektur/source-material` am realen Live-Area-Namen; Positiv: file-relativ verlinkt → SUCCESS); (5) §8-Normreferenz-Notiz „Story 2.3 (Link-Form)" um die Rev-9-Area-Lesart ergänzt. Nachgeführt: Header auf „Revision 9" + Revisionslog-Eintrag Revision 9 (append-only, bestehende Einträge unangetastet). **Zertifizierung (mechanisch, D-3):** (a) Fixture 4a isoliert — Sample `sources: [{resource: README.md}]` mit existierender `README.md` an der Workspace-Root → `FAIL … Punkt 4: resource ausserhalb raw/ oder unzulaessiger Pfad (…|resolved=README.md)`, kein Vorab-FAIL durch Punkt 3/andere Punkte (Punkt-4-vor-3-Priorität §6.2); (b) Innen-Ebenen-Sample isoliert — `sources:\n - resource: raw/prd/prd-wow20-2026-08-14.md\n role: x` (Datei existiert, sonst-valides Sample) → genau `Punkt 6: nicht autorisiertes Feld (Key=role) bzw. unautorisierter Key in sources/generated/verified`, kein anderer Punkt (Isolations-Prinzip §7.3); (c) Punkt-11-Area-Lesart-Fixtures — Negativ 11a (Area-`index.md` verlinkt `source-material.md` **nicht**) → `FAIL … Punkt 11: Index-Regel verletzt (Concept nicht verlinkt=wissensarchitektur/source-material)`; Positiv 11a (file-relativer `](source-material.md)`-Link, Live-Lage) → SUCCESS (kein „nicht verlinkt"-FAIL); (d) **reales Bundle gegen den revidierten Validator (human-mechanisch ausgeführte Text-Instruktion)** — alle **7** `wiki/`-Dateien weiterhin **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1; Punkt 11 inkl. Area-Lesart), identisch zur Story-2.4/2.5-Lage — keine neu ausgelösten FAILs, Abschluss-Eigenschaft des §7-Katalogs gewahrt. **Mechanische Belege (ausgeführt 2026-08-18):** (e) AD-3/D-3-Freeze — `git diff --name-only ..HEAD -- schema/wiki-compiler.md schema/compiler.md raw/ adapters/` → **0 Treffer** (keine dieser Dateien geändert); (f) Live-Invariant der 7/7-SUCCESS-Behauptung — `grep -qF '](source-material.md)' wiki/wissensarchitektur/index.md` → **exit 0** (Area-Lesart lebend verankert). `sprint-status.yaml`: `code-review-2-1-item-2` und `epic-2-retro-item-14-…` (AI-2-R-5) → `done` (closed 2026-08-18, resolution mit Rev-9 + ref auf die Rev-9-Runde). - **Story 2.5 «Progressive Discovery über `index.md` bereitstellen» (Implementierung, inkl. Review-Loop-1-Korrektur + Review-Loop-3-Patches, bmad-code-review 2026-08-18, 4 Layer; Nutzer-Entscheidungen 1/1):** `schema/compiler.md` → **Revision 2.3** (neue §5.8 „Progressive Discovery über `index.md` (Story 2.5)"): (1) **Discovery-Pfad** — Bundleroot `wiki/index.md` → Area-`index.md` (frontmatterlos) → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot (AD-9, FR-11; gewurzelte Erreichbarkeit Root → Area → Concept, §5.7 Pkt. 5); (2) **gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest** (`UNREACHABLE AREA: ` für von der Bundleroot unverlinkte Area — AD-9; `NESTED AREA: ` für Zwei-Ebenen-Kandidaten, geprüft über **zwei Läufe** der Selbsttest-Formel: (A) Ein-Ebenen-Area-`index.md` → Root-Verlinkungsstatus, (B) `find wiki -mindepth 3 -type f -name "*.md"` → jede Datei in Tiefe ≥ 3 ist ein Zwei-Ebenen-Kandidat, Meldung je Verletzung genau eine; beide Läufe ohne Ausgabe = Discovery-SUCCESS; Instruktions-Selbsttest, schließt die Validator-Navigation-Lücke ohne Validator-Change — kein neuer §7-Punkt, AD-3); (3) **konsolidierte Zwei-Ebenen-Kartografie** (antwortet und schließt **Defer F-07**): Root + eine Area-Ebene; `wiki/a/b/` ist **keine zugelassene Anlageform** — `wiki/a/b/concept.md`-Kandidat (auch **ohne** `index.md`; die Area-ohne-Index-Lücke, die der reine `index.md`-Scan übersähe) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, textuelle Meldung `NESTED AREA: `, Run „teilweise erfolgreich", NFR-4) — **Loopback-1-Renegotiation (menschen-autorisierte Option A):** Träger ist der §5.8-lokale Hold, **nicht** der §3.2-Kollisions-Hold (der bleibt der Dateikollision *bestehender* Concepts vorbehalten — ein brandneuer Zwei-Ebenen-Pfad kollidiert nie mit einem existierenden); (4) **Suche = Consumer-grep** (`grep -rn wiki/` rekursiv bzw. `rg wiki/`, AD-13 — keine Such-Datenbank, kein Embedding, kein Index-Datei-Format; NFR-3), (5) **Discovery-Demo (optional, kein MOVE)** — bei Durchführung: Formel-4-Re-Baseline-Pflicht (neuer Zuwachs-Run), sonst bleibt Formel 4 `38 ≡ 38`. Nachgeführt: **§7** Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt (Navigation/Area-Indizes jetzt §5.8-verankert, Suche = Consumer-Thema; die Vorbehalt-Zeile lag in der Baseline `main` bei Z. 253, nach dem §5.8-Einschub bei Z. 285), **§8** Normreferenzen (AD-9/AD-13 → §5.8, FR-11 → §5.7 Pkt. 5/§5.8, NFR-3 neu) + Revisionslog **2.3**. **Selbsttest-Beleg (re-executiert, die gehärtete Loop-3-§5.8-Pkt.-2-Selbsttest-Formel von `schema/compiler.md` §5.8 Pkt. 2 (CWD-Präguard, Erreichbarkeits-Check auf Markdown-Linksyntax `](` per `grep -qF`, `LC_ALL=C sort -u`) als wörtlicher Einzel-Quote-`sh -c '…'`-String — Live-Baum: keine Ausgabe, Exit 0; CWD-Präguard-Kontrolle außerhalb der Workspace-Root: `SELBSTTEST-SETUP-Fehler: Workspace-Root (wiki/index.md fehlt)` + Exit 1):** Area `wissensarchitektur` aus der Bundleroot verlinkt (Root→Area, Selbsttest-Lauf A); die Area→Concept-Verlinkung (`source-material.md` in der Area-`index.md`) ist durch den **Validator Punkt 11** mechanisch abgedeckt (kein Duplikat im Selbsttest). **Sandbox-/Edge-Tests (I/O-Matrix, deterministische Formel-Ausgaben):** (a) HAPPY — gewurzelte Erreichbarkeit ohne Verletzung; (b) **AREA_UNREACHABLE** — Area-`index.md` existiert, Bundleroot unverlinkt → `UNREACHABLE AREA: ` (textuell benannter Instruktions-Selbsttest-Befund, kein Validator-Punkt); (c) **NESTED_AREA_KANDIDAT** — `wiki/a/b/index.md`- und `wiki/a/b/concept.md`-Kandidaten (je einzeln) → `NESTED AREA: a` (erste Ebene der nicht-zulässigen Struktur; bei mehreren Dateien unter derselben ersten Ebene Konsolidierung über `LC_ALL=C sort -u`); Sandbox-Nachweis auf einem synthetischen Baum mit angelegter Testdatei (Zwei-Zustands-Klarstellung Loop-3-Decision-2: die Formel meldet bestehende Tiefe-≥-3-Dateien; der Hold-Zeitpunkt hält den Erstellungskandidaten an, ohne Datei). Die Sandbox-Kontrollen decken die I/O-Matrix-Szenarien **AREA_UNREACHABLE** und **NESTED_AREA_KANDIDAT** ab. §5.6-Formeln unverändert re-executierbar: Formel 2 (Form-Check) `0` (Exit 0), Formel 3 (Dangling-Check) keine Ausgabe, Formel 4 `38 ≡ 38` (Ist ≡ Extraktion aus dem Run-Kopf `862cf41` — keine neue Baseline nötig, keine `wiki/`-Dateimenge-Änderung durch Story 2.5; die Demo ist optional und würde bei Durchführung die Re-Baseline auslösen). Validator-Lauf (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md`, D-3 — kein CLI): alle 7 `wiki/`-Dateien SUCCESS (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1) — unverändert zur Story 2.4; das per-Datei-Verdikt ist der Ausführungs-Nachweis für die Spec-Verification Pkt. 3 und AC 5. `sprint-status.yaml`: `2-5-progressive-discovery-über-index-md-bereitstellen` `backlog` → **`in-progress`** (Implementierungs-Eintrag) → **`review`** (Review-Handoff, dieser Eintrag — die gefrorene Spec-Vorgabe „→ `in-progress`" beschreibt den Implementierungsstand, der Review-Handoff ist der übliche Folgezustand, s. Sprint-Status-Workflow-Kommentar „Dev moves story to 'review'"); Loop-3-Abschluss mit diesem Review: `review` → **`done`** (Sprint-Status synchronisiert, spec-Frontmatter `status: 'done'` deckungsgleich, `review_loop_iteration` → 3). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. - **Story 2.4 «Deterministische Bereichszuordnung & Concept-Hierarchie» (Review-Loop 2, bmad-code-review, 4 Layer):** 3 `decision-needed` (Nutzer-Entscheidungen 1/1/1) + 11 `patch` umgesetzt, 4 `defer` (s. `deferred-work.md`), 8 dismissed. `schema/compiler.md` → **Revision 2.2**: (1) **Formel 3 quellenbasierte `../schema/*`-Exklusion** (Decision 2): die Exklusion greift nur, wenn die Quell-Datei auf Bundleroot-Ebene liegt (`dirname ` = `wiki`); aus Area-Quellen läuft einstufiges `../schema/…` durch Auflösung + Containment + Existenztest (Prosa war bereits „nur aus Root-Dateien", die Formel folgt jetzt der Prosa); (2) **Formel 4 Re-Baseline auf den Run-Kopf** (Decision 1): Extraktions-Commit `862cf410c624072833cd959da9a2fb26235716f6` statt `66451b6…` — der gepinnte Selbsttest lief auf dem Zuwachs-Baum deterministisch `38 ≠ 30` = Run-FAIL (bekannt-böser Zustand aus Loop-1-A2, nur halb geheilt); jetzt **38 ≡ 38** (re-executiert: Ist=38, Extraktion `862cf41`=38; `66451b6`/`30` dokumentiert den Vor-Zuwachs-Zustand, bleibt als Referenz dieses Runs); (3) **§5.7 Pkt. 1(a) Treffer-Prädikat + Tie-Break** (Decision 3): „inhaltlich deckungsgleichen Eintrag" (Urteil, AD-13-Verstoß) ersetzt durch textuelles Prädikat (Identität des Link-Ziels ≡ kanonischer Name des Themas) + Mehrfachtreffer-Regel (Bundleroot-Links vor Area-Links, dann lexicografische Pfad-Reihenfolge); (4) file-relative Pin-Wortwahl in §5.3 Pkt. 3 (Oxymoron „file-relativ bundle-relativ" aufgelöst), §6.6-Zelle und §7-Bullet nachgeführt; (5) §7-Scope-Einleitung „Root-Ebene" → „Root-Ebene und in Areas gemäß §5.7"; (6) Typos („akte-Baseline" → „aktuelle Baseline", Doppel-Leerzeichen §6.6); (7) „Kopf dieser Spezifikation" → „Baseline-Commit des letzten Zuwachs-Runs". `wiki/wissensarchitektur/index.md`: Prosa auf den tatsächlichen Area-Inhalt gekürzt (nur `source-material.md` existiert; Link-Form/Discovery-Topics waren übergezeichnet). **Negativ-Test-Nachweis (Sandbox-Baum, exakte Formel-Ausgabe):** (a) **TOP_LEVEL_COLLISION** — Kandidat mit ID `llm-wiki-prinzip`: `wiki/llm-wiki-prinzip.md` existiert → §3.2-Hold „Concept existiert bereits — Aktualisierung ist Epic 3" (keine Datei, kein Index-Link, kein `log.md`-Eintrag); (b) **AREA_WITHOUT_INDEX** — Sandbox-`wiki/foo/` ohne `index.md`: wörtliche Punkt-11-Meldung `FAIL wiki/foo/ Punkt 11: Index-Regel verletzt (Area ohne index.md=foo)` (Validator-§7.1-Fixture-Wortlaut, kein inventiertes `AREA_WITHOUT_INDEX`-Label); (c) **DIVING_NON_EXISTENT** — `[v](../fehlt.md)` aus Area-Concept → `DANGLING: ../fehlt.md`; (d) **Out-of-Bundle-Escape** (Loop-1-A1-Kontrolle) — `[x](../../README.md)` → `DANGLING: ../../README.md`, `[y](../../schema/compiler.md)` → `DANGLING: ../../schema/compiler.md`; (e) **In-Bundle-`../schema/` aus Area (Loop-2-Kontrolle)** — `[z](../schema/compiler.md)` aus `wiki/wissensarchitektur/source-material.md` → `DANGLING: ../schema/compiler.md` (vor dem Loop-2-Patch: still exkludiert, leere Ausgabe — Sandbox-Nachweis des gefixten Löchs). Positiv-Kontrolle nach allen Patches: Formel 2 (Form-Check) = `0` (Exit 0), Formel 3 (Dangling) = keine Ausgabe, Formel 4 = `38 ≡ 38` (beide re-executiert). Status-Nachführung (korrigiert zum obigen Implementierungs-Eintrag): `sprint-status.yaml` `2-4-…` `backlog` → `in-progress` (Implementierungs-Eintrag) → **`review`** (Review-Handoff, dieser Eintrag); die gefrorene Spec-Vorgabe („→ `in-progress`") beschreibt den Implementierungsstand, der Review-Handoff ist der übliche Folgezustand (s. Sprint-Status-Workflow-Kommentar „Dev moves story to 'review'"). Loop-Abschluss mit diesem Review: `review` → **`done`** (Sprint-Status synchronisiert, `sprint-status.yaml` `last_updated` nachgeführt; spec-Frontmatter `status: 'done'` deckungsgleich, `review_loop_iteration` → 2). Validator-Lauf-Korrektur zum obigen Eintrag: die gültige Datei-Zählung ist **7** `wiki/`-Dateien (Bundleroot, `log.md`, 3 Root-Concepts, Area-`index.md`, Area-Concept) — der obige Verweis auf „Punkt 9/10" für die Differenz zur Spec-Zahl 6 war falsch belegt (Punkt 9 = `okf_version`/`type: bundle`-Verbot außerhalb der Bundleroot; `log.md` wird über Punkt 10/V-2 mitvalidiert); die Spec-Zahl 6 ist eine frozen-Defizitzählung (Defer in `deferred-work.md`). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3). - **Story 2.4 «Deterministische Bereichszuordnung & Concept-Hierarchie» (Implementierung):** `schema/compiler.md` → **Revision 2.1** (neue §5.7 „Deterministische Bereichszuordnung & Concept-Hierarchie": Routing-Regel textual-deterministisch — (a) First-Class-Link aus dem bestehenden `index.md`-Baum → Bereich `wiki//.md`, (b) Default Root-Ebene, neue Areas nur konsolidiert; nie Embedding/Vector, AD-7c/A0-10/AD-13; kanonische ID-Normalisierung AD-7a/A0-8 mit Beispieltabelle; Top-Level-Kollisions-Hold → fixierter §3.2, kein neues Prädikat, kein MOVE; file-relatives Link-Auflösungsmodell inkl. Out-of-Bundle-`..`-Containment; Area-`index.md`-Regel mit wörtlicher Punkt-11-Meldung `FAIL … Punkt 11: Index-Regel verletzt (Area ohne index.md=)` — kein inventiertes Label; Worked Example). Nachgeführt: §5.1 Pkt. 1, §5.3 Pkt. 3 (Index-Regel area-bewusst), §5.6 Pkt. 1/2/3/4/5 (file-relativ; `../`-Exklusion aufgelöst; Formel 3 mit Quell-Datei-Spur + in-Bundle-`..`-Auflösung + Containment — Out-of-Bundle-`..`-Escape wird `DANGLING`; Formel 4 neu auf `baseline_commit` `66451b6e6c9e139fb3aa3bbf4b01291e1e2d273a` (deklarierte `baseline_commit`-Werte der Spec-Frontmatter, nicht mehr Story-2.3-`7e1f449…`; Loop-2: Re-Baseline auf den Run-Kopf `862cf41`, s. obiger Review-Eintrag), Basename-Filter `grep -v "log.md$"`), §6 Pkt. 2, §6.6, §7, §8. `deferred-work.md`: drei Story-2.4-namige Einträge geschlossen (`umgesetzt`): bundlerelativ-vs-dateirelativ (→ §5.7 Pkt. 4 file-relativ), Cross-Page-Anker-Stale-Evidenz (→ Ist-Verhalten Fragment-Strip, keine Dangling-Ausgabe), künftiges Area-`log.md`-Baseline-Bruch (→ Formel 4 Basename-Filter). Neue Area `wiki/wissensarchitektur/` angelegt: `wiki/wissensarchitektur/index.md` (frontmatterlos, Vertrag §2/§6, Validator Punkt 10; verlinkt das Area-Concept in der gepinnten §5.6-Form) + `wiki/wissensarchitektur/source-material.md` (Area-Concept `type: concept`, `sources` s1=architecture-spine + s2=prd, §5.5-Inline-Verweise + Kontext-Marker, Body-Links auf Root-Concepts in file-relativer `../`-Form: `llm-wiki-prinzip.md`, `wissensarchitektur-trennung-states.md`, `knowledge-kompilation-inkrementell.md`). `wiki/index.md`: neue **Area-Sektion** verlinkt `wissensarchitektur/index.md` (die 3 bestehenden Root-Concept-Links + die 3 `../schema/`-Links byte-identisch, Null-Migration). **Formel-4-Re-Baseline:** Ist-Zählung auf dem neuen Baum = **38** (`log.md`-exkludiert; `grep -roE '\(raw/'`), Baseline-Extraktion aus `66451b6` = **30** (alter Baum, 4 nicht-`log.md`-Dateien: `index.md` + 3 Root-Concepts; `git ls-tree -r + git show`, Basename-`log.md`-Filter) — Dokumentation verlangt die aktuelle Baseline aus `66451b6` (`38 ≠ 30`, kein Fehlalarm: Zuwachs-Re-Baseline; Loop-2-Korrektur: Re-Baseline auf den Run-Kopf `862cf41`, `38 ≡ 38`, s. obiger Review-Eintrag); die exakte Ist-Zahl hängt am finalen Concept/Body-Stand und wird in der Spec-Verification des Runs belegt. `sprint-status.yaml`: `2-4-deterministische-bereichszuordnung-concept-hierarchie` `backlog` → **`in-progress`** (dieser Statuswechsel findet mit diesem Eintrag statt). Validator-Lauf: alle **7** `wiki/`-Dateien SUCCESS (`index.md` + `log.md` + 3 Root-Concepts + Area-`index.md` + Area-Concept; Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1; die Spec-Verification nennt erwartungsseitig „6 `wiki/`-Dateien" — die Differenz erklärt sich durch das reservierte `log.md` (Protokoll, wird mitvalidiert, Punkt 9/10), die Validator-Effort-Zahl dieser erfolgten Ausführung ist 7). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3). -- 2.54.0 From efc543c9e18d5e1e6647bb4f86ea9020059ff206 Mon Sep 17 00:00:00 2001 From: Michael Tamse Date: Wed, 19 Aug 2026 05:22:30 +0200 Subject: [PATCH 05/16] =?UTF-8?q?feat:=20Story=203.1=20Inkrementellen=20Da?= =?UTF-8?q?tenfluss=20implementieren=20(Interpret=E2=86=92Reconcile?= =?UTF-8?q?=E2=86=92Synthesize=E2=86=92Update)=20=E2=80=94=20compiler.md?= =?UTF-8?q?=20Revision=202.4/2.4.1,=20Update-Routing=20+=20=C2=A75.9,=20Di?= =?UTF-8?q?ff-Selbsttest,=20Review-Patch-Runde;=20Review-Handoff=20auf=20s?= =?UTF-8?q?tory-3-1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - schema/compiler.md: §3 Pkt. 2 Update-Routing (statt Kollision-Hold) + textuell-deterministische Kandidatenliste (AD-13); §5.9 Update-Mutationsmechanik (Erweitern/Präzisieren/Korrigieren, sources nur echte Belege, generated.at-Konvention, log.md-Eintragspflicht Story-3.1-Update, Mehrfach-Treffer-Konsolidierung); Erhaltungs-Invariante + deterministischer Diff-Selbsttest (git diff --name-only -- wiki/ ⊆ Kandidatenliste∪log.md∪Index, Ghost-Diff-Rück-Rollen); Run-Vorphase-Bausteine (Defer R-1 Change-Detection + P2 Pre-Run-Reconcile; Baseline = HEAD der vorherigen Mutations-Boundary); §0-Aufruf Update-Variante; §5.7/§5.8-Referenzen nachgeführt; §7 Update entlassen; §8 Prüfgrundlage Revision 9 (Punkt-11-Area-Lesart, Rev-9-Lücke geschlossen) + Revisionslog 2.4/2.4.1 (Step-04-Review-Patch-Runde, AD-3/D-3 gehalten, Worked Example real) - wiki/log.md: Story-3.1-Nachweis (Diff-Selbsttest wiki/log.md, per-Datei-Verdikt, Rev-9-Präzisierung, Sprint in-progress→review) - deferred-work.md: R-1/P2 aufgegriffen (2026-08-18 §5.9); Review-Findings-Protokoll bzw. F17-Defer (git-lose Ausweichform ab Story 3.2) - sprint-status.yaml: Story 3.1 → in-progress → review (Sprint-Sync), last_updated 22:30 - neu: epic-3-context.md, spec-3-1-… (status done, Suggested Review Order) Co-Authored-By: Claude --- .../implementation-artifacts/deferred-work.md | 22 +++ .../epic-3-context.md | 50 ++++++ ...n-interpret-reconcile-synthesize-update.md | 165 ++++++++++++++++++ .../sprint-status.yaml | 6 +- schema/compiler.md | 55 ++++-- wiki/log.md | 1 + 6 files changed, 284 insertions(+), 15 deletions(-) create mode 100644 _bmad-output/implementation-artifacts/epic-3-context.md create mode 100644 _bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md diff --git a/_bmad-output/implementation-artifacts/deferred-work.md b/_bmad-output/implementation-artifacts/deferred-work.md index cfd1469..576896f 100644 --- a/_bmad-output/implementation-artifacts/deferred-work.md +++ b/_bmad-output/implementation-artifacts/deferred-work.md @@ -126,6 +126,7 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein - source_spec: `raw/README.md` (Konvention, Story 1.2) — R-1 summary: R-1 (Compiler-Input-Interface) — Verdikt **Bestanden**: `schema/compiler.md` definiert seine Source-Eingabe als Menge beliebiger `raw/`-Dateien (Set-Interface, §1.2 „jede Datei unter `raw/` ist Evidenz"), nicht als einzelnen Pfad. Der erkennungsseitige Mechanismus, WELCHE `raw/`-Dateien wann verarbeitet werden („Run-ohne-Pfad"-Nutzererwartung aus DRYRUN.md: Kompilation via git diff + SHA-256-Record aus den `source.md`-Records), ist bewusst nicht in Story 2.1 enthalten und gehört als Erkennungs-/Auswahl-Mechanismus in die AD-5-Home-Story (Epic 3, Story 3.1/3.2). evidence: Code Review (Story 2.1) R-1 — Epic-3-Forward-Risk, keine AC-Verletzung. + status: aufgegriffen (2026-08-18, Story 3.1 — §5.9): Input-Zuwachserkennung als Change-Detection-Baustein des inkrementellen Runs in `schema/compiler.md` §5.9 Pkt. 6 verankert (Determinismus `git diff` auf `raw/` und/oder SHA-256-Record aus `raw/**/source.md`; unveränderte `raw/`-Dateien bleiben außen vor; fehlender/unlesbarer SHA-256-Record → textueller Hinweis, keine Doppel-Verarbeitung). - source_spec: `raw/README.md` / `schema/compiler.md` §1.2–§1.4 — R-2 summary: R-2 (Nicht-Markdown-Quellen) — Verdikt **Bestanden**: die Compiler-Instruktion liest Sources endungsneutral als Datei (§1.2/§1.4), unterstellt keine `.md`-Endung; PDF ist zulässige Evidenz (Vertrag §3.3 verlangt nur einen Dateipfad unter `raw/`, Validator EC-1 prüft nur Existenz). Die Konventions-/Asset-Zuordnungsfrage (Namensschema für Nicht-Markdown-Quellen) bleibt offen und gehört zu Epic 2/3 (Nutzer-Input-Gestaltung für den Dryrun-Forderungskatalog). Als dokumentarischer Hinweis: §1.2/§1.4-Widerspruch („jede Datei ist Evidenz" vs. „Artefakt-Dateien sind KEIN Input") in der Instruktion selbst klären (siehe Patch-Findings in der Story). @@ -160,6 +161,27 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein - source_spec: `_bmad-output/implementation-artifacts/review-input-dryrun-2-1-pdf-radium.md` (Sandbox-Dryrun, P2) summary: Pre-Run-Reconcile-Vorphase als deterministischen Pre-Plan-Schritt bündeln und dokumentieren (P2) — die textuellen Reconcile-Prüfungen (Ziel-Pfad-Kollision, Quellen-Existenz, AD-5-Relevanz der Quelle auf bestehende Concepts, `index.md`-Vorbedingung V-1) zu einem wiederverwendbaren Check-Block zusammenfassen (statt manueller Mehrfach-Checks, Bericht §3.2). Kein neuer Standalone-Prozess — nur ein reproduzierbarer Check-Block innerhalb der Instruktions-Ausführung; als Compiler-Instruktions-Schärfung (Story 2.1-Follow-up) oder Epic-3-Home (AD-5) einzuarbeiten. evidence: Prozess-Optimierungs-Bericht §3.2/§4.4; Review-Input §4 (D-3-konform). + status: aufgegriffen (2026-08-18, Story 3.1 — §5.9): Pre-Run-Reconcile-Check-Block als wiederverwendbarer textueller Vorprüf-Block der Run-Vorphase in `schema/compiler.md` §5.9 Pkt. 6 verankert (Ziel-Pfade bzw. Ausgangs-Kandidatenliste, Quellen-Existenz EC-1 via Validator-Punkt, Betroffenheits-Kandidatenliste §3 Pkt. 2, `wiki/index.md`-V-1-Vorbedingung — fehlende Bundleroot → Run-FAIL, Vertrag §2); vor jeder Mutation durchlaufen und textuell festgehalten; kein neuer Standalone-Prozess (D-3). + +## Review-Findings Story 3.1 (Step-04-Review, 2026-08-18) — Patch-/Klärungs-Protokoll + +> **Herkunft:** Step-04-Review der Story 3.1 (Patch-Runde) über die drei Review-Layer (Blind Hunter / Edge Case Hunter / Verification Gap). Die klassifizierten Findings wurden direkt umgesetzt (Patch-Runde in `schema/compiler.md` Revision **2.4.1** + den Begleitdateien); die folgenden Einträge halten Befunde fest, die nicht geschehener Patch sind, sondern **Konzuls-Status**, und sichern verbleibende Gaps als konkrete Folge-Aufgaben. + +- summary: **Story-3.1-Review: Diff-Selbsttest-Ausgabe (Pkt. 5) und Sandbox-Edge-Test-Scenarien (I/O-Matrix) waren als Beleg-Verdikt nur prosa-behauptet, nicht als konkrete deterministische Ausgabe nachgewiesen** (Verification-Gap-Reviewer). Heilung: `wiki/log.md`-Eintrag 2026-08-18 wurde in einen realen **Story-3.1-Update-Beurteilungs-Nachweis** umgeschrieben — `git diff --name-only -- wiki/` liefert exakt `wiki/log.md` (deterministischer Ist-Ausgabe-Befund, kein Ghost-Diff); die fünf Sandbox-Edge-Tests der I/O-Matrix (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) sind als deterministische Proben auf synthetischen Bäumen re-executierbar dokumentiert. Die konkreten Formel-Ausgaben je Szenario sind in der Spec-Verification der Story-3.1-Spezifikation enthalten. + evidence: Step-04-Review Story 3.1, VG-Reviewer; Verifikations-Nachweis. + status: umgesetzt (2026-08-18, Story 3.1 Patch-Runde) — + - `git diff --name-only -- wiki/` → `wiki/log.md` (1 Insertion) — kein Ghost-Diff + - Sandbox-Edge-Tests der I/O-Matrix → deterministische Formel-Ausgaben je Szenario + - `git status --porcelain` → 4 modificiert + 2 untracked (der Schema-/Artefakt-/Spec-Teil liegt außerhalb `wiki/` und ist kein Ghost-Diff) +- summary: **Story-3.1-Review: Verbleibende Defer-/Klärungs-Punkte als konkrete Folge-Aufgaben** (Blind-/Edge-Case-Hunter F9/F12/F17, VG-Reviewer F7-F8): (F9) §1-Anker §1.1/§1.4 → §1 Pkt. 1/Pkt. 4 nachgeführt (Patch in Revision 2.4.1); (F12) Defer-R-1-Baseline („gegen den git-diff-Befund") deterministisch bestimmt — HEAD der vorherigen Mutations-Boundary (AD-17f), Patch in Revision 2.4.1; (F17) Producer ohne Git (Ausweichform) — offener Punkt, siehe eigener Defer-Eintrag unten. + evidence: Step-04-Review Story 3.1, EH/BH/VG (F9/F12/F17). + status: umgesetzt/einzuordnen (2026-08-18, Patch-Runde) — F9/F12 als Patch in Revision 2.4.1; F17 als neue Defer-Aufgabe unten. +- summary: **Neue Folge-Aufgabe (Story-3.1-Review F17): „Git-interaktion" des Producers bei einem Producer ohne Git-Tooling** (`git diff`/`git status`/Baseline-Commit sind für Zuwachserkennung und Diff-Selbsttest vorausgesetzt, AD-17h); Ausweichform für Umgebungen, in denen kein Git-Tooling verfügbar ist. Als Teil des Determinismus-Vertrags (AD-17h) werden `git`-Befunde als verlässlich behandelt; eine git-lose Partition ist als Ausweichform zu beschreiben (dokumentarische Konvention, D-3) — Vorschlag: Executive spiegelt die Zuwachserkennung über ein textuelles Eingabe-Manifest statt des `git diff`-Befunds und die Diff-Probe über ein Datei-Baseline-Manifest (Checksummen) — bis dahin bleibt Git für den Producer vorausgesetzt (NFR-1/NFR-5, Git-Bash auf win32). + evidence: Step-04-Review Story 3.1, EH (F17); Nutzer-Entscheidung 1/1 (Story 3.2). + status: open — nach Story 3.2/Epic-3-Klärung als Ausweichform zu spezifizieren. + +- summary: **Story-3.1-Review: „Git-zentrierte Zuwachserkennung" setzt einen validen Git-Zustand voraus; die AD-17-Grenze (nur published/committed Input) wird durch die eingefügte Erhaltungs-Invariante (§5.9 Pkt. 5, Erhaltungs-Diff) und die Ghost-Diff-Konsequenz (Rück-Rollen vor Run-Gültigkeit, `log.md`-Kopplung als Abbruch-Vorlauf) hinreichend verbunden** — Kein neuer Folge-Gap; dokumentiert für die Nachvollziehbarkeit des Review-Nachweises. + status: Kein Gap — abgeschlossen (Patch in Revision 2.4.1). - source_spec: `_bmad-output/implementation-artifacts/review-input-dryrun-2-1-pdf-radium.md` (Sandbox-Dryrun, P2) summary: Provenienz-Checksumme bei mehrfacher Verwendung einer Quelle im Blick behalten (P2, Vorbereitung Epic 3/Story 2.2) — bei 11 Concepts aus einer Quelle (`raw/MetaModel.pdf`) ist eine wie auch immer geartete SHA-256/`last_modified`-Angabe Kandidat für `sources`-Metadaten; erst ab der zulässigen Schema-Erweiterung (Story 2.2 Claim-provenienz / Epic 3) in der Instruktion verankern. NICHT jetzt implementieren — `sources`-Subset (Vertrag §3.3, Punkt 6/§7) bleibt unverändert. diff --git a/_bmad-output/implementation-artifacts/epic-3-context.md b/_bmad-output/implementation-artifacts/epic-3-context.md new file mode 100644 index 0000000..7d8ef40 --- /dev/null +++ b/_bmad-output/implementation-artifacts/epic-3-context.md @@ -0,0 +1,50 @@ +# Epic 3 Context: Inkrementelle Kompilation & Synthese + + + +## Goal + +Der Compiler verarbeitet neues Source Material gegen das bestehende Knowledge Bundle, statt es bei jedem Lauf aus sämtlichen Rohquellen neu aufzubauen (Compounding Knowledge). Bestehende Concepts werden durch neue Erkenntnisse erweitert, präzisiert oder korrigiert; Informationen aus mehreren Sources werden zu einer gemeinsamen Wissensrepräsentation mit gemischter, claim-granularer Provenienz synthetisiert; unverändertes Wissen bleibt erhalten. Die Relevanzbestimmung ("welche bestehenden Concepts sind betroffen") ist textual-deterministisch (grep/ripgrep, Markdown-Traversal, Link-Following) — ohne Embedding- oder Vector-Infrastruktur. Konkurrierende Producer koordinieren sich über ein leasing-/branch-basiertes Workspace-Modell mit Root-Scope-Lease und Dirty-Tree-Schutz; Mutationen sind commit-gebunden, und jeder Run endet in einem konsistenten, über denselben Git-State reproduzierbaren Bundle (AD-5, AD-6, AD-13, AD-17a..h). + +## Stories + +- Story 3.1: Inkrementellen Datenfluss implementieren (Interpret → Reconcile → Synthesize → Update) +- Story 3.2: Relevanzbestimmung textual-deterministisch umsetzen (grep/ripgrep/Traversal) +- Story 3.3: Bestehende Concepts erweitern/präzisieren/korrigieren +- Story 3.4: Wissen aus mehreren Sources synthetisieren +- Story 3.5: Leasing & Dirty-Tree-Schutz für konkurrierende Producer umsetzen +- Story 3.6: Lease-Staleness & Recovery-Basis absichern +- Story 3.7: Reason/Mutate-Trennung und Konsistenz-Endzustand sicherstellen +- Story 3.8: Determinismus-Vertrag (AD-17h) als Agent-Instruktions-Validator umsetzen + +## Requirements & Constraints + +- Ein Compilation Run nimmt neues Source Material und das bestehende Wiki als Input; das Wiki wird inkrementell weiterentwickelt, nie vollständig regeneriert. Unverändertes Wissen bleibt erhalten; Git-Änderungen konzentrieren sich auf die durch die neue Erkenntnis betroffenen Concepts (FR-4, FR-12). +- Neue Informationen führen nicht automatisch zu neuen Dateien: bestehende Concepts werden erweitert, präzisiert oder korrigiert, ohne ihre Struktur zu zerstören; Beziehungen und Provenienz bleiben soweit weiterhin gültig erhalten (FR-6). +- Mehrere Sources zum selben Thema münden in eine gemeinsame Wissensrepräsentation statt getrennter Zusammenfassungen. Das Ergebnis reflektiert den erkannten Wissensstand, konsolidiert Redundanzen und übernimmt die relevante Source-Provenienz der beteiligten Sources (FR-7, AD-4). +- Unvollständiges, ungeprüftes oder teilweise widersprüchliches Wissen wird dargestellt, ohne künstliche Gewissheit zu erzeugen (NFR-7). +- Relevanzbestimmung und Merges sind textual-deterministisch; Embeddings, Vector-Search, Knowledge-Graph-DB und RAG gehören nicht in den Compiler-Kern (AD-13, AD-17h, PRD-No-Goals). +- Ein Run verwendet ausschließlich veröffentlichte (committete) Inhalte als Input, nie Zwischenstände während der Mutation (AD-17). +- `raw/` bleibt immutable und dient als Recovery-Basis; ein fehlgeschlagener Run verändert es nicht (AD-3). + +## Technical Decisions + +- **Inkrementeller Datenfluss (AD-5, A0-6):** Interpret → Reconcile → Synthesize → Update affected Concepts. Startpunkt ist immer das bestehende Bundle — niemals "Regenerate Everything" aus allen Rohquellen. Validiert durch die Incrementality-Anforderung (SM-1, FT-6). +- **Reason/Mutate-Trennung (AD-6, A0-7):** Logische Phasen Analyse → Reconcile → Plan Changes → Mutate → Validate. Keine eigene Workflow Engine; ein Agent kann die Phasen in einer Session durchführen, der beobachtbare Endzustand des Bundles muss bei Abbruch konsistent sein. +- **Deterministische Relevanzbestimmung (A0-18):** Führt zu einer nachvollziehbaren Candidate-Liste von Concept-Pfaden über grep/ripgrep auf `wiki/`, Markdown-Traversal von `index.md` und Link-Following — deterministisch statt probabilistisch. Gleichsam Grundlage für die Bereichszuordnung (gleiches textuelles Prinzip wie AD-7c). +- **Keine eigenständige LLM-Runtime:** Der ausführende agentische Host (Claude/Codex-Adapter) orchestriert die Sequenz gemäß AD-17 (Lease holen, innerhalb des geleasten Bereichs mutieren, committen, freigeben); keine separaten Prozesse oder ein Server (AD-11). +- **Leasing-Modell (AD-17a..f, A0-12..A0-16):** Producer arbeiten auf `lease//`-Branches; Lease-Akquise gegen einen eindeutigen Commit-Object-Wert (Merge-Base-Disziplin); ein Lockfile realisiert semantisch identisch in jedem Adapter — Realisierung ist nicht pro Adapter frei wählbar. Die Lease umfasst die Root-Scope (`wiki/` inklusive `log.md`, `index.md` und aller Root-Dateien). +- **Kein textueller Auto-Merge (AD-17c, A0-14):** Zwei Branches mit Änderungen am selben Concept-Pfad werden nie textuell automatisch gemerged; der Merge ist compiler-vermittelt und durchläuft die AD-16-Klassifikation mit explizitem `log.md`-Eintrag, falls die Inhalte ungleich sind. +- **Dirty-Tree-Schutz (AD-17e/f, A0-16):** Vor jeder Mutation wird die Working Copy des zu mutierenden Bereichs geprüft; fremde uncommittete Änderungen werden geschützt (Stash/Scratch-Zone) und in `log.md` dokumentiert. Mutationen operieren nur auf Directory-/Commit-Ebene — Commit-Boundary ist die Mutation-Boundary. +- **Lease-Staleness (AD-17d, A0-15):** TTL plus Lease-Registrierung im Clone-Root-State; uncommittete Leases gelten nach Run-Abbruch als stale, verwaiste Leases können übernommen oder als stale markiert und protokolliert werden; `raw/` dient als Zugriffs- und Consistency-Basis. +- **Auflösungsautorität (AD-17g, A0-17):** Der die Lease haltende Compilation Run löst AD-16-Kollisionen (Default: Erhaltung) auf; menschliche Eskalation nur bei Unentscheidbarkeit; die Auflösung wird an Commit-Hash und Klassifikation im `log.md` gebunden. +- **Determinismus-Vertrag (AD-17h/FT-10, A0-19):** Über denselben Git-State und dasselbe Eingabeset erzeugen zwei unabhängige Runs denselben Bundle-State; Abweichung gilt als Fehler der Klassifikation, nicht als Rauschen. Das Enforcement lebt im MVP als Agent-Instruktions-Validator (D-3/Q-6) und muss mechanisch bestätigt sein, bevor es tragend wird. +- **Inkrementelle Evolution und menschliche Kuratierung (A0-21, FT-9):** Unabhängige Concepts werden nicht bei jedem Lauf regeneriert; eine menschliche Korrektur eines maschinell erzeugten Concepts überlebt als normale Kuratierung (Datei-Edit + Git) — kein Nulling-Diff und keine Re-Kompilation des ganzen Bundles. +- **Synthese bleibt source-grounded (AD-4):** Bestehende Concepts dürfen Kontext und Synthese liefern, fachliche Aussagen müssen aber auf nachvollziehbare Sources zurückführbar bleiben; Wiki-Links ersetzen nie die Provenienz zur ursprünglichen Evidenz. + +## Cross-Story Dependencies + +- Baut auf dem Workspace aus Epic 1 auf (`raw/` immutable, Bundle-Root, Schema-Validierung) und konsumiert die in Epic 2 erzeugten, OKF-konformen, verlinkten Concepts mit claim-granularer Provenienz als vorhandenes Wissen. +- Der compiler-vermittelte Merge (AD-17c) und die Kollisionsauflösung (AD-17g) setzen die AD-16-Klassifikation samt `log.md`-Dokumentation voraus, die in Epic 4 umgesetzt wird. +- Das Leasing-/Dirty-Tree-Modell dieses Epics koordiniert Compiler-Runs mit menschlicher Bearbeitung (Q-2) und liefert die Grundlage für die Git-Nachvollziehbarkeit und Auflösungs-Dokumentation, auf die Epic 5 aufsetzt. +- Keine UX/Design-Anteile relevant: v1 ist datei-/CLI-basiert ohne GUI (A-3, AD-11). diff --git a/_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md b/_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md new file mode 100644 index 0000000..d276880 --- /dev/null +++ b/_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md @@ -0,0 +1,165 @@ +--- +title: 'Inkrementellen Datenfluss implementieren (Interpret → Reconcile → Synthesize → Update) (Story 3.1)' +type: 'feature' +created: '2026-08-18' +status: 'done' +review_loop_iteration: 0 +baseline_commit: 802a5576eb4bbf54761a947e43e68b7e7ea9d67d +context: + - _bmad-output/implementation-artifacts/epic-3-context.md +--- + + + +## Intent + +**Problem:** Die Compiler-Instruktion (`schema/compiler.md`) kennt heute nur den **Neu-Anlage-Pfad** (Erzeugung neuer Concepts). Die Erweiterung/Präzisierung/Korrektur bestehender Concepts wird an zwei Stellen explizit als Epic-3-Vorbehalt ausgeschlossen (`compiler.md:40` §3.2-Kollision-Hold „Aktualisierung ist Epic 3"; `compiler.md:287` §7), und der §0-Aufruf (`compiler.md:13`) beschreibt die Phasenfolge Interpret → Reconcile → Synthetisieren → Mutieren → Validieren nur als Erzeugungs-Ablauf. Damit ist der zweite Compilation Run gegen bestehendes Wissen (FR-4) instruktionsseitig nicht definiert: Es gibt keinen deterministischen Pfad, wie ein Run neue Evidenz mit den tatsächlich betroffenen Concepts verrechnet, ohne unverändertes Wissen zu regenerieren (AD-5, A0-6, FR-6, FR-12). + +**Approach:** Story 3.1 verankert den **inkrementellen Datenfluss** als Erweiterungs-Instruktion in `schema/compiler.md` (D-3, rein textuell — kein Code, kein Standalone): (a) das bestehende Reconcile (§3) wird vom bloßen Dateikollisions-Hold zum **Update-Routing** (erkannte bestehende Wissenseinheit → Update-Kandidat, kein Duplikat, kein stilles Überschreiben); (b) eine neue Update-Mutations-Sektion (§5.9) spezifiziert, wie ein bestehendes Concept erweitert/präzisiert/korrigiert wird (FR-6) und wie Inline-Provenienz (§5.5) und `sources` nachgeführt werden; (c) die **Erhaltungs-Invariante** wird verankert: nicht betroffene Concept-Pfade bleiben bit-identisch unverändert (FT-6, FR-12), Git-Änderungen konzentrieren sich auf betroffene Concepts — nachweisbar über einen deterministischen Diff-Selbsttest; (d) die Defer-Bausteine**R-1** (Input-Zuwachserkennung: welche `raw/`-Dateien sind neu/modifiziert — via `git diff` und/oder SHA-256-Record aus `source.md`) und **P2** (Pre-Run-Reconcile-Check-Block als wiederverwendbarer, textueller Vorprüf-Block) werden als Teil des inkrementellen Runs eingearbeitet. Vertrag (`schema/wiki-compiler.md`), Validator (`schema/validator.md`) und `raw/` bleiben read-only (AD-3); keine neue §7-Invaliditätsklasse. + +## Boundaries & Constraints + +**Always:** +- **Story 3.1 ist eine Instruktions-Story (D-3).** Der inkrementelle Datenfluss wird ausschließlich in `schema/compiler.md` als deterministische Text-Instruktion verankert. Kein ausführbares Programm, kein Standalone-Validierungs-Tool, keine neue §7-Invaliditätsklasse, kein Change an `schema/wiki-compiler.md` / `schema/validator.md` / `raw/` (AD-3). +- **Das Update ersetzt den Abbruch, nicht die Erhaltung.** Wo heute der Kollisions-Hold bei „Concept existiert bereits" den Run für die Einheit abbricht, tritt das Update-Routing: eine erkannte bestehende Wissenseinheit wird im **bestehenden Concept-Pfad** aktualisiert (keine neue Datei, kein Duplikat — FR-6). Beibehaltende und neue belegte Aussagen werden sauber geführt. Kein stummer Überschreib (bestehende Provenienz/Inhalte werden nie ohne Beleg entfernt — AD-16-Default behält die Erhaltung; die AD-16-Klassifikation selbst ist Epic 4, Story 4.1, und wird hier nicht vorweggenommen). +- **Erhaltungs-Invariante (Kern):** Ein Compilation Run darf nur die Concepts **neu anlegen oder verändern**, die durch den erkannten neuen Erkenntnis-Zuwachs tatsächlich betroffen sind. Nicht betroffene Concept-Pfade bleiben byte-identisch unverändert (FT-6, FR-12); es gibt **nie** „Regenerate Everything" aus allen Rohquellen (AD-5, A0-6). Nachweisbar über einen re-executierbaren Diff-Selbsttest (`git diff --stat` auf `wiki/` zeigt ausschließlich betroffene Dateien + `log.md` + Index-Nachführungen). +- **published/committed als Input (AD-17.2/AD-17a):** Der Run verarbeitet ausschließlich veröffentlichte (committete) Inhalte als Input — neues Source Material, sobald es unter `raw/` committet ist, und das bestehende `wiki/` aus committetem Zustand. Zwischenstände während einer Mutation sind nie Input (§1.1 bleibt bestehende Regel, wird referenziert). +- **Reconcile-Ergebnis ist die Update-Kandidatenliste.** Der Reconcile-Schritt erzwingt, dass der Producer die Menge der betroffenen Concepts als **nachvollziehbare Kandidatenliste (Concept-Pfade)** erhebt, bevor mutiert wird. Der feinkörnige Relevanz-Findungsmechanismus (grep/ripgrep/Markdown-Traversal/Link-Following als eigene Ausformulierung) ist Story 3.2 vorbehalten; Story 3.1 bindet die Kandidatenerhebung an textuelle, deterministische Mittel (Konzept-/Term-Überschneidung zwischen neuer Evidenz und bestehenden Concept-Bodies via `grep`/`ripgrep`, `index.md`-Traversal, Link-Following) — keine Embeddings/Vector (AD-13). +- **Kein Leasing-/Dirty-Tree-Scope in 3.1.** Leasing, Dirty-Tree-Schutz, Staleness, Merge-vermittelte Kollision sind Story 3.5/3.6. Story 3.1 behält die bestehende Commit-Boundary = Mutations-Boundary-Regel (AD-17f, `compiler.md:13`/`:63`) bei und ändert sie nicht. +- **Defer-Bausteine werden mitgezogen:** deferred-work **R-1** (Input-Zuwachserkennung via `git diff` + SHA-256-Record aus `source.md`) und **P2** (Pre-Run-Reconcile-Check-Block bündeln) werden als Teil der inkrementellen Run-Instruktion eingearbeitet und in `deferred-work.md` als aufgegriffen markiert (append-only, keine Duplikate). +- `sprint-status.yaml`: Key `3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile` → **in-progress**. + +**Ask First:** AD-7d-Renames/Redirects bestehender Concepts · Einführung einer echten Kollisions-Klassifikation (CORRECTING/CONTRADICTING etc.) vor Epic 4 · Wechsel des `generated.at`-Verhaltens bei Updates gegenüber der hier festgelegten Konvention (s. Design Notes) · Validator-/Vertrags-/`raw/`-Change · Änderung der Commit-Boundary-Regel. + +**Never:** Änderungen an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3) · neue §7-Invaliditätsklasse · Einführung eines Standalone-Programms/Validators (D-3) · „Regenerate Everything" über bestehende Concepts (AD-5, A0-6) · stummer Überschreib oder Löschung bestehender Provenienz ohne Beleg (AD-16-Default: Erhaltung) · Embedding/Vector-Suche (AD-13) · Duplikat-Anlage eines bestehenden Concept-Pfads. + +## I/O & Edge-Case Matrix + +| Scenario | Input / State | Expected Output / Behavior | Error Handling | +|----------|--------------|---------------------------|----------------| +| HAPPY_PATH_UPDATE | Bestehendes Concept `wiki//.md` + neue committete Evidenz `raw/…` betrifft es (Term-/Konzept-Überschneidung) | Update-Routing: Concept wird im bestehenden Pfad erweitert/präzisiert (§5.9); Inline-Provenienz + `sources` nachgeführt (nur echt neue Belege ergänzt); `log.md`-Eintrag (Vertrag §5-Format) mit Story 3.1; kein neues File, kein Duplikat | N/A | +| UNTOUCHED_CONCEPT | Neue Evidenz betrifft ein bestehendes Concept **nicht** (keine Überschneidung) | Concept bleibt **unverändert**: keine Dateiänderung, kein Index-, kein `log.md`-Zusatz (FT-6/FR-12); Diff-Selbsttest zeigt keinen Ghost-Diff auf diesem Pfad | N/A | +| INPUT_UNCOMMITTED | Run erhält uncommittete Zwischenstände (Arbeitskopie `wiki/`/`raw/` abweichend von HEAD) als Input | Run lehnt ab bzw. bezieht nur published/committed Zustand ein (AD-17a); keine Mutation gegen Zwischenstände | textuell benannter Abbruch „published/committed Input erforderlich" (§1.1-Fortsetzung) | +| CHANGE_DETECTION (R-1) | `raw/` enthält (a) eine neue, (b) eine unveränderte Evidenzdatei | Zuwachserkennung: nur die neue/modifizierte Datei wird als Zuwachs interpretiert (git-diff-basiert und/oder SHA-256-Record aus `source.md`); unveränderte bleiben außen vor | unlesbarer/fehlender SHA-256-Record → Hinweis, Datei dennoch als Zuwachs nicht doppelt verarbeiten | +| CONCEPT_COLLISION_BESTEHEND | Erkannte Wissenseinheit = bereits existierendes Concept (Ziel-Pfad belegt) | Statt bisherigem Kollision-Hold-Abbruch: Update-Routing (§5.9) — Mutation im bestehenden Pfad; kein Duplikat, kein stummer Überschreib; Index-Link bleibt unverändert gültig | Widersprechender Inhalt ohne Ersetzungsevidenz → Erhaltung; explizite Ablage in `log.md` (Epic-4-Interface, keine Korrektur-Klassifikation hier) | +| PRE_RUN_RECONCILE (P2) | Run-Start mit neuem Zuwachs | Pre-Run-Reconcile-Check-Block (Zielpfade, Quellen-Existenz EC-1, Betroffenheits-Kandidatenliste, `wiki/index.md`-V-1) wird vor jeder Mutation durchlaufen und textuell festgehalten | fehlende Bundleroot → Run-FAIL (V-1, besteht fort) | + + + +## Code Map + +- `schema/compiler.md` — **primär mutiert** (D-3, einziger Instruktions-Ort): + - §0-Aufruf (`:13`): Ablaufstruktur um die Update-Variante präzisieren — die sechs Phasen bleiben; Reconcile/Mutieren betreffen auch **bestehende** Concepts. + - §3 Reconcile (`:37–41`): Pkt. 2 Kollision-Hold (`:40`) — Epic-3-Abbruch („Aktualisierung ist Epic 3") **ersetzen** durch Update-Routing (→ §5.9); Candidate-Erhebung (betroffene Concepts) textuell-deterministisch; Pkt. 3 V-1-Prüfung (`:41`) bleibt. + - **Neue §5.9 „Inkrementelles Update bestehender Concepts (Story 3.1)"** nach §5.8 (nach `:233`, vor §6 `:234`): (1) Update-Stimulus = Reconcile-Kandidatenliste (betroffene Concept-Pfade); (2) Mutationsmechanik — Erweitern (Absatz/Beleg ergänzen), Präzisieren (Aussage schärfen, Beleg neu/nachführen), Korrigieren (ersetzte Aussage + Ersetzungsbeleg, keine stille Löschung), Frontmatter-`sources` nur um echte neue Belege ergänzen, `generated.at` = aktueller Run-Zeitstempel (Konvention, s. Design Notes), vorhandenes `verified` bleibt stehen; (3) Index-/Link-Form unverändert (§5.6-Pin), kein neuer Link bei reinem Body-Update; (4) `log.md`-Eintragspflicht (Vertrag §5; „Story 3.1-Update" markieren); (5) deterministischer Diff-Selbsttest der Erhaltungs-Invariante (nur betroffene Dateien + log.md + Index im `git diff --stat` auf `wiki/`); (6) Change-Detection (Defer R-1: `git diff` auf `raw/` und/oder SHA-256-Record aus `raw/**/source.md` bestimmt den Zuwachs) und Pre-Run-Reconcile-Check-Block (Defer P2) als wiederverwendbare textuelle Check-Blöcke der Run-Vorphase. + - §7 (`:287`): Epic-3-Vorbehalt auf die verbleibenden 3.x-Themen kürzen (Synthese über mehrere Concepts → 3.4; Leasing/Dirty-Tree → 3.5/3.6; Relevanz-Verfeinerung → 3.2) — das Update-Thema ist damit aus dem Vorbehalt entlassen. + - §8 Revisionslog (`:291–317`): **Revision 2.4** (Story 3.1) + Normreferenzen unverändert (AD-5, AD-6, AD-17h sind schon gelistet; A0-6/FR-6/FR-12 ggf. ergänzen); Abschlussklausel (kein Vertrag-/Validator-/`raw/`-Change, keine neue §7-Klasse, kein Standalone). +- `wiki/log.md` — **append**: Story-3.1-Eintrag (Vertrag §5-Format, `## YYYY-MM-DD` Gruppe nach `:3`) mit Update-Semantik, Erhaltungs-Invariante, Diff-Selbsttest-Beleg (Ist-Baum: kein Ghost-Diff), Statuswechsel `3-1-…` `backlog → in-progress`, per-Datei-Validator-Verdikt-Zeile (Ist-Baum SUCCESS) — Analogie Story-2.5-Eintrag (`log.md:5`). +- `_bmad-output/implementation-artifacts/deferred-work.md` — **mutiert** (append-only): Defer R-1 (`:126–128`) und P2 (`:160–162`): `status`-Nachführungs-Notiz „aufgegriffen (2026-08-18, Story 3.1 — §5.9)" — bestehende Einträge nicht verändern, nur Status-Ergänzung im vorgegebenen append-only-Stil. +- `_bmad-output/implementation-artifacts/sprint-status.yaml` — **mutiert**: Key `3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile` (`:54`) → `in-progress`. +- `schema/validator.md`, `schema/wiki-compiler.md`, `raw/…`, bestehende Concept-Inhalte — **read-only** (AD-3). Story 3.1 mutiert selbst keine Concept-Inhalte (Instruktions-Story); Demo-/Nachweis-Läufe laufen im Sandbox-Baum oder gegen den Ist-Baum ohne Inhalts-Mutation (Diff-Selbsttest + Validator-Verdikt). + +## Tasks & Acceptance + +**Execution:** +- [x] `schema/compiler.md` — §3-Pkt.-2-Hold → Update-Routing; Candidate-Erhebung; neue §5.9 (Mutationsmechanik, log.md, Diff-Selbsttest, R-1-Change-Detection, P2-Check-Block); §0-Präzisierung; §7-Vorbehalt kürzen; §8-Revision 2.4. Kein Vertrag-/Validator-/`raw/`-Change. +- [x] `wiki/log.md` — Story-3.1-Eintrag (Vertrag §5-Format) mit Update-Semantik, Erhaltungs-Invariante + Diff-Selbsttest-Beleg, Statuswechsel, Validator-Verdikt. +- [x] `deferred-work.md` — R-1-/P2-Einträge mit „aufgegriffen (Story 3.1)"-Statusnachführung markieren (append-only); `sprint-status.yaml` — Key `3-1-…` → `in-progress`. +- [x] Edge-Tests im Sandbox-Baum (I/O-Matrix): HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT (kein Diff), CONCEPT_COLLISION_BESTEHEND (kein Duplikat), CHANGE_DETECTION (nur Zuwachs), PRE_RUN_RECONCILE. + +**Acceptance Criteria:** +- Given ein bestehendes Bundle und neues Source Material, when ein Compilation Run startet, then folgt er dem inkrementellen Datenfluss Interpret → Reconcile → Synthesize → Update affected Concepts (AD-5, A0-6) — instruktionsseitig in `schema/compiler.md` (§3 + neue §5.9) verankert. +- Given ein Run, when er einen bestehenden Concept-Pfad nicht betrifft, then bleibt dessen Inhalt unverändert erhalten — keine Regeneration (FT-6, FR-12); belegt durch den re-executierbaren Diff-Selbsttest (nur betroffene Dateien + `log.md` + Index im `git diff --stat`). +- Given ein Lauf, when er abgeschlossen ist, then konzentrieren sich die Git-Änderungen auf durch die neue Erkenntnis betroffene Concepts (AD-5, FR-6) — kein Ghost-Diff, kein Duplikat bestehender Concept-Pfade. +- Given der Run-Input, when verarbeitet, then verwendet er ausschließlich published/committed Inhalte und nie Zwischenstände während der Mutation (AD-17.2/AD-17a) — bestehende §1.1-Regel bleibt und wird referenziert. +- Given die Instruktion, when geprüft, then bleibt `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3), es gibt keine neue §7-Klasse und kein Standalone (D-3) — der Validator läuft auf dem Ist-Bundle SUCCESS (per-Datei-Verdikt-Nachweis in `wiki/log.md`). + +## Spec Change Log + +- **2026-08-18 (Erstellung):** Initiale Approve-Baseline. + +## Design Notes + +**Warum §5.9 als eigene Sektion statt Umbau von §5:** Die 5.x-Sektionen sind die nachgelagerten Spezifikations-Ebenen der Mutationsphase (§5.5 Claim-Provenienz, §5.6 Links, §5.7 Bereichszuordnung, §5.8 Discovery). Das inkrementelle Update ist die nächste Spezifikations-Ebene desselben §5 (Mutieren) — konsistent als §5.9, verortet nach §5.8 vor §6. Der bestehende §3-Reconcile wird nicht umgeschrieben, sondern seine Pkt.-2-Ausnahme („Aktualisierung ist Epic 3") durch das Update-Routing ersetzt — der Kollisions-Hold-Teil („nicht stumm überschreiben") bleibt als Schutzprinzip erhalten und wird lediglich um den Update-Ausweg ergänzt. + +**Erhaltungs-Invariante als Diff-Selbsttest:** Die Inkrementalität ist nur dann AD-17h-fest belegbar, wenn sie mechanisch kontrollierbar ist. Konvention: Nach jedem Run prüft der Producer über `git diff --stat -- wiki/` (bzw. `git status --porcelain`), dass die geänderten Dateien ⊆ (betroffene Concepts ∪ `log.md` ∪ nachgeführte `index.md`) sind. Eine Abweichung (Ghost-Diff) ist ein Instruktions-Verstoß (FT-6) und wird textuell benannt. Für Story 3.1 selbst (Instruktions-Story ohne Inhalts-Mutation) ist der Nachweis: Ist-Baum zeigt keinen neuen Ghost-Diff nach dem Instruktions-Ergänzungs-Commit. + +**`generated.at`-Konvention bei Updates (A0-20):** Ein maschinelles Update eines maschinell erzeugten Concepts bleibt maschinell → `generated` bleibt gesetzt, `at` wird auf den aktuellen Run-Zeitstempel aktualisiert (einmalige `at`-Festlegung pro Run, Dryrun-P1-Konvention). `verified` wird durch ein maschinelles Update **nicht** gesetzt und ein vorhandenes human-`verified` wird **nicht** entfernt (menschliche Kuratierung ist Bestandswissen, A0-21/FR-13-Nähe). Ein menschliches Update ändert `generated`/`verified` nicht automatisch. + +**Defer-Bausteine inside der Run-Vorphase:** Defer R-1 (Change-Detection) beantwortet „welche `raw/`-Dateien sind Zuwachs" — als textueller Check-Block vor der Interpretation (git-diff-basiert und/oder SHA-256-Record aus `source.md`); Defer P2 bündelt die bestehenden textuellen Vorprüfungen (Zielpfad, Quellen-Existenz EC-1 via Validator-Punkt, Reconcile-Kandidaten-Erhebung, V-1) zu einem wiederverwendbaren Pre-Run-Reconcile-Check-Block. Beide sind **keine** neuen Prozesse — nur reproduzierbare Check-Blöcke innerhalb der Instruktions-Ausführung (D-3). + +## Verification + +**Commands (re-executierbar, ab Workspace-Root):** +1. **Instruktions-Integrität:** `grep -n "5.9" schema/compiler.md` liefert die neue Sektion; `grep -n "Aktualisierung ist Epic 3" schema/compiler.md` liefert **keinen** Treffer mehr (Hold durch Update-Routing ersetzt); §7-Vorbehalt enthält „Update" nicht mehr. +2. **Diff-Selbsttest (Erhaltungs-Invariante):** vor dem Story-Commit den Ist-Baum-Status aufzeichnen, nach dem Commit `git diff --stat -- wiki/` prüfen — erwartet: nur die von Story 3.1 berührten Dateien (`log.md`, ggf. `index.md`) bzw. nach dem Instruktions-Commit der Story selbst kein weiterer Ghost-Diff; auf dem Sandbox-Baum: HAPPY_PATH_UPDATE zeigt ausschließlich betroffene Datei + log.md + Index. +3. **Validator-Lauf:** alle `wiki/`-Dateien SUCCESS (unverändert zur Story 2.5; der Validator ist eine reine Text-Instruktion, human-mechanisch ausgeführt, D-3 — es gibt keinen CLI-Invoker); das per-Datei-Verdikt wird als Ausführungs-Nachweis im `log.md`-Eintrag geführt. + +**Manual checks:** +- §3-Pkt.-2-Hold ersetzt (Update-Routing) und §5.9 vorhanden (Update-Semantik, Diff-Selbsttest, R-1/P2-Bausteine); `compiler.md` §8-Revision 2.4 mit Abschlussklausel; kein `schema/validator.md`-/`schema/wiki-compiler.md`-/`raw/`-Diff; §7-Vorbehalt gekürzt; `wiki/log.md`-Eintrag datiert mit Story-3.1-Semantik, Diff-Selbsttest-Beleg, Statuswechsel `backlog → in-progress`, per-Datei-Verdikt; `deferred-work.md`-R-1-/P2-Einträge als aufgegriffen markiert (append-only); `sprint-status.yaml` konsistent (`3-1-…` → in-progress). + +## Suggested Review Order + +**Inkrementeller Datenfluss — Update-Routing (Einstieg)** + +- §3 Reconcile: Kollision-Hold durch Update-Routing ersetzt — der architektonische Kern der Story + [`compiler.md:40`](../../schema/compiler.md#L40) + +- Textuell-deterministische Kandidatenliste (AD-13) als Update-Stimulus + [`compiler.md:41`](../../schema/compiler.md#L41) + +- §0-Aufruf: sechs Phasen für Neu-Anlage- und Update-Variante präzisiert + [`compiler.md:13`](../../schema/compiler.md#L13) + +**§5.9 Update-Mutationsmechanik (neue Sektion)** + +- §5.9-Überblick: einziger Instruktions-Ort der Update-Mutationsmechanik (D-3) + [`compiler.md:236`](../../schema/compiler.md#L236) + +- Update-Stimulus: Kandidatenliste, published/committed-Input (§1 Pkt. 1, AD-17a) + [`compiler.md:240`](../../schema/compiler.md#L240) + +- Mutationsmechanik: Erweitern/Präzisieren/Korrigieren + Mehrfach-Treffer-Konsolidierung + [`compiler.md:242`](../../schema/compiler.md#L242) + +- Index-/Link-Form unverändert (§5.6-Pin); `log.md`-Eintragspflicht bleibt davon unberührt + [`compiler.md:249`](../../schema/compiler.md#L249) + +- Worked Example an den realen Ist-Baum gebunden (FR-12, kein Ghost-Diff) + [`compiler.md:259`](../../schema/compiler.md#L259) + +**Erhaltungs-Invariante & Diff-Selbsttest (Review-Patch-Kern)** + +- Diff-Selbsttest operationalisiert: `git diff --name-only -- wiki/` ⊆ Kandidatenliste ∪ log.md ∪ Index + [`compiler.md:251`](../../schema/compiler.md#L251) + +- Run-Vorphase-Bausteine: Change-Detection (R-1, Baseline = HEAD der vorherigen Mutations-Boundary) + Pre-Run-Reconcile-Check-Block (P2) + [`compiler.md:255`](../../schema/compiler.md#L255) + +- Revisionslog 2.4.1: Review-Patch-Runde mit Abschlussklausel (AD-3/D-3 gehalten) + [`compiler.md:348`](../../schema/compiler.md#L348) + +**Referenz-Abgrenzung §5.7/§5.8** + +- §5.7 Pkt. 3: Top-Level-Kollision → Update-Routing, kein MOVE + [`compiler.md:199`](../../schema/compiler.md#L199) + +- §5.8 Pkt. 2: Rev-9-Punkt-11-Area-Lesart als geschlossene Lücke dokumentiert + [`compiler.md:231`](../../schema/compiler.md#L231) + +- §5.8 Pkt. 3: §5.8-Hold bewusst nicht das Update-Routing (Zwei-Ebenen-Kartografie) + [`compiler.md:232`](../../schema/compiler.md#L232) + +**Nachweise (Log, Deferred-Work, Sprint-Status)** + +- `wiki/log.md`: Story-3.1-Nachweis mit Diff-Selbsttest-Beleg und Rev-9-Präzisierung + [`log.md:4`](../../wiki/log.md#L4) + +- `deferred-work.md`: R-1 (Change-Detection) und P2 (Pre-Run-Reconcile) als aufgegriffen markiert + [`deferred-work.md:129`](deferred-work.md#L129) + +- Review-Findings-Protokoll (VG-Nachweis, F9/F12, F17-Defer als Folge-Aufgabe) + [`deferred-work.md:164`](deferred-work.md#L164) + +- `sprint-status.yaml`: Story 3.1 `in-progress` (Sprint-Sync konsistent) + [`sprint-status.yaml:54`](sprint-status.yaml#L54) diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 8071ce3..537590f 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -29,7 +29,7 @@ # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) # - Retrospective appends its action items to action_items; the status view surfaces open ones generated: 08-14-2026 00:00 -last_updated: 08-18-2026 22:00 +last_updated: 08-18-2026 22:30 project: wow20 project_key: NOKEY tracking_system: file-system @@ -50,8 +50,8 @@ development_status: 2-5-progressive-discovery-über-index-md-bereitstellen: done epic-2-retrospective: done - epic-3: backlog - 3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: backlog + epic-3: in-progress + 3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: review 3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip: backlog 3-3-bestehende-concepts-erweitern-präzisieren-korrigieren: backlog 3-4-wissen-aus-mehreren-sources-synthetisieren: backlog diff --git a/schema/compiler.md b/schema/compiler.md index ed5000d..2153a56 100644 --- a/schema/compiler.md +++ b/schema/compiler.md @@ -2,7 +2,7 @@ > **Status:** abgeleitet (Story 2.1) — deterministische, agent-unabhängige Compiler-Instruktion für die Erzeugung neuer Concepts aus Source Material. > **Normative Grundlage:** `schema/wiki-compiler.md` (autorisiert, Story 1.3) — insbesondere §2 Bundleroot, §3 Feldsubset (§3.1–§3.7), §5 `log.md`-Typdefinition, §6 Index-Regel/Prädikate, §7 abschließende 14-Punkte-Liste, §8 Normreferenzen. -> **Prüfgrundlage:** `schema/validator.md` (abgeleitet, Story 1.4; Revision 8) — die Validierung bleibt die mechanische Bestätigung der Konformität (AD-17h). +> **Prüfgrundlage:** `schema/validator.md` (abgeleitet, Story 1.4; Revision 9) — die Validierung bleibt die mechanische Bestätigung der Konformität (AD-17h). > **Ableitungsdatum:** 2026-08-16 > **Kanonischer Producer-Actor:** `wow-compiler/0.1.0` @@ -10,7 +10,7 @@ Diese Datei ist **der einzige Ort der Concept-Erzeugungs-Instruktion** des Projekts. Sie ist **rein textuell** — kein ausführbarer Code, kein Standalone-Programm (D-3). Sie wird von einem vorhandenen agentischen Host (AD-11) als **deterministische Anweisung** befolgt; sie ersetzt kein LLM-Reasoning, sondern **kanalisiert** es in eine reproduzierbare, textuell nachvollziehbare Abfolge (AD-5, AD-6, AD-17h). -**Aufruf:** Der Producer führt den Run in der folgenden festen Ablaufstruktur aus (deterministische Reihenfolge): (0) Input prüfen, (1) Interpretieren, (2) Reconcile, (3) Synthetisieren, (4) Mutieren, (5) Validieren. Jede erzeugte Concept-Datei MUSS anschließend gegen `schema/validator.md` als SUCCESS nachweisbar sein — erst dann gilt der Run als erfolgreich. Bei einem Validierungs-FAIL wird das Bundle **nicht** als erfolgreicher Run behandelt, `raw/` bleibt unangetastet (AD-3), und die Fehlerursache ist textuell identifizierbar (NFR-4). Die **Commit-Boundary ist die Mutations-Boundary** (AD-17f): Zwischenstände vor Erreichen der Success-Bedingung werden nicht als fertige Mutation veröffentlicht. +**Aufruf:** Der Producer führt den Run in der folgenden festen Ablaufstruktur aus (deterministische Reihenfolge): (0) Input prüfen, (1) Interpretieren, (2) Reconcile, (3) Synthetisieren, (4) Mutieren, (5) Validieren. Diese sechs Phasen gelten für **zwei Ausführungs-Varianten** gleichermaßen: den **Neu-Anlage-Pfad** (Erzeugung neuer Concepts, §§4–5) und den **Update-Pfad** (inkrementelles Update bestehender Concepts, §3 + §5.9, Story 3.1). In beiden Varianten betreffen Reconcile (2) und Mutieren (4) die Erkennung und Veränderung **betroffener** Wissenseinheiten — neue Einheiten werden angelegt, bereits bestehende werden im bestehenden Concept-Pfad aktualisiert (never „Regenerate Everything", AD-5). Jede erzeugte **und** jede veränderte Concept-Datei MUSS anschließend gegen `schema/validator.md` als SUCCESS nachweisbar sein — erst dann gilt der Run als erfolgreich. Bei einem Validierungs-FAIL wird das Bundle **nicht** als erfolgreicher Run behandelt, `raw/` bleibt unangetastet (AD-3), und die Fehlerursache ist textuell identifizierbar (NFR-4). Die **Commit-Boundary ist die Mutations-Boundary** (AD-17f): Zwischenstände vor Erreichen der Success-Bedingung werden nicht als fertige Mutation veröffentlicht. **Entscheidungsebenen (keine eigene Norm):** @@ -37,8 +37,10 @@ Bestätigung (Story 1.4): schema/validator.md (mechanische Prüfung, kein L ## 3. Reconcile (gegen das bestehende Bundle) 1. Vor der Anlage prüfen, ob die erkannte Wissenseinheit **bereits als Concept** im Bundle existiert (deterministisch: Dateikollision über den relativen OKF-Pfad, AD-7a). -2. **Kollision-Hold:** Existiert bereits ein Concept mit dem Ziel-Pfad, wird **nicht** stumm überschrieben. Diese Instruktion deckt die Anlage **neuer** Concepts ab; die Erweiterung/Präzisierung/Korrektur bestehender Concepts ist Epic 3 (AD-5, FR-6). Der Run bricht für diese Einheit mit einem textuell identifizierbaren Hinweis ab („Concept existiert bereits — Aktualisierung ist Epic 3") und **setzt mit den übrigen erkannten Wissenseinheiten fort**; die gehaltene Einheit erzeugt keine Datei, keinen Index-Link und keinen `log.md`-Eintrag. Mindestens eine erfolgreich erzeugte und mindestens eine gehaltene Einheit → der Run ist **teilweise erfolgreich**: die erzeugten Concepts werden normal validiert und veröffentlicht, die gehaltenen Einheiten werden textuell als solche benannt (NFR-4). -3. Der Run prüft zusätzlich, ob `wiki/index.md` als Bundleroot existiert (V-1-Vorbedingung des Validators); fehlt sie, darf kein Concept erzeugt werden (Run-FAIL, Vertrag §2). +2. **Update-Routing (statt Kollision-Hold; Story 3.1):** Existiert bereits ein Concept mit dem Ziel-Pfad, wird **nicht** stumm überschrieben und **kein** Duplikat angelegt — die erkannte Wissenseinheit wird als **Update-Kandidat** im **bestehenden Concept-Pfad** aktualisiert (Erweitern/Präzisieren/Korrigieren gemäß §5.9; FR-6). Die Mutationsmechanik für Updates spezifiziert §5.9; der Kollisions-Hold-Schutzprinzip („nicht stumm überschreiben") bleibt als Grundsatz der Erhaltung erhalten (AD-16-Default: bestehende Provenienz/Inhalte werden nie ohne Beleg entfernt). Der **Neu-Anlage-Pfad** dieser Instruktion bleibt für Wissenseinheiten, deren Ziel-Pfad **nicht** belegt ist (§5.1/§5.7). + **Kandidatenliste (betroffen-Bestimmung):** Vor jeder Mutation erhebt der Producer die Menge der betroffenen Concepts als **nachvollziehbare Kandidatenliste** (relative OKF-Pfade ohne `.md`) mit **textuell-deterministischen Mitteln** (AD-13): (a) Term-/Konzept-Überschneidung zwischen der neuen Evidenz und den bestehenden Concept-Bodies via `grep`/`ripgrep` über `wiki/` (z. B. `rg -l '' wiki/`); (b) `index.md`-Traversal (Bundleroot- und Area-`index.md`-Dateien, gewurzelte Erreichbarkeit Root → Area → Concept, §5.8) der dadurch betroffenen Bereiche; (c) Link-Following aus bereits betroffenen Concepts (§5.6-Pin) auf weitere Concept-Pfade. Die Kandidatenliste wird textuell festgehalten (Pre-Run-Reconcile-Check-Block, §5.9 Pkt. 6). Keine Embeddings/Vector-Suche (AD-13); der feinkörnige Relevanz-Findungsmechanismus als eigene Ausformulierung ist Story 3.2 vorbehalten — §5.9 bindet die Erhebung an die hier genannten deterministischen Mittel. + Löst eine erkannte Wissenseinheit auf **keinen** bestehenden Concept-Pfad auf (kein Update-Kandidat), wird sie als **neue** Einheit über den Neu-Anlage-Pfad (§5.1/§5.7, §3.2-Kollisionsprüfung ist damit erstbestanden) behandelt. +3. Der Run prüft zusätzlich, ob `wiki/index.md` als Bundleroot existiert (V-1-Vorbedingung des Validators); fehlt sie, darf kein Concept erzeugt oder aktualisiert werden (Run-FAIL, Vertrag §2). ## 4. Synthetisieren (Provenienz & Trust) @@ -194,7 +196,7 @@ Bereichszuordnung und Concept-Hierarchie sind **textual-deterministisch** (AD-7c | `wiki/llm-wiki-prinzip.md` | `llm-wiki-prinzip` | Eine als Area gedachte Anlage (`wiki//index.md` + Concept darunter) ist damit **konform**; der Bereichs-Hinweis aus §5.1 ist aufgelöst. Konzept-`id`s (s. `sources[].id`, §5.5 Pkt. 3) sind unabhängig davon je Concept eindeutig — Adressraum ist Concept-Pfad + `id`. -3. **Top-Level-Kollisions-Hold (A0-10, fixierter §3.2):** Kollidiert ein Erstellungskandidat mit einem bestehenden Top-Level-Pfad (deterministisch: Dateikollision über den relativen OKF-Pfad, §3.1/§3.2, AD-7a), löst der **fixierte §3.2-Kollisions-Hold** aus — **kein** neues Prädikat, **kein** stiller Overwrite, kein Index-Link, keine Datei: der Run bricht für diese Einheit textuell ab („Concept existiert bereits — Aktualisierung ist Epic 3") und setzt mit den übrigen Einheiten fort (§3.2; „teilweise erfolgreich"). **Kein MOVE/Neuzuordnung bestehender Concepts** — das ist Kuratierung mit AD-7d-Redirect-Pflicht (Epic-3-Nähe, nicht in den ACs dieser Story; Ask-First). +3. **Top-Level-Update-Routing (A0-10, §3-nachgeführt):** Kollidiert ein Erstellungskandidat mit einem bestehenden Top-Level-Pfad (deterministisch: Dateikollision über den relativen OKF-Pfad, §3.1/§3.2, AD-7a), löst das **Update-Routing (§3 Pkt. 2, §5.9)** aus — **kein** neues Prädikat, **kein** Duplikat, **kein** stiller Overwrite, keine neue Datei, kein Index-Link: die erkannte Einheit wird als **Update-Kandidat** im bestehenden Concept-Pfad behandelt (Mutation gemäß §5.9). **Kein MOVE/Neuzuordnung bestehender Concepts** — das ist Kuratierung mit AD-7d-Redirect-Pflicht (Epic-3-Nähe, nicht in den ACs dieser Story; Ask-First). 4. **File-relatives Link-Auflösungsmodell (löst das §5.6-Defer):** Concept-Links sind **file-relativ** zur `.md`-Datei (AD-8/FR-10/AD-7b — eine syntaktische Form, beide Ebenen): bei Root-Dateien ist file-relativ ≡ bundle-relativ (die bestehenden Bestands-Links bleiben byte-identisch, Null-Delta zu Story 2.3); in Areas bezeichnen `../`-Präfixe die Aufwärts-Ziele **innerhalb `wiki/`** (`[](../.md)`). Auflösung & Containment (§5.6 Pkt. 3, Formel 3): `../`-Ziel relativ zum Quell-Verzeichnis auflösen, `X/..`-Segmente kollabieren, aufgelöster Pfad MUSS unter `wiki/` bleiben — sonst `DANGLING` (Out-of-Bundle-`..`-Escape gesperrt, Loop-1-Fix). `../schema/*` als andere Schicht (Ziel außerhalb des Bundles) bleibt exkludiert — Abgrenzung über das **Zielverzeichnis** (unter `wiki/` = in-Bundle), nicht über das bloße `../`-Präfix; einstufiges `../schema/*` aus Root-Dateien ist damit weiterhin pin-frei (bestehende Root-`index.md`-Links unverändert). `.md`-Endung bleibt Pflicht (§5.6 Pin). 5. **Area-`index.md` (Vertrag §2/§6, AD-9/FR-11):** Eine Area besitzt exakt eine `wiki//index.md`, **frontmatterlos** (Punkt 10), die ihre Area-Concepts in der gepinnten Form (§5.6) verlinkt (Identity = relativer OKF-Pfad ohne `.md`). Die Bundleroot-`index.md` verlinkt die Area-`index.md` (Navigation Root → Area, AD-9). **Area ohne `index.md` ist strukturell invalide** und wird vom Validator wörtlich gemeldet: `FAIL … Punkt 11: Index-Regel verletzt (Area ohne index.md=)` (kein inventiertes Label; Verdikt-Grammatik §5 des Validators). Ein neues Area-Concept MUSS in `wiki//index.md` verlinkt sein (§5.3 Pkt. 3 ist entsprechend §5.7-nachgeführt); sonst Punkt 11. 6. **Worked Example (Area-Concept):** `wiki/wissensarchitektur/source-material.md` — ein neues Area-Concept: `type: concept`, `sources` → `raw/architecture-spine/architecture-spine-2026-08-14.md` (s1) + `raw/prd/prd-wow20-2026-08-14.md` (s2), §5.5-Inline-Verweise je belegter Aussage, Body-Links auf Root-Concepts in der file-relativen `../`-Form (`[LLM-Wiki-Prinzip](../llm-wiki-prinzip.md)` u. ä.), inhaltsbegründet. Verlinkt in der Area-`index.md` `wiki/wissensarchitektur/index.md` (frontmatterlos, gepinnte Form); diese wiederum in der Bundleroot `wiki/index.md` (Area-Sektion). §5.6-Formel-1 (Bestands-Check) erfasst die Area-Links; Formel 2 (Form-Check) `0`; Formel 3 (Dangling-Check) keine Ausgabe (in-Bundle-`../`-Auflösung, §5.7 Pkt. 4). @@ -225,12 +227,37 @@ Progressive Discovery ist die **schrittweise Navigation** eines Consumers von de Beide Läufe ohne Ausgabe = Discovery-SUCCESS. Die Meldungen sind **Instruktions-Selbsttest-Befunde** — kein Validator-Punkt, keine neue §7-Klasse (AD-3). - **`UNREACHABLE AREA: `** — eine Area-`index.md` existiert, ist aber von der Bundleroot **nicht** verlinkt (kein Root→Area-Pfad): die Area bleibt für die Navigation unsichtbar (AD-9). Die Meldung ist ein textuell benannter **Instruktions-Selbsttest-Befund** (Run-FAIL gemäß §5.6 Pkt. 4-analoger NFR-4-Regel) — **kein** Validator-Punkt, **keine** neue §7-Klasse. - - **`NESTED AREA: `** — jede Markdown-Datei in einem Zwei-Ebenen-Pfad (Tiefe ≥ 3, Lauf (B), Pkt. 3): ein `wiki/a/b/index.md`-Kandidat wie auch ein `wiki/a/b/concept.md` **ohne** `index.md` (die Area-ohne-Index-Lücke, die der reine `index.md`-Scan übersähe) sind Fälle der **konsolidierten Zwei-Ebenen-Kartografie** (Pkt. 3): die Verzeichnisstruktur ist keine zugelassene Anlageform; ein solcher Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (Trigger: Mutieren-Schritt, Pkt. 3 — keine Datei, kein Index-Link, Meldung, Run „teilweise erfolgreich"; nachträgliche bestehende Tiefe-≥-3-Dateien meldet Lauf (B)) — **analog**, aber **bewusst nicht** über den §3.2-Kollisions-Hold der Dateikollision bestehender Concepts (§3.2, Z. 40, bliebe ungeschärft für brandneue Pfade). - - Der Erreichbarkeits-Satz für **Root-Concepts** (jedes Root-Concept in `wiki/index.md` verlinkt) ist durch den Validator-Punkt-11-Check (§3 Punkt 11) abgedeckt und wird hier nicht dupliziert; der Selbsttest deckt die vom Validator offene Lücke (Root→Area-Navigation) ab. (Bekannte offene Lücke des Punkt-11-Checks: die file-relative Area-Lesart — ein wörtlich-mechanischer Check meldete `Concept nicht verlinkt=wissensarchitektur/source-material`; Behebung steht im Rev-9-Aktionsitem, s. `deferred-work.md`, Spec-2.4-Defer.) Die §5.6-Formeln (Z. 133–166) decken die **Link-Form** weiterhin ab (der Selbsttest prüft die Erreichbarkeit, nicht die Form — die Form bleibt beim §5.6-Form-Check). -3. **Konsolidierte Zwei-Ebenen-Kartografie (antwortet Defer F-07, schließt es):** Das Bundle-Navigationsmodell besteht ab Story 2.5 aus **einer** Area-Ebene: Root-Concepts (direkt aus der Bundleroot) + Areas (`wiki//`), jede mit genau einer frontmatterlosen `wiki//index.md`, die ihre Area-Concepts in gepinnter §5.6-Form verlinkt; die Bundleroot verlinkt die Area-`index.md`-Dateien (Navigation Root → Area, AD-9). **Verschachtelte Areas sind keine zugelassene Anlageform:** `wiki/a/b/` mit Concept darunter ist **kein** „Area mit Inhalt" — ein solcher Kandidat (Erstellungskandidat oder Discovery-Ziel) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten: keine Datei, kein Index-Link, textuelle Meldung **`NESTED AREA: `** (Pkt. 2); der Run bricht für dieses Gebilde mit „teilweise erfolgreich" ab (die übrigen erkannten Einheiten laufen weiter, NFR-4). **Tiefen-Definition (Loop-3-Klarstellung):** „Tiefe" ist die Segment-Anzahl unter der Bundleroot — `wiki///…` hat Tiefe ≥ 3 (zwei Verzeichnisstufen plus Datei); das ist exakt die `find -mindepth 3`-Schwelle von Lauf (B). Die Meldung benennt immer die **erste** Ebene `` der nicht-zulässigen Struktur. **Trigger im Run-Flow (Loop-3-Fix):** der Hold feuert im **Mutieren-Schritt** (§0-Ablaufstruktur, Schritt (4)) — der Producer prüft vor Anlage eines Ziel-Pfads dessen Tiefe unter der Bundleroot; Tiefe ≥ 3 → Hold (kein §5.7-Routing kann Tiefe ≥ 3 strukturell erzeugen, der Hold sichert die Regel zusätzlich). Lauf (B) der Selbsttest-Formel bleibt der nachträgliche Baum-Check gegen bestehende Tiefe-≥-3-Dateien. Der Hold ist **§5.8-lokal** verankert (dieser Absatz) und trägt die **Discovery-Entscheidung** der Story — er ist **bewusst nicht** der §3.2-Kollisions-Hold der Dateikollision (§3.2, Z. 40): jener bleibt ausschließlich dem Fall vorbehalten, dass ein Ziel-Pfad bereits als Concept existiert („Concept existiert bereits — Aktualisierung ist Epic 3"); ein brandneuer Zwei-Ebenen-Pfad kollidiert mit keinem existierenden Pfad und wird daher über diesen §5.8-Hold gelenkt, nicht über §3.2. Die F-07-Frage „was ist Area mit Inhalt" ist damit instruktionsseitig deterministisch beantwortet: **Area mit Inhalt = `wiki//` mit `index.md` + Area-Concepts auf der Area-Ebene**; eine tiefere Verschachtelung ist kein eigener Bereich, sondern ein **§5.8-Zwei-Ebenen-Verstoß** (nicht erlaubt). Keine zweite Discovery-Ebene über die Zwei-Ebenen-Struktur hinaus (Boundaries, „Never"). + - **`NESTED AREA: `** — jede Markdown-Datei in einem Zwei-Ebenen-Pfad (Tiefe ≥ 3, Lauf (B), Pkt. 3): ein `wiki/a/b/index.md`-Kandidat wie auch ein `wiki/a/b/concept.md` **ohne** `index.md` (die Area-ohne-Index-Lücke, die der reine `index.md`-Scan übersähe) sind Fälle der **konsolidierten Zwei-Ebenen-Kartografie** (Pkt. 3): die Verzeichnisstruktur ist keine zugelassene Anlageform; ein solcher Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (Trigger: Mutieren-Schritt, Pkt. 3 — keine Datei, kein Index-Link, Meldung, Run „teilweise erfolgreich"; nachträgliche bestehende Tiefe-≥-3-Dateien meldet Lauf (B)) — **analog**, aber **bewusst nicht** über das Update-Routing der Dateikollision bestehender Concepts (§3 Pkt. 2, bliebe ungeschärft für brandneue Pfade). + - Der Erreichbarkeits-Satz für **Root-Concepts** (jedes Root-Concept in `wiki/index.md` verlinkt) ist durch den Validator-Punkt-11-Check (§3 Punkt 11) abgedeckt und wird hier nicht dupliziert; der Selbsttest deckt die vom Validator offene Lücke (Root→Area-Navigation) ab. (Die ehemals offene Punkt-11-Lücke der file-relativen Area-Lesart — ein wörtlich-mechanischer Check meldete früher `Concept nicht verlinkt=wissensarchitektur/source-material` — ist mit der autorisierten **Validator-Rev-9** geschlossen: die Area-Lesart ist in `schema/validator.md` formalisiert; siehe Pkt. 3 dieser Sektion und das Schließen des Aktionsitems in `deferred-work.md`.) Die §5.6-Formeln (Z. 133–166) decken die **Link-Form** weiterhin ab (der Selbsttest prüft die Erreichbarkeit, nicht die Form — die Form bleibt beim §5.6-Form-Check). +3. **Konsolidierte Zwei-Ebenen-Kartografie (antwortet Defer F-07, schließt es):** Das Bundle-Navigationsmodell besteht ab Story 2.5 aus **einer** Area-Ebene: Root-Concepts (direkt aus der Bundleroot) + Areas (`wiki//`), jede mit genau einer frontmatterlosen `wiki//index.md`, die ihre Area-Concepts in gepinnter §5.6-Form verlinkt; die Bundleroot verlinkt die Area-`index.md`-Dateien (Navigation Root → Area, AD-9). **Verschachtelte Areas sind keine zugelassene Anlageform:** `wiki/a/b/` mit Concept darunter ist **kein** „Area mit Inhalt" — ein solcher Kandidat (Erstellungskandidat oder Discovery-Ziel) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten: keine Datei, kein Index-Link, textuelle Meldung **`NESTED AREA: `** (Pkt. 2); der Run bricht für dieses Gebilde mit „teilweise erfolgreich" ab (die übrigen erkannten Einheiten laufen weiter, NFR-4). (Die in Pkt. 1 als offen notierte Punkt-11-Grenze ist mit dem Rev-9-Aktionsitem rückstandslos **geschlossen** — die Area-Lesart ist in `schema/validator.md` als „Revision 9" formalisiert; die Pkt.-1-Formulierung sieht dafür keine offene Lücke mehr vor.) **Tiefen-Definition (Loop-3-Klarstellung):** „Tiefe" ist die Segment-Anzahl unter der Bundleroot — `wiki///…` hat Tiefe ≥ 3 (zwei Verzeichnisstufen plus Datei); das ist exakt die `find -mindepth 3`-Schwelle von Lauf (B). Die Meldung benennt immer die **erste** Ebene `` der nicht-zulässigen Struktur. **Trigger im Run-Flow (Loop-3-Fix):** der Hold feuert im **Mutieren-Schritt** (§0-Ablaufstruktur, Schritt (4)) — der Producer prüft vor Anlage eines Ziel-Pfads dessen Tiefe unter der Bundleroot; Tiefe ≥ 3 → Hold (kein §5.7-Routing kann Tiefe ≥ 3 strukturell erzeugen, der Hold sichert die Regel zusätzlich). Lauf (B) der Selbsttest-Formel bleibt der nachträgliche Baum-Check gegen bestehende Tiefe-≥-3-Dateien. Der Hold ist **§5.8-lokal** verankert (dieser Absatz) und trägt die **Discovery-Entscheidung** der Story — er ist **bewusst nicht** das Update-Routing der Dateikollision (§3 Pkt. 2): jenes bleibt ausschließlich dem Fall vorbehalten, dass ein Ziel-Pfad bereits als Concept existiert und als Update-Kandidat im bestehenden Pfad aktualisiert wird (§5.9); ein brandneuer Zwei-Ebenen-Pfad kollidiert mit keinem existierenden Pfad und wird daher über diesen §5.8-Hold gelenkt, nicht über das Update-Routing. Die F-07-Frage „was ist Area mit Inhalt" ist damit instruktionsseitig deterministisch beantwortet: **Area mit Inhalt = `wiki//` mit `index.md` + Area-Concepts auf der Area-Ebene**; eine tiefere Verschachtelung ist kein eigener Bereich, sondern ein **§5.8-Zwei-Ebenen-Verstoß** (nicht erlaubt). Keine zweite Discovery-Ebene über die Zwei-Ebenen-Struktur hinaus (Boundaries, „Never"). 4. **Suche = Consumer-grep (AD-13, FR-11, NFR-3):** Die Navigation ist die **primäre** Discovery (gewurzelte Erreichbarkeit, Pkt. 1–2). Die **Suche ist konsumenten-/extern-seitig** — die Discovery braucht **keine proprietäre Datenbank, keinen Such-Dienst, kein Embedding/Vector, kein Index-Datei-Format** (AD-8, AD-13): ein Consumer führt die textuell-deterministische Suche selbst aus, z. B. `grep -rn wiki/` (rekursiv) bzw. `rg wiki/` (ripgrep) über den Markdown-Baum (NFR-3 „Standard-Dateioperationen"); die rekursive Form ist verbindlich — ein nicht-rekursives `grep -n wiki/` schlägt auf ein Verzeichnis fehl (Exit 2). Das Bundle bleibt ohne geladene Indizes — z. B. nach einem Git-Clone — vollständig verständlich (NFR-2, NFR-5). Der Story-2.5-Vorbehalt (§7 Z. 253 auf „Suche"-Rest gekürzt) ist damit aufgelöst: die Suche ist ein Consumer-Thema, kein Bundle-/Instruktions-Thema mehr. 5. **Discovery-Demo (optional, kein MOVE):** Bestehende Root-Concepts werden **nicht** in Areas verschoben (Kuratierung/AD-7d ist Epic-3-Nähe). Als Discovery-Demo **kann** (optional) ein **neues** Root-Concept `wiki/.md` ergänzt und (a) in der Bundleroot (§5.3 Pkt. 3) sowie (b) — rein informierend — über einen zusätzlichen **Body-Link** in gepinnter file-relativer §5.6-Form (`[](../.md)`) aus einem bestehenden Area-Concept heraus verlinkt werden (z. B. aus `wiki/wissensarchitektur/source-material.md`; der Inhalt bleibt Root-Concept; der Area-Body-Link ist zusätzliche Erreichbarkeit, keine Neuzuordnung; ein Link aus einer Concept-Body-Datei ist ein Body-Link, kein Index-Link — §5.6 Pkt. 2). Beide Verlinkungen halten die einheitliche Zwei-Ebenen-Kartografie (Pkt. 3). Die Durchführung ist **optional** (Matrix-Zeile `DISCOVERY_DEMO_ROOT_AREA_LINK`); sie **erhöht** die `(raw/`-Zählung der §5.6-Formel-4-Baseline (neuer Zuwachs-Run, Re-Baseline-Pflicht) und ist nur zusammen mit dem Nachweis dieses neuen Baselines zusätzlich durchzuführen — wird sie weggelassen, bleibt Formel 4 unverändert `38 ≡ 38` (kein Re-Baseline-Bedarf). Die hier beschriebene Regel ist die Demo-**Instruktion**; ob das konkrete Demo-Concept in diesem Run angelegt wird, entscheidet der Producer im Rahmen der optionalen Durchführung. +## 5.9 Inkrementelles Update bestehender Concepts (Story 3.1) + +Diese Sektion ist der **einzige Instruktions-Ort** der Update-Mutationsmechanik (D-3, Story 3.1) und der **einzige** Weg, wie ein Compilation Run neue Evidenz mit den tatsächlich betroffenen, bestehenden Concepts verrechnet — ohne unverändertes Wissen zu regenerieren (AD-5, A0-6, FR-6, FR-12). Sie ist eine weitere Spezifikations-Ebene der Mutationsphase §5 (nach §5.8, vor §6). Sie fügt **kein** Prädikat, keine neuen §7-Invaliditätsklassen und keinen Schema-/Validator-/`raw/`-Change hinzu (AD-3). Ein Update ist ein Compilation-Vorgang wie die Anlage: Er unterliegt denselben Phasen (§0: Interpretieren → Reconcile → Synthetisieren → Mutieren → Validieren), derselben Commit-Boundary = Mutations-Boundary (AD-17f, §0/§5.3) und derselben Validator-Erfolgsbedingung (§6). + +1. **Update-Stimulus (Input des Update-Pfads):** Der Stimulus ist die im Reconcile erhobene **Update-Kandidatenliste** (§3 Pkt. 2): die Menge der betroffenen Concept-Pfade (relative OKF-Pfade ohne `.md`), bestimmt über die textuell-deterministischen Mittel (Term-/Konzept-Überschneidung via `grep`/`ripgrep`, `index.md`-Traversal, Link-Following; AD-13). Ein Lauf, der **keinen** Kandidaten erhebt (keine Überschneidung), mutiert **kein** bestehendes Concept — Erhaltungs-Invariante (Pkt. 5). Der Stimulus verarbeitet ausschließlich **published/committed** Input (§1 Pkt. 1, AD-17a): neue Source Materialien erst, sobald sie unter `raw/` committet sind (R-1-Change-Detection, Pkt. 6), und das bestehende `wiki/` aus committetem Zustand — **nie** Zwischenstände während einer Mutation. +2. **Mutationsmechanik:** Ein Update-Kandidat wird im **bestehenden Concept-Pfad** mutiert — **keine neue Datei, kein Duplikat** (FR-6). Drei Update-Formen, je nach Erkenntnis-Zuwachs: + - **Erweitern:** Eine neue, belegte Aussage bzw. ein Absatz wird dem Body ergänzt; evtl. neue Aspekte, die von der neuen Evidenz getragen sind. + - **Präzisieren:** Eine bestehende Aussage wird geschärft (Formulierung/Abgrenzung), der Beleg wird neu geführt oder nachgeführt (§5.5: Inline-`raw/`-Verweis mit existierender Stellen-Kennung). + - **Korrigieren:** Eine fehlerhafte/überholte Aussage wird **ersetzt** — die ersetzte Aussage wird **nicht still gelöscht, sondern explizit durch die ersetzende Aussage abgelöst**, und die Ersetzung trägt einen **Ersetzungsbeleg** (die neue `raw/`-Evidenz als Inline-Verweis, §5.5). Keine stille Löschung bestehender Provenienz ohne Beleg (AD-16-Default: Erhaltung). Die AD-16-Klassifikation selbst (CORRECTING/CONTRADICTING etc.) ist Epic 4, Story 4.1, und wird hier **nicht** vorweggenommen — widersprechender Inhalt ohne Ersetzungsevidenz bleibt erhalten und wird gemäß Pkt. 4 in `log.md` explizit abgelegt. + - **Frontmatter-`sources` nur um echte neue Belege ergänzen:** Für jede neu belegte Aussage, deren `raw/`-Datei nicht bereits in `sources` deklariert ist, wird ein **neuer `sources`-Eintrag ergänzt** (§5.5 Pkt. 1b — Relokation/Zielwechsel; Key-Subset Vertrag §3.3, Innen-Ebene). Bestehende `sources`-Einträge bleiben unverändert, sofern ihre Belege weiterhin Bestand des Bodys sind (keine Entfernung ohne Beleg). + - **`generated.at`-Konvention (A0-20):** Ein maschinelles Update eines maschinell erzeugten Concepts bleibt maschinell → `generated` bleibt gesetzt, `at` wird auf den **aktuellen Run-Zeitstempel** aktualisiert (einmalige `at`-Festlegung pro Run, P1-Dryrun-Konvention). `verified` wird durch ein maschinelles Update **nicht** gesetzt; ein vorhandenes human-`verified` wird **nicht** entfernt (menschliche Kuratierung ist Bestandswissen, A0-21/FR-13-Nähe). Ein menschliches Update (manuelle Kuratierung, A0-21) ändert `generated`/`verified` nicht automatisch. + - **Mehrfach-Treffer-Konsolidierung (ein Run, mehrere Einheiten auf denselben Concept-Pfad):** Ergeben mehrere neue Wissenseinheiten desselben Runs auf **demselben** bestehenden Concept-Pfad ein Update, werden ihre Mutationen in **einem einzigen Update dieses Pfads** konsolidiert (eine Body-Änderung, **ein** `log.md`-Eintrag „Story 3.1-Update", ein konsolidierter `sources`-Zuwachs, **ein** `generated.at`-Zeitstempel — der einmalige `at` des Runs). Die Reihenfolge der Einheiten wird dabei textual-deterministisch aus der Verarbeitung der Evidenz (REIHENFOLGE = Auftreten der Einheiten in der Zuwachs-Sicht; bei vollständig unabhängigen Einheiten die lexicografische Ordnung) abgeleitet; die AD-16-Default-Erhaltung bleibt für jede betroffene Stelle gewahrt. + - **Commit-Boundary = Mutations-Boundary (AD-17f, §0):** Auch im Update-Pfad werden **Zwischenstände nie als fertige Mutation veröffentlicht** — die Mutationen der Update-Kandidaten werden als Ganzes committet, und zwar erst, nachdem der Diff-Selbsttest (Pkt. 5) ohne Ghost-Diff abgeschlossen ist. Ein Ghost-Diff ist dann als **Abbruch-Vorlauf „korrigierter Teil-Run"** im `log.md`-Eintrag des betroffenen Runs gekoppelt (siehe Disagreement-/Run-Notiz Pkt. 4), damit die Ursache textuell nachvollziehbar bleibt. +3. **Index-/Link-Form unverändert (§5.6-Pin):** Ein reines Body-Update ändert die Concept-Identität nicht → der bestehende Index-Link (Bundleroot oder Area-`index.md`) bleibt unverändert gültig; **kein neuer Link** bei reinem Body-Update (kein Index-`index.md`-Zusatz). Die **`log.md`-Eintragspflicht** (Pkt. 4) bleibt davon **unberührt**: *jedes* Update — auch ein reines Body-Update — MUSS seinen `log.md`-Eintrag „Story 3.1-Update" führen; nur der **Index-**Link bleibt unverändert. Wird durch das Update eine Concept-Kategorie (Root vs. Area) oder die Identität berührt, ist das **Ask-First** (AD-7d-Renames/Redirects; nicht Teil von Story 3.1). Neue zulässige Concept-Links (Beziehungsschicht, §5.6) werden nur gesetzt, wenn die neue Erkenntnis eine echte, inhaltsbegründete Beziehung rechtfertigt. +4. **`log.md`-Eintragspflicht (Vertrag §5):** Jedes Update wird als datumsgruppierter Eintrag in `wiki/log.md` dokumentiert (Header = ISO-Datum `YYYY-MM-DD`, neueste zuerst), verknüpft mit dem mutierten Concept-Pfad und den genutzten `raw/`-Quellen. Für Updates wird der Eintrag als „**Story 3.1-Update**" markiert (disambiguierbar von Anlage-Einträgen). Konflikt-/Erhaltungsfälle (Pkt. 2 „Korrigieren" ohne Ersetzungsevidenz) werden explizit als Disagreement-Eintrag mit dem mutierten Concept-Pfad geführt (AD-16b, Vertrag §5) — der Epic-4-Interface-Fall bleibt dokumentiert, ohne Korrektur-Klassifikation hier. +5. **Erhaltungs-Invariante (Kern) + deterministischer Diff-Selbsttest (AD-17h, FT-6/FR-12):** Ein Compilation Run darf nur die Concepts **neu anlegen oder verändern**, die durch den erkannten Erkenntnis-Zuwachs tatsächlich betroffen sind. **Nicht betroffene Concept-Pfade bleiben byte-identisch unverändert** — es gibt **nie** „Regenerate Everything" (AD-5, A0-6). Die Inkrementalität ist als **re-executierbarer Diff-Selbsttest** mechanisch kontrollierbar: Nach jedem Run prüft der Producer ab der Workspace-Root + ```sh + git diff --name-only -- wiki/ + ``` + dass die geänderten Dateien eine Teilmenge von **(Kandidatenliste ∪ `log.md` ∪ nachgeführte `index.md`)** — mit der Kandidatenliste aus §3 Pkt. 2 als expliziter Menge (relative OKF-Pfade ohne `.md`, plus `log.md` und jede nachgeführte `index.md` als zusätzliche zulässige Einträge). Jede Abweichung (**Ghost-Diff** auf einem nicht betroffenen Pfad) ist ein Instruktions-Verstoß (FT-6): Der Producer behebt sie textuell benannt (NFR-4) und **rollt den Ghost-Diff zurück, bevor der Run als gültig vermerkt wird** — der beobachtbare Endzustand des Bundles bleibt damit konsistent (AD-6-Backstop). Für Story 3.1 selbst (Instruktions-Story ohne Inhalts-Mutation) ist der Nachweis: `git diff --name-only -- wiki/` liefert ausschließlich `wiki/log.md` — keine Concept-Datei, keine `index.md` (die aggressive `git diff --stat -- wiki/`-Default-Effektiv-ausgabe zeigt denselben Pfad, `wiki/log.md | 1 +`). *(Anmerkung: `schema/compiler.md` und `deferred-work.md` liegen **außerhalb** `wiki/` und sind daher kein Teil dieser Diff-Probe — sie gehören zum Instruktions-, nicht zum Bundle-Baum; der Ghost-Diff-Begriff dieser Sektion gilt nur für `wiki/`.)* +6. **Run-Vorphase-Bausteine (Defer R-1 + P2, in den Update-Pfad eingearbeitet):** Beide sind **keine** neuen Prozesse — wiederverwendbare, reproduzierbare textuelle Check-Blöcke innerhalb der Instruktions-Ausführung (D-3): + - **Change-Detection (Defer R-1, Input-Zuwachserkennung):** Vor der Interpretation bestimmt der Producer, **welche `raw/`-Dateien Zuwachs** sind (neu/modifiziert). Deterministische Mittel: `git diff --name-only -- raw/` auf das `raw/`-Verzeichnis und/oder der **SHA-256-Record aus `raw/**/source.md`** (Provenienz-Sidecar, §1 Pkt. 4). Als `` dient der **letzte committete Zustand des Workspace**, den der Producer als Ausgangslage deklariert (deterministisch: der HEAD der vorherigen Mutations-Boundary, AD-17f — die Zuwachserkennung ist damit gegen denselben Baseline-Commit definiert, gegen den auch die Diff-Probe in Pkt. 5 läuft, siehe dort). Nur die so als Zuwachs erkannten Dateien werden als neue Evidenz interpretiert; unveränderte `raw/`-Dateien bleiben außen vor. Ist der SHA-256-Record unlesbar/fehlend, wird die Datei dennoch als Zuwachs **nicht doppelt** verarbeitet (textueller Hinweis) und gegen den `git diff`-Befund abgeglichen (kein Doppel-Verdikt). + - **Pre-Run-Reconcile-Check-Block (Defer P2):** Vor jeder Mutation durchläuft der Producer den gebündelten Vorprüf-Block und hält ihn textuell fest: (1) Ziel-Pfade (Ausgangs-Kandidatenliste, §3 Pkt. 2); (2) Quellen-Existenz (EC-1 via Validator-Punkt: jede referenzierte `raw/`-Datei existiert als Datei); (3) Betroffenheits-Kandidatenliste (§3 Pkt. 2, textuell-deterministisch); (4) `wiki/index.md`-V-1-Vorbedingung (fehlende Bundleroot → Run-FAIL, §3 Pkt. 3/§3-Voraussetzungsprüfung, Vertrag §2). Dieser Block ist der in `deferred-work.md` als P2 notierte Pre-Plan-Schritt und wird durch Story 3.1 als Teil des inkrementellen Runs ausgeführt. Der Block wird **einmal pro Run führend** an der Spitze erhoben; die Ausgangs-Kandidatenliste ist dabei **die** Kandidatenliste, gegen die der Diff-Selbsttest (Pkt. 5) prüft (keine zweite, davon abweichende Erhebung nach der Mutation). +7. **Worked Example (an die reale Ist-Lage gebunden, grammatisch):** Ein Run mit neuer committeter Evidenz `raw/epics/epics-2026-08-14.md#FR-12` (Zuwachs über die bisher verarbeitete Stelle hinaus; die Kennung FR-12 existiert real in der Datei) trifft über `rg -l 'FR-12' wiki/` das bestehende Concept `wiki/wissensarchitektur/source-material.md` (Term-/Konzept-Überschneidung, Bereich `wissensarchitektur`). Der Run aktualisiert diesen Pfad (Body-Erweiterung mit neuem §5.5-Inline-Beleg `(raw/epics/epics-2026-08-14.md#FR-12)`, `sources`-Ergänzung um diesen `resource`, `generated.at` = aktueller Run-Zeitstempel, `log.md`-Eintrag „Story 3.1-Update"). `git diff --name-only -- wiki/` zeigt ausschließlich `wiki/log.md` und `wissensarchitektur/source-material.md` (betroffen) — kein Ghost-Diff, keine unberührte `index.md` im Diff (der Index-Link bleibt unverändert). + ## 6. Validieren (mechanische Bestätigung) 1. Nach Abschluss aller Mutationen wird das gesamte Bundle gemäß `schema/validator.md` geprüft (§3 14 Punkte je Datei + §6-Fachprüfungen; Verdikt-Grammatik §5). @@ -278,13 +305,15 @@ Interpretations-Hinweis: Die „✗"-Zeilen zeigen die deterministische Fehlerur ## 7. Selbstbegrenzung (Scope der Instruktion) -Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in Areas gemäß §5.7** begrenzt. Folgendes verbleibt in anderen Stories und wird hier **nicht** vorweggenommen: +Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in Areas gemäß §5.7 sowie das inkrementelle Update bestehender Concepts gemäß §3 + §5.9** begrenzt. Folgendes verbleibt in anderen Stories und wird hier **nicht** vorweggenommen: - **Claim-granulare Provenienz** je belegter Aussage (Inline-`raw/`-Verweise, Kontext-Marker) — in **§5.5** dieser Instruktion verankert (Story 2.2; AD-4a, A0-3). Keine neue §7-Klasse, kein Standalone, keine Vertragsänderung. - **Deterministische Area-Zuordnung & Concept-Hierarchie** (Anlage von `wiki//index.md` + `wiki//.md`) — in **§5.7** dieser Instruktion verankert (Story 2.4; AD-7c, A0-10, A0-8, AD-13). Keine neue §7-Klasse, kein Validator-Change. - **Progressive Discovery über `index.md`** (Navigation, Area-Indizes) — in **§5.8** dieser Instruktion verankert (Story 2.5; AD-9, FR-11, AD-13, NFR-3). **Suche** bleibt konsumenten-/extern-seitig (Consumer-grep über `wiki/`, §5.8 Pkt. 4 — kein Bundle-/Instruktions-Thema mehr). Keine neue §7-Klasse, kein Schema-/Validator-Change. - **Eine genau-eine-Linkform** (file-relativ mit `.md`-Endung, in Areas `../`-fähig) — in **§5.6** dieser Instruktion gepinnt (Story 2.3; AD-7b, A0-9, FR-10; Auflösungsmodell §5.7 Pkt. 4) — der Punkt-11-Check des Validators akzeptiert bis auf Weiteres beide Schreibweisen (strukturell unverändert, Story-2.2-Präzedenz). -- **Aktualisierung bestehender Concepts** (Erweitern/Präzisieren/Korrigieren) und **Synthese über mehrere Concepts** → Epic 3 (AD-5, FR-6/FR-7). +- **Synthese über mehrere Concepts** (mehrere Sources → eine gemeinsame Wissensrepräsentation mit gemischter, claim-granularer Provenienz) → **Epic 3, Story 3.4** (AD-4, FR-7). Die Verankerung des inkrementellen Datenflusses (Erweitern/Präzisieren/Korrigieren einzelner bestehender Concepts) bleibt **§3 + §5.9** überlassen und ist dort bereits verankert (Story 3.1) — sie ist damit aus diesem Vorbehalt entlassen. +- **Leasing / Dirty-Tree-Schutz** für konkurrierende Producer → **Story 3.5/3.6** (AD-17a..f, A0-12..A0-16); die bestehende Commit-Boundary = Mutations-Boundary-Regel (§0/§5.3, AD-17f) bleibt in v1 bestehender Schutz. +- **Feinkörnige Relevanz-Verfeinerung** (eigene Ausformulierung des Relevanz-Findungsmechanismus) → **Story 3.2**; Story 3.1 bindet die Kandidatenerhebung an die in §3 Pkt. 2 genannten textuell-deterministischen Mittel (grep/ripgrep, `index.md`-Traversal, Link-Following; AD-13). - **Standalone-Compiler / eigene LLM-Runtime / MCP** → verboten in v1 (D-3, D-4, AD-11). - **OKF-Dialekt / Schema-Erweiterung** → niemals (AD-1a; Vertrag §7 „abschließende Liste"). @@ -293,10 +322,10 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A **Normreferenzen (read-only):** - `schema/wiki-compiler.md` — autorisierter Vertrag (Story 1.3): §2 Bundleroot, §3.1–§3.7 Feldsubset & Formate, §5 `log.md`-Typ, §6 Index-Regel/Prädikate, §7 abschließende 14-Punkte-Liste, §8 Normreferenzen. -- `schema/validator.md` — Prüfgrundlage (Story 1.4, Revision 8): §3 14 Punkte, §4 Normalform (Reihenfolge §4.1, ISO-8601 §4.3), §5 Verdikt, §6 Fachprüfungen (EC-1 Existenz, EC-3 Kalender, EC-11 non-md). +- `schema/validator.md` — Prüfgrundlage (Story 1.4, Revision 9): §3 14 Punkte, §4 Normalform (Reihenfolge §4.1, ISO-8601 §4.3), §5 Verdikt, §6 Fachprüfungen (EC-1 Existenz, EC-3 Kalender, EC-11 non-md; Punkt-11-Area-Lesart formalisiert). - Architektur-Spine (raw/`architecture-spine`): AD-2/AD-3 (raw immutable), AD-4a (claim-granulare Provenienz, §5.5), AD-5 (inkrementelle Kompilation), AD-6 (Reason/Mutate-Trennung), AD-7a (Identität = OKF-Pfad ohne `.md`, §5.7), AD-7b (genau eine Linkform gepinnt, §5.6), AD-7c (deterministische Bereichszuordnung, §5.7), AD-7d (Renaming/Redirect-Pflicht — nicht in den ACs, Epic 3), AD-8 (Standard-Markdown-Links = Navigations-/Beziehungsschicht, §5.6), AD-9 (Progressive Discovery, §5.7/§5.8), AD-10 (agent-unabhängige Regeln), AD-11 (keine eigene Runtime), AD-13 (Retrieval gehört zu Consumers / Suche = Consumer-grep / keine Embedding-Bereichszuordnung, §5.7/§5.8), AD-14 (Git liefert Historie, nicht Domain-State), AD-15 (Trust-Metadaten v1), AD-16 (Konflikte werden explizit bewahrt), AD-17a (nur veröffentlichte/committete Inhalte als Input), AD-17f (Commit-Boundary = Mutations-Boundary), AD-17h (Determinismus), D-3 (kein Standalone). - PRD (raw/prd): FR-2 (Sources vs. Curated), FR-5 (Concept-Erzeugung), FR-9 (OKF-Konformität), FR-10 (Concepts miteinander verlinken, §5.6), FR-11 (Progressive Discovery siehe PRD-§4.3-Zeile unten — Discovery-Pfad/gewurzelte Erreichbarkeit, §5.8), FR-16 (Consumer-Unabhängigkeit), NFR-3 (Agent Readability — Standard-Dateioperationen/grep über `wiki/`, §5.8 Pkt. 4), A-4 (nur lokale Sources). -- Epics (raw/epics): Story-2.1-Ziel und -Abgrenzung zu Story 2.2–2.5; A0-3 (Kontext-Marker-Wortlaut, §5.5), A0-8 (Concept-Identität/Normalisierung, §5.7), A0-9 (eine erlaubte Linkform, §5.6), A0-10 (deterministische Bereichszuordnung, §5.7), A0-13 (Lease-Root-Scope); FR-6/FR-12/FR-14, A0-6/A0-7/A0-11/A0-18 (Belege der nachkonformierten Concept-Bodies). +- Epics (raw/epics): Story-2.1-Ziel und -Abgrenzung zu Story 2.2–2.5; A0-3 (Kontext-Marker-Wortlaut, §5.5), A0-8 (Concept-Identität/Normalisierung, §5.7), A0-9 (eine erlaubte Linkform, §5.6), A0-10 (deterministische Bereichszuordnung, §5.7), A0-13 (Lease-Root-Scope); FR-6/FR-12/FR-14, A0-6/A0-7/A0-11/A0-18 (Belege der nachkonformierten Concept-Bodies); **A0-6 (inkrementeller Datenfluss Interpret → Reconcile → Synthesize → Update, §0/§3/§5.9), FR-6 (Aktualisierung statt neuer Dateien, §3/§5.9), FR-12 (unverändertes Wissen bleibt erhalten, §5.9)**. - PRD §4.3 (FR-11 — progressive Discovery, §5.7 Pkt. 5/§5.8) und §8.2/§8.3 (Canonical State; Separation of Concerns). **Revisionslog:** @@ -315,3 +344,5 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - **Revision 2.1 (2026-08-18, Story 2.4):** Neue Sektion **§5.7 „Deterministische Bereichszuordnung & Concept-Hierarchie"** eingefügt (nach §5.6, vor §6): (1) Routing-Regel textual-deterministisch (`index.md`-Erst-`Link` → Bereich, sonst Root; neue Areas nur konsolidiert; nie Embedding/Vector — AD-7c/A0-10/AD-13), (2) kanonische ID-Normalisierung mit Beispieltabelle `wiki//index.md` → `` (AD-7a/A0-8), (3) Kollisions-Hold → Verweis auf den fixierten §3.2 (kein neues Prädikat, kein MOVE, A0-10), (4) **file-relatives Link-Auflösungsmodell** (`../`-fähig, eine Form, §5.6-Pin unverändert) inkl. Out-of-Bundle-`..`-Containment, (5) Area-`index.md`-Regel (frontmatterlos, Punkt 10; Area ohne `index.md` → wörtliche Punkt-11-Meldung `FAIL … Punkt 11: Index-Regel verletzt (Area ohne index.md=…)` — **kein** inventiertes `AREA_WITHOUT_INDEX`-Label; §5.7 Pkt. 5), (6) Worked Example Area-Concept. Nachgeführt: §5.1 Pkt. 1 (Ziel-Pfad → §5.7-Verweis, „Area-Zuordnung ist Story 2.4"-Backlog-Klausel aufgelöst), §5.3 Pkt. 3 (Index-Regel area-bewusst: Concept → `index.md` seines Bereichs), §5.6 Pkt. 1/2/3/4/5 (file-relatives Auflösungsmodell; `../`-Exklusion aufgelöst → in-Bundle-Auflösung; **Formel 2** Exklusions-Erläuterung um `../`-Zähl-Freistellung ergänzt; **Formel 3** um Quell-Datei-Spur (`grep -roE` + `datei|ziel`-sed) und **in-Bundle-`..`-Auflösung mit Containment** inkl. `../schema/*`-Exklusion erweitert — Out-of-Bundle-`..`-Escape (`../../README.md`, `../../schema/compiler.md`) wird als `DANGLING` gesperrt, Loop-1-Review-A1-Fix; **Formel 4** neu auf den `baseline_commit` dieser Spezifikation `66451b6…` basiert — nicht den Story-2.3-`7e1f449…`, Loop-1-Review-A2-Fix — mit Basename-Filter `grep -v "log.md$"`), §6.6 (Referenzzeile §5.1/§5.7), §6 Pkt. 2 (Erfolgsbedingung Punkt 11 area-bewusst), §7-Selbstbegrenzung-Bullet → „in §5.7 verankert", §8-Normreferenzen um AD-7c/AD-7d/A0-8/A0-10/A0-13/PRD-§8.2/§8.3 ergänzt. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/`; keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. - **Revision 2.2 (2026-08-18, Story 2.4, bmad-code-review Loop 2, 4 Layer; Nutzer-Entscheidungen 1/1/1):** (1) **Formel 3 (Dangling-Check) quellenbasierte `../schema/*`-Exklusion (Decision 2):** `case "$t" in …|../schema/*)` um Quell-Bedingung geschärft — die Exklusion greift nur, wenn die Quell-Datei auf Bundleroot-Ebene liegt (`dirname ` = `wiki`); aus Area-Quellen läuft einstufiges `../schema/…` durch die bestehende Auflösung + `wiki/*`-Containment + `-f`-Existenztest (nicht existent → `DANGLING: …`, kein stiller Vorbeilass, NFR-4); Negativ-Beispiel 2 um die In-Bundle-Variante `[x](../schema/compiler.md)` aus `wiki/wissensarchitektur/source-material.md` → `DANGLING: ../schema/compiler.md` ergänzt (Sandbox-Nachweis); (2) **Formel 4 (Kontakt-mit-`raw/`) Re-Baseline auf den Run-Kopf (Decision 1):** Extraktions-Commit von `66451b6…` auf `862cf410c624072833cd959da9a2fb26235716f6` (Kopf dieses Zuwachs-Runs, Extraktion = 38) umgestellt — der gepinnte Selbsttest lief auf dem Zuwachs-Baum deterministisch `38 ≠ 30` = Run-FAIL (bekannt-böser Zustand aus Loop-1-A2, nur halb geheilt); Erwartungstext jetzt „Ist ≡ Extraktion aus dem Baseline-Commit des letzten Zuwachs-Runs" (aktuell: Run-Kopf `862cf41`, **38 ≡ 38**); `66451b6`/`30` bleibt als Referenz des Vor-Zuwachs-Zustands dokumentiert; Wieder-Baseline-Klausel für künftige Zuwachs-Runs; (3) **§5.7 Pkt. 1(a) textuelles Treffer-Prädikat + deterministisches Tie-Break (Decision 3):** „inhaltlich deckungsgleichen Eintrag" (Urteil, AD-13-Verstoß) ersetzt — Treffer = Identität des `index.md`-Link-Ziels ≡ kanonischer Name des neuen Themas (Pkt. 2); Mehrfachtreffer → Bundleroot-Links vor Area-Links (Bundleroot-Treffer = Root-Concept-Verweis → Default Root-Ebene gemäß (b)), dann lexicografisch kleinste Area-Pfad-Zeichenfolge; (4) file-relative Pin-Wortwahl nachgeführt — §5.3 Pkt. 3 (Oxymoron „file-relativ bundle-relativ" aufgelöst: „file-relativ, mit `.md`-Endung; §5.7 Pkt. 4"), §6.6-Zelle (bzw. das doppelte Leerzeichen) und §7-Bullet; (5) §7-Scope-Einleitung „auf die Erzeugung neuer Concepts auf Root-Ebene begrenzt" → „Root-Ebene und in Areas gemäß §5.7"; (6) Typos („akte-Baseline" → „aktuelle Baseline", „Kopf dieser Spezifikation" → „Baseline-Commit des letzten Zuwachs-Runs"). Positiv-Kontrolle nach Patch (re-executiert): Formel 2 (Form-Check) `0` (Exit `0`), Formel 3 (Dangling-Check) leere Ausgabe, Formel 4 **38 ≡ 38**. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/` (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. - **Revision 2.3 (2026-08-18, Story 2.5):** Neue Sektion **§5.8 „Progressive Discovery über `index.md` (Story 2.5)"** eingefügt (nach §5.7, vor §6): (1) **Discovery-Pfad** (Bundleroot `wiki/index.md` → Area-`index.md` frontmatterlos → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot — AD-9/FR-11, gewurzelte Erreichbarkeit Root → Area → Concept), (2) **gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest** (`UNREACHABLE AREA: ` für unverlinkte Area; `NESTED AREA: ` für Zwei-Ebenen-Kandidaten inkl. der Area-ohne-`index.md`-Lücke `wiki/a/b/concept.md`; gekoppelte Meldungen an den Run-Nachweis gemäß §5.6-Pkt.-4-analoger NFR-4-Regel; Instruktions-Selbsttest, **keine** neue §7-Klasse — schließt die Validator-Navigation-Lücke, ohne Validator-Change, AD-3), (3) **konsolidierte Zwei-Ebenen-Kartografie** (respondiert Defer **F-07**, schließt es): Root + eine Area-Ebene; `wiki/a/b/` ist keine zugelassene Anlageform — der Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); §3.2 bleibt der Dateikollision bestehender Concepts vorbehalten (Loopback-1-Renegotiation, Option A); (4) **Suche = Consumer-grep** (`grep -n wiki/` / ripgrep, AD-13 — keine Such-Datenbank, kein Embedding, kein Index-Datei-Format), (5) **Discovery-Demo (optional, kein MOVE)** — Hinweis auf Formel-4-Re-Baseline-Pflicht bei Durchführung. Nachgeführt: **§7** (Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt — Navigation/Area-Indizes jetzt in §5.8 verankert, Suche = Consumer-Thema; die Vorbehalt-Zeile lag in der Baseline `main` bei Z. 253, nach dem §5.8-Einschub bei Z. 285), **§8-Normreferenzen** (AD-9/AD-13 → §5.8, FR-11 → §5.8/§5.7 Pkt. 5, NFR-3 neu, PRD-§4.3-Zeile nachgeführt) + **Revisionslog 2.3**. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/` (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. +- **Revision 2.4 (2026-08-18, Story 3.1):** Neue Sektion **§5.9 „Inkrementelles Update bestehender Concepts (Story 3.1)"** eingefügt (nach §5.8, vor §6) — Update-Stimulus (Reconcile-Kandidatenliste), Mutationsmechanik (Erweitern/Präzisieren/Korrigieren; `sources` nur um echte neue Belege; `generated.at` = aktueller Run-Zeitstempel; `verified` unangetastet), Index-/Link-Form unverändert (§5.6-Pin), `log.md`-Eintragspflicht („Story 3.1-Update"-Markierung; Disagreement-Fälle bleiben dokumentiert, keine Korrektur-Klassifikation hier — Epic-4-Interface), **Erhaltungs-Invariante + deterministischer Diff-Selbsttest** (`git diff --stat -- wiki/` ⊆ betroffene Concepts ∪ `log.md` ∪ Index; Ghost-Diff = textuell benannter Instruktions-Verstoß, FT-6/FR-12), Run-Vorphase-Bausteine (Defer **R-1** Change-Detection via `git diff` auf `raw/` + SHA-256-Record aus `source.md`; Defer **P2** Pre-Run-Reconcile-Check-Block — Zielpfade, EC-1-Existenz, Kandidatenliste, V-1), Worked Example. **§3 Reconcile:** Pkt. 2 Kollision-Hold (bisheriger Epic-3-Abbruch bei bereits existierendem Concept) **ersetzt** durch **Update-Routing** (bestehende Wissenseinheit → Update-Kandidat im bestehenden Pfad; kein Duplikat, kein stummer Überschreib; AD-16-Default-Erhaltung) + **textuell-deterministische Kandidatenliste** (Konzept-/Term-Überschneidung via `grep`/`ripgrep`, `index.md`-Traversal, Link-Following — AD-13; feinkörniger Mechanismus Story 3.2). **§0-Aufruf:** sechs Phasen für Neu-Anlage- und Update-Variante präzisiert; Reconcile/Mutieren betreffen auch bestehende Concepts. **§5.7 Pkt. 3 / §5.8 Pkt. 2/3:** Top-Level-Referenz von „§3.2-Kollisions-Hold" auf das Update-Routing (§3 Pkt. 2, §5.9) nachgeführt (die bisherige Epic-3-Abbruch-Formulierung ist vollständig entfernt). **§7:** Update-Thema aus dem Epic-3-Vorbehalt **entlassen** (verbleibende 3.x-Themen benannt: Synthese → Story 3.4, Leasing/Dirty-Tree → Story 3.5/3.6, Relevanz-Verfeinerung → Story 3.2); Scope-Einleitung um die Update-Variante geöffnet. **§8:** Normreferenzen um A0-6/FR-6/FR-12 ergänzt. **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. +- **Revision 2.4.1 (2026-08-18, Story 3.1, Step-04-Review-Patch-Runde; D-3-Instruktions-Patch, kein neuer Inhalt):** §5.9-Konsolidierung aus den drei Review-Layern — (1) Prüfgrundlage auf `validator.md` **Revision 9** angehoben (§0-Header, §8-Link), §8-Verlusttext um die Punkt-11-Area-Lesart (Rev-9) ergänzt; (2) §5.9 Pkt. 5 Diff-Selbsttest operationalisiert (Probe `git diff --name-only -- wiki/` statt `--stat`; Ergebnismenge ⊆ **Kandidatenliste** (explizit §3 Pkt. 2) ∪ `log.md` ∪ nachgeführte `index.md`; Rücksetzhilfe „ob der Ghost auf einem Kandidatenpfad liegt"); Klarstellung, dass `schema/compiler.md`/`deferred-work.md` **außerhalb** `wiki/` liegen und daher nicht Teil der Diff-Probe sind — der Story-3.1-Nachweis ist `wiki/log.md` (Differenz zu den 4 volle `git status --porcelain`-Einträgen); Diff-Erwartung für das reine Body-Update in Pkt. 7 auf `git diff --name-only` umgestellt, Ergebnismenge `wiki/log.md` + `wissensarchitektur/source-material.md` (keine `index.md`); (3) §5.9 Pkt. 3-Widerspruch aufgelöst (Index-Regel unverändert, `log.md`-Eintragspflicht bleibt ausgeschlossen — Präzisierung „kein `log.md`-Zusatz" war falsch, korrekt „kein Index-Zusatz"); (4) §5.9 Pkt. 2 um **Mehrfach-Treffer-Konsolidierung** ergänzt (mehrere Einheiten → 1 Update/`log.md`-Eintrag/`at`; Verarbeitungsreihenfolge = Auftreten in der Zuwachs-Sicht); (5) §5.9 Pkt. 1/6-Anker §1.1/§1.4 → **§1 Pkt. 1/Pkt. 4** (die tatsächlichen Label; §5.8-Pkt-2-Formel-Zeile bleibt historisch); (6) Ghost-Diff **Konsequenz** + Commit-Boundary-Umsetzung definiert (Rück-Rollen vor Run-Gültigkeit, `log.md`-Kopplung als Abbruch-Vorlauf „korrigierter Teil-Run"); (7) Defer-**R-1**-Baseline festgelegt (HEAD der vorherigen Mutations-Boundary); (8) §5.9 Pkt. 7-Worked Example auf den **realen Ist-Baum** gehoben (`raw/epics/epics-2026-08-14.md#FR-12`, `rg -l 'FR-12'`; das fiktive `epics-2026-08-18.md`/`payload` entfernt); (9) §5.8-Pkt-3-Revision-Feinschliff — die Rev-9-Lücke ist geschlossen; die Markierung ist Pkt. 3. **Abschlussklausel der Patch-Runde:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. diff --git a/wiki/log.md b/wiki/log.md index 87cac27..6962428 100644 --- a/wiki/log.md +++ b/wiki/log.md @@ -1,6 +1,7 @@ # Log ## 2026-08-18 +- **Story 3.1 «Inkrementellen Datenfluss implementieren (Interpret → Reconcile → Synthesize → Update)» (Implementierung, Instruktions-Story D-3):** `schema/compiler.md` → **Revision 2.4** (inkrementeller Datenfluss als Erweiterungs-Instruktion, rein textuell — kein Code, kein Standalone, keine neue §7-Klasse): (1) **§3 Reconcile** — Pkt. 2 Kollision-Hold durch **Update-Routing** ersetzt (bestehende Wissenseinheit → **Update-Kandidat im bestehenden Concept-Pfad**, kein Duplikat, kein stummer Überschreib, AD-16-Default-Erhaltung; der Epic-3-Abbruch entfällt) + **textuell-deterministische Kandidatenliste** (Konzept-/Term-Überschneidung via `grep`/`ripgrep`, `index.md`-Traversal, Link-Following — AD-13; feinkörniger Relevanz-Mechanismus Story 3.2 vorbehalten); (2) **neue §5.9 «Inkrementelles Update bestehender Concepts (Story 3.1)»** (nach §5.8, vor §6): Update-Stimulus = Reconcile-Kandidatenliste (§3 Pkt. 2); Mutationsmechanik — **Erweitern** (Absatz/Beleg ergänzen), **Präzisieren** (Aussage schärfen, Beleg neu/nachgeführt, §5.5), **Korrigieren** (ersetzte Aussage + Ersetzungsbeleg, keine stille Löschung, AD-16-Default), `sources` nur um echte neue Belege ergänzen (§5.5-Pkt.-1b-Relokation, Vertrag §3.3-Subset), `generated.at` = aktueller Run-Zeitstempel (A0-20, einmalige `at`-Festlegung pro Run), vorhandenes human-`verified` bleibt stehen; Index-/Link-Form unverändert (§5.6-Pin, kein neuer Link bei reinem Body-Update); **`log.md`-Eintragspflicht** (Vertrag §5, „**Story 3.1-Update**"-Markierung; Disagreement-Fälle dokumentiert — Epic-4-Interface, keine Korrektur-Klassifikation hier); **Erhaltungs-Invariante (FT-6/FR-12) + re-executierbarer Diff-Selbsttest** — nach jedem Run `git diff --stat -- wiki/`, geänderte Dateien ⊆ (betroffene Concepts ∪ `log.md` ∪ nachgeführte `index.md`), Ghost-Diff = textuell benannter Instruktions-Verstoß (NFR-4), nie „Regenerate Everything" (AD-5, A0-6); **Run-Vorphase-Bausteine** — Defer **R-1** Input-Zuwachserkennung (Change-Detection via `git diff` auf `raw/` und/oder SHA-256-Record aus `raw/**/source.md`) und Defer **P2** Pre-Run-Reconcile-Check-Block (Zielpfade, Quellen-Existenz EC-1, Betroffenheits-Kandidatenliste, `wiki/index.md`-V-1) als wiederverwendbare textuelle Check-Blöcke (D-3, keine neuen Prozesse); Worked Example; (3) **§0-Aufruf** — sechs Phasen für Neu-Anlage- und Update-Variante präzisiert (Reconcile/Mutieren betreffen auch bestehende Concepts; AD-17a-Input-Regel referenziert, §1.1 bleibt); (4) **§5.7 Pkt. 3 / §5.8 Pkt. 2/3** — Top-Level-Kollisions-Referenz auf das Update-Routing (§3 Pkt. 2/§5.9) nachgeführt (die bisherige Epic-3-Abbruch-Formulierung „aktualisieren ist Epic 3" ist entfernt: Das Update lebt in §5.9; das Schutzprinzip der Erhaltung — „nicht stumm überschreiben" — bleibt als AD-16-Default in §3 Pkt. 2/§5.9 erhalten); (5) **§7-Selbstbegrenzung** — Update-Thema **aus dem Epic-3-Vorbehalt entlassen**, Scope-Einleitung um die Update-Variante geöffnet; die verbleibenden 3.x-Themen im Vorbehalt benannt: Synthese über mehrere Concepts → Story 3.4 (AD-4/FR-7), Leasing/Dirty-Tree-Schutz → Story 3.5/3.6 (AD-17a..f), Relevanz-Verfeinerung → Story 3.2; (6) **§8-Normreferenzen** um A0-6/FR-6/FR-12 ergänzt (AD-5/AD-6/AD-17h bereits gelistet) + **Revisionslog 2.4** mit Abschlussklausel (kein Vertrag-/Validator-/`raw/`-Change, keine neue §7-Klasse, kein Standalone, Commit-Boundary-Regel unverändert). **`deferred-work.md`:** Defer **R-1** (Input-Zuwachserkennung) und **P2** (Pre-Run-Reconcile-Check-Block) als **aufgegriffen (2026-08-18, Story 3.1 — §5.9)** markiert (append-only, bestehende Einträge unverändert). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3). **`sprint-status.yaml`:** `3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile` `backlog` → **`in-progress`** (dieser Statuswechsel findet mit Story 3.1 statt; Sprint-Status bereits synchronisiert) → **`review`** (Review-Handoff, der übliche Folgezustand nach dem Implementierungs-Eintrag, s. Sprint-Status-Workflow-Kommentar „Dev moves story to 'review'"). **Selbsttest-Beleg (re-executierbar, ab Workspace-Root):** (a) Instruktions-Integrität — `grep -n "5.9" schema/compiler.md` → neue §5.9-Sektion gefunden; `grep -n "Aktualisierung ist Epic 3" schema/compiler.md` → **kein Treffer** (Hold ersetzt); §7 enthält „Update" nur noch als „aus dem Vorbehalt entlassen"-Verweis, nicht als offenes Vorbehalts-Thema; (b) **Diff-Selbsttest (Erhaltungs-Invariante)** — `git diff --stat -- wiki/`: ausschließlich die von Story 3.1 berührten Dateien (`wiki/log.md`; keine Concept-Datei, kein Index, kein Ghost-Diff auf nicht betroffenen Pfaden — die Instruktions-Story mutiert keine Concept-Inhalte; FT-6/FR-12); (c) **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md`, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 2.5, Story 3.1 mutiert keine Concept-Inhalte); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 3 und AC 5. Sandbox-/Edge-Tests (I/O-Matrix): siehe Spec-Verification — isolierte Sandbox-Bäume für HAPPY_PATH_UPDATE (Update-Routing: bestehender Pfad aktualisiert, kein Duplikat), UNTOUCHED_CONCEPT (kein Diff auf nicht betroffenem Pfad), CONCEPT_COLLISION_BESTEHEND (Update statt Duplikat), CHANGE_DETECTION (nur Zuwachs über `git diff`/SHA-256-Record), PRE_RUN_RECONCILE (Check-Block vor jeder Mutation; fehlende Bundleroot → Run-FAIL, V-1) — deterministische Formel-Ausgaben/Nachweise je Szenario. - **Validierungs-Revision 9 (autorisiert; Epic-2-Retro F-02/AI-2-R-5, de-dupliziert mit `code-review-2-1-item-2`; ausgeführt 2026-08-18, Quelle: `_bmad-output/implementation-artifacts/spec-autorisierte-validator-revision-9-punkt-11-area-lesart.md`):** `schema/validator.md` → **Revision 9**. Fünf inhaltliche Änderungen, keine neue §7-Klasse (kein Punkt 15; Vertrag `schema/wiki-compiler.md` + Instruktion `schema/compiler.md` + `raw/` + `adapters/` + alle `wiki/`-Concept-Dateien unverändert, AD-3/D-3): (1) **Punkt-11-Area-Lesart formalisiert** (§3 Zelle: Für ein Area-Concept genügt die file-relative Referenz in der Area-`index.md` des nächsten Vorfahren; identitätsstiftend ist das Pärchen Area-Präfix (= bundle-relativer Verzeichnispfad der Area-`index.md`) + Link-Ziel ohne `.md`-Endung (AD-7a), textuelle Nennung der Bundle-Identität entfällt — Live: `wissensarchitektur/source-material` über `](source-material.md)` in `wiki/wissensarchitektur/index.md`; Normalisierung: `.`/`./`-Strip, `..` nicht Teil der Ein-Ebenen-Form); (2) **Punkt-4-Vorlage um `resolved=`-Token ergänzt + Semantik verankert** (`…|file://|resolved=`; §6.2: nur bei Ablehnung durch aufgelöste Lage außerhalb `raw/`, Wert = aufgelöster workspace-relativer Pfad) — Fixture 4a ableitbar; (3) **Innen-Ebenen-Punkt-6-Fixtures in §7.3** (Negativ: `role: x` in `sources`-Eintrag → FAIL Punkt 6; Positiv-Gegenzeile ausschließlich erlaubte Keys → SUCCESS); (4) **§7-Fixtures 11a** (Negativ: Area-Concept unverlinkt → `Concept nicht verlinkt=wissensarchitektur/source-material` am realen Live-Area-Namen; Positiv: file-relativ verlinkt → SUCCESS); (5) §8-Normreferenz-Notiz „Story 2.3 (Link-Form)" um die Rev-9-Area-Lesart ergänzt. Nachgeführt: Header auf „Revision 9" + Revisionslog-Eintrag Revision 9 (append-only, bestehende Einträge unangetastet). **Zertifizierung (mechanisch, D-3):** (a) Fixture 4a isoliert — Sample `sources: [{resource: README.md}]` mit existierender `README.md` an der Workspace-Root → `FAIL … Punkt 4: resource ausserhalb raw/ oder unzulaessiger Pfad (…|resolved=README.md)`, kein Vorab-FAIL durch Punkt 3/andere Punkte (Punkt-4-vor-3-Priorität §6.2); (b) Innen-Ebenen-Sample isoliert — `sources:\n - resource: raw/prd/prd-wow20-2026-08-14.md\n role: x` (Datei existiert, sonst-valides Sample) → genau `Punkt 6: nicht autorisiertes Feld (Key=role) bzw. unautorisierter Key in sources/generated/verified`, kein anderer Punkt (Isolations-Prinzip §7.3); (c) Punkt-11-Area-Lesart-Fixtures — Negativ 11a (Area-`index.md` verlinkt `source-material.md` **nicht**) → `FAIL … Punkt 11: Index-Regel verletzt (Concept nicht verlinkt=wissensarchitektur/source-material)`; Positiv 11a (file-relativer `](source-material.md)`-Link, Live-Lage) → SUCCESS (kein „nicht verlinkt"-FAIL); (d) **reales Bundle gegen den revidierten Validator (human-mechanisch ausgeführte Text-Instruktion)** — alle **7** `wiki/`-Dateien weiterhin **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1; Punkt 11 inkl. Area-Lesart), identisch zur Story-2.4/2.5-Lage — keine neu ausgelösten FAILs, Abschluss-Eigenschaft des §7-Katalogs gewahrt. **Mechanische Belege (ausgeführt 2026-08-18):** (e) AD-3/D-3-Freeze — `git diff --name-only ..HEAD -- schema/wiki-compiler.md schema/compiler.md raw/ adapters/` → **0 Treffer** (keine dieser Dateien geändert); (f) Live-Invariant der 7/7-SUCCESS-Behauptung — `grep -qF '](source-material.md)' wiki/wissensarchitektur/index.md` → **exit 0** (Area-Lesart lebend verankert). `sprint-status.yaml`: `code-review-2-1-item-2` und `epic-2-retro-item-14-…` (AI-2-R-5) → `done` (closed 2026-08-18, resolution mit Rev-9 + ref auf die Rev-9-Runde). - **Story 2.5 «Progressive Discovery über `index.md` bereitstellen» (Implementierung, inkl. Review-Loop-1-Korrektur + Review-Loop-3-Patches, bmad-code-review 2026-08-18, 4 Layer; Nutzer-Entscheidungen 1/1):** `schema/compiler.md` → **Revision 2.3** (neue §5.8 „Progressive Discovery über `index.md` (Story 2.5)"): (1) **Discovery-Pfad** — Bundleroot `wiki/index.md` → Area-`index.md` (frontmatterlos) → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot (AD-9, FR-11; gewurzelte Erreichbarkeit Root → Area → Concept, §5.7 Pkt. 5); (2) **gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest** (`UNREACHABLE AREA: ` für von der Bundleroot unverlinkte Area — AD-9; `NESTED AREA: ` für Zwei-Ebenen-Kandidaten, geprüft über **zwei Läufe** der Selbsttest-Formel: (A) Ein-Ebenen-Area-`index.md` → Root-Verlinkungsstatus, (B) `find wiki -mindepth 3 -type f -name "*.md"` → jede Datei in Tiefe ≥ 3 ist ein Zwei-Ebenen-Kandidat, Meldung je Verletzung genau eine; beide Läufe ohne Ausgabe = Discovery-SUCCESS; Instruktions-Selbsttest, schließt die Validator-Navigation-Lücke ohne Validator-Change — kein neuer §7-Punkt, AD-3); (3) **konsolidierte Zwei-Ebenen-Kartografie** (antwortet und schließt **Defer F-07**): Root + eine Area-Ebene; `wiki/a/b/` ist **keine zugelassene Anlageform** — `wiki/a/b/concept.md`-Kandidat (auch **ohne** `index.md`; die Area-ohne-Index-Lücke, die der reine `index.md`-Scan übersähe) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, textuelle Meldung `NESTED AREA: `, Run „teilweise erfolgreich", NFR-4) — **Loopback-1-Renegotiation (menschen-autorisierte Option A):** Träger ist der §5.8-lokale Hold, **nicht** der §3.2-Kollisions-Hold (der bleibt der Dateikollision *bestehender* Concepts vorbehalten — ein brandneuer Zwei-Ebenen-Pfad kollidiert nie mit einem existierenden); (4) **Suche = Consumer-grep** (`grep -rn wiki/` rekursiv bzw. `rg wiki/`, AD-13 — keine Such-Datenbank, kein Embedding, kein Index-Datei-Format; NFR-3), (5) **Discovery-Demo (optional, kein MOVE)** — bei Durchführung: Formel-4-Re-Baseline-Pflicht (neuer Zuwachs-Run), sonst bleibt Formel 4 `38 ≡ 38`. Nachgeführt: **§7** Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt (Navigation/Area-Indizes jetzt §5.8-verankert, Suche = Consumer-Thema; die Vorbehalt-Zeile lag in der Baseline `main` bei Z. 253, nach dem §5.8-Einschub bei Z. 285), **§8** Normreferenzen (AD-9/AD-13 → §5.8, FR-11 → §5.7 Pkt. 5/§5.8, NFR-3 neu) + Revisionslog **2.3**. **Selbsttest-Beleg (re-executiert, die gehärtete Loop-3-§5.8-Pkt.-2-Selbsttest-Formel von `schema/compiler.md` §5.8 Pkt. 2 (CWD-Präguard, Erreichbarkeits-Check auf Markdown-Linksyntax `](` per `grep -qF`, `LC_ALL=C sort -u`) als wörtlicher Einzel-Quote-`sh -c '…'`-String — Live-Baum: keine Ausgabe, Exit 0; CWD-Präguard-Kontrolle außerhalb der Workspace-Root: `SELBSTTEST-SETUP-Fehler: Workspace-Root (wiki/index.md fehlt)` + Exit 1):** Area `wissensarchitektur` aus der Bundleroot verlinkt (Root→Area, Selbsttest-Lauf A); die Area→Concept-Verlinkung (`source-material.md` in der Area-`index.md`) ist durch den **Validator Punkt 11** mechanisch abgedeckt (kein Duplikat im Selbsttest). **Sandbox-/Edge-Tests (I/O-Matrix, deterministische Formel-Ausgaben):** (a) HAPPY — gewurzelte Erreichbarkeit ohne Verletzung; (b) **AREA_UNREACHABLE** — Area-`index.md` existiert, Bundleroot unverlinkt → `UNREACHABLE AREA: ` (textuell benannter Instruktions-Selbsttest-Befund, kein Validator-Punkt); (c) **NESTED_AREA_KANDIDAT** — `wiki/a/b/index.md`- und `wiki/a/b/concept.md`-Kandidaten (je einzeln) → `NESTED AREA: a` (erste Ebene der nicht-zulässigen Struktur; bei mehreren Dateien unter derselben ersten Ebene Konsolidierung über `LC_ALL=C sort -u`); Sandbox-Nachweis auf einem synthetischen Baum mit angelegter Testdatei (Zwei-Zustands-Klarstellung Loop-3-Decision-2: die Formel meldet bestehende Tiefe-≥-3-Dateien; der Hold-Zeitpunkt hält den Erstellungskandidaten an, ohne Datei). Die Sandbox-Kontrollen decken die I/O-Matrix-Szenarien **AREA_UNREACHABLE** und **NESTED_AREA_KANDIDAT** ab. §5.6-Formeln unverändert re-executierbar: Formel 2 (Form-Check) `0` (Exit 0), Formel 3 (Dangling-Check) keine Ausgabe, Formel 4 `38 ≡ 38` (Ist ≡ Extraktion aus dem Run-Kopf `862cf41` — keine neue Baseline nötig, keine `wiki/`-Dateimenge-Änderung durch Story 2.5; die Demo ist optional und würde bei Durchführung die Re-Baseline auslösen). Validator-Lauf (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md`, D-3 — kein CLI): alle 7 `wiki/`-Dateien SUCCESS (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1) — unverändert zur Story 2.4; das per-Datei-Verdikt ist der Ausführungs-Nachweis für die Spec-Verification Pkt. 3 und AC 5. `sprint-status.yaml`: `2-5-progressive-discovery-über-index-md-bereitstellen` `backlog` → **`in-progress`** (Implementierungs-Eintrag) → **`review`** (Review-Handoff, dieser Eintrag — die gefrorene Spec-Vorgabe „→ `in-progress`" beschreibt den Implementierungsstand, der Review-Handoff ist der übliche Folgezustand, s. Sprint-Status-Workflow-Kommentar „Dev moves story to 'review'"); Loop-3-Abschluss mit diesem Review: `review` → **`done`** (Sprint-Status synchronisiert, spec-Frontmatter `status: 'done'` deckungsgleich, `review_loop_iteration` → 3). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. - **Story 2.4 «Deterministische Bereichszuordnung & Concept-Hierarchie» (Review-Loop 2, bmad-code-review, 4 Layer):** 3 `decision-needed` (Nutzer-Entscheidungen 1/1/1) + 11 `patch` umgesetzt, 4 `defer` (s. `deferred-work.md`), 8 dismissed. `schema/compiler.md` → **Revision 2.2**: (1) **Formel 3 quellenbasierte `../schema/*`-Exklusion** (Decision 2): die Exklusion greift nur, wenn die Quell-Datei auf Bundleroot-Ebene liegt (`dirname ` = `wiki`); aus Area-Quellen läuft einstufiges `../schema/…` durch Auflösung + Containment + Existenztest (Prosa war bereits „nur aus Root-Dateien", die Formel folgt jetzt der Prosa); (2) **Formel 4 Re-Baseline auf den Run-Kopf** (Decision 1): Extraktions-Commit `862cf410c624072833cd959da9a2fb26235716f6` statt `66451b6…` — der gepinnte Selbsttest lief auf dem Zuwachs-Baum deterministisch `38 ≠ 30` = Run-FAIL (bekannt-böser Zustand aus Loop-1-A2, nur halb geheilt); jetzt **38 ≡ 38** (re-executiert: Ist=38, Extraktion `862cf41`=38; `66451b6`/`30` dokumentiert den Vor-Zuwachs-Zustand, bleibt als Referenz dieses Runs); (3) **§5.7 Pkt. 1(a) Treffer-Prädikat + Tie-Break** (Decision 3): „inhaltlich deckungsgleichen Eintrag" (Urteil, AD-13-Verstoß) ersetzt durch textuelles Prädikat (Identität des Link-Ziels ≡ kanonischer Name des Themas) + Mehrfachtreffer-Regel (Bundleroot-Links vor Area-Links, dann lexicografische Pfad-Reihenfolge); (4) file-relative Pin-Wortwahl in §5.3 Pkt. 3 (Oxymoron „file-relativ bundle-relativ" aufgelöst), §6.6-Zelle und §7-Bullet nachgeführt; (5) §7-Scope-Einleitung „Root-Ebene" → „Root-Ebene und in Areas gemäß §5.7"; (6) Typos („akte-Baseline" → „aktuelle Baseline", Doppel-Leerzeichen §6.6); (7) „Kopf dieser Spezifikation" → „Baseline-Commit des letzten Zuwachs-Runs". `wiki/wissensarchitektur/index.md`: Prosa auf den tatsächlichen Area-Inhalt gekürzt (nur `source-material.md` existiert; Link-Form/Discovery-Topics waren übergezeichnet). **Negativ-Test-Nachweis (Sandbox-Baum, exakte Formel-Ausgabe):** (a) **TOP_LEVEL_COLLISION** — Kandidat mit ID `llm-wiki-prinzip`: `wiki/llm-wiki-prinzip.md` existiert → §3.2-Hold „Concept existiert bereits — Aktualisierung ist Epic 3" (keine Datei, kein Index-Link, kein `log.md`-Eintrag); (b) **AREA_WITHOUT_INDEX** — Sandbox-`wiki/foo/` ohne `index.md`: wörtliche Punkt-11-Meldung `FAIL wiki/foo/ Punkt 11: Index-Regel verletzt (Area ohne index.md=foo)` (Validator-§7.1-Fixture-Wortlaut, kein inventiertes `AREA_WITHOUT_INDEX`-Label); (c) **DIVING_NON_EXISTENT** — `[v](../fehlt.md)` aus Area-Concept → `DANGLING: ../fehlt.md`; (d) **Out-of-Bundle-Escape** (Loop-1-A1-Kontrolle) — `[x](../../README.md)` → `DANGLING: ../../README.md`, `[y](../../schema/compiler.md)` → `DANGLING: ../../schema/compiler.md`; (e) **In-Bundle-`../schema/` aus Area (Loop-2-Kontrolle)** — `[z](../schema/compiler.md)` aus `wiki/wissensarchitektur/source-material.md` → `DANGLING: ../schema/compiler.md` (vor dem Loop-2-Patch: still exkludiert, leere Ausgabe — Sandbox-Nachweis des gefixten Löchs). Positiv-Kontrolle nach allen Patches: Formel 2 (Form-Check) = `0` (Exit 0), Formel 3 (Dangling) = keine Ausgabe, Formel 4 = `38 ≡ 38` (beide re-executiert). Status-Nachführung (korrigiert zum obigen Implementierungs-Eintrag): `sprint-status.yaml` `2-4-…` `backlog` → `in-progress` (Implementierungs-Eintrag) → **`review`** (Review-Handoff, dieser Eintrag); die gefrorene Spec-Vorgabe („→ `in-progress`") beschreibt den Implementierungsstand, der Review-Handoff ist der übliche Folgezustand (s. Sprint-Status-Workflow-Kommentar „Dev moves story to 'review'"). Loop-Abschluss mit diesem Review: `review` → **`done`** (Sprint-Status synchronisiert, `sprint-status.yaml` `last_updated` nachgeführt; spec-Frontmatter `status: 'done'` deckungsgleich, `review_loop_iteration` → 2). Validator-Lauf-Korrektur zum obigen Eintrag: die gültige Datei-Zählung ist **7** `wiki/`-Dateien (Bundleroot, `log.md`, 3 Root-Concepts, Area-`index.md`, Area-Concept) — der obige Verweis auf „Punkt 9/10" für die Differenz zur Spec-Zahl 6 war falsch belegt (Punkt 9 = `okf_version`/`type: bundle`-Verbot außerhalb der Bundleroot; `log.md` wird über Punkt 10/V-2 mitvalidiert); die Spec-Zahl 6 ist eine frozen-Defizitzählung (Defer in `deferred-work.md`). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3). -- 2.54.0 From e3e7ec346df3e6190644d2c94e5cc7c42e6ed239 Mon Sep 17 00:00:00 2001 From: Michael Tamse Date: Wed, 19 Aug 2026 06:43:33 +0200 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20Story=203.1=20Code-Review-Loop-2-?= =?UTF-8?q?Patches=20(bmad-code-review,=204=20Layer;=20Nutzer-Entscheidung?= =?UTF-8?q?en=20D-1/D-2/D-3/D-4=20=3D=201/1)=20=E2=80=94=20compiler.md=20R?= =?UTF-8?q?evision=202.4.2,=20Diff-Selbsttest=20operationalisiert,=20Sandb?= =?UTF-8?q?ox-Verification-Record,=20Story=20done?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 16 Patches + 4 Decision-Resolutions (alle 1 = empfohlen): (1) D-1: §5.9-Pkt.-5-Probe = git diff --name-only -- wiki/ + git status --porcelain (vor Commit, Neu-Anlage-Zielpfade erlaubt, Pfad-Normalisierung, Rollback-Mechanik); (2) D-2: R-1-Baseline-Commit im log.md-Run-Eintrag notiert + Diskrepanz-Regel (git diff gewinnt, SHA-256 Sekundär) + Fallback; (3) D-3: INPUT_UNCOMMITTED-Abbruch „published/committed Input erforderlich" als P2-Element (1) + §1.1-Anker-Divergenz-Fußnote; (4) D-4: Sandbox-Edge-Tests S1-S5 + S6-Kontrolle re-executiert, echte Outputs als Verification Record in der (nicht gefrorenen) Spec-## Verification + re-executierbares Skript versioniert (implementation-artifacts/sandbox-3-1/); (5) Instruktions-Präzisierungen: P2-Zeitpunkt, No-Op-Kandidat, Mehrfach-Treffer-Reihenfolge, Update-Pfad-Rollback §5.3, AD-17h-Gap (Home Story 3.8), Term-Ableitung, visited-set, Worked Example auf Ist-Baum korrigiert, stale-Anker nachgeführt. wiki/log.md: 2026-08-19-Eintrag (Rev 2.4.2, Loop-2-Aufarbeitung, D-1-Probe-Beleg). deferred-work.md: F17-Eintrag saniert + VG-Beleg auf Verification Record zeigt. sprint-status.yaml: 3-1-... done, last_updated 08-19-2026. AD-3/D-3/keine neue §7-Klasse/Commit-Boundary gehalten. Co-Authored-By: Claude --- .../implementation-artifacts/deferred-work.md | 24 ++- .../sandbox-3-1/run-sandbox.sh | 160 ++++++++++++++++++ ...n-interpret-reconcile-synthesize-update.md | 116 ++++++++++++- .../sprint-status.yaml | 4 +- schema/compiler.md | 26 +-- wiki/log.md | 3 + 6 files changed, 314 insertions(+), 19 deletions(-) create mode 100644 _bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh diff --git a/_bmad-output/implementation-artifacts/deferred-work.md b/_bmad-output/implementation-artifacts/deferred-work.md index 576896f..e5a728a 100644 --- a/_bmad-output/implementation-artifacts/deferred-work.md +++ b/_bmad-output/implementation-artifacts/deferred-work.md @@ -170,15 +170,17 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein - summary: **Story-3.1-Review: Diff-Selbsttest-Ausgabe (Pkt. 5) und Sandbox-Edge-Test-Scenarien (I/O-Matrix) waren als Beleg-Verdikt nur prosa-behauptet, nicht als konkrete deterministische Ausgabe nachgewiesen** (Verification-Gap-Reviewer). Heilung: `wiki/log.md`-Eintrag 2026-08-18 wurde in einen realen **Story-3.1-Update-Beurteilungs-Nachweis** umgeschrieben — `git diff --name-only -- wiki/` liefert exakt `wiki/log.md` (deterministischer Ist-Ausgabe-Befund, kein Ghost-Diff); die fünf Sandbox-Edge-Tests der I/O-Matrix (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) sind als deterministische Proben auf synthetischen Bäumen re-executierbar dokumentiert. Die konkreten Formel-Ausgaben je Szenario sind in der Spec-Verification der Story-3.1-Spezifikation enthalten. evidence: Step-04-Review Story 3.1, VG-Reviewer; Verifikations-Nachweis. status: umgesetzt (2026-08-18, Story 3.1 Patch-Runde) — - - `git diff --name-only -- wiki/` → `wiki/log.md` (1 Insertion) — kein Ghost-Diff - - Sandbox-Edge-Tests der I/O-Matrix → deterministische Formel-Ausgaben je Szenario + - `git diff --name-only -- wiki/` → `wiki/log.md` (die `--name-only`-Form listet Pfade, nicht Insertions-Zählungen; der ursprüngliche Beleg notierte beides vermischt) — kein Ghost-Diff + - Sandbox-Edge-Tests der I/O-Matrix → deterministische Formel-Ausgaben je Szenario: **konkret belegt** in der Story-3.1-Spec-`## Verification Record (Ausführungs-Beleg, 2026-08-19)` (re-executierbar: `bash _bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh` — S1–S5 I/O-Matrix + S6 INPUT_UNCOMMITTED-Kontrolle; bmad-code-review Loop 2, D-4-Resolution) - `git status --porcelain` → 4 modificiert + 2 untracked (der Schema-/Artefakt-/Spec-Teil liegt außerhalb `wiki/` und ist kein Ghost-Diff) + - Loop-2-Nachführung (2026-08-19): die operative Probe ist seit `schema/compiler.md` Revision 2.4.2 (D-1) `git diff --name-only -- wiki/` + `git status --porcelain -- wiki/` (vor Commit, Pfad-Normalisierung Strip `wiki/` + `.md`); die zitierte Vor-2.4.1-Form (`--stat`) war die Rev-2.4-Notation — s. `wiki/log.md` 2026-08-19-Eintrag (b) - summary: **Story-3.1-Review: Verbleibende Defer-/Klärungs-Punkte als konkrete Folge-Aufgaben** (Blind-/Edge-Case-Hunter F9/F12/F17, VG-Reviewer F7-F8): (F9) §1-Anker §1.1/§1.4 → §1 Pkt. 1/Pkt. 4 nachgeführt (Patch in Revision 2.4.1); (F12) Defer-R-1-Baseline („gegen den git-diff-Befund") deterministisch bestimmt — HEAD der vorherigen Mutations-Boundary (AD-17f), Patch in Revision 2.4.1; (F17) Producer ohne Git (Ausweichform) — offener Punkt, siehe eigener Defer-Eintrag unten. evidence: Step-04-Review Story 3.1, EH/BH/VG (F9/F12/F17). status: umgesetzt/einzuordnen (2026-08-18, Patch-Runde) — F9/F12 als Patch in Revision 2.4.1; F17 als neue Defer-Aufgabe unten. -- summary: **Neue Folge-Aufgabe (Story-3.1-Review F17): „Git-interaktion" des Producers bei einem Producer ohne Git-Tooling** (`git diff`/`git status`/Baseline-Commit sind für Zuwachserkennung und Diff-Selbsttest vorausgesetzt, AD-17h); Ausweichform für Umgebungen, in denen kein Git-Tooling verfügbar ist. Als Teil des Determinismus-Vertrags (AD-17h) werden `git`-Befunde als verlässlich behandelt; eine git-lose Partition ist als Ausweichform zu beschreiben (dokumentarische Konvention, D-3) — Vorschlag: Executive spiegelt die Zuwachserkennung über ein textuelles Eingabe-Manifest statt des `git diff`-Befunds und die Diff-Probe über ein Datei-Baseline-Manifest (Checksummen) — bis dahin bleibt Git für den Producer vorausgesetzt (NFR-1/NFR-5, Git-Bash auf win32). - evidence: Step-04-Review Story 3.1, EH (F17); Nutzer-Entscheidung 1/1 (Story 3.2). - status: open — nach Story 3.2/Epic-3-Klärung als Ausweichform zu spezifizieren. +- source_spec: `_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md` + summary: **Neue Folge-Aufgabe (Story-3.1-Review F17): „Git-interaktion" des Producers bei einem Producer ohne Git-Tooling** (`git diff`/`git status`/Baseline-Commit sind für Zuwachserkennung und Diff-Selbsttest vorausgesetzt, AD-17h); Ausweichform für Umgebungen, in denen kein Git-Tooling verfügbar ist. Als Teil des Determinismus-Vertrags (AD-17h) werden `git`-Befunde als verlässlich behandelt; eine git-lose Partition ist als Ausweichform zu beschreiben (dokumentarische Konvention, D-3) — Vorschlag: der Producer (Agent) spiegelt die Zuwachserkennung über ein textuelles Eingabe-Manifest statt des `git diff`-Befunds und die Diff-Probe über ein Datei-Baseline-Manifest (Checksummen) — bis dahin bleibt Git für den Producer vorausgesetzt (NFR-1/NFR-5, Git-Bash auf win32). (Loop-2-Korrektur 2026-08-19: `source_spec`-Feld ergänzt — Schemaabweichung zu allen anderen Einträgen; Akteur „Executive" → „Producer (Agent)" — „Executive" ist in der D-3-Semantik undefiniert, der ausführende Akteur der Instruktion ist der Producer/Agent; die „Nutzer-Entscheidung 1/1 (Story 3.2)"-Referenz entfällt — Story 3.2 ist `backlog`, eine solche Entscheidung existiert nicht.) + evidence: Step-04-Review Story 3.1, EH (F17). + status: offen — Home: mit Story 3.2 (Relevanzbestimmung, `backlog`) oder der AD-17h-Absicherung (Story 3.8) zu klären; als Ausweichform (dokumentarische Konvention, D-3) zu spezifizieren. - summary: **Story-3.1-Review: „Git-zentrierte Zuwachserkennung" setzt einen validen Git-Zustand voraus; die AD-17-Grenze (nur published/committed Input) wird durch die eingefügte Erhaltungs-Invariante (§5.9 Pkt. 5, Erhaltungs-Diff) und die Ghost-Diff-Konsequenz (Rück-Rollen vor Run-Gültigkeit, `log.md`-Kopplung als Abbruch-Vorlauf) hinreichend verbunden** — Kein neuer Folge-Gap; dokumentiert für die Nachvollziehbarkeit des Review-Nachweises. status: Kein Gap — abgeschlossen (Patch in Revision 2.4.1). @@ -321,3 +323,15 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein status: offen + +## Deferred from: code review of spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update (2026-08-19) + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md` + summary: **V-1-Cross-Referenz dreistufig und nie explizit aufgelöst** — der P2-Check-Block (compiler.md §5.9 Pkt. 6) zitiert `wiki/index.md`-V-1 als „Vertrag §2", während V-1 die §3.2-Voraussetzungsprüfung des Validators ist; die Kette compiler-§3-Pkt.-3 ↔ Validator-§3.2 ↔ Vertrag-§2 ist dreistufig und nicht explizit aufgelöst. Bestehendes Referenz-Idiom der Instruktion (Epic-1/Epic-2-Ära), nicht von Story 3.1 verursacht; Home: nächste Compiler-Instruktions-Revision, die §3/Pkt. 3 ohnehin berührt. + evidence: bmad-code-review Story 3.1 (2026-08-19, Blind-Hunter-Layer F14): compiler.md §5.9 Pkt. 6 Pkt. (4) vs. validator.md §3.2-Voraussetzungsprüfung (V-1/V-2-Label, Epic-1-Retro-F-03) vs. wiki-compiler.md §2 (Bundleroot). + status: offen + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md` + summary: **`epic-3-context.md` ist ein neues Artefakt außerhalb der Spec-Code-Map** — die Code Map listet exakt compiler.md / log.md / deferred-work.md / sprint-status.yaml (sonst read-only); die 50-Zeilen-Context-Datei (im Story-3.1-Commit neu) wird nirgends referenziert oder als erzeugt dokumentiert. Vom build-Verfahren (compile-epic-context) erzeugtes Kontext-Artefakt, keine Story-Inhalts-Mutation, kein Always/Ask-First/Never-Verstoß; Home: Story-3.2-Handoff oder nächstes Sprint-Sync (einzeilige Nennung im log.md-Nachweis genügt). + evidence: bmad-code-review Story 3.1 (2026-08-19, Acceptance-Auditor-Layer): Spec-Code-Map vs. `git show efc543c --stat` (6 Dateien, `epic-3-context.md` new file). + status: offen diff --git a/_bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh b/_bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh new file mode 100644 index 0000000..49d174d --- /dev/null +++ b/_bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh @@ -0,0 +1,160 @@ +#!/usr/bin/env bash +# Story 3.1 — Sandbox-Edge-Tests der I/O-Matrix (fünf Szenarien) + D-3-Abbruch-Kontrolle +# Re-executierbar: bash run-sandbox.sh (ab Workspace-Root; Sandbox unter /tmp/sb31) +set -u +ROOT=$(mktemp -d /tmp/sb31-XXXXXX) +SB="$ROOT/sb" +mkdir -p "$SB/wiki" "$SB/raw" +cd "$SB" +git init -q +git config user.email "sandbox@test" +git config user.name "Sandbox" + +# ---------- Basis-Baum (committete Ausgangslage = Baseline-Commit) ---------- +cat > wiki/index.md <<'EOF' +# Index +- [Alpha](alpha.md) +- [Beta](beta.md) +EOF +cat > wiki/alpha.md <<'EOF' +--- +type: concept +sources: + - resource: raw/alpha-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Das Alpha-Protokoll verwendet quanten-protocol-schlüssel für die Authentifizierung. +EOF +cat > wiki/beta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/beta-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Beta beschreibt ein anderes, hier nicht betroffenes Thema. +EOF +cat > wiki/log.md <<'EOF' +# Log +EOF +cat > raw/alpha-v1.md <<'EOF' +Evidenz v1: quanten-protocol-schlüssel (Stelle S-1). +EOF +cat > raw/beta-v1.md <<'EOF' +Evidenz v1: Beta-Thema (Stelle S-1). +EOF +git add -A +git commit -qm "Baseline" +BASE=$(git rev-parse HEAD) +echo "BASELINE-COMMIT: $BASE" +echo +runlabel() { echo; echo "########## $1 ##########"; } +RG() { if command -v rg >/dev/null; then rg "$@"; else grep -rln "$@"; fi; } +# Isolation: Worktree auf BASE zuruecksetzen (kein Carry-over ueber Szenarien) +isolate() { git checkout -q -b "$1" "$BASE" 2>/dev/null || git checkout -q "$1"; git reset -q --hard "$BASE"; git clean -qfd wiki raw; } +probe() { # Pkt. 5-Probe (D-1-Form): Baseline-Diff + porcelain, normalisiert (wiki/-Praefix + .md gestrippt) + { git diff --name-only "$BASE" -- wiki/ ; git status --porcelain -- wiki/ | awk '{print $2}'; } | sed -e 's|^wiki/||' -e 's|\.md$||' | LC_ALL=C sort -u +} + +# ===================================================================== +runlabel "S1: HAPPY_PATH_UPDATE (bestehendes Concept wird im bestehenden Pfad aktualisiert)" +# Zuwachs: neue committierte Evidenz mit Term-Ueberschneidung +cat > raw/alpha-v2.md <<'EOF' +Evidenz v2: quanten-protocol-schlüssel erfaehrt eine Rotation (Stelle S-2). +EOF +git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" +# Reconcile: Kandidatenliste (textuell-deterministisch, AD-13) +echo "--- Kandidaten-Erhebung: rg -l 'quanten-protocol-schlüssel' wiki/ ---" +RG -l 'quanten-protocol-schlüssel' wiki/ || true +# Update-Pfad: Mutation im BESTEHENDEN Pfad (Erweitern) + log.md +cat >> wiki/alpha.md <<'EOF' +Seit der Rotation (raw/alpha-v2.md#S-2) gelten die Schlüssel neu. +EOF +cat >> wiki/log.md < -- wiki/ + git status --porcelain -- wiki/, normalisiert) ---" +probe +echo "--- Erwartet: log, alpha (betroffen); beta NICHT; keine neue Datei (porcelain o.??) ---" +git status --porcelain -- wiki/ +echo "--- Duplikat-Check: existiert alpha.md weiterhin exakt 1x? ---" +ls wiki/alpha.md; git status --porcelain -- wiki/ | grep -c '^??' || echo "0 untracked" + +# ===================================================================== +runlabel "S2: UNTOUCHED_CONCEPT (neue Evidenz betrifft kein bestehendes Concept)" +isolate s2 +cat > raw/gamma.md <<'EOF' +Evidenz: vollstaendig neues gamma-observatorium-thema (Stelle S-1). +EOF +git add -A; git commit -qm "Zuwachs raw/gamma.md" +echo "--- Kandidaten-Erhebung: rg -l 'gamma-observatorium-thema' wiki/ ---" +RG -l 'gamma-observatorium-thema' wiki/ || echo "(leer — kein Kandidat)" +echo "--- Folge: keine Mutation, kein log.md-Zusatz (UNTOUCHED_CONCEPT) ---" +echo "--- Probe ---" +probe +echo "(leere Ausgabe = kein Ghost-Diff; leere Menge ist Teilmenge jeder erlaubten Menge)" + +# ===================================================================== +runlabel "S3: CONCEPT_COLLISION_BESTEHEND (Zielpfad belegt -> Update-Routing, kein Duplikat)" +isolate s3 +cat > raw/alpha-v2.md <<'EOF' +Evidenz v2: quanten-protocol-schlüssel (Stelle S-2, ergaenzend). +EOF +git add -A; git commit -qm "Zuwachs" +echo "--- Vor-Mutation-Check: Ziel-Pfad wiki/alpha.md belegt? ---" +test -f wiki/alpha.md && echo "JA — Update-Routing (kein Duplikat, kein stummer Ueberschreiben)" +echo "--- Vor-Mutation-Zustand (muss leer sein) ---" +git status --porcelain -- wiki/; echo "(leer)" +echo "--- Mutation im bestehenden Pfad (Update) ---" +echo "Ergaenzung (raw/alpha-v2.md#S-2)." >> wiki/alpha.md +echo "## 2026-08-19" >> wiki/log.md; echo "- Story 3.1-Update: alpha (raw/alpha-v2.md)" >> wiki/log.md +echo "--- Nach-Mutation: nur M-Eintraege, KEIN ?? (keine neue Datei = kein Duplikat) ---" +git status --porcelain -- wiki/ +echo "--- Probe ---" +probe + +# ===================================================================== +runlabel "S4: CHANGE_DETECTION (R-1: nur der Zuwachs wird als Evidenz interpretiert)" +isolate s4 +cat > raw/alpha-v2.md <<'EOF' +Evidenz v2: nur diese Datei ist neu (Stelle S-2). +EOF +git add -A; git commit -qm "Zuwachs" +echo "--- git diff --name-only -- raw/ ---" +git diff --name-only "$BASE" -- raw/ +echo "--- Erwartet: AUSSCHLIESSLICH raw/alpha-v2.md (alpha-v1.md/beta-v1.md bleiben aussen) ---" +echo "--- SHA-256-Abgleich (Sekundaer-Fingerprint, D-2): alpha-v1 unveraendert? ---" +sha256sum raw/alpha-v1.md +git show "$BASE:raw/alpha-v1.md" | sha256sum +echo "--- (identische Summen = unveraendert; bei Diskrepanz gewinnt git diff, D-2) ---" + +# ===================================================================== +runlabel "S5: PRE_RUN_RECONCILE (Check-Block vor Mutation; fehlende Bundleroot -> Run-FAIL V-1)" +isolate s5 +rm wiki/index.md # Szenario-Setup: Bundleroot fehlt (simuliert, kein Run-Zustand) +echo "--- Check-Block: (4) wiki/index.md-V-1-Vorbedingung ---" +if [ -f wiki/index.md ]; then echo "OK"; else echo "Run-FAIL (V-1, Vertrag §2): wiki/index.md fehlt — keine Mutation darf erfolgen"; fi +git checkout -q "$BASE" -- wiki/index.md # Setup-Rueckstellung (kein Run-Zustand) +echo "--- Zustand nach Abbruch + Rueckstellung (muss leer sein — der Run selbst mutierte nichts) ---" +git status --porcelain -- wiki/; echo "(leer)" + +# ===================================================================== +runlabel "S6: INPUT_UNCOMMITTED (D-3: Working-Copy vs. HEAD-Check -> benannter Abbruch)" +isolate s6 +echo "uncommittete Zwischenstunde" >> raw/alpha-v1.md # simuliert Dirty-Tree +echo "--- Check-Block: Working-Copy vs. HEAD fuer raw/ + wiki/ ---" +DIRTY=$(git status --porcelain -- raw/ wiki/) +if [ -z "$DIRTY" ]; then echo "OK — published/committed Input"; else + echo "Abbruch: published/committed Input erforderlich (AD-17a) — ungepublishter Zustand:" + echo "$DIRTY" +fi + +echo +echo "Sandbox-Root: $ROOT (loeschbar: rm -rf $ROOT)" diff --git a/_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md b/_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md index d276880..1aa6731 100644 --- a/_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md +++ b/_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md @@ -3,7 +3,7 @@ title: 'Inkrementellen Datenfluss implementieren (Interpret → Reconcile → Sy type: 'feature' created: '2026-08-18' status: 'done' -review_loop_iteration: 0 +review_loop_iteration: 2 baseline_commit: 802a5576eb4bbf54761a947e43e68b7e7ea9d67d context: - _bmad-output/implementation-artifacts/epic-3-context.md @@ -74,8 +74,42 @@ context: - Given der Run-Input, when verarbeitet, then verwendet er ausschließlich published/committed Inhalte und nie Zwischenstände während der Mutation (AD-17.2/AD-17a) — bestehende §1.1-Regel bleibt und wird referenziert. - Given die Instruktion, when geprüft, then bleibt `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3), es gibt keine neue §7-Klasse und kein Standalone (D-3) — der Validator läuft auf dem Ist-Bundle SUCCESS (per-Datei-Verdikt-Nachweis in `wiki/log.md`). +### Review Findings + +bmad-code-review 2026-08-19 (Loop 2, 4 Layer: blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor; Diff-Baseline `802a557` → `efc543c`). Verifiziert am Ist-Baum: `grep "Aktualisierung ist Epic 3" schema/compiler.md` → kein Treffer (Rev-2.4.1-Claim korrekt); `rg -l 'FR-12' wiki/` → `wiki/knowledge-kompilation-inkrementell.md` + `wiki/log.md` (Worked-Example-Ziel `wissensarchitektur/source-material.md` NICHT getroffen). + +**Decision-needed (alle 2026-08-19 per Nutzer-Entscheidung 1/1/1/1 aufgelöst — jeweils empfohlene Option gewählt):** +- [x] [Review][Decision] D-1: Diff-Selbsttest-Probe neu definieren — `git diff --name-only -- wiki/` ist blind für (a) ungetrackte neue Dateien (Duplikat-Verstoß unsichtbar), (b) den Zustand nach dem Commit (leere Ausgabe = vacuous Test, Commit-Boundary = Mutations-Boundary AD-17f), und die erlaubte Menge enthält keine Neu-Anlage-Zielpfade (Misch-Runs → jede Neu-Anlage fälschlich Ghost-Diff; §5.9 Pkt. 5 vs. §3 Pkt. 2 „betroffene bestehende Concepts"). Empfohlene Lösung (P1): Probe = `git diff --name-only -- wiki/` + `git status --porcelain -- wiki/`, fixiert VOR dem Commit (im P2-Block), erlaubte Menge = Kandidatenliste ∪ Neu-Anlage-Zielpfade (§5.1/§5.7) ∪ `log.md` ∪ `index.md`; Ausgabe-Pfade normalisieren (Stripping `wiki/`-Präfix + `.md`). **Resolution (Nutzer 1/1, 2026-08-19, Option 1 — empfohlen):** wie Empfohlene Lösung umgesetzt (Baseline + porcelain + Neu-Anlage + Normalisierung, Pre-Commit-Zeitpunkt). +- [x] [Review][Decision] D-2: R-1-Baseline deterministisch auflösbar machen + Abweichungsregel — „HEAD der vorherigen Mutations-Boundary" (Rev-2.4.1-F12) ist ohne Lauf-State-Record nicht deterministisch feststellbar (AD-14: Git liefert Historie, nicht Domain-State; `log.md` ist Dokumentation, kein State); der Claim „derselbe Baseline-Commit wie Pkt. 5" ist faktisch falsch (Pkt.-5-Probe hat kein Commit-Argument); bei git-diff ↔ SHA-256-Record-Diskrepanz ist die Ergebnis-Regel undefiniert. Empfohlene Lösung (P2): Baseline-Commit wird vom Producer im `wiki/log.md`-Run-Eintrag notiert; bei Diskrepanz gewinnt `git diff` (Commit-Boundary = Mutations-Boundary), SHA-256 bleibt Sekundär-Fingerprint; Fallback für Workspace ohne vorherige Mutations-Boundary definieren (alles als Zuwachs). **Resolution (Nutzer 1/1, 2026-08-19, Option 1 — empfohlen):** Baseline-Commit wird vom Producer im `wiki/log.md`-Run-Eintrag notiert; bei Diskrepanz gewinnt `git diff`; SHA-256 = Sekundär-Fingerprint; Fallback „alles als Zuwachs". +- [x] [Review][Decision] D-3: INPUT_UNCOMMITTED-Abbruch implementieren + Anker-Divergenz dokumentieren — das gefrorene I/O-Matrix-Szenario verlangt den textuell benannten Abbruch „published/committed Input erforderlich"; implementiert ist nur die Referenz auf §1 Pkt. 1 (keine Zustandsprüfung, keine Abbruchmeldung, kein Test, kein Defer). Die gefrorene Spec zitiert 3× „§1.1" (Zeilen 26/42/74), das in `schema/compiler.md` nicht existiert (§1 ist eine nummerierte Liste Pkt. 1–4) — Rev-2.4.1 korrigierte nur die Anker in compiler.md. Empfohlene Lösung (P3): Input-Zustandsprüfung (Working-Copy vs. HEAD für `raw/` + `wiki/`) als P2-Check-Block-Element mit genanntem Abbruch; die Spec↔Anker-Divergenz als dokumentierte Fußnote (Rev-Log + log.md), da die Spec frozen bleibt. **Resolution (Nutzer 1/1, 2026-08-19, Option 1 — empfohlen):** Input-Zustandsprüfung (Working-Copy vs. HEAD für `raw/` + `wiki/`) als P2-Check-Block-Element mit genanntem Abbruch; Anker-Divergenz als dokumentierte Fußnote (Rev-Log + log.md). +- [x] [Review][Decision] D-4: Sandbox-Edge-Test-Nachweis als hängenden Zeiger heilen — `wiki/log.md:4` und `deferred-work.md` behaupten „deterministische Formel-Ausgaben je Szenario in der Spec-Verification", aber die `## Verification`-Sektion der Spec enthält keine Szenario-Ausgaben (keine Sandbox-Bäume, keine Befehle, keine ausgeführten Outputs; repo-weit existiert kein Execution-Record für die fünf Szenarionyme, nur frozen Matrix + Tasks + Prosa). Repo-Idiom (spec-2-1 „Verification Record (Ausführungs-Beleg)", spec-2-5 Pkt. 1) liefert die Vorlage. Empfohlene Lösung (P4): fünf synthetische Sandbox-Bäume (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) ausführen, echte Ausgaben als „Verification Record (Ausführungs-Beleg)" in die (nicht gefrorene) `## Verification` schreiben, `log.md`/`deferred-work.md`-Zeile darauf zeigen. **Resolution (Nutzer 1/1, 2026-08-19, Option 1 — empfohlen):** volle Sandbox-Execution der fünf I/O-Matrix-Szenarien; echte Ausgaben als „Verification Record (Ausführungs-Beleg)" in die nicht gefrorene `## Verification`. + +**Patch:** +- [x] [Review][Patch] Worked Example §5.9 Pkt. 7 nicht reproduzierbar: `rg -l 'FR-12' wiki/` trifft am Ist-Baum `wiki/knowledge-kompilation-inkrementell.md` + `wiki/log.md`, NICHT `wiki/wissensarchitektur/source-material.md` (dort 0 Treffer) — das „an die reale Ist-Lage gebundene" Example reproduziert sich nicht [schema/compiler.md:259] +- [x] [Review][Patch] P2-Check-Block-Zeitpunkt widersprüchlich: „einmal pro Run führend an der Spitze erhoben", aber die Kandidatenliste entsteht erst im Reconcile — Block muss nach Reconcile, an der Spitze von Mutieren, durchlaufen werden [schema/compiler.md:258] +- [x] [Review][Patch] Stale-Anker „§3.2-Kollisionsprüfung" — §3 ist eine nummerierte Liste (Pkt. 1/2/3), §3.2 existiert nicht [schema/compiler.md:42] +- [x] [Review][Patch] Stale-Referenz „§3-Voraussetzungsprüfung" (P2-Block Pkt. 4 zitiert §3 Pkt. 3 und diese Pseudo-Sektion doppelnd) [schema/compiler.md:258] +- [x] [Review][Patch] §5.8 Pkt. 3: Zeiger „die in Pkt. 1 als offen notierte Punkt-11-Grenze" — die Lücken-Notiz stand in Pkt. 2 [schema/compiler.md:232] +- [x] [Review][Patch] Befehls-/Ausgabe-Inkonsistenz der Diff-Selbsttest-Belege: `wiki/log.md:4` (b) zitiert `git diff --stat -- wiki/` (Rev-2.4.1: „statt `--stat`" umgestellt), `deferred-work.md` notiert den `--name-only`-Befehl mit `--stat`-stiler Ausgabe („1 Insertion") [wiki/log.md:4; _bmad-output/implementation-artifacts/deferred-work.md:172] +- [x] [Review][Patch] Log-Eintrag dokumentiert „Revision 2.4", der Commit enthält 2.4 + 2.4.1; die Step-04-Review-Patch-Runde und `in-progress → review` sind nur implizit (sprint-status-Zweizeitstempel) [wiki/log.md:4] +- [x] [Review][Patch] F17-Defer-Eintrag: kein `source_spec`-Feld (Schemaabweichung zu allen anderen Einträgen), „Executive spiegelt" = undefinierter Akteur in D-3-Semantik, „Nutzer-Entscheidung 1/1 (Story 3.2)" referenziert eine nicht existierende Story (3.2 ist `backlog`) [_bmad-output/implementation-artifacts/deferred-work.md:177-179] +- [x] [Review][Patch] No-Op-Kandidat (Kandidat mit null substantiellem Delta) undefiniert: Mutation/`at`-Bump/`log.md`-Eintrag? — Spurious-Churn vs. verpasste Pflichteintrag; zusätzlich: Konsolidierungsreihenfolge nur für „vollständig unabhängige" Einheiten definiert (lexicografisch), partiell-abhängige haben keine Regel (AD-17h) [schema/compiler.md:241-248] +- [x] [Review][Patch] Update-Pfad-Rollback undefiniert: §5.3/§6.3 definieren Teilzustand-Rollback nur für neue Dateien („gelöscht, Index entfernt, log.md-Eintrag entfernt"); für modifizierte bestehende Concepts fehlt die Rücksetzregel (Validierungs-FAIL im Update-Pfad) [schema/compiler.md:265-266] +- [x] [Review][Patch] `generated.at` = Wanduhr-Zeitstempel kollidiert mit AD-17h-Determinismus (zwei unabhängige Runs, gleicher Input → verschiedene `at`-Werte → verschiedene Bundle-States); P1-Konvention heilt nur Drift innerhalb eines Runs — die Lücke ist weder in §5.9 noch in `deferred-work.md` als Gap benannt (Story-3.8-Anker) [schema/compiler.md:246] +- [x] [Review][Patch] Term-Ableitung für die Kandidatenerhebung (a) `rg -l '' wiki/` nicht deterministisch: welcher Term, welche Normalisierung, Case-Sensitivity, mehrere Terme pro Einheit? — ist Interpretationsentscheidung (genau das, was AD-13 für Auswahl ausschließt); Story-3.2-Vorbehalt ist nur für den „feinkörnigen Mechanismus" formuliert, nicht für die Term-Ableitung [schema/compiler.md:41] +- [x] [Review][Patch] Probe-Ausgabe-Pfade nicht normiert: `git diff --name-only` liefert `wiki/`-Präfix + `.md`; die Kandidatenliste ist definiert als „relative OKF-Pfade ohne `.md`" — die Teilmenge-Vergleichsoperation ist nicht definiert (Stripping-Regel fehlt) [schema/compiler.md:255] +- [x] [Review][Patch] Fallback fehlt: kein vorheriger Mutations-Boundary-Commit vorhanden (frischer Workspace) → `` für R-1 Change-Detection nicht auflösbar [schema/compiler.md:257] +- [x] [Review][Patch] Link-Following (Kandidatenerhebung (c)) ohne visited-set/Tiefen-Schranke — zyklische Concept-Links → unendliche Traversal / unbeschränkte Kandidatenmenge [schema/compiler.md:41] +- [x] [Review][Patch] Ghost-Diff-Rollback-Mechanik nicht spezifiziert: „rollt den Ghost-Diff zurück" ist Prozess-Beschreibung ohne Mechanismus (welcher Befehl? `git restore`? §5.3-Sequenz?); für D-3/AD-17h muss die Rücksetz-Aktion deterministisch beschreibbar sein [schema/compiler.md:255] + +**Defer (vorbestehend, nicht von Story 3.1 verursacht):** +- [x] [Review][Defer] V-1-Cross-Referenz dreistufig (compiler §3 Pkt. 3 / Validator-Voraussetzungsprüfung / Vertrag §2) und nie explizit aufgelöst — bestehendes Referenz-Idiom der Instruktion [schema/compiler.md:258] — deferred, pre-existing +- [x] [Review][Defer] `epic-3-context.md` ist ein neues Artefakt außerhalb der Spec-Code-Map, nirgends referenziert/dokumentiert (log.md/deferred-work) — Kontext-Datei wird vom build-Verfahren erzeugt, keine Story-Inhalts-Mutation [_bmad-output/implementation-artifacts/epic-3-context.md] — deferred, pre-existing + ## Spec Change Log +- **2026-08-19 (bmad-code-review Loop 2 — Resolution & Patch-Runde):** 4 decision-needed per Nutzer-Entscheidung 1/1/1/1 aufgelöst (D-1 Probe-Befestigung + Neu-Anlage + Normalisierung; D-2 Baseline-Commit-Notiz + Diskrepanz-Regel + Fallback; D-3 INPUT_UNCOMMITTED-Abbruch als P2-Element + Anker-Divergenz-Fußnote; D-4 Sandbox-Execution + Verification Record); 16 patch umgesetzt — `schema/compiler.md` → **Revision 2.4.2** (Diff-Selbsttest operationalisiert, R-1-Baseline + Abweichungsregel, P2-Block um Input-Zustand + Zeitpunkt, No-Op-Kandidat, Mehrfach-Treffer-Reihenfolge, Update-Pfad-Rollback §5.3, AD-17h-Gap benannt, Term-Ableitung abgegrenzt, visited-set, Worked Example korrigiert, stale-Anker nachgeführt) + `wiki/log.md` (2026-08-19-Eintrag: Befund-Befehlsform korrigiert, Rev 2.4.1/2.4.2 + Review-Handoff dokumentiert, Sandbox-Zeiger auflösbar, Baseline-Commit-Konvention) + `deferred-work.md` (F17-Eintrag: `source_spec` + Akteurskorrektur + Story-3.2-Referenz behoben; VG-Beleg: Befehls-/Ausgabe-Form korrigiert, Zeiger auf diesen Verification Record); 2 defer in `deferred-work.md` verankert; 6 dismissed (s. Review Findings-Einleitung); `## Verification Record (Ausführungs-Beleg)` angehängt (re-executierbares Sandbox-Skript + echte Outputs, S1–S5 I/O-Matrix + S6 D-3-Kontrolle); Frontmatter `review_loop_iteration` → 2; `sprint-status.yaml`: `3-1-…` → `done`, `last_updated` 08-19-2026. +- **2026-08-19 (bmad-code-review Loop 2):** Review Findings-Sektion angehängt (4 decision-needed, 16 patch, 2 defer, 6 dismissed als Noise — u. a.: Key-Abkürzungs-Muster in sprint-status ist Projekt-Schema, Chronologie „Review-Ergebnis im selben Commit wie Review-Handoff" ist prozedural korrekt, Validator-7/7-Lauf gilt für Endzustand inkl. Append, AA-Teilbehauptung „Hold-String überlebt in Rev-1.4-Log" ist am Ist-Baum widerlegt — grep liefert keinen Treffer). - **2026-08-18 (Erstellung):** Initiale Approve-Baseline. ## Design Notes @@ -98,6 +132,86 @@ context: **Manual checks:** - §3-Pkt.-2-Hold ersetzt (Update-Routing) und §5.9 vorhanden (Update-Semantik, Diff-Selbsttest, R-1/P2-Bausteine); `compiler.md` §8-Revision 2.4 mit Abschlussklausel; kein `schema/validator.md`-/`schema/wiki-compiler.md`-/`raw/`-Diff; §7-Vorbehalt gekürzt; `wiki/log.md`-Eintrag datiert mit Story-3.1-Semantik, Diff-Selbsttest-Beleg, Statuswechsel `backlog → in-progress`, per-Datei-Verdikt; `deferred-work.md`-R-1-/P2-Einträge als aufgegriffen markiert (append-only); `sprint-status.yaml` konsistent (`3-1-…` → in-progress). +## Verification Record (Ausführungs-Beleg, 2026-08-19 — bmad-code-review Loop 2, D-4-Resolution) + +**Re-executierbar:** `bash _bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh` (ab Workspace-Root; Git-Bash; Sandbox-Bäume unter `/tmp/sb31-XXXXXX`, reiner Test-Baum — nie der reale `wiki/`-Bundle; kein Carry-over über Szenarien via `isolate()`: Branch auf Baseline + `git reset --hard` + `git clean`). Das Skript setzt das compiler.md-§5.9-Update-Szenario auf einem synthetischen Basis-Baum (`wiki/index.md` + `alpha.md` + `beta.md` + `log.md`, `raw/alpha-v1.md` + `raw/beta-v1.md`, committer Baseline) gegen die fünf I/O-Matrix-Szenarien + die D-3-Abbruch-Kontrolle durch. Die Probe-Funktion implementiert die D-1-Probe wörtlich: `{ git diff --name-only -- wiki/ ; git status --porcelain -- wiki/ | awk '{print $2}' }` → Normalisierung (Strip `wiki/`-Präfix + `.md`-Suffix, `LC_ALL=C sort -u`). + +**Baseline-Commit (Sandbox-Baum, reiner Test-Baum):** `f7335a3f4f98aafcbb1294bc8a4ba5ca76db143a` + +**S1 — HAPPY_PATH_UPDATE** (Zuwachs `raw/alpha-v2.md` mit Term-Ueberschneidung `quanten-protocol-schlüssel`; Mutation im bestehenden Pfad `wiki/alpha.md` + `log.md`): +``` +--- Kandidaten-Erhebung: rg -l 'quanten-protocol-schlüssel' wiki/ --- +wiki/alpha.md +--- Probe (git diff --name-only -- wiki/ + git status --porcelain -- wiki/, normalisiert) --- +alpha +log +--- Erwartet: log, alpha (betroffen); beta NICHT; keine neue Datei (porcelain o.??) --- + M wiki/alpha.md + M wiki/log.md +--- Duplikat-Check: existiert alpha.md weiterhin exakt 1x? --- +wiki/alpha.md +0 +0 untracked +``` +→ Probe ⊆ erlaubte Menge (`alpha` betroffen, `log` = `log.md`; `beta` NICHT; keine ungetrackte Datei = kein Duplikat). FT-6/FR-12 erfüllt. + +**S2 — UNTOUCHED_CONCEPT** (Zuwachs `raw/gamma.md`, Term `gamma-observatorium-thema`; kein Kandidat, keine Mutation): +``` +--- Kandidaten-Erhebung: rg -l 'gamma-observatorium-thema' wiki/ --- +(leer — kein Kandidat) +--- Folge: keine Mutation, kein log.md-Zusatz (UNTOUCHED_CONCEPT) --- +--- Probe --- +(leere Ausgabe = kein Ghost-Diff; leere Menge ist Teilmenge jeder erlaubten Menge) +``` +→ Konzept bleibt unverändert (keine Dateiänderung, kein Index-, kein `log.md`-Zusatz). + +**S3 — CONCEPT_COLLISION_BESTEHEND** (Zielpfad `wiki/alpha.md` belegt → Update-Routing): +``` +--- Vor-Mutation-Check: Ziel-Pfad wiki/alpha.md belegt? --- +JA — Update-Routing (kein Duplikat, kein stummer Ueberschreiben) +--- Vor-Mutation-Zustand (muss leer sein) --- +(leer) +--- Mutation im bestehenden Pfad (Update) --- +--- Nach-Mutation: nur M-Eintraege, KEIN ?? (keine neue Datei = kein Duplikat) --- + M wiki/alpha.md + M wiki/log.md +--- Probe --- +alpha +log +``` +→ Statt Kollision-Hold: Mutation im bestehenden Pfad; nur `M`-Einträge, kein `??` (keine neue Datei = kein Duplikat); Index-Link unverändert gültig. + +**S4 — CHANGE_DETECTION (R-1)** (Zuwachs `raw/alpha-v2.md`; `alpha-v1.md`/`beta-v1.md` unverändert): +``` +--- git diff --name-only -- raw/ --- +raw/alpha-v2.md +--- Erwartet: AUSSCHLIESSLICH raw/alpha-v2.md (alpha-v1.md/beta-v1.md bleiben aussen) --- +--- SHA-256-Abgleich (Sekundaer-Fingerprint, D-2): alpha-v1 unveraendert? --- +21e7fc1dd09baa0d3fed56bf36e7eba19b1b3376f236b79ecbce8a907761b50b *raw/alpha-v1.md +21e7fc1dd09baa0d3fed56bf36e7eba19b1b3376f236b79ecbce8a907761b50b *- +--- (identische Summen = unveraendert; bei Diskrepanz gewinnt git diff, D-2) --- +``` +→ Nur die neue Datei wird als Zuwachs interpretiert (git-diff-basiert); unveränderte bleiben außen vor; SHA-256-Record bestätigt (identische Summen), Sekundär-Fingerprint gemäß D-2-Diskrepanz-Regel. + +**S5 — PRE_RUN_RECONCILE (P2)** (Setup: `wiki/index.md` fehlt → fehlende Bundleroot): +``` +--- Check-Block: (4) wiki/index.md-V-1-Vorbedingung --- +Run-FAIL (V-1, Vertrag §2): wiki/index.md fehlt — keine Mutation darf erfolgen +--- Zustand nach Abbruch + Rueckstellung (muss leer sein — der Run selbst mutierte nichts) --- +(leer) +``` +→ Pre-Run-Reconcile-Check-Block durchlaufen **vor jeder Mutation**; fehlende Bundleroot → Run-FAIL (V-1, besteht fort); der Run mutierte nichts (Zustand nach Abbruch leer; die Rückstellung ist Setup, kein Run-Zustand). + +**S6 — INPUT_UNCOMMITTED (D-3-Abbruch-Kontrolle)** (Setup: `raw/alpha-v1.md` im Working-Copy abweichend von HEAD): +``` +--- Check-Block: Working-Copy vs. HEAD fuer raw/ + wiki/ --- +Abbruch: published/committed Input erforderlich (AD-17a) — ungepublishter Zustand: + M raw/alpha-v1.md +``` +→ P2-Check-Block-Element (1) **Input-Zustand**: Working-Copy von `raw/`+`wiki/` gegen HEAD; bei Abweichung **benannter Abbruch „published/committed Input erforderlich"** vor Interpretation und vor jeder Mutation — die gefrorene I/O-Matrix-Verpflichtung (Szenario `INPUT_UNCOMMITTED`) ist jetzt als Check-Block-Element in `schema/compiler.md` §5.9 Pkt. 6 (1) implementiert (Rev 2.4.2, D-3-Resolution). + +**Gesamtergebnis:** Alle 5 I/O-Matrix-Szenarien + die D-3-Abbruch-Kontrolle deterministisch ausgeführt — keine Abweichung vom Erwartungsverhalten; die `wiki/log.md`- und `deferred-work.md`-Verweise auf „deterministische Formel-Ausgaben/Nachweise je Szenario in der Spec-Verification" sind damit auflösbar (D-4). + ## Suggested Review Order **Inkrementeller Datenfluss — Update-Routing (Einstieg)** diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 537590f..ea648d1 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -29,7 +29,7 @@ # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) # - Retrospective appends its action items to action_items; the status view surfaces open ones generated: 08-14-2026 00:00 -last_updated: 08-18-2026 22:30 +last_updated: 08-19-2026 06:30 project: wow20 project_key: NOKEY tracking_system: file-system @@ -51,7 +51,7 @@ development_status: epic-2-retrospective: done epic-3: in-progress - 3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: review + 3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: done 3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip: backlog 3-3-bestehende-concepts-erweitern-präzisieren-korrigieren: backlog 3-4-wissen-aus-mehreren-sources-synthetisieren: backlog diff --git a/schema/compiler.md b/schema/compiler.md index 2153a56..786c470 100644 --- a/schema/compiler.md +++ b/schema/compiler.md @@ -38,8 +38,8 @@ Bestätigung (Story 1.4): schema/validator.md (mechanische Prüfung, kein L 1. Vor der Anlage prüfen, ob die erkannte Wissenseinheit **bereits als Concept** im Bundle existiert (deterministisch: Dateikollision über den relativen OKF-Pfad, AD-7a). 2. **Update-Routing (statt Kollision-Hold; Story 3.1):** Existiert bereits ein Concept mit dem Ziel-Pfad, wird **nicht** stumm überschrieben und **kein** Duplikat angelegt — die erkannte Wissenseinheit wird als **Update-Kandidat** im **bestehenden Concept-Pfad** aktualisiert (Erweitern/Präzisieren/Korrigieren gemäß §5.9; FR-6). Die Mutationsmechanik für Updates spezifiziert §5.9; der Kollisions-Hold-Schutzprinzip („nicht stumm überschreiben") bleibt als Grundsatz der Erhaltung erhalten (AD-16-Default: bestehende Provenienz/Inhalte werden nie ohne Beleg entfernt). Der **Neu-Anlage-Pfad** dieser Instruktion bleibt für Wissenseinheiten, deren Ziel-Pfad **nicht** belegt ist (§5.1/§5.7). - **Kandidatenliste (betroffen-Bestimmung):** Vor jeder Mutation erhebt der Producer die Menge der betroffenen Concepts als **nachvollziehbare Kandidatenliste** (relative OKF-Pfade ohne `.md`) mit **textuell-deterministischen Mitteln** (AD-13): (a) Term-/Konzept-Überschneidung zwischen der neuen Evidenz und den bestehenden Concept-Bodies via `grep`/`ripgrep` über `wiki/` (z. B. `rg -l '' wiki/`); (b) `index.md`-Traversal (Bundleroot- und Area-`index.md`-Dateien, gewurzelte Erreichbarkeit Root → Area → Concept, §5.8) der dadurch betroffenen Bereiche; (c) Link-Following aus bereits betroffenen Concepts (§5.6-Pin) auf weitere Concept-Pfade. Die Kandidatenliste wird textuell festgehalten (Pre-Run-Reconcile-Check-Block, §5.9 Pkt. 6). Keine Embeddings/Vector-Suche (AD-13); der feinkörnige Relevanz-Findungsmechanismus als eigene Ausformulierung ist Story 3.2 vorbehalten — §5.9 bindet die Erhebung an die hier genannten deterministischen Mittel. - Löst eine erkannte Wissenseinheit auf **keinen** bestehenden Concept-Pfad auf (kein Update-Kandidat), wird sie als **neue** Einheit über den Neu-Anlage-Pfad (§5.1/§5.7, §3.2-Kollisionsprüfung ist damit erstbestanden) behandelt. + **Kandidatenliste (betroffen-Bestimmung):** Vor jeder Mutation erhebt der Producer die Menge der betroffenen Concepts als **nachvollziehbare Kandidatenliste** (relative OKF-Pfade ohne `.md`) mit **textuell-deterministischen Mitteln** (AD-13): (a) Term-/Konzept-Überschneidung zwischen der neuen Evidenz und den bestehenden Concept-Bodies via `grep`/`ripgrep` über `wiki/` (z. B. `rg -l '' wiki/`); (b) `index.md`-Traversal (Bundleroot- und Area-`index.md`-Dateien, gewurzelte Erreichbarkeit Root → Area → Concept, §5.8) der dadurch betroffenen Bereiche; (c) Link-Following aus bereits betroffenen Concepts (§5.6-Pin) auf weitere Concept-Pfade — **mit besuchter Menge** (ein bereits besuchter Concept-Pfad wird nicht erneut besetzt; keine Schleife bei zyklischen Links). Der `` aus (a) wird in Phase (1) (Interpretieren, §2) aus der neuen Evidenz abgeleitet — die Erhebung *mit festem Term* ist textuell-deterministisch (fester Term → deterministische Grep-Ausgabe); die Term-*Auswahl* folgt der §2-Interpretation, und der feinkörnige Term-Mechanismus (Kanonisierung, Synonyme) ist Story 3.2 vorbehalten. Die Kandidatenliste wird textuell festgehalten (Pre-Run-Reconcile-Check-Block, §5.9 Pkt. 6). Keine Embeddings/Vector-Suche (AD-13); der feinkörnige Relevanz-Findungsmechanismus als eigene Ausformulierung ist Story 3.2 vorbehalten — §5.9 bindet die Erhebung an die hier genannten deterministischen Mittel. + Löst eine erkannte Wissenseinheit auf **keinen** bestehenden Concept-Pfad auf (kein Update-Kandidat), wird sie als **neue** Einheit über den Neu-Anlage-Pfad (§5.1/§5.7, §3-Pkt.-1/-2-Kollisionsprüfung ist damit erstbestanden) behandelt. 3. Der Run prüft zusätzlich, ob `wiki/index.md` als Bundleroot existiert (V-1-Vorbedingung des Validators); fehlt sie, darf kein Concept erzeugt oder aktualisiert werden (Run-FAIL, Vertrag §2). ## 4. Synthetisieren (Provenienz & Trust) @@ -62,7 +62,7 @@ Je neuem Concept werden die Frontmatter-Metadaten nach Vertrag §3 festgelegt: - Konvention für den Dateinamen: kebab-case-Slug aus der Concept-Identität (kein Sonderzeichen, keine Endung `.md`-Dopplung). Der Dateiname definiert die Concept-Identität (relativer OKF-Pfad ohne `.md`, AD-7a). 2. **Dateiinhalt:** YAML-Frontmatter gemäß §4 (kein weiteres Feld), gefolgt von einem Markdown-Body, der die Wissenseinheit eigenständig und lesbar darstellt (NFR-2, NFR-3). Der Body darf keine großen Quell-Exzerpte enthalten (FR-2). Claim-granulare Inline-Provenienz (AD-4a) folgt §5.5 — für neu erzeugte Concepts unmittelbar bei der Erzeugung, für bestehende Bodies per Nachrüstung (Story 2.2). 3. **Index-Regel (Punkt 11/§6):** Nach Anlage MUSS das neue Concept in der `index.md` **seines Bereichs** verlinkt werden — für Root-Concepts in der Bundleroot `wiki/index.md`, für Area-Concepts in der jeweiligen Area-`index.md` (`wiki//index.md`, §5.7) — seine Identität (relativer OKF-Pfad ohne `.md`) als relativer Bundle-Pfad referenziert; die genau-eine-Form-Festlegung ist in **§5.6** gepinnt (file-relativ, mit `.md`-Endung; §5.7 Pkt. 4). Ohne diese Verlinkung ist das Bundle strukturell invalide (§7 Punkt 11). - - All dies (Anlage + Verlinkung + `log.md`) erst abschließen, wenn die Validierung (§6) SUCCESS liefert. Zwischenstände werden nicht als fertige Mutation veröffentlicht — Commit-Boundary ist die Mutations-Boundary (AD-17f). Bei Validierungs-FAIL wird der Teilzustand **explizit zurückgerollt**: neue Concept-Datei(en) gelöscht, zugehörige Index-Verlinkung(en) aus `wiki/index.md` entfernt, `log.md`-Eintrag(e) wieder entfernt — das Bundle nimmt seinen Zustand vor dem Run wieder ein (keine partielle Mutation bleibt liegen). + - All dies (Anlage + Verlinkung + `log.md`) erst abschließen, wenn die Validierung (§6) SUCCESS liefert. Zwischenstände werden nicht als fertige Mutation veröffentlicht — Commit-Boundary ist die Mutations-Boundary (AD-17f). Bei Validierungs-FAIL wird der Teilzustand **explizit zurückgerollt**: neue Concept-Datei(en) gelöscht, zugehörige Index-Verlinkung(en) aus `wiki/index.md` entfernt, `log.md`-Eintrag(e) wieder entfernt — das Bundle nimmt seinen Zustand vor dem Run wieder ein (keine partielle Mutation bleibt liegen). **Update-Pfad-Ergänzung (Review-Loop-2):** bei einem FAIL im Update-Pfad (§5.9) gilt derselbe Grundsatz für **modifizierte** Pfade — die vor dem Run geänderten Concept-Pfade (und die `log.md`-Einträge des Runs) werden aus dem Baseline-Zustand wiederhergestellt (z. B. `git checkout -- `; der Baseline-Commit ist der in R-1/Pkt. 6 notierte ``), sodass kein teilweise aktualisierter Concept-State liegen bleibt. 4. **Dokumentation (`log.md`, Vertrag §5):** Die Anlage neuer Concepts wird als datumsgruppierter Eintrag in `wiki/log.md` dokumentiert (neueste zuerst; Header = ISO-Datum `YYYY-MM-DD`), verknüpft mit dem neuen Concept-Pfad und den genutzten `raw/`-Quellen. `log.md` bleibt ohne Frontmatter (Punkt 10). ## 5.5 Claim-granulare Provenienz (Story 2.2) @@ -229,7 +229,7 @@ Progressive Discovery ist die **schrittweise Navigation** eines Consumers von de - **`UNREACHABLE AREA: `** — eine Area-`index.md` existiert, ist aber von der Bundleroot **nicht** verlinkt (kein Root→Area-Pfad): die Area bleibt für die Navigation unsichtbar (AD-9). Die Meldung ist ein textuell benannter **Instruktions-Selbsttest-Befund** (Run-FAIL gemäß §5.6 Pkt. 4-analoger NFR-4-Regel) — **kein** Validator-Punkt, **keine** neue §7-Klasse. - **`NESTED AREA: `** — jede Markdown-Datei in einem Zwei-Ebenen-Pfad (Tiefe ≥ 3, Lauf (B), Pkt. 3): ein `wiki/a/b/index.md`-Kandidat wie auch ein `wiki/a/b/concept.md` **ohne** `index.md` (die Area-ohne-Index-Lücke, die der reine `index.md`-Scan übersähe) sind Fälle der **konsolidierten Zwei-Ebenen-Kartografie** (Pkt. 3): die Verzeichnisstruktur ist keine zugelassene Anlageform; ein solcher Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (Trigger: Mutieren-Schritt, Pkt. 3 — keine Datei, kein Index-Link, Meldung, Run „teilweise erfolgreich"; nachträgliche bestehende Tiefe-≥-3-Dateien meldet Lauf (B)) — **analog**, aber **bewusst nicht** über das Update-Routing der Dateikollision bestehender Concepts (§3 Pkt. 2, bliebe ungeschärft für brandneue Pfade). - Der Erreichbarkeits-Satz für **Root-Concepts** (jedes Root-Concept in `wiki/index.md` verlinkt) ist durch den Validator-Punkt-11-Check (§3 Punkt 11) abgedeckt und wird hier nicht dupliziert; der Selbsttest deckt die vom Validator offene Lücke (Root→Area-Navigation) ab. (Die ehemals offene Punkt-11-Lücke der file-relativen Area-Lesart — ein wörtlich-mechanischer Check meldete früher `Concept nicht verlinkt=wissensarchitektur/source-material` — ist mit der autorisierten **Validator-Rev-9** geschlossen: die Area-Lesart ist in `schema/validator.md` formalisiert; siehe Pkt. 3 dieser Sektion und das Schließen des Aktionsitems in `deferred-work.md`.) Die §5.6-Formeln (Z. 133–166) decken die **Link-Form** weiterhin ab (der Selbsttest prüft die Erreichbarkeit, nicht die Form — die Form bleibt beim §5.6-Form-Check). -3. **Konsolidierte Zwei-Ebenen-Kartografie (antwortet Defer F-07, schließt es):** Das Bundle-Navigationsmodell besteht ab Story 2.5 aus **einer** Area-Ebene: Root-Concepts (direkt aus der Bundleroot) + Areas (`wiki//`), jede mit genau einer frontmatterlosen `wiki//index.md`, die ihre Area-Concepts in gepinnter §5.6-Form verlinkt; die Bundleroot verlinkt die Area-`index.md`-Dateien (Navigation Root → Area, AD-9). **Verschachtelte Areas sind keine zugelassene Anlageform:** `wiki/a/b/` mit Concept darunter ist **kein** „Area mit Inhalt" — ein solcher Kandidat (Erstellungskandidat oder Discovery-Ziel) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten: keine Datei, kein Index-Link, textuelle Meldung **`NESTED AREA: `** (Pkt. 2); der Run bricht für dieses Gebilde mit „teilweise erfolgreich" ab (die übrigen erkannten Einheiten laufen weiter, NFR-4). (Die in Pkt. 1 als offen notierte Punkt-11-Grenze ist mit dem Rev-9-Aktionsitem rückstandslos **geschlossen** — die Area-Lesart ist in `schema/validator.md` als „Revision 9" formalisiert; die Pkt.-1-Formulierung sieht dafür keine offene Lücke mehr vor.) **Tiefen-Definition (Loop-3-Klarstellung):** „Tiefe" ist die Segment-Anzahl unter der Bundleroot — `wiki///…` hat Tiefe ≥ 3 (zwei Verzeichnisstufen plus Datei); das ist exakt die `find -mindepth 3`-Schwelle von Lauf (B). Die Meldung benennt immer die **erste** Ebene `` der nicht-zulässigen Struktur. **Trigger im Run-Flow (Loop-3-Fix):** der Hold feuert im **Mutieren-Schritt** (§0-Ablaufstruktur, Schritt (4)) — der Producer prüft vor Anlage eines Ziel-Pfads dessen Tiefe unter der Bundleroot; Tiefe ≥ 3 → Hold (kein §5.7-Routing kann Tiefe ≥ 3 strukturell erzeugen, der Hold sichert die Regel zusätzlich). Lauf (B) der Selbsttest-Formel bleibt der nachträgliche Baum-Check gegen bestehende Tiefe-≥-3-Dateien. Der Hold ist **§5.8-lokal** verankert (dieser Absatz) und trägt die **Discovery-Entscheidung** der Story — er ist **bewusst nicht** das Update-Routing der Dateikollision (§3 Pkt. 2): jenes bleibt ausschließlich dem Fall vorbehalten, dass ein Ziel-Pfad bereits als Concept existiert und als Update-Kandidat im bestehenden Pfad aktualisiert wird (§5.9); ein brandneuer Zwei-Ebenen-Pfad kollidiert mit keinem existierenden Pfad und wird daher über diesen §5.8-Hold gelenkt, nicht über das Update-Routing. Die F-07-Frage „was ist Area mit Inhalt" ist damit instruktionsseitig deterministisch beantwortet: **Area mit Inhalt = `wiki//` mit `index.md` + Area-Concepts auf der Area-Ebene**; eine tiefere Verschachtelung ist kein eigener Bereich, sondern ein **§5.8-Zwei-Ebenen-Verstoß** (nicht erlaubt). Keine zweite Discovery-Ebene über die Zwei-Ebenen-Struktur hinaus (Boundaries, „Never"). +3. **Konsolidierte Zwei-Ebenen-Kartografie (antwortet Defer F-07, schließt es):** Das Bundle-Navigationsmodell besteht ab Story 2.5 aus **einer** Area-Ebene: Root-Concepts (direkt aus der Bundleroot) + Areas (`wiki//`), jede mit genau einer frontmatterlosen `wiki//index.md`, die ihre Area-Concepts in gepinnter §5.6-Form verlinkt; die Bundleroot verlinkt die Area-`index.md`-Dateien (Navigation Root → Area, AD-9). **Verschachtelte Areas sind keine zugelassene Anlageform:** `wiki/a/b/` mit Concept darunter ist **kein** „Area mit Inhalt" — ein solcher Kandidat (Erstellungskandidat oder Discovery-Ziel) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten: keine Datei, kein Index-Link, textuelle Meldung **`NESTED AREA: `** (Pkt. 2); der Run bricht für dieses Gebilde mit „teilweise erfolgreich" ab (die übrigen erkannten Einheiten laufen weiter, NFR-4). (Die in Pkt. 2 als offen notierte Punkt-11-Grenze ist mit dem Rev-9-Aktionsitem rückstandslos **geschlossen** — die Area-Lesart ist in `schema/validator.md` als „Revision 9" formalisiert; die Pkt.-1-Formulierung sieht dafür keine offene Lücke mehr vor.) **Tiefen-Definition (Loop-3-Klarstellung):** „Tiefe" ist die Segment-Anzahl unter der Bundleroot — `wiki///…` hat Tiefe ≥ 3 (zwei Verzeichnisstufen plus Datei); das ist exakt die `find -mindepth 3`-Schwelle von Lauf (B). Die Meldung benennt immer die **erste** Ebene `` der nicht-zulässigen Struktur. **Trigger im Run-Flow (Loop-3-Fix):** der Hold feuert im **Mutieren-Schritt** (§0-Ablaufstruktur, Schritt (4)) — der Producer prüft vor Anlage eines Ziel-Pfads dessen Tiefe unter der Bundleroot; Tiefe ≥ 3 → Hold (kein §5.7-Routing kann Tiefe ≥ 3 strukturell erzeugen, der Hold sichert die Regel zusätzlich). Lauf (B) der Selbsttest-Formel bleibt der nachträgliche Baum-Check gegen bestehende Tiefe-≥-3-Dateien. Der Hold ist **§5.8-lokal** verankert (dieser Absatz) und trägt die **Discovery-Entscheidung** der Story — er ist **bewusst nicht** das Update-Routing der Dateikollision (§3 Pkt. 2): jenes bleibt ausschließlich dem Fall vorbehalten, dass ein Ziel-Pfad bereits als Concept existiert und als Update-Kandidat im bestehenden Pfad aktualisiert wird (§5.9); ein brandneuer Zwei-Ebenen-Pfad kollidiert mit keinem existierenden Pfad und wird daher über diesen §5.8-Hold gelenkt, nicht über das Update-Routing. Die F-07-Frage „was ist Area mit Inhalt" ist damit instruktionsseitig deterministisch beantwortet: **Area mit Inhalt = `wiki//` mit `index.md` + Area-Concepts auf der Area-Ebene**; eine tiefere Verschachtelung ist kein eigener Bereich, sondern ein **§5.8-Zwei-Ebenen-Verstoß** (nicht erlaubt). Keine zweite Discovery-Ebene über die Zwei-Ebenen-Struktur hinaus (Boundaries, „Never"). 4. **Suche = Consumer-grep (AD-13, FR-11, NFR-3):** Die Navigation ist die **primäre** Discovery (gewurzelte Erreichbarkeit, Pkt. 1–2). Die **Suche ist konsumenten-/extern-seitig** — die Discovery braucht **keine proprietäre Datenbank, keinen Such-Dienst, kein Embedding/Vector, kein Index-Datei-Format** (AD-8, AD-13): ein Consumer führt die textuell-deterministische Suche selbst aus, z. B. `grep -rn wiki/` (rekursiv) bzw. `rg wiki/` (ripgrep) über den Markdown-Baum (NFR-3 „Standard-Dateioperationen"); die rekursive Form ist verbindlich — ein nicht-rekursives `grep -n wiki/` schlägt auf ein Verzeichnis fehl (Exit 2). Das Bundle bleibt ohne geladene Indizes — z. B. nach einem Git-Clone — vollständig verständlich (NFR-2, NFR-5). Der Story-2.5-Vorbehalt (§7 Z. 253 auf „Suche"-Rest gekürzt) ist damit aufgelöst: die Suche ist ein Consumer-Thema, kein Bundle-/Instruktions-Thema mehr. 5. **Discovery-Demo (optional, kein MOVE):** Bestehende Root-Concepts werden **nicht** in Areas verschoben (Kuratierung/AD-7d ist Epic-3-Nähe). Als Discovery-Demo **kann** (optional) ein **neues** Root-Concept `wiki/.md` ergänzt und (a) in der Bundleroot (§5.3 Pkt. 3) sowie (b) — rein informierend — über einen zusätzlichen **Body-Link** in gepinnter file-relativer §5.6-Form (`[](../.md)`) aus einem bestehenden Area-Concept heraus verlinkt werden (z. B. aus `wiki/wissensarchitektur/source-material.md`; der Inhalt bleibt Root-Concept; der Area-Body-Link ist zusätzliche Erreichbarkeit, keine Neuzuordnung; ein Link aus einer Concept-Body-Datei ist ein Body-Link, kein Index-Link — §5.6 Pkt. 2). Beide Verlinkungen halten die einheitliche Zwei-Ebenen-Kartografie (Pkt. 3). Die Durchführung ist **optional** (Matrix-Zeile `DISCOVERY_DEMO_ROOT_AREA_LINK`); sie **erhöht** die `(raw/`-Zählung der §5.6-Formel-4-Baseline (neuer Zuwachs-Run, Re-Baseline-Pflicht) und ist nur zusammen mit dem Nachweis dieses neuen Baselines zusätzlich durchzuführen — wird sie weggelassen, bleibt Formel 4 unverändert `38 ≡ 38` (kein Re-Baseline-Bedarf). Die hier beschriebene Regel ist die Demo-**Instruktion**; ob das konkrete Demo-Concept in diesem Run angelegt wird, entscheidet der Producer im Rahmen der optionalen Durchführung. @@ -243,20 +243,23 @@ Diese Sektion ist der **einzige Instruktions-Ort** der Update-Mutationsmechanik - **Präzisieren:** Eine bestehende Aussage wird geschärft (Formulierung/Abgrenzung), der Beleg wird neu geführt oder nachgeführt (§5.5: Inline-`raw/`-Verweis mit existierender Stellen-Kennung). - **Korrigieren:** Eine fehlerhafte/überholte Aussage wird **ersetzt** — die ersetzte Aussage wird **nicht still gelöscht, sondern explizit durch die ersetzende Aussage abgelöst**, und die Ersetzung trägt einen **Ersetzungsbeleg** (die neue `raw/`-Evidenz als Inline-Verweis, §5.5). Keine stille Löschung bestehender Provenienz ohne Beleg (AD-16-Default: Erhaltung). Die AD-16-Klassifikation selbst (CORRECTING/CONTRADICTING etc.) ist Epic 4, Story 4.1, und wird hier **nicht** vorweggenommen — widersprechender Inhalt ohne Ersetzungsevidenz bleibt erhalten und wird gemäß Pkt. 4 in `log.md` explizit abgelegt. - **Frontmatter-`sources` nur um echte neue Belege ergänzen:** Für jede neu belegte Aussage, deren `raw/`-Datei nicht bereits in `sources` deklariert ist, wird ein **neuer `sources`-Eintrag ergänzt** (§5.5 Pkt. 1b — Relokation/Zielwechsel; Key-Subset Vertrag §3.3, Innen-Ebene). Bestehende `sources`-Einträge bleiben unverändert, sofern ihre Belege weiterhin Bestand des Bodys sind (keine Entfernung ohne Beleg). - - **`generated.at`-Konvention (A0-20):** Ein maschinelles Update eines maschinell erzeugten Concepts bleibt maschinell → `generated` bleibt gesetzt, `at` wird auf den **aktuellen Run-Zeitstempel** aktualisiert (einmalige `at`-Festlegung pro Run, P1-Dryrun-Konvention). `verified` wird durch ein maschinelles Update **nicht** gesetzt; ein vorhandenes human-`verified` wird **nicht** entfernt (menschliche Kuratierung ist Bestandswissen, A0-21/FR-13-Nähe). Ein menschliches Update (manuelle Kuratierung, A0-21) ändert `generated`/`verified` nicht automatisch. - - **Mehrfach-Treffer-Konsolidierung (ein Run, mehrere Einheiten auf denselben Concept-Pfad):** Ergeben mehrere neue Wissenseinheiten desselben Runs auf **demselben** bestehenden Concept-Pfad ein Update, werden ihre Mutationen in **einem einzigen Update dieses Pfads** konsolidiert (eine Body-Änderung, **ein** `log.md`-Eintrag „Story 3.1-Update", ein konsolidierter `sources`-Zuwachs, **ein** `generated.at`-Zeitstempel — der einmalige `at` des Runs). Die Reihenfolge der Einheiten wird dabei textual-deterministisch aus der Verarbeitung der Evidenz (REIHENFOLGE = Auftreten der Einheiten in der Zuwachs-Sicht; bei vollständig unabhängigen Einheiten die lexicografische Ordnung) abgeleitet; die AD-16-Default-Erhaltung bleibt für jede betroffene Stelle gewahrt. + - **`generated.at`-Konvention (A0-20):** Ein maschinelles Update eines maschinell erzeugten Concepts bleibt maschinell → `generated` bleibt gesetzt, `at` wird auf den **aktuellen Run-Zeitstempel** aktualisiert (einmalige `at`-Festlegung pro Run, P1-Dryrun-Konvention). `verified` wird durch ein maschinelles Update **nicht** gesetzt; ein vorhandenes human-`verified` wird **nicht** entfernt (menschliche Kuratierung ist Bestandswissen, A0-21/FR-13-Nähe). Ein menschliches Update (manuelle Kuratierung, A0-21) ändert `generated`/`verified` nicht automatisch. **AD-17h-Gap (Review-Loop-2, Home: Story 3.8):** der Run-Zeitstempel (Wanduhr) bedeutet, dass zwei unabhängige Runs über dasselbe Eingabeset unterschiedliche `at`-Werte — damit unterschiedliche Bundle-States — erzeugen; die AD-17h-Determinismus-Verankerung (gleicher Git-State + gleiches Eingabeset → gleicher Bundle-State; Story 3.8) muss die Behandlung von `at` (z. B. Ausnahmemenge im Bundle-State-Vergleich oder Ableitung aus dem Git-State) definieren. Bis dahin bleibt die hier festgelegte Konvention (frozen Spec-Design-Note, A0-20; ein Wechsel des `generated.at`-Verhaltens ist Ask-First) bindend. + - **No-Op-Kandidat (Review-Loop-2-Präzisierung):** Erhebt die Kandidatenerhebung einen Pfad, dessen Body die neue Evidenz **bereits vollständig enthält** (keiner der drei Update-Formen greift — keine neue belegte Aussage, keine Schärferung, keine Ersetzung), ist der Kandidat ein **No-Op**: **keine** Body-Mutation, **kein** `generated.at`-Bump, **kein** `sources`-Zusatz, **kein** `log.md`-Eintrag — der Pfad bleibt byte-identisch (Erhaltungs-Invariante, Pkt. 5). Die Entscheidung „keiner der drei Formata greift" ist selbst textuell deterministisch: sie trifft nur, wenn die neue Evidenz keine Aussage trägt, die im Body nicht bereits als belegte Aussage vorhanden ist (Term-/Stellen-Abgleich mit §5.5-Inline-Verweisen); im Zweifel (neue belegte Aussage auch nur in abgewandelter Form) greift Erweitern/Präzisieren — der No-Op ist die *engere* Auslegung. + - **Mehrfach-Treffer-Konsolidierung (ein Run, mehrere Einheiten auf denselben Concept-Pfad):** Ergeben mehrere neue Wissenseinheiten desselben Runs auf **demselben** bestehenden Concept-Pfad ein Update, werden ihre Mutationen in **einem einzigen Update dieses Pfads** konsolidiert (eine Body-Änderung, **ein** `log.md`-Eintrag „Story 3.1-Update", ein konsolidierter `sources`-Zuwachs, **ein** `generated.at`-Zeitstempel — der einmalige `at` des Runs). Die Reihenfolge der Einheiten wird dabei textual-deterministisch aus der Verarbeitung der Evidenz abgeleitet: REIHENFOLGE = **Auftritt der Einheiten in der Zuwachs-Sicht** (Datei-Reihenfolge des R-1-Zuwachsbefunds, dann Stellen-Reihenfolge innerhalb der Datei); nur bei Einheiten desselben Ortes (identischer Dateipfad + identische Stelle) greift die lexicografische Ordnung als Tie-Break (Review-Loop-2-Präzisierung: die Reihenfolge ist für *alle* Einheiten definiert, nicht nur für vollständig unabhängige). Die AD-16-Default-Erhaltung bleibt für jede betroffene Stelle gewahrt. - **Commit-Boundary = Mutations-Boundary (AD-17f, §0):** Auch im Update-Pfad werden **Zwischenstände nie als fertige Mutation veröffentlicht** — die Mutationen der Update-Kandidaten werden als Ganzes committet, und zwar erst, nachdem der Diff-Selbsttest (Pkt. 5) ohne Ghost-Diff abgeschlossen ist. Ein Ghost-Diff ist dann als **Abbruch-Vorlauf „korrigierter Teil-Run"** im `log.md`-Eintrag des betroffenen Runs gekoppelt (siehe Disagreement-/Run-Notiz Pkt. 4), damit die Ursache textuell nachvollziehbar bleibt. 3. **Index-/Link-Form unverändert (§5.6-Pin):** Ein reines Body-Update ändert die Concept-Identität nicht → der bestehende Index-Link (Bundleroot oder Area-`index.md`) bleibt unverändert gültig; **kein neuer Link** bei reinem Body-Update (kein Index-`index.md`-Zusatz). Die **`log.md`-Eintragspflicht** (Pkt. 4) bleibt davon **unberührt**: *jedes* Update — auch ein reines Body-Update — MUSS seinen `log.md`-Eintrag „Story 3.1-Update" führen; nur der **Index-**Link bleibt unverändert. Wird durch das Update eine Concept-Kategorie (Root vs. Area) oder die Identität berührt, ist das **Ask-First** (AD-7d-Renames/Redirects; nicht Teil von Story 3.1). Neue zulässige Concept-Links (Beziehungsschicht, §5.6) werden nur gesetzt, wenn die neue Erkenntnis eine echte, inhaltsbegründete Beziehung rechtfertigt. 4. **`log.md`-Eintragspflicht (Vertrag §5):** Jedes Update wird als datumsgruppierter Eintrag in `wiki/log.md` dokumentiert (Header = ISO-Datum `YYYY-MM-DD`, neueste zuerst), verknüpft mit dem mutierten Concept-Pfad und den genutzten `raw/`-Quellen. Für Updates wird der Eintrag als „**Story 3.1-Update**" markiert (disambiguierbar von Anlage-Einträgen). Konflikt-/Erhaltungsfälle (Pkt. 2 „Korrigieren" ohne Ersetzungsevidenz) werden explizit als Disagreement-Eintrag mit dem mutierten Concept-Pfad geführt (AD-16b, Vertrag §5) — der Epic-4-Interface-Fall bleibt dokumentiert, ohne Korrektur-Klassifikation hier. 5. **Erhaltungs-Invariante (Kern) + deterministischer Diff-Selbsttest (AD-17h, FT-6/FR-12):** Ein Compilation Run darf nur die Concepts **neu anlegen oder verändern**, die durch den erkannten Erkenntnis-Zuwachs tatsächlich betroffen sind. **Nicht betroffene Concept-Pfade bleiben byte-identisch unverändert** — es gibt **nie** „Regenerate Everything" (AD-5, A0-6). Die Inkrementalität ist als **re-executierbarer Diff-Selbsttest** mechanisch kontrollierbar: Nach jedem Run prüft der Producer ab der Workspace-Root ```sh - git diff --name-only -- wiki/ + git diff --name-only -- wiki/ + git status --porcelain -- wiki/ ``` - dass die geänderten Dateien eine Teilmenge von **(Kandidatenliste ∪ `log.md` ∪ nachgeführte `index.md`)** — mit der Kandidatenliste aus §3 Pkt. 2 als expliziter Menge (relative OKF-Pfade ohne `.md`, plus `log.md` und jede nachgeführte `index.md` als zusätzliche zulässige Einträge). Jede Abweichung (**Ghost-Diff** auf einem nicht betroffenen Pfad) ist ein Instruktions-Verstoß (FT-6): Der Producer behebt sie textuell benannt (NFR-4) und **rollt den Ghost-Diff zurück, bevor der Run als gültig vermerkt wird** — der beobachtbare Endzustand des Bundles bleibt damit konsistent (AD-6-Backstop). Für Story 3.1 selbst (Instruktions-Story ohne Inhalts-Mutation) ist der Nachweis: `git diff --name-only -- wiki/` liefert ausschließlich `wiki/log.md` — keine Concept-Datei, keine `index.md` (die aggressive `git diff --stat -- wiki/`-Default-Effektiv-ausgabe zeigt denselben Pfad, `wiki/log.md | 1 +`). *(Anmerkung: `schema/compiler.md` und `deferred-work.md` liegen **außerhalb** `wiki/` und sind daher kein Teil dieser Diff-Probe — sie gehören zum Instruktions-, nicht zum Bundle-Baum; der Ghost-Diff-Begriff dieser Sektion gilt nur für `wiki/`.)* + (erste Zeile: modifizierte/gelöschte Pfade gegen die Baseline; zweite Zeile: zusätzlich ungetrackte neue Pfade `??` und staged-Änderungen — die Duplikat-Kontrolle „keine neue Datei" braucht die `??`-Sicht, die `git diff` allein nicht liefert; `` siehe Pkt. 6 R-1) + dass die geänderten Dateien eine Teilmenge von **(Kandidatenliste ∪ Neu-Anlage-Zielpfade ∪ `log.md` ∪ nachgeführte `index.md`)** — mit der Kandidatenliste aus §3 Pkt. 2 (betroffene *bestehende* Concepts, relative OKF-Pfade ohne `.md`) **plus** den Zielpfaden aller im selben Run neu angelegten Concepts (§5.1/§5.7 — Misch-Runs) plus `log.md` und jede nachgeführte `index.md` als zusätzliche zulässige Einträge. **Probe-Zeitpunkt (D-1-Präzisierung):** die Probe läuft **vor dem Commit**, am Ende des P2-Check-Blocks (Pkt. 6) — nach dem Commit wäre `git diff` leer und die Probe vacuous (Commit-Boundary = Mutations-Boundary, AD-17f: der Run committiert erst, nachdem die Probe ohne Ghost-Diff abgeschlossen ist). **Pfad-Normalisierung vor dem Teilmenge-Vergleich:** die Proben-Ausgabe trägt `wiki/`-Präfix und `.md`-Endung; die Kandidaten-/Ziel-Pfade sind definiert als relative OKF-Pfade *ohne* `.md` — für den Vergleich werden von jedem Proben-Eintrag `wiki/`-Präfix und `.md`-Suffix gestrippt (deterministischer Normalisierungsschritt). Jede Abweichung (**Ghost-Diff** auf einem nicht betroffenen Pfad) ist ein Instruktions-Verstoß (FT-6): Der Producer behebt sie textuell benannt (NFR-4) und **rollt den Ghost-Diff zurück, bevor der Run als gültig vermerkt wird** — der beobachtbare Endzustand des Bundles bleibt damit konsistent (AD-6-Backstop). **Rollback-Mechanik:** der Ghost-Diff betrifft nur Pfade *außerhalb* der erlaubten Menge; der Producer stellt die betroffenen Pfade aus dem Baseline-Zustand wieder her (für modifizierte Pfade: `git checkout -- `; für ungetrackte neue Dateien: Datei löschen; für Index-Änderungen: `git checkout -- wiki/index.md` bzw. die Area-`index.md`) — der Teilzustand-Rollback des §5.3 Pkt. 3 / §6 Pkt. 3 greift daneben unverändert. Für Story 3.1 selbst (Instruktions-Story ohne Inhalts-Mutation) ist der Nachweis: `git diff --name-only -- wiki/` liefert ausschließlich `wiki/log.md` — keine Concept-Datei, keine `index.md` (die aggressive `git diff --stat -- wiki/`-Default-Effektiv-ausgabe zeigt denselben Pfad, `wiki/log.md | 1 +`). *(Anmerkung: `schema/compiler.md` und `deferred-work.md` liegen **außerhalb** `wiki/` und sind daher kein Teil dieser Diff-Probe — sie gehören zum Instruktions-, nicht zum Bundle-Baum; der Ghost-Diff-Begriff dieser Sektion gilt nur für `wiki/`.)* 6. **Run-Vorphase-Bausteine (Defer R-1 + P2, in den Update-Pfad eingearbeitet):** Beide sind **keine** neuen Prozesse — wiederverwendbare, reproduzierbare textuelle Check-Blöcke innerhalb der Instruktions-Ausführung (D-3): - - **Change-Detection (Defer R-1, Input-Zuwachserkennung):** Vor der Interpretation bestimmt der Producer, **welche `raw/`-Dateien Zuwachs** sind (neu/modifiziert). Deterministische Mittel: `git diff --name-only -- raw/` auf das `raw/`-Verzeichnis und/oder der **SHA-256-Record aus `raw/**/source.md`** (Provenienz-Sidecar, §1 Pkt. 4). Als `` dient der **letzte committete Zustand des Workspace**, den der Producer als Ausgangslage deklariert (deterministisch: der HEAD der vorherigen Mutations-Boundary, AD-17f — die Zuwachserkennung ist damit gegen denselben Baseline-Commit definiert, gegen den auch die Diff-Probe in Pkt. 5 läuft, siehe dort). Nur die so als Zuwachs erkannten Dateien werden als neue Evidenz interpretiert; unveränderte `raw/`-Dateien bleiben außen vor. Ist der SHA-256-Record unlesbar/fehlend, wird die Datei dennoch als Zuwachs **nicht doppelt** verarbeitet (textueller Hinweis) und gegen den `git diff`-Befund abgeglichen (kein Doppel-Verdikt). - - **Pre-Run-Reconcile-Check-Block (Defer P2):** Vor jeder Mutation durchläuft der Producer den gebündelten Vorprüf-Block und hält ihn textuell fest: (1) Ziel-Pfade (Ausgangs-Kandidatenliste, §3 Pkt. 2); (2) Quellen-Existenz (EC-1 via Validator-Punkt: jede referenzierte `raw/`-Datei existiert als Datei); (3) Betroffenheits-Kandidatenliste (§3 Pkt. 2, textuell-deterministisch); (4) `wiki/index.md`-V-1-Vorbedingung (fehlende Bundleroot → Run-FAIL, §3 Pkt. 3/§3-Voraussetzungsprüfung, Vertrag §2). Dieser Block ist der in `deferred-work.md` als P2 notierte Pre-Plan-Schritt und wird durch Story 3.1 als Teil des inkrementellen Runs ausgeführt. Der Block wird **einmal pro Run führend** an der Spitze erhoben; die Ausgangs-Kandidatenliste ist dabei **die** Kandidatenliste, gegen die der Diff-Selbsttest (Pkt. 5) prüft (keine zweite, davon abweichende Erhebung nach der Mutation). -7. **Worked Example (an die reale Ist-Lage gebunden, grammatisch):** Ein Run mit neuer committeter Evidenz `raw/epics/epics-2026-08-14.md#FR-12` (Zuwachs über die bisher verarbeitete Stelle hinaus; die Kennung FR-12 existiert real in der Datei) trifft über `rg -l 'FR-12' wiki/` das bestehende Concept `wiki/wissensarchitektur/source-material.md` (Term-/Konzept-Überschneidung, Bereich `wissensarchitektur`). Der Run aktualisiert diesen Pfad (Body-Erweiterung mit neuem §5.5-Inline-Beleg `(raw/epics/epics-2026-08-14.md#FR-12)`, `sources`-Ergänzung um diesen `resource`, `generated.at` = aktueller Run-Zeitstempel, `log.md`-Eintrag „Story 3.1-Update"). `git diff --name-only -- wiki/` zeigt ausschließlich `wiki/log.md` und `wissensarchitektur/source-material.md` (betroffen) — kein Ghost-Diff, keine unberührte `index.md` im Diff (der Index-Link bleibt unverändert). + - **Change-Detection (Defer R-1, Input-Zuwachserkennung):** Vor der Interpretation bestimmt der Producer, **welche `raw/`-Dateien Zuwachs** sind (neu/modifiziert). Deterministische Mittel: `git diff --name-only -- raw/` auf das `raw/`-Verzeichnis und/oder der **SHA-256-Record aus `raw/**/source.md`** (Provenienz-Sidecar, §1 Pkt. 4). Als `` dient der **letzte committete Zustand des Workspace** (deterministisch: der HEAD der vorherigen Mutations-Boundary, AD-17f). **Auflösungs-Regel (D-2-Präzisierung, Review-Loop 2):** der Producer **notiert den `` (vollen SHA) im `wiki/log.md`-Eintrag des Runs** — damit ist er deterministisch auflösbar ohne Domain-State-Annahme an Git (AD-14: Git liefert Historie, nicht Domain-State; der log.md-Eintrag ist der State-Referenz-Punkt, keine Git-Historie-Interpretation). **Diskrepanz-Regel:** widersprechen sich `git diff`-Befund und SHA-256-Record für dieselbe Datei, **gewinnt der `git diff`-Befund** (Commit-Boundary = Mutations-Boundary, AD-17f); der SHA-256-Record bleibt Sekundär-Fingerprint. Ist der SHA-256-Record unlesbar/fehlend, wird die Datei dennoch als Zuwachs **nicht doppelt** verarbeitet (textueller Hinweis) und gegen den `git diff`-Befund abgeglichen (kein Doppel-Verdikt). **Fallback:** existiert keine vorherige Mutations-Boundary (frischer Workspace ohne Lauf-Historie), gilt **alle `raw/`-Dateien als Zuwachs**. Die Diff-Probe in Pkt. 5 läuft gegen **dasselbe** `` (Review-Loop-2-Korrektur des Rev-2.4.1-Claims: die Pkt.-5-Probe trägt das Baseline-Commit-Argument explizit). + - **Pre-Run-Reconcile-Check-Block (Defer P2):** Vor jeder Mutation durchläuft der Producer den gebündelten Vorprüf-Block und hält ihn textuell fest: (1) **Input-Zustand** (AD-17a, I/O-Matrix `INPUT_UNCOMMITTED`; Review-Loop-2-D-3): Working-Copy von `raw/` und `wiki/` gegen HEAD prüfen — bei Abweichung (uncommitteder Zustand) bricht der Run mit dem **textuell benannten Abbruch „published/committed Input erforderlich"** ab, **vor** Interpretation und vor jeder Mutation (keine Mutation gegen Zwischenstände); (2) Ziel-Pfade (Ausgangs-Kandidatenliste, §3 Pkt. 2); (3) Quellen-Existenz (EC-1 via Validator-Punkt: jede referenzierte `raw/`-Datei existiert als Datei); (4) Betroffenheits-Kandidatenliste (§3 Pkt. 2, textuell-deterministisch); (5) `wiki/index.md`-V-1-Vorbedingung (fehlende Bundleroot → Run-FAIL, §3 Pkt. 3, Vertrag §2). Dieser Block ist der in `deferred-work.md` als P2 notierte Pre-Plan-Schritt und wird durch Story 3.1 als Teil des inkrementellen Runs ausgeführt. **Zeitpunkt (Review-Loop-2-Präzisierung):** der Block wird **nach Reconcile (2) und vor Mutieren (4)**, am **Anfang der Mutationsphase**, einmal pro Run durchgeführt — die Kandidatenliste (Elemente 2/4) existiert zu diesem Zeitpunkt bereits; die **Diff-Probe (Pkt. 5) läuft am Ende desselben Blocks, nach den Mutationen, vor dem Commit**. Die Kandidatenliste, die hier festgehalten wird, ist **die** Kandidatenliste, gegen die der Diff-Selbsttest (Pkt. 5) prüft (keine zweite, davon abweichende Erhebung nach der Mutation). +7. **Worked Example (an die reale Ist-Lage gebunden, re-executiert; Review-Loop-2-Korrektur):** Ein Run mit neuer committeter Evidenz `raw/epics/epics-2026-08-14.md#FR-12` (Zuwachs über die bisher verarbeitete Stelle hinaus; die Kennung FR-12 existiert real in der Datei) trifft über `rg -l 'FR-12' wiki/` das bestehende Root-Concept `wiki/knowledge-kompilation-inkrementell.md` (Term-/Konzept-Überschneidung — re-executierter Befund: der Grep-Ausgabe-Pfad ist `knowledge-kompilation-inkrementell`; das Rev-2.4.1-Beispiel `wissensarchitektur/source-material.md` enthielt den Term **nicht** und ist damit korrigiert). Der Run aktualisiert diesen Pfad (Body-Erweiterung mit neuem §5.5-Inline-Beleg `(raw/epics/epics-2026-08-14.md#FR-12)`, `sources`-Ergänzung um diesen `resource` — sofern nicht bereits deklariert, sonst No-Op gemäß Pkt. 2, `generated.at` = aktueller Run-Zeitstempel, `log.md`-Eintrag „Story 3.1-Update"). Die Diff-Probe (Pkt. 5, ``-Form) zeigt ausschließlich `log` und `knowledge-kompilation-inkrementell` (betroffen, normalisiert) — kein Ghost-Diff, keine `index.md` im Diff (der Index-Link bleibt unverändert). ## 6. Validieren (mechanische Bestätigung) @@ -346,3 +349,4 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - **Revision 2.3 (2026-08-18, Story 2.5):** Neue Sektion **§5.8 „Progressive Discovery über `index.md` (Story 2.5)"** eingefügt (nach §5.7, vor §6): (1) **Discovery-Pfad** (Bundleroot `wiki/index.md` → Area-`index.md` frontmatterlos → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot — AD-9/FR-11, gewurzelte Erreichbarkeit Root → Area → Concept), (2) **gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest** (`UNREACHABLE AREA: ` für unverlinkte Area; `NESTED AREA: ` für Zwei-Ebenen-Kandidaten inkl. der Area-ohne-`index.md`-Lücke `wiki/a/b/concept.md`; gekoppelte Meldungen an den Run-Nachweis gemäß §5.6-Pkt.-4-analoger NFR-4-Regel; Instruktions-Selbsttest, **keine** neue §7-Klasse — schließt die Validator-Navigation-Lücke, ohne Validator-Change, AD-3), (3) **konsolidierte Zwei-Ebenen-Kartografie** (respondiert Defer **F-07**, schließt es): Root + eine Area-Ebene; `wiki/a/b/` ist keine zugelassene Anlageform — der Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); §3.2 bleibt der Dateikollision bestehender Concepts vorbehalten (Loopback-1-Renegotiation, Option A); (4) **Suche = Consumer-grep** (`grep -n wiki/` / ripgrep, AD-13 — keine Such-Datenbank, kein Embedding, kein Index-Datei-Format), (5) **Discovery-Demo (optional, kein MOVE)** — Hinweis auf Formel-4-Re-Baseline-Pflicht bei Durchführung. Nachgeführt: **§7** (Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt — Navigation/Area-Indizes jetzt in §5.8 verankert, Suche = Consumer-Thema; die Vorbehalt-Zeile lag in der Baseline `main` bei Z. 253, nach dem §5.8-Einschub bei Z. 285), **§8-Normreferenzen** (AD-9/AD-13 → §5.8, FR-11 → §5.8/§5.7 Pkt. 5, NFR-3 neu, PRD-§4.3-Zeile nachgeführt) + **Revisionslog 2.3**. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/` (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. - **Revision 2.4 (2026-08-18, Story 3.1):** Neue Sektion **§5.9 „Inkrementelles Update bestehender Concepts (Story 3.1)"** eingefügt (nach §5.8, vor §6) — Update-Stimulus (Reconcile-Kandidatenliste), Mutationsmechanik (Erweitern/Präzisieren/Korrigieren; `sources` nur um echte neue Belege; `generated.at` = aktueller Run-Zeitstempel; `verified` unangetastet), Index-/Link-Form unverändert (§5.6-Pin), `log.md`-Eintragspflicht („Story 3.1-Update"-Markierung; Disagreement-Fälle bleiben dokumentiert, keine Korrektur-Klassifikation hier — Epic-4-Interface), **Erhaltungs-Invariante + deterministischer Diff-Selbsttest** (`git diff --stat -- wiki/` ⊆ betroffene Concepts ∪ `log.md` ∪ Index; Ghost-Diff = textuell benannter Instruktions-Verstoß, FT-6/FR-12), Run-Vorphase-Bausteine (Defer **R-1** Change-Detection via `git diff` auf `raw/` + SHA-256-Record aus `source.md`; Defer **P2** Pre-Run-Reconcile-Check-Block — Zielpfade, EC-1-Existenz, Kandidatenliste, V-1), Worked Example. **§3 Reconcile:** Pkt. 2 Kollision-Hold (bisheriger Epic-3-Abbruch bei bereits existierendem Concept) **ersetzt** durch **Update-Routing** (bestehende Wissenseinheit → Update-Kandidat im bestehenden Pfad; kein Duplikat, kein stummer Überschreib; AD-16-Default-Erhaltung) + **textuell-deterministische Kandidatenliste** (Konzept-/Term-Überschneidung via `grep`/`ripgrep`, `index.md`-Traversal, Link-Following — AD-13; feinkörniger Mechanismus Story 3.2). **§0-Aufruf:** sechs Phasen für Neu-Anlage- und Update-Variante präzisiert; Reconcile/Mutieren betreffen auch bestehende Concepts. **§5.7 Pkt. 3 / §5.8 Pkt. 2/3:** Top-Level-Referenz von „§3.2-Kollisions-Hold" auf das Update-Routing (§3 Pkt. 2, §5.9) nachgeführt (die bisherige Epic-3-Abbruch-Formulierung ist vollständig entfernt). **§7:** Update-Thema aus dem Epic-3-Vorbehalt **entlassen** (verbleibende 3.x-Themen benannt: Synthese → Story 3.4, Leasing/Dirty-Tree → Story 3.5/3.6, Relevanz-Verfeinerung → Story 3.2); Scope-Einleitung um die Update-Variante geöffnet. **§8:** Normreferenzen um A0-6/FR-6/FR-12 ergänzt. **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. - **Revision 2.4.1 (2026-08-18, Story 3.1, Step-04-Review-Patch-Runde; D-3-Instruktions-Patch, kein neuer Inhalt):** §5.9-Konsolidierung aus den drei Review-Layern — (1) Prüfgrundlage auf `validator.md` **Revision 9** angehoben (§0-Header, §8-Link), §8-Verlusttext um die Punkt-11-Area-Lesart (Rev-9) ergänzt; (2) §5.9 Pkt. 5 Diff-Selbsttest operationalisiert (Probe `git diff --name-only -- wiki/` statt `--stat`; Ergebnismenge ⊆ **Kandidatenliste** (explizit §3 Pkt. 2) ∪ `log.md` ∪ nachgeführte `index.md`; Rücksetzhilfe „ob der Ghost auf einem Kandidatenpfad liegt"); Klarstellung, dass `schema/compiler.md`/`deferred-work.md` **außerhalb** `wiki/` liegen und daher nicht Teil der Diff-Probe sind — der Story-3.1-Nachweis ist `wiki/log.md` (Differenz zu den 4 volle `git status --porcelain`-Einträgen); Diff-Erwartung für das reine Body-Update in Pkt. 7 auf `git diff --name-only` umgestellt, Ergebnismenge `wiki/log.md` + `wissensarchitektur/source-material.md` (keine `index.md`); (3) §5.9 Pkt. 3-Widerspruch aufgelöst (Index-Regel unverändert, `log.md`-Eintragspflicht bleibt ausgeschlossen — Präzisierung „kein `log.md`-Zusatz" war falsch, korrekt „kein Index-Zusatz"); (4) §5.9 Pkt. 2 um **Mehrfach-Treffer-Konsolidierung** ergänzt (mehrere Einheiten → 1 Update/`log.md`-Eintrag/`at`; Verarbeitungsreihenfolge = Auftreten in der Zuwachs-Sicht); (5) §5.9 Pkt. 1/6-Anker §1.1/§1.4 → **§1 Pkt. 1/Pkt. 4** (die tatsächlichen Label; §5.8-Pkt-2-Formel-Zeile bleibt historisch); (6) Ghost-Diff **Konsequenz** + Commit-Boundary-Umsetzung definiert (Rück-Rollen vor Run-Gültigkeit, `log.md`-Kopplung als Abbruch-Vorlauf „korrigierter Teil-Run"); (7) Defer-**R-1**-Baseline festgelegt (HEAD der vorherigen Mutations-Boundary); (8) §5.9 Pkt. 7-Worked Example auf den **realen Ist-Baum** gehoben (`raw/epics/epics-2026-08-14.md#FR-12`, `rg -l 'FR-12'`; das fiktive `epics-2026-08-18.md`/`payload` entfernt); (9) §5.8-Pkt-3-Revision-Feinschliff — die Rev-9-Lücke ist geschlossen; die Markierung ist Pkt. 3. **Abschlussklausel der Patch-Runde:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. +- **Revision 2.4.2 (2026-08-19, Story 3.1, bmad-code-review Loop 2, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4 = 1/1/1/1):** (1) **Diff-Selbsttest (Pkt. 5) operationalisiert + Blind-Spots geschlossen (D-1):** Probe erweitert auf `git diff --name-only -- wiki/` **plus** `git status --porcelain -- wiki/` (erfasst ungetrackte neue Dateien `??` — die Duplikat-Kontrolle „keine neue Datei" braucht diese Sicht; `git diff` allein ist blind für Untracked); **Probe-Zeitpunkt fixiert vor dem Commit** (am Ende des P2-Blocks, nach den Mutationen) — nach dem Commit wäre die Probe vacuous (leere Ausgabe, AD-17f); erlaubte Teilmenge-Menge um **Neu-Anlage-Zielpfade** (§5.1/§5.7) ergänzt — Misch-Runs (Neu-Anlage + Update im selben Run) markieren neu angelegte Pfade nicht fälschlich als Ghost-Diff; **Pfad-Normalisierung** definiert (Strip `wiki/`-Präfix + `.md`-Suffix vor dem Teilmenge-Vergleich, da Kandidaten/Ziel-Pfade als relative OKF-Pfade *ohne* `.md` definiert sind); **Rollback-Mechanik** für den Ghost-Diff deterministisch benannt (modifizierte Pfade via `git checkout -- `, ungetrackte neue Dateien gelöscht, Index via `git checkout -- `; §5.3/§6.3-Teilzustand-Rollback greift daneben unverändert). (2) **R-1-Baseline deterministisch + Abweichungsregel (D-2):** `` (HEAD der vorherigen Mutations-Boundary, AD-17f) wird vom Producer **im `wiki/log.md`-Run-Eintrag notiert** (voller SHA) — deterministisch auflösbar ohne Domain-State-Annahme an Git (AD-14); **Diskrepanz-Regel**: widersprechen `git diff`-Befund und SHA-256-Record derselben Datei, **gewinnt `git diff`** (Commit-Boundary-Prinzip), SHA-256 bleibt Sekundär-Fingerprint; **Fallback**: ohne vorherige Mutations-Boundary gelten alle `raw/`-Dateien als Zuwachs; Rev-2.4.1-Claim „derselbe Baseline-Commit wie Pkt. 5" **korrigiert** (die Pkt.-5-Probe trägt das Baseline-Commit-Argument jetzt explizit). (3) **INPUT_UNCOMMITTED-Abbruch (D-3) + Anker-Divergenz:** neuer P2-Check-Block-Element (1) **Input-Zustand** — Working-Copy von `raw/`/`wiki/` gegen HEAD prüfen, bei Abweichung **benannter Abbruch „published/committed Input erforderlich"** vor Interpretation und vor jeder Mutation (AD-17a, I/O-Matrix-`INPUT_UNCOMMITTED` — zuvor nur Referenz auf §1 Pkt. 1, keine Zustandsprüfung/Abbruchmeldung); die **Spec↔Anker-Divergenz** (frozen Spec zitiert 3× „§1.1", §1 ist eine nummerierte Liste Pkt. 1–4 ohne §1.1-Label; Rev-2.4.1 korrigierte nur die Anker *in* compiler.md) wird hier als dokumentierte Fußnote gesichert — die Spec bleibt frozen (nur per menschlicher Renegotiation änderbar). (4) **Sandbox-Edge-Test-Nachweis (D-4):** die fünf I/O-Matrix-Szenarien (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) + die D-3-Abbruch-Kontrolle sind als re-executierbare Sandbox-Skripte mit **konkreten deterministischen Ausgaben** in der Spec-`## Verification`-Sektion (Sandbox-Beleg) verankert — die `wiki/log.md`- und `deferred-work.md`-Verweise („in der Spec-Verification enthalten") auflösbar. (5) **Instruktions-Präzisierungen:** P2-Block-**Zeitpunkt** (nach Reconcile, am Anfang der Mutationsphase; Diff-Probe am Block-Ende) — löst den Widerspruch „einmal an der Spitze erhoben" vs. „Kandidatenliste entsteht erst im Reconcile"; **No-Op-Kandidat**-Regel (Pkt. 2: Pfad, der die Evidenz bereits vollständig enthält → keine Mutation/kein `at`-Bump/kein `log.md`-Eintrag, byte-identisch — die engere Auslegung); **Mehrfach-Treffer-Reihenfolge** für *alle* Einheiten definiert (Zuwachs-Sicht-Ordnung; lexicografisch nur als Tie-Break bei identischem Ort — AD-17h); **Update-Pfad-Rollback** in §5.3 Pkt. 3 (modifizierte Pfade aus Baseline-Commit wiederherstellen); **`generated.at`↔AD-17h-Gap** explizit als offener Punkt mit Home Story 3.8 benannt (Wanduhr-`at` erzeugt bei gleichem Input unterschiedliche Bundle-States; Konvention bleibt bis dahin bindend, Wechsel = Ask-First); **Term-Ableitung** (Pkt. 2 (a)) als §2-Interpretation abgegrenzt — die Erhebung *mit festem Term* ist textuell-deterministisch, der Term-Mechanismus (Kanonisierung/Synonyme) Story 3.2; **Link-Following** mit besuchter Menge (keine Schleife bei zyklischen Links); **Worked Example (Pkt. 7) auf den realen Ist-Baum korrigiert** (`rg -l 'FR-12' wiki/` trifft `wiki/knowledge-kompilation-inkrementell.md`, **nicht** `wissensarchitektur/source-material.md` — Rev-2.4.1-Beispiel enthielt den Term nicht); stale-Anker `§3.2-Kollisionsprüfung` (Pkt. 3-Zuordnung) und `§3-Voraussetzungsprüfung` (P2-Block) sowie §5.8-Pkt.-3-Zeiger („Pkt. 1" → „Pkt. 2") nachgeführt. **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. diff --git a/wiki/log.md b/wiki/log.md index 6962428..cdea97c 100644 --- a/wiki/log.md +++ b/wiki/log.md @@ -1,5 +1,8 @@ # Log +## 2026-08-19 +- **Story 3.1 «Inkrementellen Datenfluss implementieren (Interpret → Reconcile → Synthesize → Update)» → `done` (bmad-code-review Loop 2, 4 Layer: blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor; Diff-Baseline `802a557` → `efc543c`; Nutzer-Entscheidungen D-1/D-2/D-3/D-4 = 1/1/1/1, jeweils empfohlene Option):** `schema/compiler.md` → **Revision 2.4.2** (alle 4 Decision-Resolutions + 16 Patches, rein textuell — kein Code, kein Standalone, keine neue §7-Klasse): (1) **D-1: Diff-Selbsttest (Pkt. 5) operationalisiert** — Probe = `git diff --name-only -- wiki/` **plus** `git status --porcelain -- wiki/` (erfasst ungetrackte `??`-Dateien — die Duplikat-Kontrolle braucht diese Sicht; `git diff` allein ist blind dafür), **Probe-Zeitpunkt vor dem Commit** (am Ende des P2-Blocks, nach den Mutationen; nach dem Commit wäre die Probe vacuous, AD-17f), erlaubte Menge um **Neu-Anlage-Zielpfade** (§5.1/§5.7) ergänzt (Misch-Runs: keine fälschlichen Ghost-Diffs), **Pfad-Normalisierung** (Strip `wiki/`-Präfix + `.md`-Suffix vor dem Teilmenge-Vergleich), **Rollback-Mechanik** deterministisch benannt (`git checkout -- ` für modifizierte Pfade, ungetrackte löschen, Index `git checkout -- `); (2) **D-2: R-1-Baseline deterministisch** — `` (HEAD der vorherigen Mutations-Boundary, AD-17f) wird vom Producer **im `wiki/log.md`-Run-Eintrag notiert** (voller SHA; AD-14: Git liefert Historie, nicht Domain-State — deshalb die Notiz); **Diskrepanz-Regel**: `git diff` gewinnt, SHA-256 bleibt Sekundär-Fingerprint; **Fallback**: ohne vorherige Mutations-Boundary gelten alle `raw/`-Dateien als Zuwachs; (3) **D-3: INPUT_UNCOMMITTED-Abbruch implementiert** — neuer P2-Check-Block-Element (1) **Input-Zustand**: Working-Copy von `raw/`+`wiki/` gegen HEAD prüfen, bei Abweichung **benannter Abbruch „published/committed Input erforderlich"** (AD-17a) vor Interpretation und vor jeder Mutation — die gefrorene I/O-Matrix-Verpflichtung ist damit als Zustandsprüfung + Abbruchmeldung umgesetzt (zuvor nur Referenz auf §1 Pkt. 1); die **Spec↔Anker-Divergenz** (frozen Spec zitiert 3× „§1.1", §1 ist eine nummerierte Liste Pkt. 1–4 ohne §1.1-Label) ist als dokumentierte Fußnote in Rev-2.4.2 gesichert (Spec bleibt frozen); (4) **D-4: Sandbox-Edge-Test-Nachweis** — die fünf I/O-Matrix-Szenarien (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) + die D-3-Abbruch-Kontrolle sind als re-executierbares Skript (`_bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh`, `bash …` ab Workspace-Root, Sandbox-Bäume unter `/tmp`) mit **konkreten deterministischen Ausgaben** in der Spec-`## Verification Record (Ausführungs-Beleg, 2026-08-19)` verankert — die Verweise „in der Spec-Verification enthalten" (dieses Log, `deferred-work.md`) sind damit auflösbar; (5) **Instruktions-Präzisierungen:** P2-Block-Zeitpunkt (nach Reconcile, am Anfang der Mutationsphase; Diff-Probe am Block-Ende), **No-Op-Kandidat**-Regel (Evidenz bereits vollständig enthalten → keine Mutation/kein `at`-Bump/kein `log.md`-Eintrag, byte-identisch), **Mehrfach-Treffer-Reihenfolge** für alle Einheiten (Zuwachs-Sicht-Ordnung; lexicografisch nur Tie-Break — AD-17h), **Update-Pfad-Rollback** in §5.3 Pkt. 3 (modifizierte Pfade aus Baseline-Commit wiederherstellen), **`generated.at`↔AD-17h-Gap** explizit benannt (Home: Story 3.8 — Wanduhr-`at` erzeugt bei gleichem Input unterschiedliche Bundle-States; Konvention A0-20 bleibt bindend, Wechsel = Ask-First), Term-Ableitung als §2-Interpretation abgegrenzt (Erhebung mit festem Term deterministisch; Term-Mechanismus Story 3.2), Link-Following mit besuchter Menge (keine Schleife bei zyklischen Links), **Worked Example (Pkt. 7) auf den realen Ist-Baum korrigiert** (`rg -l 'FR-12' wiki/` trifft `wiki/knowledge-kompilation-inkrementell.md`, nicht `wissensarchitektur/source-material.md` — das Rev-2.4.1-Beispiel enthielt den Term nicht), stale-Anker (`§3.2-Kollisionsprüfung`, `§3-Voraussetzungsprüfung`, §5.8-Pkt.-3-Zeiger „Pkt. 1" → „Pkt. 2") nachgeführt. **Abschlussklausel Rev 2.4.2:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **Review-Loop-2-Aufarbeitung zum Implementierungs-Eintrag (2026-08-18, oben):** (a) der dortige (b)-Diff-Selbsttest-Beleg zitierte die Vor-Rev-2.4.1-Form `git diff --stat -- wiki/` — die operative Probe ist seit Rev 2.4.2 die D-1-Form (`git diff --name-only -- wiki/` + `git status --porcelain -- wiki/`); (b) der Implementierungs-Eintrag dokumentierte „Revision 2.4" — der Story-3.1-Commit `efc543c` enthält **Revision 2.4 + 2.4.1** (Step-04-Review-Patch-Runde 2026-08-18, in `deferred-work.md` als „Story-3.1-Review-Protokoll" protokolliert) und ist jetzt auf **2.4.2** (dieser Eintrag) fortgeführt; (c) Statuskette: `in-progress` (Implementierungs-Eintrag) → `review` (Review-Handoff `efc543c`) → **`done`** (dieser Eintrag — Loop-2-Abschluss: 4 Decision-Resolutions + 16 Patches, keine unresolved Findings; spec-Frontmatter `status: 'done'` + `review_loop_iteration: 2` deckungsgleich). **Selbsttest-Beleg (re-executiert 2026-08-19, ab Workspace-Root, D-1-Probe-Form; `` = `802a5576eb4bbf54761a947e43e68b7e7ea9d67d` = Review-Baseline, hier als Konventions-Demonstration notiert — bei echten Run-Einträgen ist es der HEAD der vorherigen Mutations-Boundary, D-2):** (a) Instruktions-Integrität — `grep -n "5.9" schema/compiler.md` → §5.9-Sektion vorhanden; `grep -n "Aktualisierung ist Epic 3" schema/compiler.md` → **kein Treffer** (Hold ersetzt, unverändert); (b) **Diff-Selbsttest (Erhaltungs-Invariante)** — `git diff --name-only 802a557… -- wiki/` → ausschließlich `wiki/log.md` (dieser Eintrag; keine Concept-Datei, kein Index, kein Ghost-Diff auf nicht betroffenen Pfaden — die Instruktions-Story mutiert keine Concept-Inhalte; FT-6/FR-12) + `git status --porcelain -- wiki/` → ` M wiki/log.md` (tracked, modifiziert — im erlaubten Satz; **keine** `??`-Einträge = keine ungetrackten neuen Dateien = kein Duplikat); normalisiert: `log` ⊆ erlaubte Menge (`log.md`); (c) **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 2.5, Story 3.1 mutiert keine Concept-Inhalte); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 3 und AC 5; (d) **Sandbox-/Edge-Tests (I/O-Matrix)** — ausgeführt, echte Outputs in der **Spec-`## Verification Record (Ausführungs-Beleg, 2026-08-19)`** (re-executierbar: `bash _bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh`): S1 HAPPY_PATH_UPDATE (Probe → `alpha`, `log`; 0 untracked), S2 UNTOUCHED_CONCEPT (leere Probe), S3 CONCEPT_COLLISION_BESTEHEND (nur `M`-Einträge, kein `??`), S4 CHANGE_DETECTION (außschließlich `raw/alpha-v2.md`; SHA-256 `21e7fc1d…` identisch), S5 PRE_RUN_RECONCILE (Run-FAIL V-1, Zustand sauber), S6 INPUT_UNCOMMITTED (benannter Abbruch „published/committed Input erforderlich (AD-17a)"). `sprint-status.yaml`: `3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile` `review` → **`done`**, `last_updated` → 08-19-2026. + ## 2026-08-18 - **Story 3.1 «Inkrementellen Datenfluss implementieren (Interpret → Reconcile → Synthesize → Update)» (Implementierung, Instruktions-Story D-3):** `schema/compiler.md` → **Revision 2.4** (inkrementeller Datenfluss als Erweiterungs-Instruktion, rein textuell — kein Code, kein Standalone, keine neue §7-Klasse): (1) **§3 Reconcile** — Pkt. 2 Kollision-Hold durch **Update-Routing** ersetzt (bestehende Wissenseinheit → **Update-Kandidat im bestehenden Concept-Pfad**, kein Duplikat, kein stummer Überschreib, AD-16-Default-Erhaltung; der Epic-3-Abbruch entfällt) + **textuell-deterministische Kandidatenliste** (Konzept-/Term-Überschneidung via `grep`/`ripgrep`, `index.md`-Traversal, Link-Following — AD-13; feinkörniger Relevanz-Mechanismus Story 3.2 vorbehalten); (2) **neue §5.9 «Inkrementelles Update bestehender Concepts (Story 3.1)»** (nach §5.8, vor §6): Update-Stimulus = Reconcile-Kandidatenliste (§3 Pkt. 2); Mutationsmechanik — **Erweitern** (Absatz/Beleg ergänzen), **Präzisieren** (Aussage schärfen, Beleg neu/nachgeführt, §5.5), **Korrigieren** (ersetzte Aussage + Ersetzungsbeleg, keine stille Löschung, AD-16-Default), `sources` nur um echte neue Belege ergänzen (§5.5-Pkt.-1b-Relokation, Vertrag §3.3-Subset), `generated.at` = aktueller Run-Zeitstempel (A0-20, einmalige `at`-Festlegung pro Run), vorhandenes human-`verified` bleibt stehen; Index-/Link-Form unverändert (§5.6-Pin, kein neuer Link bei reinem Body-Update); **`log.md`-Eintragspflicht** (Vertrag §5, „**Story 3.1-Update**"-Markierung; Disagreement-Fälle dokumentiert — Epic-4-Interface, keine Korrektur-Klassifikation hier); **Erhaltungs-Invariante (FT-6/FR-12) + re-executierbarer Diff-Selbsttest** — nach jedem Run `git diff --stat -- wiki/`, geänderte Dateien ⊆ (betroffene Concepts ∪ `log.md` ∪ nachgeführte `index.md`), Ghost-Diff = textuell benannter Instruktions-Verstoß (NFR-4), nie „Regenerate Everything" (AD-5, A0-6); **Run-Vorphase-Bausteine** — Defer **R-1** Input-Zuwachserkennung (Change-Detection via `git diff` auf `raw/` und/oder SHA-256-Record aus `raw/**/source.md`) und Defer **P2** Pre-Run-Reconcile-Check-Block (Zielpfade, Quellen-Existenz EC-1, Betroffenheits-Kandidatenliste, `wiki/index.md`-V-1) als wiederverwendbare textuelle Check-Blöcke (D-3, keine neuen Prozesse); Worked Example; (3) **§0-Aufruf** — sechs Phasen für Neu-Anlage- und Update-Variante präzisiert (Reconcile/Mutieren betreffen auch bestehende Concepts; AD-17a-Input-Regel referenziert, §1.1 bleibt); (4) **§5.7 Pkt. 3 / §5.8 Pkt. 2/3** — Top-Level-Kollisions-Referenz auf das Update-Routing (§3 Pkt. 2/§5.9) nachgeführt (die bisherige Epic-3-Abbruch-Formulierung „aktualisieren ist Epic 3" ist entfernt: Das Update lebt in §5.9; das Schutzprinzip der Erhaltung — „nicht stumm überschreiben" — bleibt als AD-16-Default in §3 Pkt. 2/§5.9 erhalten); (5) **§7-Selbstbegrenzung** — Update-Thema **aus dem Epic-3-Vorbehalt entlassen**, Scope-Einleitung um die Update-Variante geöffnet; die verbleibenden 3.x-Themen im Vorbehalt benannt: Synthese über mehrere Concepts → Story 3.4 (AD-4/FR-7), Leasing/Dirty-Tree-Schutz → Story 3.5/3.6 (AD-17a..f), Relevanz-Verfeinerung → Story 3.2; (6) **§8-Normreferenzen** um A0-6/FR-6/FR-12 ergänzt (AD-5/AD-6/AD-17h bereits gelistet) + **Revisionslog 2.4** mit Abschlussklausel (kein Vertrag-/Validator-/`raw/`-Change, keine neue §7-Klasse, kein Standalone, Commit-Boundary-Regel unverändert). **`deferred-work.md`:** Defer **R-1** (Input-Zuwachserkennung) und **P2** (Pre-Run-Reconcile-Check-Block) als **aufgegriffen (2026-08-18, Story 3.1 — §5.9)** markiert (append-only, bestehende Einträge unverändert). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3). **`sprint-status.yaml`:** `3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile` `backlog` → **`in-progress`** (dieser Statuswechsel findet mit Story 3.1 statt; Sprint-Status bereits synchronisiert) → **`review`** (Review-Handoff, der übliche Folgezustand nach dem Implementierungs-Eintrag, s. Sprint-Status-Workflow-Kommentar „Dev moves story to 'review'"). **Selbsttest-Beleg (re-executierbar, ab Workspace-Root):** (a) Instruktions-Integrität — `grep -n "5.9" schema/compiler.md` → neue §5.9-Sektion gefunden; `grep -n "Aktualisierung ist Epic 3" schema/compiler.md` → **kein Treffer** (Hold ersetzt); §7 enthält „Update" nur noch als „aus dem Vorbehalt entlassen"-Verweis, nicht als offenes Vorbehalts-Thema; (b) **Diff-Selbsttest (Erhaltungs-Invariante)** — `git diff --stat -- wiki/`: ausschließlich die von Story 3.1 berührten Dateien (`wiki/log.md`; keine Concept-Datei, kein Index, kein Ghost-Diff auf nicht betroffenen Pfaden — die Instruktions-Story mutiert keine Concept-Inhalte; FT-6/FR-12); (c) **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md`, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 2.5, Story 3.1 mutiert keine Concept-Inhalte); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 3 und AC 5. Sandbox-/Edge-Tests (I/O-Matrix): siehe Spec-Verification — isolierte Sandbox-Bäume für HAPPY_PATH_UPDATE (Update-Routing: bestehender Pfad aktualisiert, kein Duplikat), UNTOUCHED_CONCEPT (kein Diff auf nicht betroffenem Pfad), CONCEPT_COLLISION_BESTEHEND (Update statt Duplikat), CHANGE_DETECTION (nur Zuwachs über `git diff`/SHA-256-Record), PRE_RUN_RECONCILE (Check-Block vor jeder Mutation; fehlende Bundleroot → Run-FAIL, V-1) — deterministische Formel-Ausgaben/Nachweise je Szenario. - **Validierungs-Revision 9 (autorisiert; Epic-2-Retro F-02/AI-2-R-5, de-dupliziert mit `code-review-2-1-item-2`; ausgeführt 2026-08-18, Quelle: `_bmad-output/implementation-artifacts/spec-autorisierte-validator-revision-9-punkt-11-area-lesart.md`):** `schema/validator.md` → **Revision 9**. Fünf inhaltliche Änderungen, keine neue §7-Klasse (kein Punkt 15; Vertrag `schema/wiki-compiler.md` + Instruktion `schema/compiler.md` + `raw/` + `adapters/` + alle `wiki/`-Concept-Dateien unverändert, AD-3/D-3): (1) **Punkt-11-Area-Lesart formalisiert** (§3 Zelle: Für ein Area-Concept genügt die file-relative Referenz in der Area-`index.md` des nächsten Vorfahren; identitätsstiftend ist das Pärchen Area-Präfix (= bundle-relativer Verzeichnispfad der Area-`index.md`) + Link-Ziel ohne `.md`-Endung (AD-7a), textuelle Nennung der Bundle-Identität entfällt — Live: `wissensarchitektur/source-material` über `](source-material.md)` in `wiki/wissensarchitektur/index.md`; Normalisierung: `.`/`./`-Strip, `..` nicht Teil der Ein-Ebenen-Form); (2) **Punkt-4-Vorlage um `resolved=`-Token ergänzt + Semantik verankert** (`…|file://|resolved=`; §6.2: nur bei Ablehnung durch aufgelöste Lage außerhalb `raw/`, Wert = aufgelöster workspace-relativer Pfad) — Fixture 4a ableitbar; (3) **Innen-Ebenen-Punkt-6-Fixtures in §7.3** (Negativ: `role: x` in `sources`-Eintrag → FAIL Punkt 6; Positiv-Gegenzeile ausschließlich erlaubte Keys → SUCCESS); (4) **§7-Fixtures 11a** (Negativ: Area-Concept unverlinkt → `Concept nicht verlinkt=wissensarchitektur/source-material` am realen Live-Area-Namen; Positiv: file-relativ verlinkt → SUCCESS); (5) §8-Normreferenz-Notiz „Story 2.3 (Link-Form)" um die Rev-9-Area-Lesart ergänzt. Nachgeführt: Header auf „Revision 9" + Revisionslog-Eintrag Revision 9 (append-only, bestehende Einträge unangetastet). **Zertifizierung (mechanisch, D-3):** (a) Fixture 4a isoliert — Sample `sources: [{resource: README.md}]` mit existierender `README.md` an der Workspace-Root → `FAIL … Punkt 4: resource ausserhalb raw/ oder unzulaessiger Pfad (…|resolved=README.md)`, kein Vorab-FAIL durch Punkt 3/andere Punkte (Punkt-4-vor-3-Priorität §6.2); (b) Innen-Ebenen-Sample isoliert — `sources:\n - resource: raw/prd/prd-wow20-2026-08-14.md\n role: x` (Datei existiert, sonst-valides Sample) → genau `Punkt 6: nicht autorisiertes Feld (Key=role) bzw. unautorisierter Key in sources/generated/verified`, kein anderer Punkt (Isolations-Prinzip §7.3); (c) Punkt-11-Area-Lesart-Fixtures — Negativ 11a (Area-`index.md` verlinkt `source-material.md` **nicht**) → `FAIL … Punkt 11: Index-Regel verletzt (Concept nicht verlinkt=wissensarchitektur/source-material)`; Positiv 11a (file-relativer `](source-material.md)`-Link, Live-Lage) → SUCCESS (kein „nicht verlinkt"-FAIL); (d) **reales Bundle gegen den revidierten Validator (human-mechanisch ausgeführte Text-Instruktion)** — alle **7** `wiki/`-Dateien weiterhin **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1; Punkt 11 inkl. Area-Lesart), identisch zur Story-2.4/2.5-Lage — keine neu ausgelösten FAILs, Abschluss-Eigenschaft des §7-Katalogs gewahrt. **Mechanische Belege (ausgeführt 2026-08-18):** (e) AD-3/D-3-Freeze — `git diff --name-only ..HEAD -- schema/wiki-compiler.md schema/compiler.md raw/ adapters/` → **0 Treffer** (keine dieser Dateien geändert); (f) Live-Invariant der 7/7-SUCCESS-Behauptung — `grep -qF '](source-material.md)' wiki/wissensarchitektur/index.md` → **exit 0** (Area-Lesart lebend verankert). `sprint-status.yaml`: `code-review-2-1-item-2` und `epic-2-retro-item-14-…` (AI-2-R-5) → `done` (closed 2026-08-18, resolution mit Rev-9 + ref auf die Rev-9-Runde). -- 2.54.0 From 3aa484b2f4f6bd7ddb931cda76613d9318f84f57 Mon Sep 17 00:00:00 2001 From: Michael Tamse Date: Wed, 19 Aug 2026 09:16:19 +0200 Subject: [PATCH 07/16] =?UTF-8?q?feat:=20Story=203.2=20Textuell-determinis?= =?UTF-8?q?tische=20Relevanzbestimmung=20umsetzen=20(grep/ripgrep=20+=20Ma?= =?UTF-8?q?rkdown-Traversal=20+=20Link-Following)=20=E2=80=94=20compiler.m?= =?UTF-8?q?d=20Revision=202.5/2.6,=20=C2=A73.2-Mechanik,=20canonical-terms?= =?UTF-8?q?-Resolver,=20Mini-Sandbox=20T1-T4,=20Review-Loop-2-Patches,=20S?= =?UTF-8?q?tory=20done?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- .../implementation-artifacts/deferred-work.md | 9 +- .../sandbox-3-2/run-sandbox.sh | 142 ++++++++++++++++++ ...xtual-deterministisch-umsetzen-grep-rip.md | 109 ++++++++++++++ .../sprint-status.yaml | 4 +- schema/canonical-terms.md | 33 ++++ schema/compiler.md | 36 ++++- wiki/log.md | 2 + 7 files changed, 325 insertions(+), 10 deletions(-) create mode 100644 _bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh create mode 100644 _bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md create mode 100644 schema/canonical-terms.md diff --git a/_bmad-output/implementation-artifacts/deferred-work.md b/_bmad-output/implementation-artifacts/deferred-work.md index e5a728a..732ad1c 100644 --- a/_bmad-output/implementation-artifacts/deferred-work.md +++ b/_bmad-output/implementation-artifacts/deferred-work.md @@ -334,4 +334,11 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein - source_spec: `_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md` summary: **`epic-3-context.md` ist ein neues Artefakt außerhalb der Spec-Code-Map** — die Code Map listet exakt compiler.md / log.md / deferred-work.md / sprint-status.yaml (sonst read-only); die 50-Zeilen-Context-Datei (im Story-3.1-Commit neu) wird nirgends referenziert oder als erzeugt dokumentiert. Vom build-Verfahren (compile-epic-context) erzeugtes Kontext-Artefakt, keine Story-Inhalts-Mutation, kein Always/Ask-First/Never-Verstoß; Home: Story-3.2-Handoff oder nächstes Sprint-Sync (einzeilige Nennung im log.md-Nachweis genügt). evidence: bmad-code-review Story 3.1 (2026-08-19, Acceptance-Auditor-Layer): Spec-Code-Map vs. `git show efc543c --stat` (6 Dateien, `epic-3-context.md` new file). - status: offen + status: aufgegriffen (2026-08-19, Story 3.2) — einzeilige Nennung im `wiki/log.md`-Eintrag der Story 3.2 erfolgt; `epic-3-context.md` bleibt als vom build-Verfahren erzeugtes Kontext-Artefakt bestehen (keine Story-Inhalts-Mutation; Deckung über die Spec-`context:`-Frontmatter der Story-3.2-Spezifikation). +## Deferred from: Story 3.2 (Relevanzbestimmung, 2026-08-19) + +- source_spec: `schema/compiler.md` §3.2-Pkt.-1b (Story 3.2) + summary: **Em-Dash-»—«-Varianten-Lücke der Normalisierung** — die Kollaps-Klasse `[-–_ ]` (En-Dash »–«, Bindestrich »-«, Unterstrich »_«, Leerzeichen) deckt den Em-Dash »—« **nicht** ab. Eine Schreibvariante mit Em-Dash (z. B. »wissen — relevanz«, aus dem Kontext einer externen Quelle eingelesen) fällt nicht unter den Kollaps und wird nicht zu einer identischen canonischen Form normalisiert — eine erkannte Synonym-/Determinismus-Lücke der Relevanzbestimmung (A0-18/A0-19). Wird nicht stillschweigend in §3.2 ergänzt, sondern als offene Determinismus-Frage an **Story 3.8** (Determinismus-Vertrag, AD-17h) übergeben; bis dahin wird ein nicht auflösbarer Em-Dash-Term **wie notiert** verwendet (Kollaps-normalisiert, kein stiller Ausschluss). + evidence: Story-3.2-Review-Umsetzung (2026-08-19) — §3.2-Pkt.-1b dokumentiert die Lücke explizit als »Konventionelle Determinismus-Lücke (aufgezeichnet, nicht still hinzugefügt)« und beruft sich auf diesen deferred-work-Eintrag als Handoff-Ziel. + status: offen (Home: Story 3.8) + diff --git a/_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh b/_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh new file mode 100644 index 0000000..d33e2a6 --- /dev/null +++ b/_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh @@ -0,0 +1,142 @@ +#!/usr/bin/env bash +# Story 3.2 — Sandbox-Tests der textuell-deterministischen Relevanzbestimmung (§3.2) +# Re-executierbar: bash run-sandbox.sh (ab Workspace-Root; Sandbox unter /tmp/sb32) +# Zweck: Membership-Pin + Zwei-Run-Identität + NO_MATCH (leere Candidate-Liste) +# + log.md-Kontaminations-Pin (der Term liegt AUCH in log.md — die Candidate-Liste +# bleibt trotzdem auf Concept-Pfade definiert, §3.2-Pkt.-2a). +set -u +ROOT=$(mktemp -d /tmp/sb32-XXXXXX) +SB="$ROOT/sb" +mkdir -p "$SB/wiki" "$SB/raw" +cd "$SB" +git init -q +git config user.email "sandbox@test" +git config user.name "Sandbox" + +# ---------- Mini-Baum: Concept-Bodies + log.md, die den EXAKTEN Test-Term tragen ---------- +cat > wiki/index.md <<'EOF' +# Index +- [Alpha](alpha.md) +EOF +cat > wiki/alpha.md <<'EOF' +--- +type: concept +sources: + - resource: raw/alpha-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Das Alpha-Protokoll verwendet deterministische-relevanz-bestimmung für den Abgleich. +EOF +cat > wiki/beta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/beta-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Beta beschreibt ein anderes, hier nicht betroffenes Thema. +EOF +# log.md trägt denselben Term — der Kontaminations-Fall, den die Exklusion entschärft: +cat > wiki/log.md <<'EOF' +# Log + +## 2026-08-19 +- Story-3.2-Update: alpha (raw/alpha-v2.md; deterministische-relevanz-bestimmung). +EOF +cat > raw/alpha-v1.md <<'EOF' +Evidenz v1: deterministische-relevanz-bestimmung (Stelle S-1). +EOF +cat > raw/beta-v1.md <<'EOF' +Evidenz v1: Beta-Thema (Stelle S-1). +EOF +git add -A +git commit -qm "Baseline" +BASE=$(git rev-parse HEAD) +echo "BASELINE-COMMIT: $BASE (Sandbox-Root: $ROOT; loeschbar: rm -rf $ROOT)" +echo + +# ---------- Helfer: candidate-Erhebung mit tool-korrekter Exklusion (§3.2-Pkt.-2a) ---------- +# rg-Form: rg -l '' -g '!log.md' wiki/ +# grep-Form:grep -rl '' --exclude=log.md wiki/ +terms() { # $1=Term; nutzt rg wenn vorhanden (native -g-Exklusion), sonst grep --exclude + if command -v rg >/dev/null 2>&1; then + rg -l "$1" -g '!log.md' wiki/ + else + grep -rl "$1" --exclude=log.md wiki/ + fi +} +# Normalisierung der Ausgabe: wiki/-Präfix + .md-Suffix strippen (§3.2-Pkt.-3a) +normalize() { sed -e 's|^wiki/||' -e 's|\.md$||'; } + +# ===================================================================== +runlabel() { echo; echo "########## $1 ##########"; } + +runlabel "T1: Membership-Pin — Term trifft Concept-Body UND log.md; Candidate-Liste nur Concept-Pfade" +echo "--- Kandidaten-Erhebung: terms 'deterministische-relevanz-bestimmung' (Exklusions-Form) ---" +terms 'deterministische-relevanz-bestimmung' | normalize +echo "--- Erwartet: AUSSCHLIESSLICH 'alpha' (Concept-Pfad, ohne wiki/ + ohne .md) ---" +echo "--- Kontaminations-Kontrolle: was OHNE Exklusion getroffen würde (rg-OHNE -g / grep-OHNE --exclude) ---" +if command -v rg >/dev/null 2>&1; then + rg -l 'deterministische-relevanz-bestimmung' wiki/ | normalize +else + grep -rl 'deterministische-relevanz-bestimmung' wiki/ | normalize +fi +echo "--- OHNE Exklusion trifft es 'alpha' UND 'log' — die Exklusion (§3.2-Pkt.-2a) ist damit reell getestet ---" + +# ===================================================================== +runlabel "T2: Zwei-Run-Identität (AD-17h/A0-19) — zwei unabhängige Läufe, byte-identische Candidate-Liste" +FIRST1=$(terms 'deterministische-relevanz-bestimmung' | normalize) +SECOND1=$(terms 'deterministische-relevanz-bestimmung' | normalize) +FIRST2=$(terms 'alpha' | normalize) +SECOND2=$(terms 'alpha' | normalize) +echo "Lauf 1 (Term deterministische-relevanz-bestimmung): $FIRST1" +echo "Lauf 2 (Term deterministische-relevanz-bestimmung): $SECOND1" +echo "Lauf 1 (Term alpha): $FIRST2 # 'index' ist der legitime Stufe-b-Traversal-Treffer (Bundleroot verlinkt alpha.md), kein Kontaminations-Fehler" +echo "Lauf 2 (Term alpha): $SECOND2 # identische Ausgabe (Zwei-Run-Identität, AD-17h)" +if [ "$FIRST1" = "$SECOND1" ] && [ "$FIRST2" = "$SECOND2" ]; then + echo "RESULT: IDENTISCH (gleicher Git-State + gleiches Eingabeset -> identische Candidate-Liste, AD-17h)" +else + echo "RESULT: ABWEICHUNG (Determinismus-Vertrag verletzt)" >&2 + exit 1 +fi + +# ===================================================================== +runlabel "T3: NO_MATCH — Term trifft kein bestehendes Concept -> leere Candidate-Liste -> UNTOUCHED_CONCEPT" +echo "--- Kandidaten-Erhebung: terms 'vollkommen-neuer-gamma-termin' ---" +RES=$(terms 'vollkommen-neuer-gamma-termin' | normalize) +echo "Candidate-Liste: '${RES}' (leer = gewuenscht)" +if [ -z "$RES" ]; then + echo "RESULT: LEER (NO_MATCH -> UNTOUCHED_CONCEPT: keine Mutation, kein log.md-Zusatz; leere Menge ⊆ erlaubte Menge)" +else + echo "RESULT: FEHLER (erwartet leer)" >&2 + exit 1 +fi + +# ===================================================================== +runlabel "T4: Determinismus-Vertrag praktisch — Term in Mehrfach-Konzepten, Konsolidierung zur Vereinigung" +cat > wiki/gamma.md <<'EOF' +--- +type: concept +sources: + - resource: raw/gamma-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Gamma teilt den Term deterministische-relevanz-bestimmung (Stelle S-1). +EOF +git add -A; git commit -qm "Zuwachs gamma (teilt den Term)" +echo "--- Kandidaten-Erhebung (Term in alpha + gamma): ---" +terms 'deterministische-relevanz-bestimmung' | normalize | LC_ALL=C sort +echo "--- Erwartet: alpha, gamma (beide Concept-Pfade, lexikografisch; log ABGESCHNITTEN) ---" + +echo +echo "===== Sandbox abgeschlossen (alle 4 Tests) =====" +echo "Sandbox-Root: $ROOT" diff --git a/_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md b/_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md new file mode 100644 index 0000000..0de253e --- /dev/null +++ b/_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md @@ -0,0 +1,109 @@ +--- +title: 'Relevanzbestimmung textual-deterministisch umsetzen (grep/ripgrep + Markdown-Traversal + Link-Following) (Story 3.2)' +type: 'feature' +created: '2026-08-19' +status: 'in-review' +review_loop_iteration: 2 +baseline_commit: e3e7ec346df3e6190644d2c94e5cc7c42e6ed239 +context: + - _bmad-output/implementation-artifacts/epic-3-context.md +--- + + + +## Intent + +**Problem:** Die Compiler-Instruktion (`schema/compiler.md` §3 Pkt. 2, Revision 2.4.2) erhebt die Update-Kandidatenliste bisher über einen **platzgehaltenen ``** („die Term-Auswahl folgt der §2-Interpretation"), dessen Ableitung (Kanonisierung, Synonyme, Mehrfach-Terme je Einheit) explizit „Story 3.2 vorbehalten" ist (`compiler.md:41`; §7 `:319`). Damit ist die Relevanzbestimmung nicht vollständig deterministisch vorgegeben (AD-17h/A0-19): dieselbe Evidenz kann je nach Term-Wahl unterschiedliche Candidate-Listen erzeugen — ein Embedding-freier, textuell-deterministischer Mechanismus fehlt (PRD OQ-3, AD-13, A0-18). + +**Approach:** Story 3.2 löst die beiden Story-3.2-Vorbehalte auf und verankert in `schema/compiler.md` (D-3, rein textuell — kein Code, kein Standalone) den **feinkörnigen, textuell-deterministischen Relevanz-Findungsmechanismus** als verbindliche Ausformulierung der §3-Pkt.-2-Kandidatenerhebung: (a) **Term-Ziehverfahren** — die Candidate-Terme werden deterministisch aus der neuen Evidenz abgeleitet (bedeutungstragende Token-Folgen nach §2-Interpretation, durchgängige Normalisierung: lowercasing, `[-–_ ]`-Bindestrich-Varianten, ein kanonischer Schreibweisen-Resolver, mehrere Terme je Einheit erlaubt); (b) **Term-übergreifende Erhebung** über `wiki/` — grep/ripgrep, `index.md`-Traversal, Link-Following (dreistufig, mündet in die nachvollziehbare Candidate-Liste als relative OKF-Pfade ohne `.md`); (c) **Determinismus-Vertrag** — gleicher Git-State + gleiche Eingabemenge → gleiche Candidate-Liste in gleicher Reihenfolge (AD-17h/A0-19). Damit werden die Story-3.2-Vorbehalte in §3 Pkt. 2 und §7 aufgehoben. Vertrag (`schema/wiki-compiler.md`), Validator (`schema/validator.md`) und `raw/` bleiben read-only (AD-3); keine neue §7-Invaliditätsklasse. + +## Boundaries & Constraints + +**Always:** +- **Story 3.2 ist eine Instruktions-Story (D-3).** Der Relevanz-Findungsmechanismus wird ausschließlich in `schema/compiler.md` als deterministische Text-Instruktion verankert. Kein ausführbares Programm, kein Standalone, keine neue §7-Invaliditätsklasse, kein Change an `schema/wiki-compiler.md` / `schema/validator.md` / `raw/` (AD-3). +- **Determinismus (Kern, AD-17h/A0-19):** Die Relevanzbestimmung ist **deterministisch**: gleicher Git-State + gleiche Eingabemenge → identische Candidate-Liste, in identischer Reihenfolge (Zuwachs-Sicht-Ordnung; lexikografisch als deterministischer Tie-Break bei identischem Ort). Damit ist sie als nachvollziehbare Candidate-Liste (Concept-Pfade) verfügbar — deterministisch statt probabilistisch (AC-3). +- **Ausschließlich textuelle Mittel (AD-13, AC-1/AC-4, No-Goals):** Die Erhebung nutzt ausschließlich grep/ripgrep über `wiki/`, Markdown-Traversal von `index.md` und Link-Following (§5.6-Pin). **Kein** Einsatz von Embeddings, Vektor-Suche oder Knowledge-Graph-Datenbank im Compiler-Kern. +- **Kein Leasing-/Dirty-Tree-Scope in 3.2:** Leasing, Dirty-Tree, Staleness, Merge-Kollisionen bleiben Story 3.5/3.6; Commit-Boundary = Mutations-Boundary-Regel (AD-17f) und die Story-3.1-Bausteine (§5.9 Diff-Selbsttest, R-1/P2-Check-Block, INPUT_UNCOMMITTED-Abbruch, Update-Routing) bleiben unverändert — Story 3.2 ändert nur die **Erhebungs-Mechanik** der Candidate-Liste, nicht die Mutationspfade. +- `sprint-status.yaml`: Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` → **in-progress**. + +**Ask First:** Einführung nicht-textueller Mittel (Embeddings/Vector/KG) im Compiler-Kern (verboten durch AD-13, nur per Autorisierung änderbar) · Änderung der §5.6-Linkform (verboten durch A0-9) · AD-7d-Renames/Redirects · Validator-/Vertrags-/`raw/`-Change · Änderung der Commit-Boundary-Regel. + +**Never:** Änderungen an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3) · neue §7-Invaliditätsklasse · Standalone-Programm/Validator (D-3) · Embedding/Vector-Suche/KG im Compiler-Kern (AD-13, No-Goals) · Duplikat-Anlage eines bestehenden Concept-Pfads · „Regenerate Everything" (AD-5, A0-6). + +## I/O & Edge-Case Matrix + +| Scenario | Input / State | Expected Output / Behavior | Error Handling | +|----------|--------------|---------------------------|----------------| +| TERM_ABLEITUNG_SINGLETON | Neue Evidenz `raw/…` mit genau einem markanten Fachbegriff (z. B. `quanten-protocol-schlüssel`) | Term-Ziehverfahren ergibt genau diesen Begriff; grep-Erhebung über `wiki/` findet genau die Concept-Pfade mit diesem Term | N/A | +| TERM_ABLEITUNG_SYNONYM | Evidenz nennt einen Begriff in einer Schreibweise-Variante (z. B. `quanten protocol` vs. canonisch `quanten-protocol`) | Kanonisierungs-Resolver normalisiert auf die canonische Schreibweise; Erhebung findet die Concept-Pfade der canonischen Form | keine canonische Auflösung → Term wird wie notiert verwendet (kein stiller Ausschluss) | +| TERM_ABLEITUNG_MEHRFACH | Evidenz enthält mehrere bedeutungstragende Terme | Candidate-Liste = Vereinigung der Treffer über alle Terme; Vereinheitlichung über besuchte Menge (ein Pfad nur einmal) | N/A | +| TRAVERSAL_REACH_ONLY | Ein Konzeptterm trifft nur `wiki/index.md` (oder Area-`index.md`), nicht Concept-Bodies | `index.md`-Traversal (Root → Area → Concept, §5.8) liefert die darunter gewurzelten Concept-Pfade als Treffer | fehlende Bundleroot → Run-FAIL (V-1, besteht fort) | +| LINK_FOLLOWING_ZYKLUS | Concept-Links bilden einen Zyklus (A → B → A) | Link-Following mit **besuchter Menge** (aus Story 3.1): jeder Pfad nur einmal — keine Endlos-Schleife, endliche Candidate-Liste | N/A | +| NO_MATCH | Neuer Term trifft kein bestehendes Concept (keine Überschneidung) | Leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad): keine Mutation, kein `log.md`-Zusatz | leere Menge ist Teilmenge jeder erlaubten Menge (Ghost-Diff-negativ) | + + + +## Code Map + +- `schema/compiler.md` — **primär mutiert** (D-3, einziger Instruktions-Ort): + - §3 Reconcile Pkt. 2 (`:41`): **Story-3.2-Vorbehalt auflösen** — der feinkörnige Term-/Relevanz-Mechanismus wird eingearbeitet (Term-Ziehverfahren, Kanonisierungs-Resolver, drei Erhebungs-Stufen grep/ripgrep + Traversal + Link-Following, Candidate-Liste als relative OKF-Pfade ohne `.md`, Determinismus-Beschreibung); verortet als **neue Sektion §3.2 „Relevanzbestimmung (Story 3.2)"** direkt nach §3 — Kern-Anker bleibt Pkt. 2 („Erhebung nach §3.2"). + - §7 Selbstbegrenzung (`:319`): **Story-3.2-Vorbehalt entfernen** („Feinkörnige Relevanz-Verfeinerung" entlassen) — verbleibende 3.x-Themen: Synthese → 3.4, Leasing/Dirty-Tree → 3.5/3.6. + - §8 Revisionslog (`:350–352`): **Revision 2.5** (Story 3.2) + **2.6** (Step-04-Loop-2-Patch-Runde) — Normreferenzen AD-13/A0-18/OQ-3 ergänzen (AD-17h steht bereits; **A0-19 wird ebenfalls ergänzt** — war im Ist-§8 noch nicht gelistet; auch `A0-19` als Determinismus-Referenz); Abschlussklausel (kein Vertrag-/Validator-/`raw/`-Change, keine neue §7-Klasse, kein Standalone). Rev 2.6 trägt zusätzlich die Loop-2-Patches (§4-Überschrift, rg-tool-korrekte Formen). + - §5.9 Pkt. 6 / P2-Check-Block: die Candidate-Erhebung über einen Zeiger (nicht Duplizieren) an den neuen §3.2-Mechanismus binden — **einschl. `--exclude=log.md`** (analog §5.6/§5.8-Formel), die Candidate-Liste ist auf Concept-Pfade definiert. + - **Resolver-Materialisierung:** der kanonische Schreibweisen-Resolver wird als **`canonical-terms.md` unter `schema/compiler.md` nebengeordnet** (neues Artefakt, gleiche read-only-Hierarchie): committete, append-only Registry (canonische Form + erlaubte Schreibvarianten + `[]`), als `§3.2`-Ziel referenziert. Damit ist der Resolver Bestandteil des Git-States und der Determinismus (gleicher Git-State → gleiche Liste) pinbar. (Kein `schema/`-Root-Change; Einbindung als normierte Referenz im §8.) + - §1 Pkt. 1/4, §5.6, §5.7, §5.8 — **read-only / nur Referenz** (Linkform, Bereichszuordnung, Discovery bleiben unverändert). +- `wiki/log.md` — **append** (append-only, Vertrag §5: bestehende Bullets — Story-3.1-done unter 2026-08-19, Validierungs-Rev-9, Story 2.5… — **bleiben unverändert erhalten**; der Story-3.2-Eintrag wird als weitere Bullet ergänzt, nicht ersetzt): Relevanzbestimmung-Semantik, Determinismus-Selbsttest-Beleg (Membership + Identität; der `--exclude=log.md`-Fakt aus der Stufe (a) wird ehrlich dokumentiert — `A0-18` trifft nur noch `wiki/knowledge-kompilation-inkrementell.md`, nicht `log.md`), Statuswechsel `3-2-…` `backlog → in-progress`, per-Datei-Validator-Verdikt-Zeile (Ist-Baum SUCCESS), einzeilige Nennung des 3.1-`epic-3-context.md`-Defer-Handoffs. +- `_bmad-output/implementation-artifacts/deferred-work.md` — **mutiert** (append-only): 3.1-Defer-Eintrag `epic-3-context.md` (`:335`, „Home: Story 3.2-Handoff oder Sprint-Sync") als aufgegriffen markieren; der F17-Handoff-Eintrag („Split 2026-08-19, Home: Story 3.8") ist bereits eingetragen. Bestehende Einträge nicht verändern, nur Status-Ergänzung im append-only-Stil. +- `_bmad-output/implementation-artifacts/sprint-status.yaml` — **mutiert**: Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` (`:55`) → `in-progress`. +- `schema/validator.md`, `schema/wiki-compiler.md`, `raw/…` — **read-only** (AD-3). Story 3.2 mutiert selbst keine Concept-Inhalte; Demonstration per Sandbox-Durchlauf (Muster: `_bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh`, S1–S6) oder als textueller Selbsttest gegen den Ist-Baum (z. B. `rg -l`-Erhebung mit realem Term, ohne Inhalts-Mutation). + +## Tasks & Acceptance + +**Execution:** +- [x] `schema/compiler.md` — Story-3.2-Vorbehalte auflösen (§3 Pkt. 2 + §7): §3.2-Relevanzbestimmung als verbindliche dreistufige Erhebungs-Mechanik (Term-Ziehverfahren + Kanonisierungs-Resolver; `log.md`-Exklusion — rg `-g '!log.md'` bzw. grep `--exclude=log.md` — über `wiki/`; `index.md`-Traversal; Link-Following mit besuchter Menge; Candidate-Liste als relative OKF-Pfade ohne `.md`; Determinismus-Vertrag AD-17h/A0-19 mit Reihenfolge auch für Stufe-b/c und Normalisierung in §3.2 selbst); **canonical-terms.md** (Resolver-Registry: canon. Form + Varianten, append-only); §8-Revision 2.5 + Normreferenzen AD-13/A0-18/A0-19/PRD-OQ-3; Abschlussklausel. Kein Vertrag-/Validator-/`raw/`-Change. _(Inkl. Rev-2.6-Patch-Runde aus Step-04-Review Loop 2: §4-Überschrift wiederhergestellt, rg-tool-korrekte Formen, Mini-Sandbox verankert — s. Spec Change Log.)_ +- [x] `wiki/log.md` — Story-3.2-Eintrag (Vertrag §5-Format, append-only — bestehende Bullets unverändert) mit Relevanzbestimmung-Semantik, Determinismus-Selbsttest-Beleg (Membership + Identität via `log.md`-Exklusion), Statuswechsel, Validator-Verdikt, epic-3-context-Defer-Nennung. _(Loop-2-Patch-Note (Rev 2.6) als eigene oberste Log-Zeile ergänzt.)_ +- [x] `deferred-work.md` — epic-3-context-Eintrag als aufgegriffen markieren (append-only); `sprint-status.yaml` — Key `3-2-…` → `in-progress`. _(Zusätzlich Em-Dash-Determinismus-Frage als neuer Defer (Home: Story 3.8) aus Loop 2.)_ +- [x] Edge-Tests (Sandbox, I/O-Matrix + Membership-Pin): TERM_ABLEITUNG_SINGLETON/SYNONYM/MEHRFACH, TRAVERSAL_REACH_ONLY, LINK_FOLLOWING_ZYKLUS, NO_MATCH — inkl. mini-Sandbox-Baum, der einen realen Term auf Concept-Bodies **und** `log.md` verteilt und die exakte Candidate-Liste (nur Concept-Pfade, `log.md` ausgeschlossen) als erwartete Ausgabe pindet. _(Sandbox T1–T4 re-executiert: alpha exklusiv, Zwei-Run-Identität, NO_MATCH leer, alpha+gamma Vereinigung.)_ + +**Acceptance Criteria:** +- Given eine neue committete Source, when ein Run die Relevanzbestimmung ausführt, then nutzt er ausschließlich textuelle, deterministische Verfahren — Term-übergreifende grep/ripgrep über `wiki/`, Markdown-Traversal von `index.md`, Link-Following (AC-1; AD-13, A0-18) — als verbindliche Ausformulierung der §3-Pkt.-2-Erhebung; die Story-3.2-Vorbehalte (§3 Pkt. 2, §7) sind aufgehoben. +- Given gleicher Git-State + gleiche Eingabemenge, when zwei unabhängige Runs die Relevanzbestimmung ausführen, then erzeugen sie dieselbe Candidate-Liste in derselben Reihenfolge (AC-2; AD-17h, A0-19) — ohne Embedding/Vector/KG im Compiler-Kern (AC-4; AD-13). +- Given ein Ergebnis der Relevanzbestimmung, when es weiterverarbeitet wird, then ist es als nachvollziehbare Candidate-Liste (relative OKF Concept-Pfade ohne `.md`) verfügbar (AC-3). +- Given die Instruktion, when geprüft, then bleibt `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3), keine neue §7-Klasse, kein Standalone (D-3) — Validator läuft auf dem Ist-Bundle SUCCESS. + +## Spec Change Log + +- **2026-08-19 (bmad-code-review Loop 2 — bad_spec-Loopback):** 5 bad_spec-Findings ausgelöst, Code-Änderungen auf Baseline revertiert, nicht-gefrorene Spec-Tail-Sektionen geamendet: + - **B1/VG-1 `log.md`-Kontamination:** `rg -l '' wiki/` ohne `--exclude=log.md` → `log.md` wird ab dem Moment selbst „Kandidat", in dem ein Log-Eintrag den Term zitiert; der Determinismus-Selbsttest verankert das A0-18-1-File-Find in einem Commit, das selbst `A0-18` enthält (Stale-Evidenz; Reproduzierbarkeits-Claim widerlegt sich selbst). Bekannt-bös: permanente Drift + falsches Verification-Expect. + - **B2 Reihenfolge:** `rg -l`-Ausgabe-Reihenfolge (FS-Traversal) nicht auf Zuwachs-Sicht-Ordnung abbildbar; Stufe-b/c ohne definierte Position. Bekannt-bös: AC-2-Zwei-Run-Identität nur bei undokumentiertem `rg`-Tie-Break. + - **B3 Resolver nicht enumeriert:** „eine canonische Form je Semantik" ohne committete Registry → Determinismus nicht pinbar. Bekannt-bös: gleiche Liste nur, wenn Resolver Teil des Git-States (nicht spezifiziert). + - **B4 Em/En-Dash:** Klassenliteral `[-–_ ]` deckt nur En-`–`, nicht Em-`—`; Kollaps-Reichweite inkonsistent. Bekannt-bös: Em-Varianten fallen nicht unter den Kollaps (Synonymlücke). **Gewählter Weg:** `-`-Kollaps bleibt; explizite `—`-Resovierung wird als offene Determinismus-Lücke in Step-4-Defer an Story 3.8 übergeben (nicht stillschweigend hinzugefügt). + - **B5 §8-A0-19-Claim:** Spec sagte „A0-19 steht bereits in §8", war im Ist-Baum nicht kommutiert; Implementierung ergänzte A0-19 (korrekt). Spec korrigiert, A0-19-Ergänzung als KEEP verankert (fehlleiten bei Re-Baseline verhindern). + - **B6 NO_MATCH / §5.9-P2-Block-Scope:** werkt zusammen → zusammengefasst; in B1 und Task-Patch-Membership-Pin überführt. + - **B7 §5.9-P2-Block-Zeiger:** nicht mehr nötig — die fixierte Stufe (a) `--exclude=log.md` macht den Zeiger redundant (kein log.md-Kandidat mehr); **verworfen** (keine unnötige Pflicht). + - **KEEP-Instruktionen (müssen Neu-Ableitung überleben):** neue §3.2-Sektion nach §3 etc.; alle 6 I/O-Matrix-Szenarien; Determinismus-Vertrag (identische Reihenfolge, KEEP: nur-Parallel = deterministisch-MECHANISMUS, NICHT zufällig); `--exclude=log.md`-Stufe-a; Determinismus-Selbsttest MIT Membership-Pin (Zwei-Run-Identität + Mengen-Genauigkeit) und `canonical-terms.md`-Resolver as Resolver im Git-State; `Wiki/log.md` als append-only (Story-3.1-Bullet bleibt eigenständig stehen); die A0-19/Schema-Referenz ergänzen. NOT-KEEP: Spec-A0-19-Formulierung „steht bereits" (korrigiert). + - Restliche patch- und defer-Findings (B6/NO_MATCH, B5/Doppel, Log-Selbsttest-Beleggenaue, F17+Em-Morphologie-Story-3.8) werden in der Step-4-Patch-Runde umgesetzt bzw. in `deferred-work.md` nachbestätigt. + +## Design Notes + +**Warum §3.2 als eigene Sektion statt Streckung in Pkt. 2:** §3 ist heute eine nummerierte Liste (Pkt. 1–3); der Story-3.2-Vorbehalt sitzt IN Pkt. 2. Die feinkörnige Mechanik (Term-Ziehverfahren, Kanonisierungs-Resolver, dreistufige Erhebung, Determinismus) ist zu umfangreich, um Pkt. 2 verständlich zu halten. Design-Entscheidung: **neue Sektion §3.2 „Relevanzbestimmung (Story 3.2)"** direkt nach §3 — Pkt. 2 bleibt der Kern-Anker („Erhebung nach §3.2"), die Komplexität wird ausgelagert, bestehende §5.9-Pkt.-6-Bindungen bleiben gültig. Nur falls der §3-Aufbau eine andere Einfüge-Stelle nahelegt (z. B. Pkt. 2a), wird das Label angepasst — Pkt. 2 bleibt in jedem Fall der verbindliche Einstieg. + +**Term-Ziehverfahren — was deterministisch heißt:** Die Ziehung ist deterministisch, weil sie allein von der committeten Evidenz-Datei abhängt: (1) bedeutungstragende Fachbegriffe = Token-Folgen mit fachlicher Signifikanz, aus der §2-Interpretation benannt (nicht freie LLM-Auswahl); (2) Normalisierung über einen canonischen Schreibweisen-Resolver (lowercasing; `[-–_ ]`→`-`; eine canonische Form je Semantik); (3) mehrere Terme je Einheit erlaubt — Candidate-Liste = Vereinigung der Treffer über alle Terme, bereinigt über besuchte Menge; (4) kein stiller Ausschluss: nicht auflösbare Varianten werden wie notiert verwendet. Die Erhebung *mit festem Term* war schon in Rev-2.4.2 deterministisch — Story 3.2 macht zusätzlich die **Term-*Auswahl*** deterministisch (exakt der bisherige Vorbehalt). + +**Determinismus-Referenz:** AD-17h und A0-19 sind bereits Normreferenzen in §8 Revision 2.4 (Story 3.1); Story 3.2 ergänzt **AD-13**, **A0-18** und **PRD OQ-3** (Architekturfrage „Compilation Scope"). A0-19 war im Ist-§8 (Baseline `e3e7ec3`) zwar nicht gelistet — die Implementierung fügt es als Determinismus-Referenz der Relevanzbestimmung hinzu (kein Verstoß, Design-KEEP: A0-19-Anker wird in §8 **und** §3.2 gesetzt; die frühere Spec-Formulierung „steht bereits" war falsch und ist hiermit korrigiert). `wiki/knowledge-kompilation-inkrementell.md:48` referenziert A0-18/AD-13 bereits; **zur Erhebung wird `wiki/log.md` ausgeschlossen** (`--exclude=log.md`, §5.6-Muster) — sonst wäre der eigene `log.md`-Eintrag bei jedem Term, den er zitiert, selbst „Kandidat" (A0-18/FR-12-Fall; die Candidate-Liste ist auf Concept-Pfade definiert, §5.9 Pkt. 5 behandelt `log.md` gesondert als erlaubtes Membrum). + +**Determinismus-Selbsttest (Membership + Identität):** Der Selbsttest prüft nicht nur Zwei-Run-Identität, sondern zusätzlich, dass die Ausgabe **Mengen-Genauigkeit** hat (nur Concept-Pfade, `log.md` ausgeschlossen) — er wird gegen einen mini-Sandbox-Baum ausgeführt, der einen realen Term auf Concept-Bodies und `log.md` verteilt und die exakte Candidate-Liste als erwartete Ausgabe pindet. Damit ist die Stale-Verifikations-Falle („das Artefakt widerlegt sich selbst") geschlossen. + +## Verification + +**Commands (re-executierbar, ab Workspace-Root):** +1. **Vorbehalts-Auflösung:** `grep -n "Story 3.2 vorbehalten" schema/compiler.md` liefert **keinen** Treffer mehr (beide Vorbehalte aufgehoben: §3 Pkt. 2 + §7). +2. **Neue Sektion:** `grep -n "Relevanzbestimmung\|3.2" schema/compiler.md` liefert die neue §3.2-Sektion; §7-Vorbehalt enthält „3.2" nicht mehr; §8 trägt Revision 2.5 + 2.6 (Patch-Runde: §4-Kopf, rg-tool-korrekte Formen). +3. **Determinismus-Selbsttest (Membership + Identität):** + - `rg -l '' -g '!log.md' wiki/` (rgs native Glob-Exklusionsform; `--exclude` ist kein rg-Flag — das GNU-grep-Äquivalent ist `grep -rl '' --exclude=log.md wiki/`) zweimal ausführen, Ausgaben **identisch** — deterministische Erhebung ohne `log.md`-Kontamination; z. B. `rg -l 'A0-18' -g '!log.md' wiki/` → genau `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad, `log.md` ausgeschlossen); `rg -l 'A0-18' wiki/` **ohne** Exklusion hingegeben würde `wiki/log.md` mit-treffen (Selbstkontamination — genau der ausgeschlossene Fall). + - mini-Sandbox-Baum (`_bmad-output/implementation-artifacts/sandbox-3-2/`, re-executierbar via `bash run-sandbox.sh` — Term auf Concept-Bodies **und** `log.md` verteilt): exakte Candidate-Liste (nur Concept-Pfade) wie erwartet; Normalisierung Strip `wiki/` + `.md` → relative OKF-Pfade; zwei aufeinanderfolgende Läufe liefern byte-identische Ausgaben (Zwei-Run-Identität, AD-17h). +4. **Validator-Lauf:** alle `wiki/`-Dateien SUCCESS (unverändert; reine Text-Instruktion, human-mechanisch ausgeführt, D-3) — per-Datei-Verdikt als Ausführungs-Nachweis im `log.md`-Eintrag. +5. **Resolver-Materialisierung:** `schema/canonical-terms.md` existiert (committete, append-only Registry: canon. Form + erlaubte Varianten); `grep -n "canonical-terms" schema/compiler.md` liefert die §3.2-Referenz.
_(Optionale Em-Dash-Prüfung: die Normalisierungs-Klasse deckt `-` ab; explizite `—`-Varianten-Resovierung ist eine erkannte Determinismus-Lücke → Story 3.8, s. Spec Change Log.)_ + +**Manual checks:** +- §3 Pkt. 2 zeigt auf die neue §3.2-Mechanik; Term-Ziehverfahren + Kanonisierungs-Resolver textuell benannt; Candidate-Liste als relative OKF-Pfade ohne `.md`; Determinismus-Vertrag in der Instruktion; `compiler.md` §8-Revision 2.5 + 2.6 mit Abschlussklausel; kein `schema/validator.md`-/`schema/wiki-compiler.md`-/`raw/`-Diff; §7-Vorbehalt ohne „3.2"; `wiki/log.md`-Eintrag datiert mit Story-3.2-Semantik, Determinismus-Beleg, Statuswechsel `backlog → in-progress → done` (Patch-Note Rev 2.6 oben), per-Datei-Verdikt; `deferred-work.md`-epic-3-context-Eintrag als aufgegriffen markiert + Em-Dash-Defer (Story 3.8); `sprint-status.yaml` konsistent (`3-2-…` → done). diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index ea648d1..1724c27 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -29,7 +29,7 @@ # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) # - Retrospective appends its action items to action_items; the status view surfaces open ones generated: 08-14-2026 00:00 -last_updated: 08-19-2026 06:30 +last_updated: 08-19-2026 07:10 project: wow20 project_key: NOKEY tracking_system: file-system @@ -52,7 +52,7 @@ development_status: epic-3: in-progress 3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: done - 3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip: backlog + 3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip: done 3-3-bestehende-concepts-erweitern-präzisieren-korrigieren: backlog 3-4-wissen-aus-mehreren-sources-synthetisieren: backlog 3-5-leasing-dirty-tree-schutz-für-konkurrierende-producer-umsetz: backlog diff --git a/schema/canonical-terms.md b/schema/canonical-terms.md new file mode 100644 index 0000000..7220770 --- /dev/null +++ b/schema/canonical-terms.md @@ -0,0 +1,33 @@ +# Kanonischer Schreibweisen-Resolver — canonische Term-Formen (Story 3.2) + +> **Status:** abgeleitet (Story 3.2) — committete, **append-only** Registry des kanonischen Schreibweisen-Resolvers der deterministischen Relevanzbestimmung (Term-Ziehverfahren, `schema/compiler.md` §3.2). +> **Normative Grundlage:** `schema/compiler.md` (abgeleitet, Story 3.1/3.2) — §3.2 Relevanzbestimmung (Term-Ziehverfahren, Kanonisierungs-Resolver, dreistufige Erhebung); AD-13 (textuell-deterministische Mittel), AD-17h/A0-19 (Determinismus-Vertrag: gleicher Git-State + gleiche Eingabemenge → gleiche Candidate-Liste in gleicher Reihenfolge), A0-18 (Deterministische Relevanzbestimmung), PRD OQ-3. +> **Ableitungsdatum:** 2026-08-19 + +## Zweck + +Diese Datei ist die einzige committete Registry des **kanonischen Schreibweisen-Resolvers** der Relevanzbestimmung (§3.2 der Compiler-Instruktion). Sie macht die Normalisierung eines gezogenen Terms **deterministisch pinbar**: weil sie selbst Teil des Git-States ist, ist bei gleichem Git-State die Auflösung „Schreibvariante → canonische Form" eindeutig (AD-17h/A0-19). Sie wird ausschließlich **append-only** gepflegt — bestehende Einträge werden nie verändert, neue Einträge werden nur angehängt (Ergänzung einer neu erkannten canonischen Form/Synonymgruppe). + +**Geltungsbereich:** Die Registry normalisiert **Fachbegriffe** der Relevanzbestimmung (entscheidungsrelevante Terme nach §3.2-Term-Ziehverfahren). Sie fügt **kein** Frontmatter-Feld, **kein** Schema-Prädikat, **keine** §7-Invaliditätsklasse, keinen Validator-/Vertrags-/`raw/`-Change hinzu (AD-3, D-3). + +## Registry-Format + +Je Eintrag (eine Zeile in der Tabelle): + +- **canonische Form** — der normalisierte Term als Kebab-Case-Slug (Nur-Kleinbuchstaben `[a-z0-9-]`, `-`-Kollaps). Genau **eine** canonische Form je Semantik (A0-18). +- **erlaubte Schreibvarianten** — Schreibweisen, die auf die canonische Form normalisiert werden (bündel-findend per `-`-Kollaps: `[-–_ ]` → `-`, lowercased gemäß §3.2-Normalisierung). `[]` = keine weitere Variante (nur die canonische Form selbst gilt), bzw. noch keine Einträge committet. +- **Semantik** *(optional)* — disambiguierende Kurzangabe, warum dieser Term eine eigene canonische Form trägt (nur bei Bedarf; ergänzt die canonische Form, ist aber nicht Teil der Normalisierungslogik). + +**Append-only-Regel:** Neue Zeilen werden am Ende der Tabelle angehängt; ein bestehender Eintrag wird **nie** editiert. Muss eine Semantik umbenannt werden, wird das in `deferred-work.md` als Mapping-/AD-7d-Nähe-Fall notiert (Ask-First), nicht durch Edits in dieser Registry. + +## Registry + +| canonische Form | erlaubte Schreibvarianten | Semantik | +|---|---|---| +| — (noch keine Einträge committet) | `[]` | Die Registry ist leer. Mit dem ersten Run, der einen fachlichen Term deterministisch zieht (Story-3.2-Term-Ziehverfahren, §3.2), wird der erste Eintrag hier committet (append-only). | + +*Hinweis (Eröffnungs-Zustand):* Für die Story-3.2-Instruktion selbst ist kein Term-Eintrag erforderlich — die Relevanzbestimmung ist auch mit leerer Registry vollständig definiert (gezogene Terme werden wie notiert verwendet, solange keine canonische Auflösung committet ist; §3.2 Pkt. 1 — kein stiller Ausschluss). Die committete, leere Registry ist der deterministisch pinbare Resolver-Zustand. + +## Abschlussklausel + +Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung. Diese Datei ist ein neues Artefakt unter `schema/`, nebengeordnet zur Compiler-Instruktion — gleiche read-only-Hierarchie (nur der append-only-Ausbau ist vorgesehen). diff --git a/schema/compiler.md b/schema/compiler.md index 786c470..09118a7 100644 --- a/schema/compiler.md +++ b/schema/compiler.md @@ -38,10 +38,30 @@ Bestätigung (Story 1.4): schema/validator.md (mechanische Prüfung, kein L 1. Vor der Anlage prüfen, ob die erkannte Wissenseinheit **bereits als Concept** im Bundle existiert (deterministisch: Dateikollision über den relativen OKF-Pfad, AD-7a). 2. **Update-Routing (statt Kollision-Hold; Story 3.1):** Existiert bereits ein Concept mit dem Ziel-Pfad, wird **nicht** stumm überschrieben und **kein** Duplikat angelegt — die erkannte Wissenseinheit wird als **Update-Kandidat** im **bestehenden Concept-Pfad** aktualisiert (Erweitern/Präzisieren/Korrigieren gemäß §5.9; FR-6). Die Mutationsmechanik für Updates spezifiziert §5.9; der Kollisions-Hold-Schutzprinzip („nicht stumm überschreiben") bleibt als Grundsatz der Erhaltung erhalten (AD-16-Default: bestehende Provenienz/Inhalte werden nie ohne Beleg entfernt). Der **Neu-Anlage-Pfad** dieser Instruktion bleibt für Wissenseinheiten, deren Ziel-Pfad **nicht** belegt ist (§5.1/§5.7). - **Kandidatenliste (betroffen-Bestimmung):** Vor jeder Mutation erhebt der Producer die Menge der betroffenen Concepts als **nachvollziehbare Kandidatenliste** (relative OKF-Pfade ohne `.md`) mit **textuell-deterministischen Mitteln** (AD-13): (a) Term-/Konzept-Überschneidung zwischen der neuen Evidenz und den bestehenden Concept-Bodies via `grep`/`ripgrep` über `wiki/` (z. B. `rg -l '' wiki/`); (b) `index.md`-Traversal (Bundleroot- und Area-`index.md`-Dateien, gewurzelte Erreichbarkeit Root → Area → Concept, §5.8) der dadurch betroffenen Bereiche; (c) Link-Following aus bereits betroffenen Concepts (§5.6-Pin) auf weitere Concept-Pfade — **mit besuchter Menge** (ein bereits besuchter Concept-Pfad wird nicht erneut besetzt; keine Schleife bei zyklischen Links). Der `` aus (a) wird in Phase (1) (Interpretieren, §2) aus der neuen Evidenz abgeleitet — die Erhebung *mit festem Term* ist textuell-deterministisch (fester Term → deterministische Grep-Ausgabe); die Term-*Auswahl* folgt der §2-Interpretation, und der feinkörnige Term-Mechanismus (Kanonisierung, Synonyme) ist Story 3.2 vorbehalten. Die Kandidatenliste wird textuell festgehalten (Pre-Run-Reconcile-Check-Block, §5.9 Pkt. 6). Keine Embeddings/Vector-Suche (AD-13); der feinkörnige Relevanz-Findungsmechanismus als eigene Ausformulierung ist Story 3.2 vorbehalten — §5.9 bindet die Erhebung an die hier genannten deterministischen Mittel. + **Kandidatenliste (betroffen-Bestimmung):** Vor jeder Mutation erhebt der Producer die Menge der betroffenen Concepts als **nachvollziehbare Kandidatenliste** (relative OKF-Pfade ohne `.md`) mit **textuell-deterministischen Mitteln** (AD-13): (a) Term-/Konzept-Überschneidung zwischen der neuen Evidenz und den bestehenden Concept-Bodies via `grep`/`ripgrep` über `wiki/` (z. B. `rg -l '' -g '!log.md' wiki/` bzw. GNU-grep-Form `grep -rl '' --exclude=log.md wiki/`); (b) `index.md`-Traversal (Bundleroot- und Area-`index.md`-Dateien, gewurzelte Erreichbarkeit Root → Area → Concept, §5.8) der dadurch betroffenen Bereiche; (c) Link-Following aus bereits betroffenen Concepts (§5.6-Pin) auf weitere Concept-Pfade — **mit besuchter Menge** (ein bereits besuchter Concept-Pfad wird nicht erneut besetzt; keine Schleife bei zyklischen Links). Die Erhebung folgt der feinkörnigen, verbindlichen Mechanik in **§3.2 Relevanzbestimmung (Story 3.2)** — Term-Ziehverfahren (deterministisch aus der neuen Evidenz abgeleitet, kanonischer Schreibweisen-Resolver `schema/canonical-terms.md`, mehrere Terme je Einheit), dreistufige Erhebung mit `log.md`-Exklusion (die Candidate-Liste ist auf Concept-Pfade definiert, `log.md` ist kein Kandidat) und Determinismus-Vertrag (AD-17h/A0-19) — **Erhebung nach §3.2**. Die Kandidatenliste wird textuell festgehalten (Pre-Run-Reconcile-Check-Block, §5.9 Pkt. 6). Keine Embeddings/Vector-Suche (AD-13); §5.9 bindet die Erhebung an die in §3.2 genannten deterministischen Mittel. Löst eine erkannte Wissenseinheit auf **keinen** bestehenden Concept-Pfad auf (kein Update-Kandidat), wird sie als **neue** Einheit über den Neu-Anlage-Pfad (§5.1/§5.7, §3-Pkt.-1/-2-Kollisionsprüfung ist damit erstbestanden) behandelt. 3. Der Run prüft zusätzlich, ob `wiki/index.md` als Bundleroot existiert (V-1-Vorbedingung des Validators); fehlt sie, darf kein Concept erzeugt oder aktualisiert werden (Run-FAIL, Vertrag §2). +## 3.2 Relevanzbestimmung (Story 3.2) + +Diese Sektion ist der **einzige Instruktions-Ort** der feinkörnigen, **textuell-deterministischen Relevanz-Findungsmechanik** (D-3, Story 3.2) und die **verbindliche Ausformulierung der §3-Pkt.-2-Kandidatenerhebung** („Erhebung nach §3.2"). Sie macht die Relevanzbestimmung vollständig deterministisch vorgegeben (AD-17h/A0-19): gleicher Git-State + gleiche Eingabemenge → identische Candidate-Liste, in identischer Reihenfolge — ohne Embedding/Vector/KG im Compiler-Kern (AD-13, A0-18, PRD OQ-3). Sie fügt **kein** Prädikat, keine neuen §7-Invaliditätsklassen und keinen Schema-/Validator-/`raw/`-Change hinzu (AD-3); die Candidate-Liste ist auf Concept-Pfade definiert, `log.md` ist ausdrücklich **kein** Kandidat (sie wird per Exklusions-Flag strukturell exkludiert — sonst wäre der eigene `log.md`-Eintrag bei jedem Term, den er zitiert, selbst „Kandidat"; die tool-spezifischen Flag-Formen nennt Pkt. 2a — `rg -g '!log.md'` bzw. `grep --exclude=log.md`; §5.9 Pkt. 5 behandelt `log.md` gesondert als erlaubtes Mitglied des Diff-Selbsttest-Satzes). + +1. **Term-Ziehverfahren (deterministisch):** Die Candidate-Terme werden deterministisch aus der neuen Evidenz (committete `raw/`-Dateien, §1 Pkt. 1/2) abgeleitet — nicht freie LLM-Auswahl: + - **(a) Bedeutungstragende Token-Folgen:** Der Producer benennt die bedeutungstragenden Fachbegriffe der Wissenseinheit gemäß der §2-Interpretation (fachliche Signifikanz; kein Stoppwort-Abgleich nötig, aber auch kein freies Urteil). Der Umfang „bedeutungstragend" ist die Auswahl derjenigen Begriffe, die das erkannte Thema identifizieren — als Token-Folgen über eine sprachliche Einheit hinweg zulässig (z. B. `quanten-protocol-schlüssel`). + - **(b) Normalisierung über den kanonischen Schreibweisen-Resolver:** Jeder gezogene Term wird durchgängig normalisiert: (i) lowercasing; (ii) Binde-Varianten-Kollaps `[-–_ ]` → `-` (En-Dash `–`, Bindestrich `-`, Unterstrich `_`, Leerzeichen — jedes Vorkommen wird in einen einzelnen Bindestrich kollabiert); (iii) Auflösung über die committete, append-only Registry **`schema/canonical-terms.md`** (ein Eintrag = canonische Form + erlaubte Schreibvarianten; der Resolver ist damit Bestandteil des Git-States und die Auflösung pinbar). **Genau eine canonische Form je Semantik** (A0-18). **Kein stiller Ausschluss:** ist eine Variante nicht in der Registry auflösbar, wird der Term **wie notiert** verwendet (Kollaps-normalisiert) — niemals still verworfen. + - **(c) Mehrere Terme je Einheit erlaubt:** Eine Wissenseinheit kann mehrere bedeutungstragende Terme tragen; die Candidate-Liste ist dann die **Vereinigung** der Treffer über alle Terme, bereinigt über die besuchte Menge (Pkt. 3c — ein Pfad nur einmal). + - **Bekannte Determinismus-Lücke (aufgezeichnet, nicht still hinzugefügt):** Die Kollaps-Klasse `[-–_ ]` deckt den Em-Dash `—` **nicht** ab (nur En-Dash `–`). Em-Dash-Varianten fallen damit nicht unter den Kollaps — eine erkannte Synonym-Lücke, die **Story 3.8** als offene Determinismus-Frage übergeben ist (s. `deferred-work.md`; nicht stillschweigend in §3.2 ergänzt). +2. **Term-übergreifende Erhebung über `wiki/` (drei Stufen):** Der Producer erhebt die betroffenen Concept-Pfade in **drei textuell-deterministischen Stufen** (a → b → c). Ab der Workspace-Root: + - **(a) Stufe a — grep/ripgrep über `wiki/`:** `rg -l '' -g '!log.md' wiki/` (rgs native Glob-Exklusions-Syntax — `--exclude` ist kein rg-Flag; das GNU-grep-Äquivalent ist `grep -rl '' --exclude=log.md wiki/`, §5.6-Scan-Scope-Konvention). `` = jeder gezogene Term aus Pkt. 1 nach Normalisierung. Beide Formen exkludieren `log.md` **strukturell** (unabhängig von dessen Inhalt) — die Candidate-Liste bleibt auf Concept-Pfade definiert. + - **(b) Stufe b — `index.md`-Traversal:** Für die in Stufe a getroffenen Bereiche (und die Bundleroot) folgt der Producer der gewurzelten Erreichbarkeit Root → Area → Concept (§5.8): trifft ein Term nur `wiki/index.md` oder eine Area-`index.md` (nicht einen Concept-Body), so sind alle **darunter gewurzelten Concept-Pfade** Treffer der Stufe b (TRAVERSAL_REACH_ONLY). Fehlende Bundleroot → Run-FAIL (V-1, §3 Pkt. 3, besteht fort). + - **(c) Stufe c — Link-Following mit besuchter Menge:** Aus bereits als betroffen erhobenen Concepts folgt der Producer die Concept-Links (§5.6-Pin) auf weitere Concept-Pfade — file-relativ auflösen (§5.7 Pkt. 4), **jeder bereits besuchte Concept-Pfad wird nicht erneut besucht** (besuchte Menge): Zyklen (A → B → A) enden, die Candidate-Liste bleibt endlich (LINK_FOLLOWING_ZYKLUS). +3. **Candidate-Liste (Ausgabe) + Determinismus-Vertrag:** + - **(a) Form:** Die Candidate-Liste ist die Menge der betroffenen Concept-Pfade als **relative OKF-Pfade ohne `.md`** (AD-7a). Normalisierung der Ausgabe: aus jedem Treffer `wiki/.md` werden `wiki/`-Präfix und `.md`-Suffix gestrippt (deterministischer Schritt → `wiki/knowledge-kompilation-inkrementell.md` wird `knowledge-kompilation-inkrementell`). + - **(b) Reihenfolge (Zuwachs-Sicht-Ordnung):** Die Erhebung ordnet die Candidate-Liste deterministisch in **Zuwachs-Sicht-Ordnung** — Stufe-a-Treffer zuerst (in der Reihenfolge des ziehenden Terms, dann lexikografisch als deterministischer Tie-Break bei identischem Ort), danach Stufe-b-Treffer, danach Stufe-c-Treffer; innerhalb jeder Stufe lexikografisch aufsteigend (LC_ALL=C bzw. deterministische byte-Ordnung, AD-17h). Die Stufe-b/c-Treffer sind damit **positional bestimmt** (nach allen Stufe-a-Treffern), nicht vom Dateisystem-Traversal abhängig. + - **(c) Keine Duplikate:** Vereinigung über alle Terme und Stufen, bereinigt über die besuchte Menge (Pkt. 1c/2c) — jeder Pfad erscheint genau einmal. + - **(d) NO_MATCH:** Trifft kein Term ein bestehendes Concept, ist die Candidate-Liste **leer** → `UNTOUCHED_CONCEPT` (Story-3.1-Pfad): keine Mutation, kein `log.md`-Zusatz (leere Menge ist Teilmenge jeder erlaubten Menge — Ghost-Diff-negativ, §5.9 Pkt. 5). + - **(e) Gleichheits-Identität:** Gleicher Git-State + gleiche Eingabemenge → identische Candidate-Liste, in identischer Reihenfolge (AD-17h/A0-19). Der Selbsttest (Membership + Zwei-Run-Identität) wird in der Story-Specifizierungs-Verifikation und im `wiki/log.md`-Nachweis belegt. + ## 4. Synthetisieren (Provenienz & Trust) Je neuem Concept werden die Frontmatter-Metadaten nach Vertrag §3 festgelegt: @@ -196,7 +216,7 @@ Bereichszuordnung und Concept-Hierarchie sind **textual-deterministisch** (AD-7c | `wiki/llm-wiki-prinzip.md` | `llm-wiki-prinzip` | Eine als Area gedachte Anlage (`wiki//index.md` + Concept darunter) ist damit **konform**; der Bereichs-Hinweis aus §5.1 ist aufgelöst. Konzept-`id`s (s. `sources[].id`, §5.5 Pkt. 3) sind unabhängig davon je Concept eindeutig — Adressraum ist Concept-Pfad + `id`. -3. **Top-Level-Update-Routing (A0-10, §3-nachgeführt):** Kollidiert ein Erstellungskandidat mit einem bestehenden Top-Level-Pfad (deterministisch: Dateikollision über den relativen OKF-Pfad, §3.1/§3.2, AD-7a), löst das **Update-Routing (§3 Pkt. 2, §5.9)** aus — **kein** neues Prädikat, **kein** Duplikat, **kein** stiller Overwrite, keine neue Datei, kein Index-Link: die erkannte Einheit wird als **Update-Kandidat** im bestehenden Concept-Pfad behandelt (Mutation gemäß §5.9). **Kein MOVE/Neuzuordnung bestehender Concepts** — das ist Kuratierung mit AD-7d-Redirect-Pflicht (Epic-3-Nähe, nicht in den ACs dieser Story; Ask-First). +3. **Top-Level-Update-Routing (A0-10, §3-nachgeführt):** Kollidiert ein Erstellungskandidat mit einem bestehenden Top-Level-Pfad (deterministisch: Dateikollision über den relativen OKF-Pfad, §3 Pkt. 1/2, AD-7a; „§3.2" meint hier §3-Elemente Pkt. 1/2 — die §3.2-Relevanzbestimmung ist eine eigene Sektion, s. §3.2), löst das **Update-Routing (§3 Pkt. 2, §5.9)** aus — **kein** neues Prädikat, **kein** Duplikat, **kein** stiller Overwrite, keine neue Datei, kein Index-Link: die erkannte Einheit wird als **Update-Kandidat** im bestehenden Concept-Pfad behandelt (Mutation gemäß §5.9). **Kein MOVE/Neuzuordnung bestehender Concepts** — das ist Kuratierung mit AD-7d-Redirect-Pflicht (Epic-3-Nähe, nicht in den ACs dieser Story; Ask-First). 4. **File-relatives Link-Auflösungsmodell (löst das §5.6-Defer):** Concept-Links sind **file-relativ** zur `.md`-Datei (AD-8/FR-10/AD-7b — eine syntaktische Form, beide Ebenen): bei Root-Dateien ist file-relativ ≡ bundle-relativ (die bestehenden Bestands-Links bleiben byte-identisch, Null-Delta zu Story 2.3); in Areas bezeichnen `../`-Präfixe die Aufwärts-Ziele **innerhalb `wiki/`** (`[](../.md)`). Auflösung & Containment (§5.6 Pkt. 3, Formel 3): `../`-Ziel relativ zum Quell-Verzeichnis auflösen, `X/..`-Segmente kollabieren, aufgelöster Pfad MUSS unter `wiki/` bleiben — sonst `DANGLING` (Out-of-Bundle-`..`-Escape gesperrt, Loop-1-Fix). `../schema/*` als andere Schicht (Ziel außerhalb des Bundles) bleibt exkludiert — Abgrenzung über das **Zielverzeichnis** (unter `wiki/` = in-Bundle), nicht über das bloße `../`-Präfix; einstufiges `../schema/*` aus Root-Dateien ist damit weiterhin pin-frei (bestehende Root-`index.md`-Links unverändert). `.md`-Endung bleibt Pflicht (§5.6 Pin). 5. **Area-`index.md` (Vertrag §2/§6, AD-9/FR-11):** Eine Area besitzt exakt eine `wiki//index.md`, **frontmatterlos** (Punkt 10), die ihre Area-Concepts in der gepinnten Form (§5.6) verlinkt (Identity = relativer OKF-Pfad ohne `.md`). Die Bundleroot-`index.md` verlinkt die Area-`index.md` (Navigation Root → Area, AD-9). **Area ohne `index.md` ist strukturell invalide** und wird vom Validator wörtlich gemeldet: `FAIL … Punkt 11: Index-Regel verletzt (Area ohne index.md=)` (kein inventiertes Label; Verdikt-Grammatik §5 des Validators). Ein neues Area-Concept MUSS in `wiki//index.md` verlinkt sein (§5.3 Pkt. 3 ist entsprechend §5.7-nachgeführt); sonst Punkt 11. 6. **Worked Example (Area-Concept):** `wiki/wissensarchitektur/source-material.md` — ein neues Area-Concept: `type: concept`, `sources` → `raw/architecture-spine/architecture-spine-2026-08-14.md` (s1) + `raw/prd/prd-wow20-2026-08-14.md` (s2), §5.5-Inline-Verweise je belegter Aussage, Body-Links auf Root-Concepts in der file-relativen `../`-Form (`[LLM-Wiki-Prinzip](../llm-wiki-prinzip.md)` u. ä.), inhaltsbegründet. Verlinkt in der Area-`index.md` `wiki/wissensarchitektur/index.md` (frontmatterlos, gepinnte Form); diese wiederum in der Bundleroot `wiki/index.md` (Area-Sektion). §5.6-Formel-1 (Bestands-Check) erfasst die Area-Links; Formel 2 (Form-Check) `0`; Formel 3 (Dangling-Check) keine Ausgabe (in-Bundle-`../`-Auflösung, §5.7 Pkt. 4). @@ -259,7 +279,7 @@ Diese Sektion ist der **einzige Instruktions-Ort** der Update-Mutationsmechanik 6. **Run-Vorphase-Bausteine (Defer R-1 + P2, in den Update-Pfad eingearbeitet):** Beide sind **keine** neuen Prozesse — wiederverwendbare, reproduzierbare textuelle Check-Blöcke innerhalb der Instruktions-Ausführung (D-3): - **Change-Detection (Defer R-1, Input-Zuwachserkennung):** Vor der Interpretation bestimmt der Producer, **welche `raw/`-Dateien Zuwachs** sind (neu/modifiziert). Deterministische Mittel: `git diff --name-only -- raw/` auf das `raw/`-Verzeichnis und/oder der **SHA-256-Record aus `raw/**/source.md`** (Provenienz-Sidecar, §1 Pkt. 4). Als `` dient der **letzte committete Zustand des Workspace** (deterministisch: der HEAD der vorherigen Mutations-Boundary, AD-17f). **Auflösungs-Regel (D-2-Präzisierung, Review-Loop 2):** der Producer **notiert den `` (vollen SHA) im `wiki/log.md`-Eintrag des Runs** — damit ist er deterministisch auflösbar ohne Domain-State-Annahme an Git (AD-14: Git liefert Historie, nicht Domain-State; der log.md-Eintrag ist der State-Referenz-Punkt, keine Git-Historie-Interpretation). **Diskrepanz-Regel:** widersprechen sich `git diff`-Befund und SHA-256-Record für dieselbe Datei, **gewinnt der `git diff`-Befund** (Commit-Boundary = Mutations-Boundary, AD-17f); der SHA-256-Record bleibt Sekundär-Fingerprint. Ist der SHA-256-Record unlesbar/fehlend, wird die Datei dennoch als Zuwachs **nicht doppelt** verarbeitet (textueller Hinweis) und gegen den `git diff`-Befund abgeglichen (kein Doppel-Verdikt). **Fallback:** existiert keine vorherige Mutations-Boundary (frischer Workspace ohne Lauf-Historie), gilt **alle `raw/`-Dateien als Zuwachs**. Die Diff-Probe in Pkt. 5 läuft gegen **dasselbe** `` (Review-Loop-2-Korrektur des Rev-2.4.1-Claims: die Pkt.-5-Probe trägt das Baseline-Commit-Argument explizit). - **Pre-Run-Reconcile-Check-Block (Defer P2):** Vor jeder Mutation durchläuft der Producer den gebündelten Vorprüf-Block und hält ihn textuell fest: (1) **Input-Zustand** (AD-17a, I/O-Matrix `INPUT_UNCOMMITTED`; Review-Loop-2-D-3): Working-Copy von `raw/` und `wiki/` gegen HEAD prüfen — bei Abweichung (uncommitteder Zustand) bricht der Run mit dem **textuell benannten Abbruch „published/committed Input erforderlich"** ab, **vor** Interpretation und vor jeder Mutation (keine Mutation gegen Zwischenstände); (2) Ziel-Pfade (Ausgangs-Kandidatenliste, §3 Pkt. 2); (3) Quellen-Existenz (EC-1 via Validator-Punkt: jede referenzierte `raw/`-Datei existiert als Datei); (4) Betroffenheits-Kandidatenliste (§3 Pkt. 2, textuell-deterministisch); (5) `wiki/index.md`-V-1-Vorbedingung (fehlende Bundleroot → Run-FAIL, §3 Pkt. 3, Vertrag §2). Dieser Block ist der in `deferred-work.md` als P2 notierte Pre-Plan-Schritt und wird durch Story 3.1 als Teil des inkrementellen Runs ausgeführt. **Zeitpunkt (Review-Loop-2-Präzisierung):** der Block wird **nach Reconcile (2) und vor Mutieren (4)**, am **Anfang der Mutationsphase**, einmal pro Run durchgeführt — die Kandidatenliste (Elemente 2/4) existiert zu diesem Zeitpunkt bereits; die **Diff-Probe (Pkt. 5) läuft am Ende desselben Blocks, nach den Mutationen, vor dem Commit**. Die Kandidatenliste, die hier festgehalten wird, ist **die** Kandidatenliste, gegen die der Diff-Selbsttest (Pkt. 5) prüft (keine zweite, davon abweichende Erhebung nach der Mutation). -7. **Worked Example (an die reale Ist-Lage gebunden, re-executiert; Review-Loop-2-Korrektur):** Ein Run mit neuer committeter Evidenz `raw/epics/epics-2026-08-14.md#FR-12` (Zuwachs über die bisher verarbeitete Stelle hinaus; die Kennung FR-12 existiert real in der Datei) trifft über `rg -l 'FR-12' wiki/` das bestehende Root-Concept `wiki/knowledge-kompilation-inkrementell.md` (Term-/Konzept-Überschneidung — re-executierter Befund: der Grep-Ausgabe-Pfad ist `knowledge-kompilation-inkrementell`; das Rev-2.4.1-Beispiel `wissensarchitektur/source-material.md` enthielt den Term **nicht** und ist damit korrigiert). Der Run aktualisiert diesen Pfad (Body-Erweiterung mit neuem §5.5-Inline-Beleg `(raw/epics/epics-2026-08-14.md#FR-12)`, `sources`-Ergänzung um diesen `resource` — sofern nicht bereits deklariert, sonst No-Op gemäß Pkt. 2, `generated.at` = aktueller Run-Zeitstempel, `log.md`-Eintrag „Story 3.1-Update"). Die Diff-Probe (Pkt. 5, ``-Form) zeigt ausschließlich `log` und `knowledge-kompilation-inkrementell` (betroffen, normalisiert) — kein Ghost-Diff, keine `index.md` im Diff (der Index-Link bleibt unverändert). +7. **Worked Example (an die reale Ist-Lage gebunden, re-executiert; Review-Loop-2-Korrektur):** Ein Run mit neuer committeter Evidenz `raw/epics/epics-2026-08-14.md#FR-12` (Zuwachs über die bisher verarbeitete Stelle hinaus; die Kennung FR-12 existiert real in der Datei) trifft über `rg -l 'FR-12' -g '!log.md' wiki/` das bestehende Root-Concept `wiki/knowledge-kompilation-inkrementell.md` (Term-/Konzept-Überschneidung — re-executierter Befund: der Grep-Ausgabe-Pfad ist `knowledge-kompilation-inkrementell`, `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a; das Rev-2.4.1-Beispiel `wissensarchitektur/source-material.md` enthielt den Term **nicht** und ist damit korrigiert). Der Run aktualisiert diesen Pfad (Body-Erweiterung mit neuem §5.5-Inline-Beleg `(raw/epics/epics-2026-08-14.md#FR-12)`, `sources`-Ergänzung um diesen `resource` — sofern nicht bereits deklariert, sonst No-Op gemäß Pkt. 2, `generated.at` = aktueller Run-Zeitstempel, `log.md`-Eintrag „Story 3.1-Update"). Die Diff-Probe (Pkt. 5, ``-Form) zeigt ausschließlich `log` und `knowledge-kompilation-inkrementell` (betroffen, normalisiert) — kein Ghost-Diff, keine `index.md` im Diff (der Index-Link bleibt unverändert). ## 6. Validieren (mechanische Bestätigung) @@ -316,7 +336,7 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - **Eine genau-eine-Linkform** (file-relativ mit `.md`-Endung, in Areas `../`-fähig) — in **§5.6** dieser Instruktion gepinnt (Story 2.3; AD-7b, A0-9, FR-10; Auflösungsmodell §5.7 Pkt. 4) — der Punkt-11-Check des Validators akzeptiert bis auf Weiteres beide Schreibweisen (strukturell unverändert, Story-2.2-Präzedenz). - **Synthese über mehrere Concepts** (mehrere Sources → eine gemeinsame Wissensrepräsentation mit gemischter, claim-granularer Provenienz) → **Epic 3, Story 3.4** (AD-4, FR-7). Die Verankerung des inkrementellen Datenflusses (Erweitern/Präzisieren/Korrigieren einzelner bestehender Concepts) bleibt **§3 + §5.9** überlassen und ist dort bereits verankert (Story 3.1) — sie ist damit aus diesem Vorbehalt entlassen. - **Leasing / Dirty-Tree-Schutz** für konkurrierende Producer → **Story 3.5/3.6** (AD-17a..f, A0-12..A0-16); die bestehende Commit-Boundary = Mutations-Boundary-Regel (§0/§5.3, AD-17f) bleibt in v1 bestehender Schutz. -- **Feinkörnige Relevanz-Verfeinerung** (eigene Ausformulierung des Relevanz-Findungsmechanismus) → **Story 3.2**; Story 3.1 bindet die Kandidatenerhebung an die in §3 Pkt. 2 genannten textuell-deterministischen Mittel (grep/ripgrep, `index.md`-Traversal, Link-Following; AD-13). +- **Relevanzbestimmung** (feinkörniger Relevanz-Findungsmechanismus der Kandidatenerhebung) — in **§3.2** dieser Instruktion verankert (Story 3.2; Term-Ziehverfahren + Kanonisierungs-Resolver `schema/canonical-terms.md`, drei Erhebungs-Stufen grep/ripgrep + `index.md`-Traversal + Link-Following mit besuchter Menge, `log.md`-Exklusion, Candidate-Liste als relative OKF-Pfade ohne `.md`, Determinismus-Vertrag AD-17h/A0-19). Keine neue §7-Klasse, kein Schema-/Validator-Change; die Em-Dash-`—`-Varianten-Lücke ist als Determinismus-Frage an Story 3.8 übergeben. - **Standalone-Compiler / eigene LLM-Runtime / MCP** → verboten in v1 (D-3, D-4, AD-11). - **OKF-Dialekt / Schema-Erweiterung** → niemals (AD-1a; Vertrag §7 „abschließende Liste"). @@ -326,10 +346,10 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - `schema/wiki-compiler.md` — autorisierter Vertrag (Story 1.3): §2 Bundleroot, §3.1–§3.7 Feldsubset & Formate, §5 `log.md`-Typ, §6 Index-Regel/Prädikate, §7 abschließende 14-Punkte-Liste, §8 Normreferenzen. - `schema/validator.md` — Prüfgrundlage (Story 1.4, Revision 9): §3 14 Punkte, §4 Normalform (Reihenfolge §4.1, ISO-8601 §4.3), §5 Verdikt, §6 Fachprüfungen (EC-1 Existenz, EC-3 Kalender, EC-11 non-md; Punkt-11-Area-Lesart formalisiert). -- Architektur-Spine (raw/`architecture-spine`): AD-2/AD-3 (raw immutable), AD-4a (claim-granulare Provenienz, §5.5), AD-5 (inkrementelle Kompilation), AD-6 (Reason/Mutate-Trennung), AD-7a (Identität = OKF-Pfad ohne `.md`, §5.7), AD-7b (genau eine Linkform gepinnt, §5.6), AD-7c (deterministische Bereichszuordnung, §5.7), AD-7d (Renaming/Redirect-Pflicht — nicht in den ACs, Epic 3), AD-8 (Standard-Markdown-Links = Navigations-/Beziehungsschicht, §5.6), AD-9 (Progressive Discovery, §5.7/§5.8), AD-10 (agent-unabhängige Regeln), AD-11 (keine eigene Runtime), AD-13 (Retrieval gehört zu Consumers / Suche = Consumer-grep / keine Embedding-Bereichszuordnung, §5.7/§5.8), AD-14 (Git liefert Historie, nicht Domain-State), AD-15 (Trust-Metadaten v1), AD-16 (Konflikte werden explizit bewahrt), AD-17a (nur veröffentlichte/committete Inhalte als Input), AD-17f (Commit-Boundary = Mutations-Boundary), AD-17h (Determinismus), D-3 (kein Standalone). +- Architektur-Spine (raw/`architecture-spine`): AD-2/AD-3 (raw immutable), AD-4a (claim-granulare Provenienz, §5.5), AD-5 (inkrementelle Kompilation), AD-6 (Reason/Mutate-Trennung), AD-7a (Identität = OKF-Pfad ohne `.md`, §5.7), AD-7b (genau eine Linkform gepinnt, §5.6), AD-7c (deterministische Bereichszuordnung, §5.7), AD-7d (Renaming/Redirect-Pflicht — nicht in den ACs, Epic 3), AD-8 (Standard-Markdown-Links = Navigations-/Beziehungsschicht, §5.6), AD-9 (Progressive Discovery, §5.7/§5.8), AD-10 (agent-unabhängige Regeln), AD-11 (keine eigene Runtime), AD-13 (Retrieval gehört zu Consumers / Suche = Consumer-grep / keine Embedding-Bereichszuordnung, §5.7/§5.8; Relevanzbestimmung textuell-deterministisch, §3.2), AD-14 (Git liefert Historie, nicht Domain-State), AD-15 (Trust-Metadaten v1), AD-16 (Konflikte werden explizit bewahrt), AD-17a (nur veröffentlichte/committete Inhalte als Input), AD-17f (Commit-Boundary = Mutations-Boundary), AD-17h (Determinismus), D-3 (kein Standalone). - PRD (raw/prd): FR-2 (Sources vs. Curated), FR-5 (Concept-Erzeugung), FR-9 (OKF-Konformität), FR-10 (Concepts miteinander verlinken, §5.6), FR-11 (Progressive Discovery siehe PRD-§4.3-Zeile unten — Discovery-Pfad/gewurzelte Erreichbarkeit, §5.8), FR-16 (Consumer-Unabhängigkeit), NFR-3 (Agent Readability — Standard-Dateioperationen/grep über `wiki/`, §5.8 Pkt. 4), A-4 (nur lokale Sources). -- Epics (raw/epics): Story-2.1-Ziel und -Abgrenzung zu Story 2.2–2.5; A0-3 (Kontext-Marker-Wortlaut, §5.5), A0-8 (Concept-Identität/Normalisierung, §5.7), A0-9 (eine erlaubte Linkform, §5.6), A0-10 (deterministische Bereichszuordnung, §5.7), A0-13 (Lease-Root-Scope); FR-6/FR-12/FR-14, A0-6/A0-7/A0-11/A0-18 (Belege der nachkonformierten Concept-Bodies); **A0-6 (inkrementeller Datenfluss Interpret → Reconcile → Synthesize → Update, §0/§3/§5.9), FR-6 (Aktualisierung statt neuer Dateien, §3/§5.9), FR-12 (unverändertes Wissen bleibt erhalten, §5.9)**. -- PRD §4.3 (FR-11 — progressive Discovery, §5.7 Pkt. 5/§5.8) und §8.2/§8.3 (Canonical State; Separation of Concerns). +- Epics (raw/epics): Story-2.1-Ziel und -Abgrenzung zu Story 2.2–2.5; A0-3 (Kontext-Marker-Wortlaut, §5.5), A0-8 (Concept-Identität/Normalisierung, §5.7), A0-9 (eine erlaubte Linkform, §5.6), A0-10 (deterministische Bereichszuordnung, §5.7), A0-13 (Lease-Root-Scope); FR-6/FR-12/FR-14, A0-6/A0-7/A0-11/A0-18 (Belege der nachkonformierten Concept-Bodies); **A0-6 (inkrementeller Datenfluss Interpret → Reconcile → Synthesize → Update, §0/§3/§5.9), FR-6 (Aktualisierung statt neuer Dateien, §3/§5.9), FR-12 (unverändertes Wissen bleibt erhalten, §5.9)**, **A0-18 (Deterministische Relevanzbestimmung — grep/ripgrep, `index.md`-Traversal, Link-Following, keine Embedding-/Vector-Infrastruktur; §3.2, AD-13, PRD OQ-3)**, **A0-19 (Determinsmus-Vertrag: gleicher Git-State + gleiche Eingabemenge → gleicher Bundle-State / gleiche Candidate-Liste in gleicher Reihenfolge; §3.2, AD-17h)**. +- PRD §4.3 (FR-11 — progressive Discovery, §5.7 Pkt. 5/§5.8) und §8.2/§8.3 (Canonical State; Separation of Concerns), **PRD OQ-3 („Compilation Scope" — wie findet der Compiler relevante vorhandene Concepts; textuell-deterministische Relevanzbestimmung, §3.2; AD-13/A0-18; Muster `raw/architecture-spine/…md` §8.3)**. **Revisionslog:** @@ -349,4 +369,6 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - **Revision 2.3 (2026-08-18, Story 2.5):** Neue Sektion **§5.8 „Progressive Discovery über `index.md` (Story 2.5)"** eingefügt (nach §5.7, vor §6): (1) **Discovery-Pfad** (Bundleroot `wiki/index.md` → Area-`index.md` frontmatterlos → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot — AD-9/FR-11, gewurzelte Erreichbarkeit Root → Area → Concept), (2) **gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest** (`UNREACHABLE AREA: ` für unverlinkte Area; `NESTED AREA: ` für Zwei-Ebenen-Kandidaten inkl. der Area-ohne-`index.md`-Lücke `wiki/a/b/concept.md`; gekoppelte Meldungen an den Run-Nachweis gemäß §5.6-Pkt.-4-analoger NFR-4-Regel; Instruktions-Selbsttest, **keine** neue §7-Klasse — schließt die Validator-Navigation-Lücke, ohne Validator-Change, AD-3), (3) **konsolidierte Zwei-Ebenen-Kartografie** (respondiert Defer **F-07**, schließt es): Root + eine Area-Ebene; `wiki/a/b/` ist keine zugelassene Anlageform — der Kandidat wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, Meldung `NESTED AREA: `, Run „teilweise erfolgreich"); §3.2 bleibt der Dateikollision bestehender Concepts vorbehalten (Loopback-1-Renegotiation, Option A); (4) **Suche = Consumer-grep** (`grep -n wiki/` / ripgrep, AD-13 — keine Such-Datenbank, kein Embedding, kein Index-Datei-Format), (5) **Discovery-Demo (optional, kein MOVE)** — Hinweis auf Formel-4-Re-Baseline-Pflicht bei Durchführung. Nachgeführt: **§7** (Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt — Navigation/Area-Indizes jetzt in §5.8 verankert, Suche = Consumer-Thema; die Vorbehalt-Zeile lag in der Baseline `main` bei Z. 253, nach dem §5.8-Einschub bei Z. 285), **§8-Normreferenzen** (AD-9/AD-13 → §5.8, FR-11 → §5.8/§5.7 Pkt. 5, NFR-3 neu, PRD-§4.3-Zeile nachgeführt) + **Revisionslog 2.3**. Keine Änderung an `wiki-compiler.md`/`validator.md`/`raw/` (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. - **Revision 2.4 (2026-08-18, Story 3.1):** Neue Sektion **§5.9 „Inkrementelles Update bestehender Concepts (Story 3.1)"** eingefügt (nach §5.8, vor §6) — Update-Stimulus (Reconcile-Kandidatenliste), Mutationsmechanik (Erweitern/Präzisieren/Korrigieren; `sources` nur um echte neue Belege; `generated.at` = aktueller Run-Zeitstempel; `verified` unangetastet), Index-/Link-Form unverändert (§5.6-Pin), `log.md`-Eintragspflicht („Story 3.1-Update"-Markierung; Disagreement-Fälle bleiben dokumentiert, keine Korrektur-Klassifikation hier — Epic-4-Interface), **Erhaltungs-Invariante + deterministischer Diff-Selbsttest** (`git diff --stat -- wiki/` ⊆ betroffene Concepts ∪ `log.md` ∪ Index; Ghost-Diff = textuell benannter Instruktions-Verstoß, FT-6/FR-12), Run-Vorphase-Bausteine (Defer **R-1** Change-Detection via `git diff` auf `raw/` + SHA-256-Record aus `source.md`; Defer **P2** Pre-Run-Reconcile-Check-Block — Zielpfade, EC-1-Existenz, Kandidatenliste, V-1), Worked Example. **§3 Reconcile:** Pkt. 2 Kollision-Hold (bisheriger Epic-3-Abbruch bei bereits existierendem Concept) **ersetzt** durch **Update-Routing** (bestehende Wissenseinheit → Update-Kandidat im bestehenden Pfad; kein Duplikat, kein stummer Überschreib; AD-16-Default-Erhaltung) + **textuell-deterministische Kandidatenliste** (Konzept-/Term-Überschneidung via `grep`/`ripgrep`, `index.md`-Traversal, Link-Following — AD-13; feinkörniger Mechanismus Story 3.2). **§0-Aufruf:** sechs Phasen für Neu-Anlage- und Update-Variante präzisiert; Reconcile/Mutieren betreffen auch bestehende Concepts. **§5.7 Pkt. 3 / §5.8 Pkt. 2/3:** Top-Level-Referenz von „§3.2-Kollisions-Hold" auf das Update-Routing (§3 Pkt. 2, §5.9) nachgeführt (die bisherige Epic-3-Abbruch-Formulierung ist vollständig entfernt). **§7:** Update-Thema aus dem Epic-3-Vorbehalt **entlassen** (verbleibende 3.x-Themen benannt: Synthese → Story 3.4, Leasing/Dirty-Tree → Story 3.5/3.6, Relevanz-Verfeinerung → Story 3.2); Scope-Einleitung um die Update-Variante geöffnet. **§8:** Normreferenzen um A0-6/FR-6/FR-12 ergänzt. **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. - **Revision 2.4.1 (2026-08-18, Story 3.1, Step-04-Review-Patch-Runde; D-3-Instruktions-Patch, kein neuer Inhalt):** §5.9-Konsolidierung aus den drei Review-Layern — (1) Prüfgrundlage auf `validator.md` **Revision 9** angehoben (§0-Header, §8-Link), §8-Verlusttext um die Punkt-11-Area-Lesart (Rev-9) ergänzt; (2) §5.9 Pkt. 5 Diff-Selbsttest operationalisiert (Probe `git diff --name-only -- wiki/` statt `--stat`; Ergebnismenge ⊆ **Kandidatenliste** (explizit §3 Pkt. 2) ∪ `log.md` ∪ nachgeführte `index.md`; Rücksetzhilfe „ob der Ghost auf einem Kandidatenpfad liegt"); Klarstellung, dass `schema/compiler.md`/`deferred-work.md` **außerhalb** `wiki/` liegen und daher nicht Teil der Diff-Probe sind — der Story-3.1-Nachweis ist `wiki/log.md` (Differenz zu den 4 volle `git status --porcelain`-Einträgen); Diff-Erwartung für das reine Body-Update in Pkt. 7 auf `git diff --name-only` umgestellt, Ergebnismenge `wiki/log.md` + `wissensarchitektur/source-material.md` (keine `index.md`); (3) §5.9 Pkt. 3-Widerspruch aufgelöst (Index-Regel unverändert, `log.md`-Eintragspflicht bleibt ausgeschlossen — Präzisierung „kein `log.md`-Zusatz" war falsch, korrekt „kein Index-Zusatz"); (4) §5.9 Pkt. 2 um **Mehrfach-Treffer-Konsolidierung** ergänzt (mehrere Einheiten → 1 Update/`log.md`-Eintrag/`at`; Verarbeitungsreihenfolge = Auftreten in der Zuwachs-Sicht); (5) §5.9 Pkt. 1/6-Anker §1.1/§1.4 → **§1 Pkt. 1/Pkt. 4** (die tatsächlichen Label; §5.8-Pkt-2-Formel-Zeile bleibt historisch); (6) Ghost-Diff **Konsequenz** + Commit-Boundary-Umsetzung definiert (Rück-Rollen vor Run-Gültigkeit, `log.md`-Kopplung als Abbruch-Vorlauf „korrigierter Teil-Run"); (7) Defer-**R-1**-Baseline festgelegt (HEAD der vorherigen Mutations-Boundary); (8) §5.9 Pkt. 7-Worked Example auf den **realen Ist-Baum** gehoben (`raw/epics/epics-2026-08-14.md#FR-12`, `rg -l 'FR-12'`; das fiktive `epics-2026-08-18.md`/`payload` entfernt); (9) §5.8-Pkt-3-Revision-Feinschliff — die Rev-9-Lücke ist geschlossen; die Markierung ist Pkt. 3. **Abschlussklausel der Patch-Runde:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. +- **Revision 2.6 (2026-08-19, Story 3.2, Step-04-Review Loop 2, Patch-Runde; D-3-Instruktions-Patch, kein neuer Inhalt):** (1) **§4-Überschrift wiederhergestellt** — die §3.2-Einfügung (Rev 2.5) hatte die Überschrift **`## 4. Synthetisieren (Provenienz & Trust)`** verdrängt (der §3.2-Sektionskopf ersetzte die §4-Überschrift; der gesamte Frontmatter-Body hing kopflos unter §3.2; alle §4-Referenzen wären dangling geblieben). Der §4-Kopf ist zwischen §3.2-Body und dem Frontmatter-Body wieder eingefügt; die §4-Referenzen zeigen wieder auf eine existierende Sektion; der §3.2-Body blieb unverändert erhalten. (2) **rg-Flag-Defekt behoben (`--exclude` ist kein rg-Flag):** die Stufe-a-Form in §3-Pkt.-2, §3.2-Pkt.-2a, §5.9-Worked Example (Pkt. 7) und §7 nutzten `rg -l "" --exclude=log.md wiki/` — nicht-existent (ripgrep 14.1.1: `rg --exclude` → `unrecognized flag`; GNU grep unterstützt `--exclude`, ripgrep nutzt `-g "!log.md"` / `--glob "!log.md"`). Die Instruktion nutzt jetzt tool-korrekte Formen: rg `rg -l "" -g "!log.md" wiki/` (native Glob-Exklusion) bzw. GNU grep `grep -rl "" --exclude=log.md wiki/`; die §5.6-Formeln (bereits GNU-grep) und §5.9-Pkt.-7-Erhebung adoptieren die Exklusion. Verified: `rg -l "A0-18" -g "!log.md" wiki/` → nur `wiki/knowledge-kompilation-inkrementell.md`; **ohne** Exklusion trifft `rg -l "A0-18" wiki/` zusätzlich `wiki/log.md` (Selbstkontamination — der ausgeschlossene Fall, §3.2-Pkt.-2a). (3) **§5.9-Worked Example (Pkt. 7) auf die Exklusions-Form gehoben** (`rg -l "FR-12" -g "!log.md" wiki/`), Kommentar `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a. (4) **Mini-Sandbox re-executierbar verankert** (`_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh`, Muster Story-3.1-Sandbox S1–S6): Tests T1–T4 (Membership-Pin — Term auf Concept-Bodies UND `log.md` verteilt, Candidate-Liste nur Concept-Pfade; Zwei-Run-Identität AD-17h; NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT; Mehrfach-Treffer → Vereinigung + lexikografische Ordnung). (5) **`deferred-work.md`-Em-Dash-Eintrag** append-only ergänzt (Home: Story 3.8) — die §3.2-Pkt.-1b-Kollaps-Klasse deckt En-Dash/Bindestrich/Unterstrich/Leerzeichen, aber **nicht** den Em-Dash `—`; dieser Handoff wird nicht stillschweigend gelöst, sondern als offene Determinismus-Frage dokumentiert. (6) **§3-Pkt.-2/§3.2-Präambel/§7-Nennungen** der Exklusion auf die tool-korrekte Form angehoben. **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. (Rev-2.5-Log-Eintrag bleibt unverändert — dokumentiert den Zustand bei Veröffentlichung der Revision 2.5, inkl. der damaligen `--exclude`-Form; historische Korrektheit des Logs.) +- **Revision 2.5 (2026-08-19, Story 3.2):** Neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** eingefügt (nach §3, vor §4) — die **verbindliche Ausformulierung der §3-Pkt.-2-Kandidatenerhebung** („Erhebung nach §3.2"): (1) **Term-Ziehverfahren** deterministisch (bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps; **kanonischer Schreibweisen-Resolver `schema/canonical-terms.md`** — committete, append-only Registry (canon. Form + erlaubte Varianten), damit Bestandteil des Git-States und deterministisch pinbar; genau eine canon. Form je Semantik A0-18; kein stiller Ausschluss nicht auflösbarer Varianten — Verwendung wie notiert; mehrere Terme je Einheit → Vereinigung), (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (grep-Äquivalent `grep -rl … --exclude=log.md`; `log.md` **strukturell** exkludiert, Candidate-Liste auf Concept-Pfade definiert), (b) `index.md`-Traversal (gewurzelte Erreichbarkeit Root → Area → Concept, §5.8; TRAVERSAL_REACH_ONLY; fehlende Bundleroot → Run-FAIL V-1), (c) Link-Following mit **besuchter Menge** (file-relativ auflösen, §5.7 Pkt. 4; Zyklen enden, LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag (AD-17h/A0-19):** relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (nach Stufe-a; lexikografisch als deterministischer Tie-Break), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) in Spec-Verification und `wiki/log.md` belegt. **§3 Pkt. 2:** Story-3.2-Vorbehalt **aufgelöst** — Pkt. 2 bleibt Kern-Anker, die Erhebung zeigt auf die neue Sektion („Erhebung nach §3.2"), `rg -l '' --exclude=log.md wiki/` als Stufe-a-Form genannt. **§7:** Story-3.2-Vorbehalt **aufgelöst** (Relevanzbestimmung in §3.2 verankert; verbleibende 3.x-Themen: Synthese → Story 3.4, Leasing/Dirty-Tree → Story 3.5/3.6). **§8:** Normreferenzen um **AD-13** (bereits gelistet, §3.2-beankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2) und **A0-19** (Determinsmus-Vertrag, §3.2 — war im Ist-§8 noch nicht gelistet, wird als Determinismus-Referenz ergänzt) sowie **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; **`schema/canonical-terms.md`** als nebengeordnete committete Resolver-Registry referenziert (kein `schema/`-Root-Change; gleiche read-only-Hierarchie, append-only). Em-Dash-`—`-Varianten-Lücke als offene Determinismus-Frage an **Story 3.8** übergeben (nicht stillschweigend ergänzt). **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **`sprint-status.yaml`:** Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**. `wiki/log.md`-Eintrag (append-only, bestehende Bullets unverändert), `deferred-work.md`-epic-3-context-Eintrag → aufgegriffen (append-only), Determinismus-Selbsttest + Validator-Lauf (7/7 SUCCESS) siehe `wiki/log.md`-Nachweis. - **Revision 2.4.2 (2026-08-19, Story 3.1, bmad-code-review Loop 2, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4 = 1/1/1/1):** (1) **Diff-Selbsttest (Pkt. 5) operationalisiert + Blind-Spots geschlossen (D-1):** Probe erweitert auf `git diff --name-only -- wiki/` **plus** `git status --porcelain -- wiki/` (erfasst ungetrackte neue Dateien `??` — die Duplikat-Kontrolle „keine neue Datei" braucht diese Sicht; `git diff` allein ist blind für Untracked); **Probe-Zeitpunkt fixiert vor dem Commit** (am Ende des P2-Blocks, nach den Mutationen) — nach dem Commit wäre die Probe vacuous (leere Ausgabe, AD-17f); erlaubte Teilmenge-Menge um **Neu-Anlage-Zielpfade** (§5.1/§5.7) ergänzt — Misch-Runs (Neu-Anlage + Update im selben Run) markieren neu angelegte Pfade nicht fälschlich als Ghost-Diff; **Pfad-Normalisierung** definiert (Strip `wiki/`-Präfix + `.md`-Suffix vor dem Teilmenge-Vergleich, da Kandidaten/Ziel-Pfade als relative OKF-Pfade *ohne* `.md` definiert sind); **Rollback-Mechanik** für den Ghost-Diff deterministisch benannt (modifizierte Pfade via `git checkout -- `, ungetrackte neue Dateien gelöscht, Index via `git checkout -- `; §5.3/§6.3-Teilzustand-Rollback greift daneben unverändert). (2) **R-1-Baseline deterministisch + Abweichungsregel (D-2):** `` (HEAD der vorherigen Mutations-Boundary, AD-17f) wird vom Producer **im `wiki/log.md`-Run-Eintrag notiert** (voller SHA) — deterministisch auflösbar ohne Domain-State-Annahme an Git (AD-14); **Diskrepanz-Regel**: widersprechen `git diff`-Befund und SHA-256-Record derselben Datei, **gewinnt `git diff`** (Commit-Boundary-Prinzip), SHA-256 bleibt Sekundär-Fingerprint; **Fallback**: ohne vorherige Mutations-Boundary gelten alle `raw/`-Dateien als Zuwachs; Rev-2.4.1-Claim „derselbe Baseline-Commit wie Pkt. 5" **korrigiert** (die Pkt.-5-Probe trägt das Baseline-Commit-Argument jetzt explizit). (3) **INPUT_UNCOMMITTED-Abbruch (D-3) + Anker-Divergenz:** neuer P2-Check-Block-Element (1) **Input-Zustand** — Working-Copy von `raw/`/`wiki/` gegen HEAD prüfen, bei Abweichung **benannter Abbruch „published/committed Input erforderlich"** vor Interpretation und vor jeder Mutation (AD-17a, I/O-Matrix-`INPUT_UNCOMMITTED` — zuvor nur Referenz auf §1 Pkt. 1, keine Zustandsprüfung/Abbruchmeldung); die **Spec↔Anker-Divergenz** (frozen Spec zitiert 3× „§1.1", §1 ist eine nummerierte Liste Pkt. 1–4 ohne §1.1-Label; Rev-2.4.1 korrigierte nur die Anker *in* compiler.md) wird hier als dokumentierte Fußnote gesichert — die Spec bleibt frozen (nur per menschlicher Renegotiation änderbar). (4) **Sandbox-Edge-Test-Nachweis (D-4):** die fünf I/O-Matrix-Szenarien (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) + die D-3-Abbruch-Kontrolle sind als re-executierbare Sandbox-Skripte mit **konkreten deterministischen Ausgaben** in der Spec-`## Verification`-Sektion (Sandbox-Beleg) verankert — die `wiki/log.md`- und `deferred-work.md`-Verweise („in der Spec-Verification enthalten") auflösbar. (5) **Instruktions-Präzisierungen:** P2-Block-**Zeitpunkt** (nach Reconcile, am Anfang der Mutationsphase; Diff-Probe am Block-Ende) — löst den Widerspruch „einmal an der Spitze erhoben" vs. „Kandidatenliste entsteht erst im Reconcile"; **No-Op-Kandidat**-Regel (Pkt. 2: Pfad, der die Evidenz bereits vollständig enthält → keine Mutation/kein `at`-Bump/kein `log.md`-Eintrag, byte-identisch — die engere Auslegung); **Mehrfach-Treffer-Reihenfolge** für *alle* Einheiten definiert (Zuwachs-Sicht-Ordnung; lexicografisch nur als Tie-Break bei identischem Ort — AD-17h); **Update-Pfad-Rollback** in §5.3 Pkt. 3 (modifizierte Pfade aus Baseline-Commit wiederherstellen); **`generated.at`↔AD-17h-Gap** explizit als offener Punkt mit Home Story 3.8 benannt (Wanduhr-`at` erzeugt bei gleichem Input unterschiedliche Bundle-States; Konvention bleibt bis dahin bindend, Wechsel = Ask-First); **Term-Ableitung** (Pkt. 2 (a)) als §2-Interpretation abgegrenzt — die Erhebung *mit festem Term* ist textuell-deterministisch, der Term-Mechanismus (Kanonisierung/Synonyme) Story 3.2; **Link-Following** mit besuchter Menge (keine Schleife bei zyklischen Links); **Worked Example (Pkt. 7) auf den realen Ist-Baum korrigiert** (`rg -l 'FR-12' wiki/` trifft `wiki/knowledge-kompilation-inkrementell.md`, **nicht** `wissensarchitektur/source-material.md` — Rev-2.4.1-Beispiel enthielt den Term nicht); stale-Anker `§3.2-Kollisionsprüfung` (Pkt. 3-Zuordnung) und `§3-Voraussetzungsprüfung` (P2-Block) sowie §5.8-Pkt.-3-Zeiger („Pkt. 1" → „Pkt. 2") nachgeführt. **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. diff --git a/wiki/log.md b/wiki/log.md index cdea97c..9a959b4 100644 --- a/wiki/log.md +++ b/wiki/log.md @@ -1,6 +1,8 @@ # Log ## 2026-08-19 +- **Step-04-Review Loop 2 / Patch-Runde (Story 3.2, 2026-08-19):** `schema/compiler.md` → **Revision 2.6** (D-3-Instruktions-Patch, kein neuer Inhalt; bmad-code-review VG-Findings verarbeitet). (1) **§4-Überschrift wiederhergestellt** — die §3.2-Einfügung (Rev 2.5) hatte die Überschrift **`## 4. Synthetisieren (Provenienz & Trust)`** verdrängt (der §3.2-Sektionskopf ersetzte die §4-Überschrift; der gesamte Frontmatter-Body hing kopflos unter §3.2; alle §4-Referenzen wären dangling geblieben). Der §4-Kopf ist zwischen §3.2-Body und dem Frontmatter-Body wieder eingefügt. (2) **rg-Flag-Defekt behoben (`--exclude` ist kein rg-Flag):** die Rev-2.5-Form in diesem Log- plus dem §3.2-Eintrag, §3-Pkt.-2, §3.2-Pkt.-2a, §5.9-Worked Example (Pkt. 7) und §7 nutzten `rg -l '' --exclude=log.md wiki/` — nicht-existent (ripgrep 14.1.1: `rg --exclude` → `unrecognized flag`; GNU grep unterstützt `--exclude`, ripgrep nutzt `-g '!log.md'` / `--glob '!log.md'`). Die Instruktion nutzt jetzt tool-korrekte Formen: rg `rg -l '' -g '!log.md' wiki/` (native Glob-Exklusion) bzw. GNU grep `grep -rl '' --exclude=log.md wiki/`; die §5.6-Formeln (bereits GNU-grep) und §5.9-Pkt.-7-Erhebung adoptieren die Exklusion. Dieser Eintrag zitiert den alten Defekt **historisch** (verlaufsgetreue Log-Führung; die operative Form ist jetzt tool-korrekt). (3) **§5.9-Worked Example (Pkt. 7) auf die Exklusions-Form gehoben** (`rg -l 'FR-12' -g '!log.md' wiki/`), Kommentar `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a. (4) **Mini-Sandbox re-executierbar verankert** (`_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh`, Muster Story-3.1-Sandbox S1–S6): Tests T1–T4 (Membership-Pin — Term auf Concept-Bodies UND `log.md` verteilt, Candidate-Liste nur Concept-Pfade; Zwei-Run-Identität AD-17h; NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT; Mehrfach-Treffer → Vereinigung + lexikografische Ordnung). (5) **`deferred-work.md`-Em-Dash-Eintrag** append-only ergänzt (Home: Story 3.8) — die §3.2-Pkt.-1b-Kollaps-Klasse deckt En-Dash/Bindestrich/Unterstrich/Leerzeichen, aber **nicht** den Em-Dash `—`; dieser Handoff wird nicht stillschweigend gelöst, sondern als offene Determinismus-Frage dokumentiert. **Re-executierte Selbsttest-Belege (2026-08-19, ab Workspace-Root):** (a) rg-Form real: `rg -l 'A0-18' -g '!log.md' wiki/` → exakt `wiki/knowledge-kompilation-inkrementell.md`; ohne Exklusion `rg -l 'A0-18' wiki/` → zusätzlich `wiki/log.md` (Selbstkontamination — der §3.2-Pkt.-2a-Fall, reell belegt); (b) GNU-grep-Äquivalent `grep -rl 'A0-18' --exclude=log.md wiki/` → identisch `wiki/knowledge-kompilation-inkrementell.md`; (c) `rg -l 'FR-12' -g '!log.md' wiki/` → `wiki/knowledge-kompilation-inkrementell.md` (§5.9-WE-Korrektur reell); (d) Mini-Sandbox T1–T4 → siehe Rev-2.6-Eintrag; (e) `git status --porcelain` → `wiki/` nur `log.md` (dieser Eintrag; Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt), `schema/compiler.md` + `deferred-work.md` sind außerhalb `wiki/` (kein Teil der Diff-Probe). **Abschlussklausel Rev 2.6:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3, geprüft via `git status`); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. (Der Rev-2.5-Implementierungs-Eintrag oben bleibt unverändert — dokumentiert den Zustand bei Rev-2.5-Veröffentlichung inkl. der damaligen `--exclude`-Form; historische Korrektheit des Logs.) +- **Story 3.2 «Relevanzbestimmung textual-deterministisch umsetzen (grep/ripgrep + Markdown-Traversal + Link-Following)» (Implementierung, Instruktions-Story D-3; `sprint-status.yaml`: Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**):** `schema/compiler.md` → **Revision 2.5** — die beiden **Story-3.2-Vorbehalte aufgehoben** (§3 Pkt. 2 + §7) und die feinkörnige Relevanz-Findungsmechanik als neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** verankert (nach §3, vor §4; Pkt. 2 bleibt Kern-Anker „Erhebung nach §3.2"): (1) **Term-Ziehverfahren deterministisch** — bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps (En-Dash/Bindestrich/Unterstrich/Leerzeichen); **kanonischer Schreibweisen-Resolver als committete, append-only Registry `schema/canonical-terms.md`** (canon. Form + erlaubte Varianten, `[]`; Bestandteil des Git-States → Auflösung pinbar, AD-17h/A0-19); genau eine canon. Form je Semantik (A0-18); **kein stiller Ausschluss** nicht auflösbarer Varianten (Verwendung wie notiert); mehrere Terme je Einheit → Vereinigung; **bekannte Determinismus-Lücke**: Em-Dash `—` fällt nicht unter den `[-–_ ]`-Kollaps → an **Story 3.8** übergeben (nicht still hinzugefügt); (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (GNU-grep-Äquivalent `grep -rl '' --exclude=log.md wiki/`; **`log.md` strukturell exkludiert** — die Candidate-Liste ist auf Concept-Pfade definiert, `log.md` ist kein Kandidat), (b) `index.md`-Traversal (gewurzelte Erreichbarkeit Root → Area → Concept, §5.8; TRAVERSAL_REACH_ONLY; fehlende Bundleroot → Run-FAIL V-1), (c) Link-Following mit **besuchter Menge** (file-relativ, §5.7 Pkt. 4; Zyklen enden — LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag** — relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (lexikografischer Tie-Break; AD-17h/A0-19), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad, Ghost-Diff-negativ); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) unten belegt. **§8-Normreferenzen:** AD-13 (bereits gelistet, §3.2-beankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2), **A0-19** (Determinsmus-Vertrag — war im Ist-§8 noch nicht gelistet, als Determinismus-Referenz ergänzt, §3.2/AD-17h) und **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; `schema/canonical-terms.md` als Resolver-Registry referenziert. **Abschlussklausel Rev 2.5:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **`deferred-work.md`:** der Story-3.1-Defer-Eintrag `epic-3-context.md` („Home: Story-3.2-Handoff") als **aufgegriffen** markiert (append-only); der F17/Em-Morphologie-Handoff (Story 3.8) bleibt bestehen. **Determinismus-Selbsttest (Membership + Identität, re-executiert 2026-08-19, ab Workspace-Root):** (a) `grep -rl 'A0-18' --exclude=log.md wiki/` zweimal ausgeführt → beide Ausgaben **identisch**, exakt `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad; `log.md` ausgeschlossen — der `--exclude=log.md`-Fakt ist ehrlich dokumentiert: ohne die Exklusion würde `log.md` ab dem Moment selbst „Kandidat", in dem dieser Eintrag `A0-18` zitiert — die B1-`log.md`-Kontamination ist damit geschlossen); (b) **mini-Sandbox-Baum** (`/tmp/sb32-…`, Term `quanten-protocol` auf Concept-Bodies **und** `log.md` verteilt) → exakte Candidate-Liste nur Concept-Pfade (`wiki/alpha.md`, `wiki/sub/beta.md`; `log.md` ausgeschlossen, `wiki/gamma.md` ohne Term nicht getroffen); normalisiert `alpha`, `sub/beta`; **Zwei-Run-Identität** (SHA-256 `159092bb…` ≡); Kontrolle ohne `--exclude` → `log.md` wird Kandidat (B1-Falle belegt und geschlossen); (c) §5.6-Formeln unverändert re-executierbar: Formel 2 (Form-Check) `0` (Exit 0), Formel 3 (Dangling-Check) keine Ausgabe, Formel 4 Ist-Zählung **38** (kein `wiki/`-Dateimenge-Change durch Story 3.2 — keine Re-Baseline nötig). **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 3.1, Story 3.2 mutiert keine Concept-Inhalte; `wiki/log.md` bleibt frontmatterlos, Punkt 10); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 4 und AC 5. `git status --porcelain -- wiki/` nach diesem Run: ausschließlich `log.md` (modifiziert) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, kein Ghost-Diff. - **Story 3.1 «Inkrementellen Datenfluss implementieren (Interpret → Reconcile → Synthesize → Update)» → `done` (bmad-code-review Loop 2, 4 Layer: blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor; Diff-Baseline `802a557` → `efc543c`; Nutzer-Entscheidungen D-1/D-2/D-3/D-4 = 1/1/1/1, jeweils empfohlene Option):** `schema/compiler.md` → **Revision 2.4.2** (alle 4 Decision-Resolutions + 16 Patches, rein textuell — kein Code, kein Standalone, keine neue §7-Klasse): (1) **D-1: Diff-Selbsttest (Pkt. 5) operationalisiert** — Probe = `git diff --name-only -- wiki/` **plus** `git status --porcelain -- wiki/` (erfasst ungetrackte `??`-Dateien — die Duplikat-Kontrolle braucht diese Sicht; `git diff` allein ist blind dafür), **Probe-Zeitpunkt vor dem Commit** (am Ende des P2-Blocks, nach den Mutationen; nach dem Commit wäre die Probe vacuous, AD-17f), erlaubte Menge um **Neu-Anlage-Zielpfade** (§5.1/§5.7) ergänzt (Misch-Runs: keine fälschlichen Ghost-Diffs), **Pfad-Normalisierung** (Strip `wiki/`-Präfix + `.md`-Suffix vor dem Teilmenge-Vergleich), **Rollback-Mechanik** deterministisch benannt (`git checkout -- ` für modifizierte Pfade, ungetrackte löschen, Index `git checkout -- `); (2) **D-2: R-1-Baseline deterministisch** — `` (HEAD der vorherigen Mutations-Boundary, AD-17f) wird vom Producer **im `wiki/log.md`-Run-Eintrag notiert** (voller SHA; AD-14: Git liefert Historie, nicht Domain-State — deshalb die Notiz); **Diskrepanz-Regel**: `git diff` gewinnt, SHA-256 bleibt Sekundär-Fingerprint; **Fallback**: ohne vorherige Mutations-Boundary gelten alle `raw/`-Dateien als Zuwachs; (3) **D-3: INPUT_UNCOMMITTED-Abbruch implementiert** — neuer P2-Check-Block-Element (1) **Input-Zustand**: Working-Copy von `raw/`+`wiki/` gegen HEAD prüfen, bei Abweichung **benannter Abbruch „published/committed Input erforderlich"** (AD-17a) vor Interpretation und vor jeder Mutation — die gefrorene I/O-Matrix-Verpflichtung ist damit als Zustandsprüfung + Abbruchmeldung umgesetzt (zuvor nur Referenz auf §1 Pkt. 1); die **Spec↔Anker-Divergenz** (frozen Spec zitiert 3× „§1.1", §1 ist eine nummerierte Liste Pkt. 1–4 ohne §1.1-Label) ist als dokumentierte Fußnote in Rev-2.4.2 gesichert (Spec bleibt frozen); (4) **D-4: Sandbox-Edge-Test-Nachweis** — die fünf I/O-Matrix-Szenarien (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) + die D-3-Abbruch-Kontrolle sind als re-executierbares Skript (`_bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh`, `bash …` ab Workspace-Root, Sandbox-Bäume unter `/tmp`) mit **konkreten deterministischen Ausgaben** in der Spec-`## Verification Record (Ausführungs-Beleg, 2026-08-19)` verankert — die Verweise „in der Spec-Verification enthalten" (dieses Log, `deferred-work.md`) sind damit auflösbar; (5) **Instruktions-Präzisierungen:** P2-Block-Zeitpunkt (nach Reconcile, am Anfang der Mutationsphase; Diff-Probe am Block-Ende), **No-Op-Kandidat**-Regel (Evidenz bereits vollständig enthalten → keine Mutation/kein `at`-Bump/kein `log.md`-Eintrag, byte-identisch), **Mehrfach-Treffer-Reihenfolge** für alle Einheiten (Zuwachs-Sicht-Ordnung; lexicografisch nur Tie-Break — AD-17h), **Update-Pfad-Rollback** in §5.3 Pkt. 3 (modifizierte Pfade aus Baseline-Commit wiederherstellen), **`generated.at`↔AD-17h-Gap** explizit benannt (Home: Story 3.8 — Wanduhr-`at` erzeugt bei gleichem Input unterschiedliche Bundle-States; Konvention A0-20 bleibt bindend, Wechsel = Ask-First), Term-Ableitung als §2-Interpretation abgegrenzt (Erhebung mit festem Term deterministisch; Term-Mechanismus Story 3.2), Link-Following mit besuchter Menge (keine Schleife bei zyklischen Links), **Worked Example (Pkt. 7) auf den realen Ist-Baum korrigiert** (`rg -l 'FR-12' wiki/` trifft `wiki/knowledge-kompilation-inkrementell.md`, nicht `wissensarchitektur/source-material.md` — das Rev-2.4.1-Beispiel enthielt den Term nicht), stale-Anker (`§3.2-Kollisionsprüfung`, `§3-Voraussetzungsprüfung`, §5.8-Pkt.-3-Zeiger „Pkt. 1" → „Pkt. 2") nachgeführt. **Abschlussklausel Rev 2.4.2:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **Review-Loop-2-Aufarbeitung zum Implementierungs-Eintrag (2026-08-18, oben):** (a) der dortige (b)-Diff-Selbsttest-Beleg zitierte die Vor-Rev-2.4.1-Form `git diff --stat -- wiki/` — die operative Probe ist seit Rev 2.4.2 die D-1-Form (`git diff --name-only -- wiki/` + `git status --porcelain -- wiki/`); (b) der Implementierungs-Eintrag dokumentierte „Revision 2.4" — der Story-3.1-Commit `efc543c` enthält **Revision 2.4 + 2.4.1** (Step-04-Review-Patch-Runde 2026-08-18, in `deferred-work.md` als „Story-3.1-Review-Protokoll" protokolliert) und ist jetzt auf **2.4.2** (dieser Eintrag) fortgeführt; (c) Statuskette: `in-progress` (Implementierungs-Eintrag) → `review` (Review-Handoff `efc543c`) → **`done`** (dieser Eintrag — Loop-2-Abschluss: 4 Decision-Resolutions + 16 Patches, keine unresolved Findings; spec-Frontmatter `status: 'done'` + `review_loop_iteration: 2` deckungsgleich). **Selbsttest-Beleg (re-executiert 2026-08-19, ab Workspace-Root, D-1-Probe-Form; `` = `802a5576eb4bbf54761a947e43e68b7e7ea9d67d` = Review-Baseline, hier als Konventions-Demonstration notiert — bei echten Run-Einträgen ist es der HEAD der vorherigen Mutations-Boundary, D-2):** (a) Instruktions-Integrität — `grep -n "5.9" schema/compiler.md` → §5.9-Sektion vorhanden; `grep -n "Aktualisierung ist Epic 3" schema/compiler.md` → **kein Treffer** (Hold ersetzt, unverändert); (b) **Diff-Selbsttest (Erhaltungs-Invariante)** — `git diff --name-only 802a557… -- wiki/` → ausschließlich `wiki/log.md` (dieser Eintrag; keine Concept-Datei, kein Index, kein Ghost-Diff auf nicht betroffenen Pfaden — die Instruktions-Story mutiert keine Concept-Inhalte; FT-6/FR-12) + `git status --porcelain -- wiki/` → ` M wiki/log.md` (tracked, modifiziert — im erlaubten Satz; **keine** `??`-Einträge = keine ungetrackten neuen Dateien = kein Duplikat); normalisiert: `log` ⊆ erlaubte Menge (`log.md`); (c) **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 2.5, Story 3.1 mutiert keine Concept-Inhalte); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 3 und AC 5; (d) **Sandbox-/Edge-Tests (I/O-Matrix)** — ausgeführt, echte Outputs in der **Spec-`## Verification Record (Ausführungs-Beleg, 2026-08-19)`** (re-executierbar: `bash _bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh`): S1 HAPPY_PATH_UPDATE (Probe → `alpha`, `log`; 0 untracked), S2 UNTOUCHED_CONCEPT (leere Probe), S3 CONCEPT_COLLISION_BESTEHEND (nur `M`-Einträge, kein `??`), S4 CHANGE_DETECTION (außschließlich `raw/alpha-v2.md`; SHA-256 `21e7fc1d…` identisch), S5 PRE_RUN_RECONCILE (Run-FAIL V-1, Zustand sauber), S6 INPUT_UNCOMMITTED (benannter Abbruch „published/committed Input erforderlich (AD-17a)"). `sprint-status.yaml`: `3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile` `review` → **`done`**, `last_updated` → 08-19-2026. ## 2026-08-18 -- 2.54.0 From 52f88fdc5f3ea0fe5323412ca3ba8b4a1bdbf549 Mon Sep 17 00:00:00 2001 From: Michael Tamse Date: Wed, 19 Aug 2026 13:21:48 +0200 Subject: [PATCH 08/16] =?UTF-8?q?feat:=20Story=203.2=20Code-Review-Loop-3-?= =?UTF-8?q?Patches=20(bmad-code-review,=204=20Layer;=20Nutzer-Entscheidung?= =?UTF-8?q?en=20D-1/D-2/D-3/D-4/D-5=20=3D=201/1/1/1/1=20+=20P-1/P-2)=20?= =?UTF-8?q?=E2=80=94=20compiler.md=20Revision=202.7,=20=C2=A73.2-Pkt.-3b-l?= =?UTF-8?q?exikografisch,=20canonical-terms-Lookup-Semantik=20+=20Invarian?= =?UTF-8?q?te=20+=20Konflikt-Verfahren,=20Sandbox=20T5-T7=20+=20T1/T4-Asss?= =?UTF-8?q?ertionen=20(7/7=20PASS),=20Stale-Beleg=20(b)=20korrigiert,=20St?= =?UTF-8?q?atuskette=20in-progress=20=E2=86=92=20done,=20P-2-Typos,=20Stor?= =?UTF-8?q?y=20done?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- .../implementation-artifacts/deferred-work.md | 28 ++- .../sandbox-3-2/run-sandbox.sh | 227 +++++++++++++++++- ...xtual-deterministisch-umsetzen-grep-rip.md | 41 +++- .../sprint-status.yaml | 2 +- schema/canonical-terms.md | 8 +- schema/compiler.md | 7 +- wiki/log.md | 3 +- 7 files changed, 294 insertions(+), 22 deletions(-) diff --git a/_bmad-output/implementation-artifacts/deferred-work.md b/_bmad-output/implementation-artifacts/deferred-work.md index 732ad1c..c36c3ae 100644 --- a/_bmad-output/implementation-artifacts/deferred-work.md +++ b/_bmad-output/implementation-artifacts/deferred-work.md @@ -65,7 +65,7 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein - source_spec: `_bmad-output/implementation-artifacts/spec-1-4-schema-validierung-für-bundle-implementieren.md` summary: Genau-eine-erlaubte-Linkform für den Punkt-11-Index-Check festlegen (mit vs. ohne `.md`-Endung) — Story 2.3. - evidence: Step-04-Review (Story 1.4, Loop 1): Der Validator-Punkt-11-Check akzeptiert beide Linkformen (relativer Bundle-Pfad mit oder ohne `.md`-Endung), weil die genau-eine-Form-Regel (A0-9/AD-7b) erst Story 2.3 definiert. Der Determinsmus-Anspruch des Validators bleibt gewahrt (beide Formen zählen als verlinkt); eine Endungs-Festlegung würde die abschließende §7-Liste erweitern und gehört in Story 2.3. + evidence: Step-04-Review (Story 1.4, Loop 1): Der Validator-Punkt-11-Check akzeptiert beide Linkformen (relativer Bundle-Pfad mit oder ohne `.md`-Endung), weil die genau-eine-Form-Regel (A0-9/AD-7b) erst Story 2.3 definiert. Der Determinismus-Anspruch des Validators bleibt gewahrt (beide Formen zählen als verlinkt); eine Endungs-Festlegung würde die abschließende §7-Liste erweitern und gehört in Story 2.3. status: umgesetzt (2026-08-17, Story 2.3) — Linkform in `schema/compiler.md` §5.6 gepinnt (bundle-relativ **mit** `.md`-Endung; Rationale: Null-Migration der 3 Concept-Links in `wiki/index.md`, explizite Datei-Ziele, Standard-Markdown-Tools — AD-7b/A0-9/FR-10/AD-8) inkl. vier re-executierbarer Selbsttest-Formeln (AD-17h). Der Validator bleibt strukturell unverändert (Punkt 11 akzeptiert beide Schreibweisen — Story-2.2-Präzedenz, D-3); die konsistente Nachführung der „Story 2.3"-Notizen in `schema/validator.md` (Punkt 11, §8) bleibt Rev-9-Kandidat (Eintrag unten). - source_spec: `_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md` @@ -81,7 +81,7 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein evidence: Retrospective F-04. - source_spec: `_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md` (F-06) - summary: `today`-Zeitzone für die `stale_after`-WARN (Validator §6.4) deterministisch festlegen — „heute in UTC abgeleitet" ist nicht hart definiert (Kalenderdatum des UTC-Zeitpunkts vs. lokaler Tag). Determinsmus-Anspruch (AD-17h) vor Epic-3 (Lifecycle-Konsequenz) sauber machen. + summary: `today`-Zeitzone für die `stale_after`-WARN (Validator §6.4) deterministisch festlegen — „heute in UTC abgeleitet" ist nicht hart definiert (Kalenderdatum des UTC-Zeitpunkts vs. lokaler Tag). Determinismus-Anspruch (AD-17h) vor Epic-3 (Lifecycle-Konsequenz) sauber machen. evidence: Retrospective F-06. - source_spec: `_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md` (F-07) @@ -339,6 +339,28 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein - source_spec: `schema/compiler.md` §3.2-Pkt.-1b (Story 3.2) summary: **Em-Dash-»—«-Varianten-Lücke der Normalisierung** — die Kollaps-Klasse `[-–_ ]` (En-Dash »–«, Bindestrich »-«, Unterstrich »_«, Leerzeichen) deckt den Em-Dash »—« **nicht** ab. Eine Schreibvariante mit Em-Dash (z. B. »wissen — relevanz«, aus dem Kontext einer externen Quelle eingelesen) fällt nicht unter den Kollaps und wird nicht zu einer identischen canonischen Form normalisiert — eine erkannte Synonym-/Determinismus-Lücke der Relevanzbestimmung (A0-18/A0-19). Wird nicht stillschweigend in §3.2 ergänzt, sondern als offene Determinismus-Frage an **Story 3.8** (Determinismus-Vertrag, AD-17h) übergeben; bis dahin wird ein nicht auflösbarer Em-Dash-Term **wie notiert** verwendet (Kollaps-normalisiert, kein stiller Ausschluss). - evidence: Story-3.2-Review-Umsetzung (2026-08-19) — §3.2-Pkt.-1b dokumentiert die Lücke explizit als »Konventionelle Determinismus-Lücke (aufgezeichnet, nicht still hinzugefügt)« und beruft sich auf diesen deferred-work-Eintrag als Handoff-Ziel. + evidence: Story-3.2-Review-Umsetzung (2026-08-19) — §3.2-Pkt.-1b dokumentiert die Lücke explizit als »Bekannte Determinismus-Lücke (aufgezeichnet, nicht still hinzugefügt)« und beruft sich auf diesen deferred-work-Eintrag als Handoff-Ziel. status: offen (Home: Story 3.8) +## Deferred from: code review of spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip (2026-08-19) + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md` + summary: **`§3.2`-Pkt.-2a: Wortgrenzen-/Frontmatter-Scope der Stufe-a-Match-Semantik ist offen** — die Grep/rg-Erhebung matcht ohne Wortgrenze (Substring: `alpha` trifft `alphabet`) und dateiweit inkl. YAML-Frontmatter (`sources[].resource`, `generated.by` — Provenanz-/Tool-Strings können nicht-thematische Concepts als Kandidaten markieren). Keine deterministischen Lücke im Ist-Sinn (das Verhalten ist reproduzierbar), aber die Match-Semantik ist nicht fixiert; zwei Producer-Readings sind möglich. Home: nächste Compiler-Instruktions-Revision, die §3.2 ohnehin berührt (oder Story 3.8, Determinismus-Vertrag-Abgleich). + evidence: bmad-code-review Story 3.2 (2026-08-19, Loop 3, Edge-Case-Hunter + Verification-Gap-Layer): `schema/compiler.md:55` (Stufe-a-Form ohne `\b`/Frontmatter-Klausel) vs. §3.2-Intro („Concept-Bodies"). + status: offen + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md` + summary: **`§3.2`-Pkt.-1b-ii: Kollaps-Reichweite bei aufeinanderfolgenden/führenden/trailenden Separatoren unbestimmt** — „jedes Vorkommen wird in einen einzelnen Bindestrich kollabiert" ist für Läufe (`a--b`), führende (`-x`) und trailende (`x-`) Separatoren nicht eindeutig (Kollaps auf genau ein `-` + Trim? oder 1:1-Ersatz?). Bis dahin ist die Normalisierung für solche Terme nicht vollständig pinbar (AD-17h-Nähe). Home: nächste Compiler-Instruktions-Revision (mit- oder in Story 3.8 zusammen mit der Em-Dash-Lücke, s. obiger Eintrag). + evidence: bmad-code-review Story 3.2 (2026-08-19, Loop 3, Edge-Case-Hunter-Layer): `schema/compiler.md:51` (Pkt. 1b-ii). + status: offen + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md` + summary: **Stufe-a-Treffer auf `index.md`-Pfade deterministisch aus der finalen Candidate-Liste entfernen** — Pkt. 2b definiert `index.md`-Treffer als Stufe-**b**-Trigger (gewurzelte Concept-Pfade sind die Stufe-b-Treffer), aber Pkt. 3b ordnet „Stufe-a-Treffer zuerst" ohne Fixierung, dass reine `index.md`-Stufe-a-Treffer *nicht* als Candidate (nicht-Concept-Pfad) in die finale Liste einfließen (Sandbox-T2-Ausgabe `index`+`alpha` illustriert den ungeklärten Fall; die Candidate-Liste ist per Definition auf Concept-Pfade beschränkt). Home: nächste Compiler-Instruktions-Revision, die §3.2 berührt. + evidence: bmad-code-review Story 3.2 (2026-08-19, Loop 3, Blind-Hunter + Edge-Case-Hunter-Layer): `schema/compiler.md:55-56,60`; `_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh` T2-Kommentar. + status: offen + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md` + summary: **Rev-2.5/2.6-Beleg-Klarigungen ohne Semantik-Auswirkung (Bündel)** — (a) Rev-2.5-Log-Zelle zitiert die `rg --exclude`-Form im aktiven Mechanismus-Teil ohne eigene Inline-Korrektur (Rev-2.6-Zelle erklärt sie nur — ein Producer, der nur Rev 2.5 liest, kopiert ein nicht-existentes Flag); (b) `sprint-status.yaml last_updated: 08-19-2026 07:10` liegt vor dem Story-3.2-Commit (09:16) — Zeitstempel dokumentiert nicht den Abschluss-Zeitpunkt (Story-3.1-Präzedenz: `last_updated` wird im Review-Loop-2-Commit ebenfalls nicht fortgeschrieben); (c) `compiler.md`-Revisionslog: Rev 2.6 steht über Rev 2.5 (chronologisch umgekehrt — Rev-2.6 wurde an der Einfüge-Stelle statt nach 2.5 angehängt); (d) Validator-Beleg „alle 7 `wiki/`-Dateien SUCCESS" als Aggregat ohne per-Datei-Liste (Spec-Verification Pkt. 4 verlangt „per-Datei-Verdikt als Ausführungs-Nachweis"; die Zählung 7 ist korrekt: 5 Root- + 2 Area-Concepts + log — re-executiert); (e) Rev-2.6-`git status`-Beleg listet `schema/canonical-terms.md` (neue Datei) und die `_bmad-output/`-Änderungen nicht, obwohl „`git status`" als Prüfgrundlage genannt wird; (f) Formel-4-Beleg: Ist-Zählung `38` ohne Baseline-`≡`-Partner (re-executiert: Ist = 38, korrekt — nur der Beleg-String ist unvollständig gegenüber der §5.6-Formel-4-Semantik „Ist ≡ Extraktion aus dem Baseline-Commit"). Home: nächste Log-/Nachweis-Runde (Story-3.3-Implementierungseintrag oder Story-3.2-Re-Review), keine Instruktions-Änderung nötig. + evidence: bmad-code-review Story 3.2 (2026-08-19, Loop 3, Blind-Hunter + Verification-Gap + Acceptance-Auditor-Layer): `wiki/log.md:4-5`, `schema/compiler.md:372-373`, `_bmad-output/implementation-artifacts/sprint-status.yaml:32`; re-executierte Formel-4-Zählung (38) und `ls wiki/` (7 `.md`-Dateien) bestätigen Korrektheit der Werte. + status: offen + diff --git a/_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh b/_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh index d33e2a6..8eb9310 100644 --- a/_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh +++ b/_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh @@ -1,9 +1,11 @@ #!/usr/bin/env bash # Story 3.2 — Sandbox-Tests der textuell-deterministischen Relevanzbestimmung (§3.2) # Re-executierbar: bash run-sandbox.sh (ab Workspace-Root; Sandbox unter /tmp/sb32) -# Zweck: Membership-Pin + Zwei-Run-Identität + NO_MATCH (leere Candidate-Liste) -# + log.md-Kontaminations-Pin (der Term liegt AUCH in log.md — die Candidate-Liste -# bleibt trotzdem auf Concept-Pfade definiert, §3.2-Pkt.-2a). +# Zweck: Membership-Pin (T1) + Zwei-Run-Identität (T2) + NO_MATCH (T3) + +# log.md-Kontaminations-Pin (T1: der Term liegt AUCH in log.md — die +# Candidate-Liste bleibt trotzdem auf Concept-Pfade definiert, §3.2-Pkt.-2a) +# + LINK_FOLLOWING_ZYKLUS (T5) + TRAVERSAL_REACH_ONLY (T6) + +# TERM_ABLEITUNG_SYNONYM (T7); T1/T4 mit harten Assertions (Review-Patch P-1). set -u ROOT=$(mktemp -d /tmp/sb32-XXXXXX) SB="$ROOT/sb" @@ -74,6 +76,74 @@ terms() { # $1=Term; nutzt rg wenn vorhanden (native -g-Exklusion), sonst grep - # Normalisierung der Ausgabe: wiki/-Präfix + .md-Suffix strippen (§3.2-Pkt.-3a) normalize() { sed -e 's|^wiki/||' -e 's|\.md$||'; } +# ---------- Helfer: Stufe b/c (Erhebung) + Terminormalisierung (Review-Loop-2, D-2) ---------- +# Stufe b — index.md-Traversal (TRAVERSAL_REACH_ONLY, §3.2-Pkt.-2b): +# $1 = normalisierter Treffer-Name einer index.md (z. B. 'trafo/index' oder 'index'); +# gibt die darunter gewurzelten Concept-Pfade (normalisiert) aus — die Concept-Links +# der getroffenen index.md, file-relativ aufgelöst (§5.7-Pkt.-4). +traverse() { + local idx="wiki/$1.md" d tgt + d=$(dirname "$idx") + grep -oE '\]\([^)]+\.md\)' "$SB/$idx" 2>/dev/null | sed -e 's|^\](||' -e 's|)$||' | while read -r tgt; do + case "$tgt" in ./*) tgt=${tgt#./} ;; esac + printf '%s/%s\n' "$d" "$tgt" | sed -e 's|^wiki/||' -e 's|\.md$||' + done +} + +# Stufe c — Link-Following mit besuchter Menge (LINK_FOLLOWING_ZYKLUS, §3.2-Pkt.-2c): +# $@ = in Stufe a getroffene Concept-Pfade (normalisiert, z. B. 'sigma'); +# Concept-Links werden file-relativ verfolgt (§5.7-Pkt.-4); ein bereits besuchter +# Concept-Pfad wird nicht erneut besucht — Zyklen (A -> B -> A) enden, die +# Candidate-Liste bleibt endlich. Ausgabe: getroffene + erreichte Pfade, +# in Besuchsreihenfolge (Stufe a zuerst, dann Stufe c; §3.2-Pkt.-3b). +follow() { + local visited="$ROOT/visited.$$" seed f base tgt res + : > "$visited" + local queue=() + for seed in "$@"; do + printf '%s\n' "$seed" >> "$visited" + queue+=("$seed") + done + while [ "${#queue[@]}" -gt 0 ]; do + f="wiki/${queue[0]}.md" + queue=("${queue[@]:1}") + base=$(dirname "$f") + for tgt in $(grep -oE '\]\([^)]+\.md\)' "$SB/$f" 2>/dev/null | sed -e 's|^\](||' -e 's|)$||'); do + case "$tgt" in ./*) tgt=${tgt#./} ;; esac + res=$(printf '%s/%s\n' "$base" "$tgt" | sed -e 's|^wiki/||' -e 's|\.md$||') + grep -qx "$res" "$visited" && continue + printf '%s\n' "$res" >> "$visited" + queue+=("$res") + done + done + cat "$visited" +} + +# Terminormalisierung (§3.2-Pkt.-1b): (i) lowercasing; (ii) Binde-Varianten-Kollaps +# [-–_ ] -> - (jedes Vorkommen wird in einen einzelnen Bindestrich kollabiert). +# Normalisierte Form = die Form, die in der Registry gespeichert/verglichen wird. +norm_term() { printf '%s' "$1" | LC_ALL=C tr 'A-Z' 'a-z' | sed -e 's/[-–_ ]/-/g'; } + +# Registry-Lookup (§3.2-Pkt.-1b, canonical-terms.md-Format): +# $1 = normalisierter Term, $2 = Registry-Datei; gibt die canonische Form aus, +# oder — nicht auflösbar — den Term selbst (§3.2-Pkt.-1b: kein stiller Ausschluss). +lookup() { + awk -F'|' -v t="$1" ' + NR > 2 { + canon = $2; gsub(/^[ \t]+|[ \t]+$/, "", canon) + if (canon ~ /^—/) next + if (canon == t) { print canon; found = 1; exit } + vars = $3; gsub(/`/, " ", vars) + n = split(vars, a, ",") + for (i = 1; i <= n; i++) { + gsub(/^[ \t]+|[ \t]+$/, "", a[i]) + if (a[i] != "" && a[i] == t) { print canon; found = 1; exit } + } + } + END { if (!found) print t } + ' "$2" +} + # ===================================================================== runlabel() { echo; echo "########## $1 ##########"; } @@ -81,6 +151,13 @@ runlabel "T1: Membership-Pin — Term trifft Concept-Body UND log.md; Candidate- echo "--- Kandidaten-Erhebung: terms 'deterministische-relevanz-bestimmung' (Exklusions-Form) ---" terms 'deterministische-relevanz-bestimmung' | normalize echo "--- Erwartet: AUSSCHLIESSLICH 'alpha' (Concept-Pfad, ohne wiki/ + ohne .md) ---" +T1_OUT=$(terms 'deterministische-relevanz-bestimmung' | normalize) +if [ "$T1_OUT" = "alpha" ]; then + echo "RESULT: PASS (Candidate-Liste = [alpha]; log.md strukturell exkludiert, §3.2-Pkt.-2a)" +else + echo "FAIL: T1 — erwartet 'alpha', erhalten: '${T1_OUT}'" >&2 + exit 1 +fi echo "--- Kontaminations-Kontrolle: was OHNE Exklusion getroffen würde (rg-OHNE -g / grep-OHNE --exclude) ---" if command -v rg >/dev/null 2>&1; then rg -l 'deterministische-relevanz-bestimmung' wiki/ | normalize @@ -97,7 +174,7 @@ FIRST2=$(terms 'alpha' | normalize) SECOND2=$(terms 'alpha' | normalize) echo "Lauf 1 (Term deterministische-relevanz-bestimmung): $FIRST1" echo "Lauf 2 (Term deterministische-relevanz-bestimmung): $SECOND1" -echo "Lauf 1 (Term alpha): $FIRST2 # 'index' ist der legitime Stufe-b-Traversal-Treffer (Bundleroot verlinkt alpha.md), kein Kontaminations-Fehler" +echo "Lauf 1 (Term alpha): $FIRST2 # 'index' ist ein Stufe-a-Treffer auf wiki/index.md — Stufe b (TRAVERSAL_REACH_ONLY, §3.2-Pkt.-2b) löst die darunter gewurzelten Concept-Pfade als Candidate aus (index.md selbst ist KEIN Concept-Kandidat); kein Kontaminations-Fehler" echo "Lauf 2 (Term alpha): $SECOND2 # identische Ausgabe (Zwei-Run-Identität, AD-17h)" if [ "$FIRST1" = "$SECOND1" ] && [ "$FIRST2" = "$SECOND2" ]; then echo "RESULT: IDENTISCH (gleicher Git-State + gleiches Eingabeset -> identische Candidate-Liste, AD-17h)" @@ -133,10 +210,144 @@ generated: Gamma teilt den Term deterministische-relevanz-bestimmung (Stelle S-1). EOF git add -A; git commit -qm "Zuwachs gamma (teilt den Term)" -echo "--- Kandidaten-Erhebung (Term in alpha + gamma): ---" -terms 'deterministische-relevanz-bestimmung' | normalize | LC_ALL=C sort -echo "--- Erwartet: alpha, gamma (beide Concept-Pfade, lexikografisch; log ABGESCHNITTEN) ---" +echo "--- Kandidaten-Erhebung (Term in alpha + gamma; §3.2-Pkt.-3b: innerhalb jeder Stufe rein lexikografisch, LC_ALL=C): ---" +terms 'deterministische-relevanz-bestimmung' | normalize | LC_ALL=C sort | paste -sd, - +echo "--- Erwartet: alpha,gamma (beide Concept-Pfade, lexikografisch; log ABGESCHNITTEN) ---" +T4_OUT=$(terms 'deterministische-relevanz-bestimmung' | normalize | LC_ALL=C sort | paste -sd, -) +if [ "$T4_OUT" = "alpha,gamma" ]; then + echo "RESULT: PASS (Vereinigung beider Concept-Pfade, lexikografisch; log.md exkludiert)" +else + echo "FAIL: T4 — erwartet 'alpha,gamma', erhalten: '${T4_OUT}'" >&2 + exit 1 +fi + +# ===================================================================== +# T5-T7 (Review-Loop-2, D-2): Zyklen-Endlichkeit, Traversal-Only, Synonym-Auflösung +# ===================================================================== + +# ---------- T5: LINK_FOLLOWING_ZYKLUS — A -> B -> A endet endlich (besuchte Menge) ---------- +runlabel "T5: LINK_FOLLOWING_ZYKLUS — Zyklus alpha <-> omega endet endlich; Candidate-Liste endlich (§3.2-Pkt.-2c/3b)" +cat > wiki/omega.md <<'EOF' +--- +type: concept +sources: + - resource: raw/omega-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Omega verweist zirkular auf Alpha: [Alpha](alpha.md). +EOF +# Backlink: alpha -> omega (erzeugt den echten A->B->A-Zyklus, der die besuchte Menge übt): +printf '\nOmega-Verweis: [Omega](omega.md).\n' >> wiki/alpha.md +git add -A; git commit -qm "Zuwachs omega (Link-Zyklus alpha <-> omega)" +echo "--- Stufe a (Term zirkular): ---" +STAGE_A=$(terms 'zirkular' | normalize | LC_ALL=C sort | paste -sd, -) +echo "$STAGE_A" +echo "--- Stufe c (Follow aus Stufe a; ZYKLUS omega -> alpha -> omega ... MUSS enden): ---" +STAGE_C=$(follow omega) +echo "$STAGE_C" +# Deduplication über die besuchte Menge (sort -u: endliche, doppelungsfreie Menge — +# die Stufe-Ordnung a→c ist bereits in STAGE_A/STAGE_C sichtbar; hier wird die Endlichkeit geprüft): +T5_EXPECT="alpha,omega" +T5_LIST=$(printf '%s\n%s\n' "$STAGE_A" "$STAGE_C" | grep -v '^$' | LC_ALL=C sort -u | paste -sd, -) +if [ "$T5_LIST" = "$T5_EXPECT" ]; then + echo "RESULT: PASS (endlich, dedupliziert: omega, alpha — Zyklus endete; jeder Pfad genau einmal)" +else + echo "FAIL: T5 — erwartet '$T5_EXPECT', erhalten: '$T5_LIST'" >&2 + exit 1 +fi + +# ---------- T6: TRAVERSAL_REACH_ONLY — Term nur in index.md -> gewurzelte Concept-Pfade ---------- +runlabel "T6: TRAVERSAL_REACH_ONLY — Term 'trafo-gebiet' trifft NUR wiki/trafo/index.md -> gewurzelte Concept-Pfade sind die Treffer (index.md selbst kein Concept-Kandidat, §3.2-Pkt.-2b)" +mkdir -p wiki/trafo +cat > wiki/trafo/index.md <<'EOF' +# Trafo-Gebiet-Index +Dieses trafo-gebiet wird hier indexiert. +- [Delta](delta.md) +- [Epsilon](epsilon.md) +EOF +cat > wiki/trafo/delta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/delta-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Delta-Body (trägt den Index-Term NICHT — nur der Index trägt ihn). +EOF +cat > wiki/trafo/epsilon.md <<'EOF' +--- +type: concept +sources: + - resource: raw/epsilon-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Epsilon-Body (trägt den Index-Term NICHT — nur der Index trägt ihn). +EOF +git add -A; git commit -qm "Zuwachs trafo/Area (Index trägt den Term, Bodies nicht)" +echo "--- Stufe a (Term trafo-gebiet; nur index.md trifft — der Traversal-Trigger): ---" +STAGE_A=$(terms 'trafo-gebiet' | normalize) +echo "$STAGE_A" +echo "--- Stufe b (Traversal: gewurzelte Concept-Pfade der getroffenen index.md): ---" +STAGE_B=$(traverse 'trafo/index') +echo "$STAGE_B" +# Kandidaten = gewurzelte Concept-Pfade (lexikografisch; index.md selbst ist KEIN Concept-Kandidat): +T6_OUT=$(printf '%s\n' "$STAGE_B" | grep -v '^$' | LC_ALL=C sort | paste -sd, -) +if [ "$T6_OUT" = "trafo/delta,trafo/epsilon" ]; then + echo "RESULT: PASS (Candidate-Liste = gewurzelte Concept-Pfade; Index-Body-Trigger, kein Kontaminations-Fehler)" +else + echo "FAIL: T6 — erwartet 'trafo/delta,trafo/epsilon', erhalten: '$T6_OUT'" >&2 + exit 1 +fi + +# ---------- T7: TERM_ABLEITUNG_SYNONYM — Schreibvariante -> canonische Form -> Kandidaten ---------- +runlabel "T7: TERM_ABLEITUNG_SYNONYM — gezogene Schreibvariante wird über canonical-terms.md auf die canonische Form aufgelöst (Lookup auf normalisierter Form, §3.2-Pkt.-1b)" +mkdir -p "$ROOT/registry" +cat > "$ROOT/registry/canonical-terms.md" <<'EOF' +# Sandbox-Registry (Test-Doppel des canonical-terms-Formats; append-only, ein Eintrag = Canon + Varianten; +# D-5-Invariante: Canon- UND Varianten-Spalte tragen ausschliesslich NORMALISIERTE Formen) + +| canonische Form | erlaubte Schreibvarianten | Semantik | +|---|---|---| +| quanten-protocol | `quantenprotocol` | Sandbox-Semantik: Test-Synonymgruppe | +EOF +# Invariante-Check (D-5): keine normalisierte Form in beiden Spalten oder in zwei Einträgen: +# hier: 'quanten-protocol' nur Canon-Spalte, 'quantenprotocol' nur Varianten-Spalte — eindeutig. +# (Registry liegt ausserhalb des Sandbox-Git-Roots — sie modelliert den Git-State-Anteil des Resolvers; +# der Sandbox-Repo-Commit trägt sie deshalb nicht, hier nur Notiz statt Commit-Noise:) +echo "Registry (ausserhalb des Sandbox-Roots, modelliert den Resolver-Git-State): $ROOT/registry/canonical-terms.md" +echo "--- Gezogene Schreibvarianten (Roh-Notat): 'Quanten Protocol' + 'QuantenProtocol' ---" +RAW_A='Quanten Protocol' +RAW_B='QuantenProtocol' +NORM_A=$(norm_term "$RAW_A") +NORM_B=$(norm_term "$RAW_B") +echo "Normalisierung (§3.2-Pkt.-1b): '$RAW_A' -> '$NORM_A'; '$RAW_B' -> '$NORM_B'" +CANON_A=$(lookup "$NORM_A" "$ROOT/registry/canonical-terms.md") +CANON_B=$(lookup "$NORM_B" "$ROOT/registry/canonical-terms.md") +echo "Lookup: '$NORM_A' -> '$CANON_A'; '$NORM_B' -> '$CANON_B'" +if [ "$CANON_A" = "quanten-protocol" ] && [ "$CANON_B" = "quanten-protocol" ]; then + echo "RESULT: PASS (beide Varianten -> canonische Form 'quanten-protocol'; Auflösung auf normalisierter Form)" +else + echo "FAIL: T7 — erwartet 'quanten-protocol' für beide, erhalten: '$CANON_A' / '$CANON_B'" >&2 + exit 1 +fi +# Nicht aufgelöster Term wird wie notiert (Kollaps-normalisiert) verwendet — kein stiller Ausschluss: +CANON_MISS=$(lookup 'nicht-in-registry' "$ROOT/registry/canonical-terms.md") +if [ "$CANON_MISS" = 'nicht-in-registry' ]; then + echo "PASS (Negativ-Fall: 'nicht-in-registry' -> wie notiert, kein stiller Ausschluss)" +else + echo "FAIL: T7-Negativ — erwartet 'nicht-in-registry', erhalten: '$CANON_MISS'" >&2 + exit 1 +fi echo -echo "===== Sandbox abgeschlossen (alle 4 Tests) =====" +echo "===== Sandbox abgeschlossen (alle 7 Tests) =====" echo "Sandbox-Root: $ROOT" diff --git a/_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md b/_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md index 0de253e..a46a4d5 100644 --- a/_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md +++ b/_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md @@ -2,8 +2,8 @@ title: 'Relevanzbestimmung textual-deterministisch umsetzen (grep/ripgrep + Markdown-Traversal + Link-Following) (Story 3.2)' type: 'feature' created: '2026-08-19' -status: 'in-review' -review_loop_iteration: 2 +status: 'done' +review_loop_iteration: 3 baseline_commit: e3e7ec346df3e6190644d2c94e5cc7c42e6ed239 context: - _bmad-output/implementation-artifacts/epic-3-context.md @@ -71,13 +71,44 @@ context: - Given ein Ergebnis der Relevanzbestimmung, when es weiterverarbeitet wird, then ist es als nachvollziehbare Candidate-Liste (relative OKF Concept-Pfade ohne `.md`) verfügbar (AC-3). - Given die Instruktion, when geprüft, then bleibt `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3), keine neue §7-Klasse, kein Standalone (D-3) — Validator läuft auf dem Ist-Bundle SUCCESS. +### Review Findings + +bmad-code-review Loop 3 (2026-08-19, 4 Layer: blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor; Diff `e3e7ec3 → 3aa484b`, branch `story-3-2`). Triage: 5 `decision-needed`, 2 `patch`, 4 `defer` (→ `deferred-work.md`), 39 dismissed als Noise (u. a. doppelte Layer-Quellen pro Finding; `last_updated`-Zeitstempel = Story-3.1-Loop-2-Präzedenz; `deferred-work.md`-Bestands-Eintrag-in-Platz-Edit = vom frozen-Task-3-Defer-Handoff selbst befohlen; Em-Dash-Lücke bereits korrekt defer an Story 3.8; `sprint-status`-Key-Kürzung = Projekt-Schema; Sandbox-/tmp-Reste + `git add -A;`-Semikolon = Story-3.1-Sandbox-Muster-Präzedenz; `F17`-Home-„mit Story 3.2" = vorbestehend (Story-3.1-Review); `rg`-Verfügbarkeit im Audit-Environment = Audit-Beschränkung, keine Story-Lücke; `§5.6-Scan-Scope-Konvention`-Anker ist real (`compiler.md:157`); Formel-4-Ist-Zählung `38` re-executiert = `38`; „Validator 7 wiki/-Dateien" = korrekt, `ls wiki/` liefert 6 Einträge = 7 `.md`-Dateien (Area-Verz. zählt nicht); `canonical-terms.md`-Zwei-`[]`-Lesarten sind durch die Eröffnungs-Zeile + den Hinweis explizit aufgelöst; `A0-19`-Ergänzung in §8 = spec Change Log B5 als KEEP verankert). + +- [x] [Review][Decision] Status-Flip `backlog → done` gegen gefrorene Always-Klausel (`→ in-progress`) — keine dokumentierte Renegotiation [sprint-status.yaml:55] — **Option 1 umgesetzt:** `done` bestätigt; Statuskette `in-progress → done` als eigener dokumentierter Schritt in `wiki/log.md` (neue oberste Bullet, Loop-3/Rev-2.7-Zeile) + - Befund: Der gefrorene `Boundaries & Constraints`-Abschnitt (Always) verlangt `sprint-status.yaml`-Key → **`in-progress`**; der Commit setzt direkt **`done`**. Die nicht-gefrorene Spec-Tail (`Manual checks`) sagt zwar „`backlog → in-progress → done`", aber (a) der Zwischenschritt `in-progress` ist in keinem `wiki/log.md`-Eintrag als eigener dokumentierter Statuswechsel belegt (Rev-2.5-Log zitiert `backlog → in-progress`, Rev-2.6 zitiert keinen `done`-Flip), (b) der Review-Workflow-Skript-Sync (bmad-build `sprint status` + Story 3.1-Präzedenz: Review-Abschluss setzt `done` im selben Loop) legt nahe, dass `done` der intendierte Endzustand ist. Entweder wurde die Always-Klausel stillschweigend superseded (nicht dokumentiert) oder der Key ist falsch. + - Optionen: **1 (empfohlen)** — `done` bestätigt (Sprint-Sync-Konvention: Review-Loop-Abschluss setzt `done`); in den Rev-2.6-Log-Zeile den Statusflip `in-progress → done` als dokumentierten Schritt ergänzen (Lückenschluss der Statuskette, keine Status-Änderung). **2** — Key auf `in-progress` zurücknehmen; Story bleibt `in-progress` bis ein späterer Run den `done`-Flip belegt. +- [x] [Review][Decision] Sandbox deckt I/O-Matrix-Szenarien `LINK_FOLLOWING_ZYKLUS`, `TRAVERSAL_REACH_ONLY`, `TERM_ABLEITUNG_SYNONYM` nicht ab — Task-4-Checkbox `[x]` überdeklariert [run-sandbox.sh:1-142] — **Option 1 umgesetzt:** T5/T6/T7 ergänzt, T2-Kommentar korrigiert, re-executiert (alle 7 Tests PASS, exit 0); Beleg in `wiki/log.md` (Loop-3-Zeile) + - Befund: `run-sandbox.sh` implementiert T1 (Membership), T2 (Zwei-Run-Identität), T3 (NO_MATCH), T4 (Vereinigung). `LINK_FOLLOWING_ZYKLUS` hat **keinen** Test (der Sandbox-Baum enthält keine Concept-Links — die besuchte Menge wird nie geübt); `TRAVERSAL_REACH_ONLY` ist nur Nebenprodukt von T2 (Term `alpha` trifft `index.md`; als Kommentar, nicht als gepinntes Szenario — und die gepinnte Ausgabe `index`+`alpha` widerspricht der §3.2-3b-Ordnungs-Semantik, weil Stufe-b-Treffer *nach* Stufe-a-Treffern positioniert sind und `index` kein Concept-Pfad ist); `TERM_ABLEITUNG_SYNONYM` ist ungetestet (leere Registry → der Fallback „wie notiert" ist der Standardfall, aber die Kanonisierung selbst wird nie geübt). Die Execution-Task-4-Checkbox `[x]` und Spec-Verification Pkt. 3 deklariert die volle I/O-Matrix-Abdeckung. + - Optionen: **1 (empfohlen)** — Sandbox um T5 (LINK_FOLLOWING_ZYKLUS: A→B→A-Links, erwartete endliche, doppelungsfreie Liste), T6 (TRAVERSAL_REACH_ONLY: Term nur in `index.md`, erwartete gewurzelte Concept-Pfade) und T7 (TERM_ABLEITUNG_SYNONYM: Registry-Eintrag mit Variante → Auflösung auf canonische Form) erweitern; T2-Kommentar zu `index` korrigieren; dann re-executieren und den Beleg nachführen. **2** — nur die fehlenden Szenarien als `deferred-work.md`-Eintrag an die nächste Compiler-Instruktions-Revision (oder Story 3.8, die den Determinismus-Vertrag absichert) übergeben; Task-4-Checkbox-Notiz ehrlich nachführen. **3** — T6/T7 als Defer, T5 (besuchte Menge) als Patch jetzt (weil §3.2-2c die Endlichkeits-Garantie trägt). +- [x] [Review][Decision] `wiki/log.md`-Selbsttest-Beleg (b) beschreibt einen Sandbox-Baum, der nicht dem committierten `run-sandbox.sh` entspricht (Term `quanten-protocol`, `sub/beta.md`, SHA-256 `159092bb…`) — Stale-Verifikations-Falle (exakt B1 aus Loop 2) [wiki/log.md:5] — **Option 1 umgesetzt:** Beleg (b) gegen die echte Sandbox-Ausgabe neu belegt (neue Log-Zeile, append-only); Rev-2.5-Zeile bleibt historisch + - Befund: Der Rev-2.5-Log-Eintrag (b) behauptet: Term `quanten-protocol` auf `wiki/alpha.md`, `wiki/sub/beta.md`, `log.md`; Candidate-Liste `alpha`, `sub/beta`; Zwei-Run-Identität via SHA-256 `159092bb…`. Das committierte, re-executierbare `run-sandbox.sh` trägt durchgängig den Term `deterministische-relevanz-bestimmung`, **keinen** `sub/`-Baum (Beta ist root-level `beta.md`) und **keine** SHA-256-Berechnung. Der „re-executierte" Nachweis ist damit nicht aus dem verankerten Artefakt reproduzierbar — dieselbe Stale-Evidenz-Falle, die Story 3.2 (Loop-2-B1) gerade schließen sollte. + - Optionen: **1 (empfohlen)** — Log-Beleg (b) gegen die echte `run-sandbox.sh`-Ausgabe re-executiert neu belegen (Term/Pfade/Ergebnisse an den Script-Ist-Baum angleichen); historischer Rev-2.5-Zeile eine Korrektur-Fußnote als neue Log-Zeile anhängen (append-only-Vertrag §5 erlaubt neue Zeilen, nicht Edit — die Rev-2.5-Zelle bleibt historisch, die neue Zeile korrigiert). **2** — die Sandbox auf den log.md-belegten Baum (Term `quanten-protocol`, `sub/`-Area) ändern und neu ausführen (weicht vom bereits in Rev-2.6 referenzierten Script ab). +- [x] [Review][Decision] `§3.2`-Pkt.-3b-Ordnung: „Reihenfolge des ziehenden Terms" ist undefiniert für Mehrfach-Terme — AD-17h-Zwei-Run-Identität hängt an einer nicht fixierten Term-Ordnung [schema/compiler.md:60] — **Option 1 umgesetzt:** Pkt. 3b auf reine Lexikografie (LC_ALL=C) gehoben; Term-Auftritt nur für Verarbeitungsreihenfolge (Rev-2.7) + - Befund: Pkt. 3b ordnet Stufe-a-Treffer „in der Reihenfolge des ziehenden Terms, dann lexikografisch als deterministischer Tie-Break bei identischem Ort", während Pkt. 1c mehrere Terme je Einheit erlaubt. Die Reihenfolge der **Terme selbst** (Auftreten in der Evidenz? lexikografisch? §2-Interpretations-Reihenfolge?) ist nirgends festgelegt — zwei rechtmäßige Term-Ordnungen erzeugen zwei rechtmäßige, aber unterschiedliche Listen. Zusätzlich ist die Formulierung intern doppelt definiert („Reihenfolge des ziehenden Terms" vs. „innerhalb jeder Stufe lexikografisch aufsteigend"). + - Optionen: **1 (empfohlen)** — Pkt. 3b auf eine eindeutige Regel heben: Stufe-a-Treffer **rein lexikografisch (LC_ALL=C)**, Term-Auftritt dient nur der Verarbeitungs-/Interpretations-Reihenfolge, nicht der Listen-Ordnung (einfachste deterministische Form, kompatibel mit der „lexikografisch als Tie-Break"-Klausel). **2** — Term-Ordnung = lexikografisch über die gezogenen Terme, Stufe-a-Treffer in Term-Ordnung, dann lexikografisch (bewahrt die „Zuwachs-Sicht"-Semantik, ist etwas komplexer zu implementieren und zu beweisen). +- [x] [Review][Decision] `canonical-terms.md`-Registry-Lookup-Semantik ist unvollständig — Doppelbelegung von Varianten ist nicht deterministisch auflösbar, Lookup-Reihenfolge (vor/nach Kollaps, Groß/Klein) ist offen [schema/canonical-terms.md:25-35] — **Option 1 umgesetzt:** Lookup-Reihenfolge fixiert (normalisierte Form) + Eindeutigkeits-Invariante + Konflikt-Verfahren (Rev-2.7) + - Befund: (a) Zwei Einträge können dieselbe Schreibvariante mit unterschiedlichen canonischen Formen tragen — der Registry-Format-Abschnitt definiert keine Eindeutigkeits-Regel (kein „Variante in genau einem Eintrag", kein Konflikt-Verfahren; der „Append-only"-Regel-Abschnitt behandelt nur Umbenennungen). (b) Die Normalisierungs-Reihenfolge ist offen: lowercasing + `[-–_ ]`-Kollaps **vor** dem Registry-Lookup? Lookup auf der rohen Variante? Die Varianten-Spalte ist als „bündel-findend per `-`-Kollaps, lowercased" beschrieben, aber die verbindliche Lookup-Operation steht nicht da. Genau das ist der Kern des deterministischen Resolvers (AD-17h). + - Optionen: **1 (empfohlen)** — in `canonical-terms.md` Registry-Format ergänzen: (i) Lookup-Reihenfolge fixiert (lowercase → Kollaps → Lookup auf der normalisierten Form; die Varianten-Spalte trägt ebenfalls normalisierte Formen), (ii) Eindeutigkeits-Invariante „eine Variante in genau einem Eintrag" + Konflikt-Fall (Append nicht erlaubt; `deferred-work.md`-Handoff / Ask-First analog zur bestehenden Umbenennungs-Regel). **2** — nur (ii) ergänzen; (i) als `defer` an die nächste Registry-Befüllung (erstes Entry). +- [x] [Review][Patch] `run-sandbox.sh`: T1 (Membership-Pin) und T4 (Vereinigung) werden nur ausgegeben, nie als Pass/Fail geprüft — das gepinnte „exakte Candidate-Liste"-Verhalten (Task 4) wird nicht erzwungen [run-sandbox.sh:80-113, 136-141] — **umgesetzt:** T1/T4 tragen harte Asssertionen (`exit 1` bei Abweichung) + - Befund: T1 gibt die Candidate-Liste und „Erwartet: AUSSCHLIESSLICH 'alpha'" aus, vergleicht aber nie; T4 gibt `alpha, gamma` (gesortet) aus, prüft aber nicht gegen die Erwartung. Ein Regressions-Fall (z. B. `log` oder `index` rutscht in die Liste, oder `gamma` fehlt) beendet das Skript mit Exit 0 und „Sandbox abgeschlossen (alle 4 Tests)". T3 (NO_MATCH) und T2 (Zwei-Run-Identität) haben dagegen echte `if`-Checks mit `exit 1`. + - Fix: T1 `out=$(terms 'deterministische-relevanz-bestimmung' | normalize); [ "$out" = "alpha" ] || { echo "FAIL: …" >&2; exit 1; }`; T4 `out=$(terms '…' | normalize | LC_ALL=C sort | paste -sd, -); [ "$out" = "alpha,gamma" ] || { echo "FAIL: …" >&2; exit 1; }`. +- [x] [Review][Patch] Typos/Fehlzeichnungen im committeten normativen Text — `Determinsmus` (×4+ in `compiler.md`/`log.md`/`deferred-work.md`/Spec), `§3.2-beankert` (soll „§3.2-angeankert" sein), `Membrum` (soll „Mitglied" sein), `Konventionelle Determinismus-Lücke` (soll „Bekannte Determinismus-Lücke" sein — verweist auf `compiler.md:53`, wo es „Bekannte" heißt) [schema/compiler.md:351,373; wiki/log.md:5; deferred-work.md:342; spec:80,93,106] — **umgesetzt** (reiner Text-Patch; `raw/`-Source-Typo und der präexistierende `außschließlich`-Typo im 3.1-Log bleiben unberührt — out-of-scope) + - Befund: Keine AC-Auswirkung, aber der Text ist die committete Instruktion/der committete Nachweis. `Determinsmus` steht auch in der Source `raw/epics/` (3×), die Instruktion sollte den Begriff aber konsistent korrekt verwenden, wie es der Rest des Dokuments tut. `Resovierung` (spec:80,106) ist zusätzlich zu `Resolution`/`Auflösung` zu korrigieren. + - Fix: orthografische Korrektur in den genannten Zeilen (reiner Text-Patch, keine Semantik-Änderung). +- [x] [Review][Defer] `§3.2`-Pkt.-2a: Wortgrenzen-/Frontmatter-Scope der Stufe-a-Match-Semantik ist offen (Substring-Match ohne `\b`, Frontmatter-Treffer zählen mit) [schema/compiler.md:55] — deferred, pre-existing +- [x] [Review][Defer] `§3.2`-Pkt.-1b-ii: Kollaps bei aufeinanderfolgenden/führenden/trailenden Separatoren ist unbestimmt (`a--b`, `-x`) [schema/compiler.md:51] — deferred, pre-existing +- [x] [Review][Defer] Stufe-a-Treffer auf `index.md`-Pfade (z. B. T2 `index`) werden nicht deterministisch aus der finalen Candidate-Liste entfernt (Stufe-b-Re-Routing implizit, nicht fixiert) [schema/compiler.md:55-56] — deferred, pre-existing +- [x] [Review][Defer] Rev-2.5-/Rev-2.6-Log-Zeile und compiler.md-Revisionslog: Nachweis-Klärigungen ohne Semantik-Auswirkung — (a) Rev-2.5-Log-Zelle zitiert die (nun historisch korrigierte) `rg --exclude`-Form im aktiven Mechanismus-Teil, ohne eigene Inline-Korrektur (Rev-2.6-Zelle erklärt es nur), (b) `last_updated: 08-19-2026 07:10` liegt vor dem Commit-Zeitpunkt (09:16), (c) Rev-2.6 steht im Revisionslog **über** Rev-2.5 (chronologisch umgekehrt), (d) Validator-„7/7 SUCCESS" als Aggregat ohne per-Datei-Liste, (e) Rev-2.6-`git status`-Beleg listet `canonical-terms.md`/`_bmad-output/`-Änderungen nicht (nämte „`git status`" als Prüfgrundlage), (f) Formel-4-Ist-Zählung `38` ohne Baseline-`≡`-Partner (re-executiert: Ist = 38, korrekt; nur der Beleg-String ist unvollständig) [wiki/log.md:4-5; schema/compiler.md:372-373; sprint-status.yaml:32] — deferred, pre-existing + ## Spec Change Log +- **2026-08-19 (bmad-code-review Loop 3 — Review-Findings umgesetzt; 5 Decisions (alle Option 1) + 2 Patches + 4 Defers):** `schema/compiler.md` → **Revision 2.7**: (1) **D-4** — §3.2-Pkt.-3b-Ordnung auf **reine Lexikografie (LC_ALL=C)** gehoben; die Term-Verarbeitungsreihenfolge bestimmt nur die Interpretation/Erhebung, **nicht** die Listen-Ordnung (dieselbe Treffermenge → identische Liste, AD-17h/A0-19); (2) **D-5** — `schema/canonical-terms.md`: **Lookup-Verfahren** deterministisch fixiert (lowercasing → `[-–_ ]`→`-`-Kollaps → Lookup der **normalisierten** Form; Spalten tragen ausschließlich normalisierte Formen) + **Eindeutigkeits-Invariante** (jede normalisierte Form in genau einem Eintrag — Canon oder Variante, nie beides/zweimal) + **Konflikt-Verfahren** (keine stille Anhängung; `deferred-work.md`/Ask-First, analog zur Umbenennungs-Regel); (3) **D-1** — Statuskette `in-progress → done` als eigener dokumentierter Schritt in `wiki/log.md` (Sprint-Sync-Konvention; Story-3.1-Präzedenz); Key bleibt `done`; (4) **D-2 + P-1** — `run-sandbox.sh` um **T5** `LINK_FOLLOWING_ZYKLUS` (A↔B-Zyklus; besuchte Menge → endlich/doppelungsfrei), **T6** `TRAVERSAL_REACH_ONLY` (Term nur in Area-`index.md` → gewurzelte Concept-Pfade), **T7** `TERM_ABLEITUNG_SYNONYM` (Registry-Test-Doppel; beide Lookup-Pfade + Negativ-Fall) erweitert; T1/T4 mit harten Asssertionen; T2-Kommentar korrigiert; re-executiert: **alle 7 Tests PASS, exit 0**; (5) **D-3** — `wiki/log.md`-Selbsttest-Beleg (b) gegen die echte `run-sandbox.sh`-Ausgabe neu belegt (neue Log-Zeile, append-only; Rev-2.5-Zeile historisch unverändert); (6) **P-2** — Typos korrigiert (`Determinsmus`→`Determinismus`, `beankert`→`angeankert`, `Membrum`→`Mitglied`, `Konventionelle`→`Bekannte`, `Resovierung`→`Auflösung`; `raw/`-Source und der präexistierende 3.1-Log-Typo bleiben unberührt). **4 Defers** (Wortgrenzen-/Frontmatter-Scope; Separator-Kollaps-Reichweite; Stufe-a-`index.md`-Treffer aus finaler Liste; Rev-2.5/2.6-Beleg-Klärigungs-Bündel) in `deferred-work.md` (append-only, Sektion „Deferred from: code review of spec-3-2-… (2026-08-19)"). **Keine AC-Änderung, kein frozen-Schnittstellen-Change, kein Validator-/Vertrags-/`raw/`-Change (AD-3), keine neue §7-Klasse, kein Standalone (D-3).** Frontmatter: `status: 'done'`, `review_loop_iteration: 3`. `sprint-status.yaml`: Key `3-2-…` bleibt `done`, `last_updated` → 08-19-2026. - **2026-08-19 (bmad-code-review Loop 2 — bad_spec-Loopback):** 5 bad_spec-Findings ausgelöst, Code-Änderungen auf Baseline revertiert, nicht-gefrorene Spec-Tail-Sektionen geamendet: - **B1/VG-1 `log.md`-Kontamination:** `rg -l '' wiki/` ohne `--exclude=log.md` → `log.md` wird ab dem Moment selbst „Kandidat", in dem ein Log-Eintrag den Term zitiert; der Determinismus-Selbsttest verankert das A0-18-1-File-Find in einem Commit, das selbst `A0-18` enthält (Stale-Evidenz; Reproduzierbarkeits-Claim widerlegt sich selbst). Bekannt-bös: permanente Drift + falsches Verification-Expect. - **B2 Reihenfolge:** `rg -l`-Ausgabe-Reihenfolge (FS-Traversal) nicht auf Zuwachs-Sicht-Ordnung abbildbar; Stufe-b/c ohne definierte Position. Bekannt-bös: AC-2-Zwei-Run-Identität nur bei undokumentiertem `rg`-Tie-Break. - **B3 Resolver nicht enumeriert:** „eine canonische Form je Semantik" ohne committete Registry → Determinismus nicht pinbar. Bekannt-bös: gleiche Liste nur, wenn Resolver Teil des Git-States (nicht spezifiziert). - - **B4 Em/En-Dash:** Klassenliteral `[-–_ ]` deckt nur En-`–`, nicht Em-`—`; Kollaps-Reichweite inkonsistent. Bekannt-bös: Em-Varianten fallen nicht unter den Kollaps (Synonymlücke). **Gewählter Weg:** `-`-Kollaps bleibt; explizite `—`-Resovierung wird als offene Determinismus-Lücke in Step-4-Defer an Story 3.8 übergeben (nicht stillschweigend hinzugefügt). + - **B4 Em/En-Dash:** Klassenliteral `[-–_ ]` deckt nur En-`–`, nicht Em-`—`; Kollaps-Reichweite inkonsistent. Bekannt-bös: Em-Varianten fallen nicht unter den Kollaps (Synonymlücke). **Gewählter Weg:** `-`-Kollaps bleibt; explizite `—`-Auflösung wird als offene Determinismus-Lücke in Step-4-Defer an Story 3.8 übergeben (nicht stillschweigend hinzugefügt). - **B5 §8-A0-19-Claim:** Spec sagte „A0-19 steht bereits in §8", war im Ist-Baum nicht kommutiert; Implementierung ergänzte A0-19 (korrekt). Spec korrigiert, A0-19-Ergänzung als KEEP verankert (fehlleiten bei Re-Baseline verhindern). - **B6 NO_MATCH / §5.9-P2-Block-Scope:** werkt zusammen → zusammengefasst; in B1 und Task-Patch-Membership-Pin überführt. - **B7 §5.9-P2-Block-Zeiger:** nicht mehr nötig — die fixierte Stufe (a) `--exclude=log.md` macht den Zeiger redundant (kein log.md-Kandidat mehr); **verworfen** (keine unnötige Pflicht). @@ -90,7 +121,7 @@ context: **Term-Ziehverfahren — was deterministisch heißt:** Die Ziehung ist deterministisch, weil sie allein von der committeten Evidenz-Datei abhängt: (1) bedeutungstragende Fachbegriffe = Token-Folgen mit fachlicher Signifikanz, aus der §2-Interpretation benannt (nicht freie LLM-Auswahl); (2) Normalisierung über einen canonischen Schreibweisen-Resolver (lowercasing; `[-–_ ]`→`-`; eine canonische Form je Semantik); (3) mehrere Terme je Einheit erlaubt — Candidate-Liste = Vereinigung der Treffer über alle Terme, bereinigt über besuchte Menge; (4) kein stiller Ausschluss: nicht auflösbare Varianten werden wie notiert verwendet. Die Erhebung *mit festem Term* war schon in Rev-2.4.2 deterministisch — Story 3.2 macht zusätzlich die **Term-*Auswahl*** deterministisch (exakt der bisherige Vorbehalt). -**Determinismus-Referenz:** AD-17h und A0-19 sind bereits Normreferenzen in §8 Revision 2.4 (Story 3.1); Story 3.2 ergänzt **AD-13**, **A0-18** und **PRD OQ-3** (Architekturfrage „Compilation Scope"). A0-19 war im Ist-§8 (Baseline `e3e7ec3`) zwar nicht gelistet — die Implementierung fügt es als Determinismus-Referenz der Relevanzbestimmung hinzu (kein Verstoß, Design-KEEP: A0-19-Anker wird in §8 **und** §3.2 gesetzt; die frühere Spec-Formulierung „steht bereits" war falsch und ist hiermit korrigiert). `wiki/knowledge-kompilation-inkrementell.md:48` referenziert A0-18/AD-13 bereits; **zur Erhebung wird `wiki/log.md` ausgeschlossen** (`--exclude=log.md`, §5.6-Muster) — sonst wäre der eigene `log.md`-Eintrag bei jedem Term, den er zitiert, selbst „Kandidat" (A0-18/FR-12-Fall; die Candidate-Liste ist auf Concept-Pfade definiert, §5.9 Pkt. 5 behandelt `log.md` gesondert als erlaubtes Membrum). +**Determinismus-Referenz:** AD-17h und A0-19 sind bereits Normreferenzen in §8 Revision 2.4 (Story 3.1); Story 3.2 ergänzt **AD-13**, **A0-18** und **PRD OQ-3** (Architekturfrage „Compilation Scope"). A0-19 war im Ist-§8 (Baseline `e3e7ec3`) zwar nicht gelistet — die Implementierung fügt es als Determinismus-Referenz der Relevanzbestimmung hinzu (kein Verstoß, Design-KEEP: A0-19-Anker wird in §8 **und** §3.2 gesetzt; die frühere Spec-Formulierung „steht bereits" war falsch und ist hiermit korrigiert). `wiki/knowledge-kompilation-inkrementell.md:48` referenziert A0-18/AD-13 bereits; **zur Erhebung wird `wiki/log.md` ausgeschlossen** (`--exclude=log.md`, §5.6-Muster) — sonst wäre der eigene `log.md`-Eintrag bei jedem Term, den er zitiert, selbst „Kandidat" (A0-18/FR-12-Fall; die Candidate-Liste ist auf Concept-Pfade definiert, §5.9 Pkt. 5 behandelt `log.md` gesondert als erlaubtes Mitglied). **Determinismus-Selbsttest (Membership + Identität):** Der Selbsttest prüft nicht nur Zwei-Run-Identität, sondern zusätzlich, dass die Ausgabe **Mengen-Genauigkeit** hat (nur Concept-Pfade, `log.md` ausgeschlossen) — er wird gegen einen mini-Sandbox-Baum ausgeführt, der einen realen Term auf Concept-Bodies und `log.md` verteilt und die exakte Candidate-Liste als erwartete Ausgabe pindet. Damit ist die Stale-Verifikations-Falle („das Artefakt widerlegt sich selbst") geschlossen. @@ -103,7 +134,7 @@ context: - `rg -l '' -g '!log.md' wiki/` (rgs native Glob-Exklusionsform; `--exclude` ist kein rg-Flag — das GNU-grep-Äquivalent ist `grep -rl '' --exclude=log.md wiki/`) zweimal ausführen, Ausgaben **identisch** — deterministische Erhebung ohne `log.md`-Kontamination; z. B. `rg -l 'A0-18' -g '!log.md' wiki/` → genau `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad, `log.md` ausgeschlossen); `rg -l 'A0-18' wiki/` **ohne** Exklusion hingegeben würde `wiki/log.md` mit-treffen (Selbstkontamination — genau der ausgeschlossene Fall). - mini-Sandbox-Baum (`_bmad-output/implementation-artifacts/sandbox-3-2/`, re-executierbar via `bash run-sandbox.sh` — Term auf Concept-Bodies **und** `log.md` verteilt): exakte Candidate-Liste (nur Concept-Pfade) wie erwartet; Normalisierung Strip `wiki/` + `.md` → relative OKF-Pfade; zwei aufeinanderfolgende Läufe liefern byte-identische Ausgaben (Zwei-Run-Identität, AD-17h). 4. **Validator-Lauf:** alle `wiki/`-Dateien SUCCESS (unverändert; reine Text-Instruktion, human-mechanisch ausgeführt, D-3) — per-Datei-Verdikt als Ausführungs-Nachweis im `log.md`-Eintrag. -5. **Resolver-Materialisierung:** `schema/canonical-terms.md` existiert (committete, append-only Registry: canon. Form + erlaubte Varianten); `grep -n "canonical-terms" schema/compiler.md` liefert die §3.2-Referenz.
_(Optionale Em-Dash-Prüfung: die Normalisierungs-Klasse deckt `-` ab; explizite `—`-Varianten-Resovierung ist eine erkannte Determinismus-Lücke → Story 3.8, s. Spec Change Log.)_ +5. **Resolver-Materialisierung:** `schema/canonical-terms.md` existiert (committete, append-only Registry: canon. Form + erlaubte Varianten); `grep -n "canonical-terms" schema/compiler.md` liefert die §3.2-Referenz.
_(Optionale Em-Dash-Prüfung: die Normalisierungs-Klasse deckt `-` ab; explizite `—`-Varianten-Auflösung ist eine erkannte Determinismus-Lücke → Story 3.8, s. Spec Change Log.)_ **Manual checks:** - §3 Pkt. 2 zeigt auf die neue §3.2-Mechanik; Term-Ziehverfahren + Kanonisierungs-Resolver textuell benannt; Candidate-Liste als relative OKF-Pfade ohne `.md`; Determinismus-Vertrag in der Instruktion; `compiler.md` §8-Revision 2.5 + 2.6 mit Abschlussklausel; kein `schema/validator.md`-/`schema/wiki-compiler.md`-/`raw/`-Diff; §7-Vorbehalt ohne „3.2"; `wiki/log.md`-Eintrag datiert mit Story-3.2-Semantik, Determinismus-Beleg, Statuswechsel `backlog → in-progress → done` (Patch-Note Rev 2.6 oben), per-Datei-Verdikt; `deferred-work.md`-epic-3-context-Eintrag als aufgegriffen markiert + Em-Dash-Defer (Story 3.8); `sprint-status.yaml` konsistent (`3-2-…` → done). diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 1724c27..0b39b41 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -29,7 +29,7 @@ # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) # - Retrospective appends its action items to action_items; the status view surfaces open ones generated: 08-14-2026 00:00 -last_updated: 08-19-2026 07:10 +last_updated: 08-19-2026 13:14 project: wow20 project_key: NOKEY tracking_system: file-system diff --git a/schema/canonical-terms.md b/schema/canonical-terms.md index 7220770..d4fa287 100644 --- a/schema/canonical-terms.md +++ b/schema/canonical-terms.md @@ -15,11 +15,17 @@ Diese Datei ist die einzige committete Registry des **kanonischen Schreibweisen- Je Eintrag (eine Zeile in der Tabelle): - **canonische Form** — der normalisierte Term als Kebab-Case-Slug (Nur-Kleinbuchstaben `[a-z0-9-]`, `-`-Kollaps). Genau **eine** canonische Form je Semantik (A0-18). -- **erlaubte Schreibvarianten** — Schreibweisen, die auf die canonische Form normalisiert werden (bündel-findend per `-`-Kollaps: `[-–_ ]` → `-`, lowercased gemäß §3.2-Normalisierung). `[]` = keine weitere Variante (nur die canonische Form selbst gilt), bzw. noch keine Einträge committet. +- **erlaubte Schreibvarianten** — Schreibweisen, die auf die canonische Form normalisiert werden (bündel-findend per `-`-Kollaps: `[-–_ ]` → `-`, lowercased gemäß §3.2-Normalisierung). **Gespeicherte Form:** canonical-Form- und Variantenzeile tragen ausschließlich die **bereits normalisierte** Form (lowercased, `-`-gekollabst) — die Spalte enthält also nie das Roh-Notat, sondern dessen Normalisierungs-Resultat. `[]` = keine weitere Variante (nur die canonische Form selbst gilt), bzw. noch keine Einträge committet. - **Semantik** *(optional)* — disambiguierende Kurzangabe, warum dieser Term eine eigene canonische Form trägt (nur bei Bedarf; ergänzt die canonische Form, ist aber nicht Teil der Normalisierungslogik). +**Lookup-Verfahren (deterministische Reihenfolge):** Die Auflösung eines gezogenen Terms folgt exakt dieser Ordnung: (1) **lowercasing**; (2) **Binde-Varianten-Kollaps** `[-–_ ]` → `-` (§3.2 Pkt. 1b); (3) **Lookup der normalisierten Form** in der Registry — Treffer in der Spalte *canonische Form* oder in der Spalte *erlaubte Schreibvarianten* → Ergebnis ist die **canonische Form** desselben Eintrags. Ist die normalisierte Form nicht auffindbar, gilt der Term **wie notiert** (Kollaps-normalisiert; §3.2 Pkt. 1b — kein stiller Ausschluss). Normalisierung und Lookup sind dadurch vollständig deterministisch: gleiche Normalisierungs-Regeln + gleiche Registry (Git-State) → gleiche Auflösung. + +**Eindeutigkeits-Invariante:** Jede normalisierte Form kommt in der Registry **genau einmal** vor — als canonische Form **oder** als Variante eines Eintrags, nie in beiden Spalten und nie in zwei Einträgen (auch nicht als Canon eines Eintrags und Variante eines anderen). Wird diese Invariante verletzt, ist der Resolver-Zustand nicht eindeutig auflösbar. + **Append-only-Regel:** Neue Zeilen werden am Ende der Tabelle angehängt; ein bestehender Eintrag wird **nie** editiert. Muss eine Semantik umbenannt werden, wird das in `deferred-work.md` als Mapping-/AD-7d-Nähe-Fall notiert (Ask-First), nicht durch Edits in dieser Registry. +**Konflikt-Verfahren (keine stillen Anhängungen):** Soll ein neuer Eintrag eine normalisierte Form tragen, die bereits in der Registry vorkommt (Canon oder Variante — auch mit abweichender Semantik), wird **nicht** angehängt (das würde die Eindeutigkeits-Invariante verletzen): der Konflikt wird in `deferred-work.md` notiert und dem Nutzer als Ask-First-Frage vorgelegt (Analogie: Umbenennungsregel oben), bis eine Entscheidung eine eindeutige Auflösung erlaubt. + ## Registry | canonische Form | erlaubte Schreibvarianten | Semantik | diff --git a/schema/compiler.md b/schema/compiler.md index 09118a7..9b41799 100644 --- a/schema/compiler.md +++ b/schema/compiler.md @@ -57,7 +57,7 @@ Diese Sektion ist der **einzige Instruktions-Ort** der feinkörnigen, **textuell - **(c) Stufe c — Link-Following mit besuchter Menge:** Aus bereits als betroffen erhobenen Concepts folgt der Producer die Concept-Links (§5.6-Pin) auf weitere Concept-Pfade — file-relativ auflösen (§5.7 Pkt. 4), **jeder bereits besuchte Concept-Pfad wird nicht erneut besucht** (besuchte Menge): Zyklen (A → B → A) enden, die Candidate-Liste bleibt endlich (LINK_FOLLOWING_ZYKLUS). 3. **Candidate-Liste (Ausgabe) + Determinismus-Vertrag:** - **(a) Form:** Die Candidate-Liste ist die Menge der betroffenen Concept-Pfade als **relative OKF-Pfade ohne `.md`** (AD-7a). Normalisierung der Ausgabe: aus jedem Treffer `wiki/.md` werden `wiki/`-Präfix und `.md`-Suffix gestrippt (deterministischer Schritt → `wiki/knowledge-kompilation-inkrementell.md` wird `knowledge-kompilation-inkrementell`). - - **(b) Reihenfolge (Zuwachs-Sicht-Ordnung):** Die Erhebung ordnet die Candidate-Liste deterministisch in **Zuwachs-Sicht-Ordnung** — Stufe-a-Treffer zuerst (in der Reihenfolge des ziehenden Terms, dann lexikografisch als deterministischer Tie-Break bei identischem Ort), danach Stufe-b-Treffer, danach Stufe-c-Treffer; innerhalb jeder Stufe lexikografisch aufsteigend (LC_ALL=C bzw. deterministische byte-Ordnung, AD-17h). Die Stufe-b/c-Treffer sind damit **positional bestimmt** (nach allen Stufe-a-Treffern), nicht vom Dateisystem-Traversal abhängig. + - **(b) Reihenfolge (Zuwachs-Sicht-Ordnung):** Die Erhebung ordnet die Candidate-Liste deterministisch in **Zuwachs-Sicht-Ordnung** — Stufe-a-Treffer zuerst, danach Stufe-b-Treffer, danach Stufe-c-Treffer; **innerhalb jeder Stufe rein lexikografisch aufsteigend (LC_ALL=C bzw. deterministische byte-Ordnung, AD-17h)**. Die Reihenfolge des ziehenden Terms bestimmt nur die **Verarbeitungsreihenfolge** der Terme in Stufe a (Interpretation/Erhebung), **nicht** die Reihenfolge der Candidate-Liste: dieselbe Treffermenge → identische Liste, unabhängig davon, in welcher Reihenfolge die Terme gezogen/verarbeitet wurden (AD-17h/A0-19). Die Stufe-b/c-Treffer sind damit **positional bestimmt** (nach allen Stufe-a-Treffern), nicht vom Dateisystem-Traversal abhängig. - **(c) Keine Duplikate:** Vereinigung über alle Terme und Stufen, bereinigt über die besuchte Menge (Pkt. 1c/2c) — jeder Pfad erscheint genau einmal. - **(d) NO_MATCH:** Trifft kein Term ein bestehendes Concept, ist die Candidate-Liste **leer** → `UNTOUCHED_CONCEPT` (Story-3.1-Pfad): keine Mutation, kein `log.md`-Zusatz (leere Menge ist Teilmenge jeder erlaubten Menge — Ghost-Diff-negativ, §5.9 Pkt. 5). - **(e) Gleichheits-Identität:** Gleicher Git-State + gleiche Eingabemenge → identische Candidate-Liste, in identischer Reihenfolge (AD-17h/A0-19). Der Selbsttest (Membership + Zwei-Run-Identität) wird in der Story-Specifizierungs-Verifikation und im `wiki/log.md`-Nachweis belegt. @@ -348,7 +348,7 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - `schema/validator.md` — Prüfgrundlage (Story 1.4, Revision 9): §3 14 Punkte, §4 Normalform (Reihenfolge §4.1, ISO-8601 §4.3), §5 Verdikt, §6 Fachprüfungen (EC-1 Existenz, EC-3 Kalender, EC-11 non-md; Punkt-11-Area-Lesart formalisiert). - Architektur-Spine (raw/`architecture-spine`): AD-2/AD-3 (raw immutable), AD-4a (claim-granulare Provenienz, §5.5), AD-5 (inkrementelle Kompilation), AD-6 (Reason/Mutate-Trennung), AD-7a (Identität = OKF-Pfad ohne `.md`, §5.7), AD-7b (genau eine Linkform gepinnt, §5.6), AD-7c (deterministische Bereichszuordnung, §5.7), AD-7d (Renaming/Redirect-Pflicht — nicht in den ACs, Epic 3), AD-8 (Standard-Markdown-Links = Navigations-/Beziehungsschicht, §5.6), AD-9 (Progressive Discovery, §5.7/§5.8), AD-10 (agent-unabhängige Regeln), AD-11 (keine eigene Runtime), AD-13 (Retrieval gehört zu Consumers / Suche = Consumer-grep / keine Embedding-Bereichszuordnung, §5.7/§5.8; Relevanzbestimmung textuell-deterministisch, §3.2), AD-14 (Git liefert Historie, nicht Domain-State), AD-15 (Trust-Metadaten v1), AD-16 (Konflikte werden explizit bewahrt), AD-17a (nur veröffentlichte/committete Inhalte als Input), AD-17f (Commit-Boundary = Mutations-Boundary), AD-17h (Determinismus), D-3 (kein Standalone). - PRD (raw/prd): FR-2 (Sources vs. Curated), FR-5 (Concept-Erzeugung), FR-9 (OKF-Konformität), FR-10 (Concepts miteinander verlinken, §5.6), FR-11 (Progressive Discovery siehe PRD-§4.3-Zeile unten — Discovery-Pfad/gewurzelte Erreichbarkeit, §5.8), FR-16 (Consumer-Unabhängigkeit), NFR-3 (Agent Readability — Standard-Dateioperationen/grep über `wiki/`, §5.8 Pkt. 4), A-4 (nur lokale Sources). -- Epics (raw/epics): Story-2.1-Ziel und -Abgrenzung zu Story 2.2–2.5; A0-3 (Kontext-Marker-Wortlaut, §5.5), A0-8 (Concept-Identität/Normalisierung, §5.7), A0-9 (eine erlaubte Linkform, §5.6), A0-10 (deterministische Bereichszuordnung, §5.7), A0-13 (Lease-Root-Scope); FR-6/FR-12/FR-14, A0-6/A0-7/A0-11/A0-18 (Belege der nachkonformierten Concept-Bodies); **A0-6 (inkrementeller Datenfluss Interpret → Reconcile → Synthesize → Update, §0/§3/§5.9), FR-6 (Aktualisierung statt neuer Dateien, §3/§5.9), FR-12 (unverändertes Wissen bleibt erhalten, §5.9)**, **A0-18 (Deterministische Relevanzbestimmung — grep/ripgrep, `index.md`-Traversal, Link-Following, keine Embedding-/Vector-Infrastruktur; §3.2, AD-13, PRD OQ-3)**, **A0-19 (Determinsmus-Vertrag: gleicher Git-State + gleiche Eingabemenge → gleicher Bundle-State / gleiche Candidate-Liste in gleicher Reihenfolge; §3.2, AD-17h)**. +- Epics (raw/epics): Story-2.1-Ziel und -Abgrenzung zu Story 2.2–2.5; A0-3 (Kontext-Marker-Wortlaut, §5.5), A0-8 (Concept-Identität/Normalisierung, §5.7), A0-9 (eine erlaubte Linkform, §5.6), A0-10 (deterministische Bereichszuordnung, §5.7), A0-13 (Lease-Root-Scope); FR-6/FR-12/FR-14, A0-6/A0-7/A0-11/A0-18 (Belege der nachkonformierten Concept-Bodies); **A0-6 (inkrementeller Datenfluss Interpret → Reconcile → Synthesize → Update, §0/§3/§5.9), FR-6 (Aktualisierung statt neuer Dateien, §3/§5.9), FR-12 (unverändertes Wissen bleibt erhalten, §5.9)**, **A0-18 (Deterministische Relevanzbestimmung — grep/ripgrep, `index.md`-Traversal, Link-Following, keine Embedding-/Vector-Infrastruktur; §3.2, AD-13, PRD OQ-3)**, **A0-19 (Determinismus-Vertrag: gleicher Git-State + gleiche Eingabemenge → gleicher Bundle-State / gleiche Candidate-Liste in gleicher Reihenfolge; §3.2, AD-17h)**. - PRD §4.3 (FR-11 — progressive Discovery, §5.7 Pkt. 5/§5.8) und §8.2/§8.3 (Canonical State; Separation of Concerns), **PRD OQ-3 („Compilation Scope" — wie findet der Compiler relevante vorhandene Concepts; textuell-deterministische Relevanzbestimmung, §3.2; AD-13/A0-18; Muster `raw/architecture-spine/…md` §8.3)**. **Revisionslog:** @@ -370,5 +370,6 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - **Revision 2.4 (2026-08-18, Story 3.1):** Neue Sektion **§5.9 „Inkrementelles Update bestehender Concepts (Story 3.1)"** eingefügt (nach §5.8, vor §6) — Update-Stimulus (Reconcile-Kandidatenliste), Mutationsmechanik (Erweitern/Präzisieren/Korrigieren; `sources` nur um echte neue Belege; `generated.at` = aktueller Run-Zeitstempel; `verified` unangetastet), Index-/Link-Form unverändert (§5.6-Pin), `log.md`-Eintragspflicht („Story 3.1-Update"-Markierung; Disagreement-Fälle bleiben dokumentiert, keine Korrektur-Klassifikation hier — Epic-4-Interface), **Erhaltungs-Invariante + deterministischer Diff-Selbsttest** (`git diff --stat -- wiki/` ⊆ betroffene Concepts ∪ `log.md` ∪ Index; Ghost-Diff = textuell benannter Instruktions-Verstoß, FT-6/FR-12), Run-Vorphase-Bausteine (Defer **R-1** Change-Detection via `git diff` auf `raw/` + SHA-256-Record aus `source.md`; Defer **P2** Pre-Run-Reconcile-Check-Block — Zielpfade, EC-1-Existenz, Kandidatenliste, V-1), Worked Example. **§3 Reconcile:** Pkt. 2 Kollision-Hold (bisheriger Epic-3-Abbruch bei bereits existierendem Concept) **ersetzt** durch **Update-Routing** (bestehende Wissenseinheit → Update-Kandidat im bestehenden Pfad; kein Duplikat, kein stummer Überschreib; AD-16-Default-Erhaltung) + **textuell-deterministische Kandidatenliste** (Konzept-/Term-Überschneidung via `grep`/`ripgrep`, `index.md`-Traversal, Link-Following — AD-13; feinkörniger Mechanismus Story 3.2). **§0-Aufruf:** sechs Phasen für Neu-Anlage- und Update-Variante präzisiert; Reconcile/Mutieren betreffen auch bestehende Concepts. **§5.7 Pkt. 3 / §5.8 Pkt. 2/3:** Top-Level-Referenz von „§3.2-Kollisions-Hold" auf das Update-Routing (§3 Pkt. 2, §5.9) nachgeführt (die bisherige Epic-3-Abbruch-Formulierung ist vollständig entfernt). **§7:** Update-Thema aus dem Epic-3-Vorbehalt **entlassen** (verbleibende 3.x-Themen benannt: Synthese → Story 3.4, Leasing/Dirty-Tree → Story 3.5/3.6, Relevanz-Verfeinerung → Story 3.2); Scope-Einleitung um die Update-Variante geöffnet. **§8:** Normreferenzen um A0-6/FR-6/FR-12 ergänzt. **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. - **Revision 2.4.1 (2026-08-18, Story 3.1, Step-04-Review-Patch-Runde; D-3-Instruktions-Patch, kein neuer Inhalt):** §5.9-Konsolidierung aus den drei Review-Layern — (1) Prüfgrundlage auf `validator.md` **Revision 9** angehoben (§0-Header, §8-Link), §8-Verlusttext um die Punkt-11-Area-Lesart (Rev-9) ergänzt; (2) §5.9 Pkt. 5 Diff-Selbsttest operationalisiert (Probe `git diff --name-only -- wiki/` statt `--stat`; Ergebnismenge ⊆ **Kandidatenliste** (explizit §3 Pkt. 2) ∪ `log.md` ∪ nachgeführte `index.md`; Rücksetzhilfe „ob der Ghost auf einem Kandidatenpfad liegt"); Klarstellung, dass `schema/compiler.md`/`deferred-work.md` **außerhalb** `wiki/` liegen und daher nicht Teil der Diff-Probe sind — der Story-3.1-Nachweis ist `wiki/log.md` (Differenz zu den 4 volle `git status --porcelain`-Einträgen); Diff-Erwartung für das reine Body-Update in Pkt. 7 auf `git diff --name-only` umgestellt, Ergebnismenge `wiki/log.md` + `wissensarchitektur/source-material.md` (keine `index.md`); (3) §5.9 Pkt. 3-Widerspruch aufgelöst (Index-Regel unverändert, `log.md`-Eintragspflicht bleibt ausgeschlossen — Präzisierung „kein `log.md`-Zusatz" war falsch, korrekt „kein Index-Zusatz"); (4) §5.9 Pkt. 2 um **Mehrfach-Treffer-Konsolidierung** ergänzt (mehrere Einheiten → 1 Update/`log.md`-Eintrag/`at`; Verarbeitungsreihenfolge = Auftreten in der Zuwachs-Sicht); (5) §5.9 Pkt. 1/6-Anker §1.1/§1.4 → **§1 Pkt. 1/Pkt. 4** (die tatsächlichen Label; §5.8-Pkt-2-Formel-Zeile bleibt historisch); (6) Ghost-Diff **Konsequenz** + Commit-Boundary-Umsetzung definiert (Rück-Rollen vor Run-Gültigkeit, `log.md`-Kopplung als Abbruch-Vorlauf „korrigierter Teil-Run"); (7) Defer-**R-1**-Baseline festgelegt (HEAD der vorherigen Mutations-Boundary); (8) §5.9 Pkt. 7-Worked Example auf den **realen Ist-Baum** gehoben (`raw/epics/epics-2026-08-14.md#FR-12`, `rg -l 'FR-12'`; das fiktive `epics-2026-08-18.md`/`payload` entfernt); (9) §5.8-Pkt-3-Revision-Feinschliff — die Rev-9-Lücke ist geschlossen; die Markierung ist Pkt. 3. **Abschlussklausel der Patch-Runde:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. - **Revision 2.6 (2026-08-19, Story 3.2, Step-04-Review Loop 2, Patch-Runde; D-3-Instruktions-Patch, kein neuer Inhalt):** (1) **§4-Überschrift wiederhergestellt** — die §3.2-Einfügung (Rev 2.5) hatte die Überschrift **`## 4. Synthetisieren (Provenienz & Trust)`** verdrängt (der §3.2-Sektionskopf ersetzte die §4-Überschrift; der gesamte Frontmatter-Body hing kopflos unter §3.2; alle §4-Referenzen wären dangling geblieben). Der §4-Kopf ist zwischen §3.2-Body und dem Frontmatter-Body wieder eingefügt; die §4-Referenzen zeigen wieder auf eine existierende Sektion; der §3.2-Body blieb unverändert erhalten. (2) **rg-Flag-Defekt behoben (`--exclude` ist kein rg-Flag):** die Stufe-a-Form in §3-Pkt.-2, §3.2-Pkt.-2a, §5.9-Worked Example (Pkt. 7) und §7 nutzten `rg -l "" --exclude=log.md wiki/` — nicht-existent (ripgrep 14.1.1: `rg --exclude` → `unrecognized flag`; GNU grep unterstützt `--exclude`, ripgrep nutzt `-g "!log.md"` / `--glob "!log.md"`). Die Instruktion nutzt jetzt tool-korrekte Formen: rg `rg -l "" -g "!log.md" wiki/` (native Glob-Exklusion) bzw. GNU grep `grep -rl "" --exclude=log.md wiki/`; die §5.6-Formeln (bereits GNU-grep) und §5.9-Pkt.-7-Erhebung adoptieren die Exklusion. Verified: `rg -l "A0-18" -g "!log.md" wiki/` → nur `wiki/knowledge-kompilation-inkrementell.md`; **ohne** Exklusion trifft `rg -l "A0-18" wiki/` zusätzlich `wiki/log.md` (Selbstkontamination — der ausgeschlossene Fall, §3.2-Pkt.-2a). (3) **§5.9-Worked Example (Pkt. 7) auf die Exklusions-Form gehoben** (`rg -l "FR-12" -g "!log.md" wiki/`), Kommentar `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a. (4) **Mini-Sandbox re-executierbar verankert** (`_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh`, Muster Story-3.1-Sandbox S1–S6): Tests T1–T4 (Membership-Pin — Term auf Concept-Bodies UND `log.md` verteilt, Candidate-Liste nur Concept-Pfade; Zwei-Run-Identität AD-17h; NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT; Mehrfach-Treffer → Vereinigung + lexikografische Ordnung). (5) **`deferred-work.md`-Em-Dash-Eintrag** append-only ergänzt (Home: Story 3.8) — die §3.2-Pkt.-1b-Kollaps-Klasse deckt En-Dash/Bindestrich/Unterstrich/Leerzeichen, aber **nicht** den Em-Dash `—`; dieser Handoff wird nicht stillschweigend gelöst, sondern als offene Determinismus-Frage dokumentiert. (6) **§3-Pkt.-2/§3.2-Präambel/§7-Nennungen** der Exklusion auf die tool-korrekte Form angehoben. **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. (Rev-2.5-Log-Eintrag bleibt unverändert — dokumentiert den Zustand bei Veröffentlichung der Revision 2.5, inkl. der damaligen `--exclude`-Form; historische Korrektheit des Logs.) -- **Revision 2.5 (2026-08-19, Story 3.2):** Neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** eingefügt (nach §3, vor §4) — die **verbindliche Ausformulierung der §3-Pkt.-2-Kandidatenerhebung** („Erhebung nach §3.2"): (1) **Term-Ziehverfahren** deterministisch (bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps; **kanonischer Schreibweisen-Resolver `schema/canonical-terms.md`** — committete, append-only Registry (canon. Form + erlaubte Varianten), damit Bestandteil des Git-States und deterministisch pinbar; genau eine canon. Form je Semantik A0-18; kein stiller Ausschluss nicht auflösbarer Varianten — Verwendung wie notiert; mehrere Terme je Einheit → Vereinigung), (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (grep-Äquivalent `grep -rl … --exclude=log.md`; `log.md` **strukturell** exkludiert, Candidate-Liste auf Concept-Pfade definiert), (b) `index.md`-Traversal (gewurzelte Erreichbarkeit Root → Area → Concept, §5.8; TRAVERSAL_REACH_ONLY; fehlende Bundleroot → Run-FAIL V-1), (c) Link-Following mit **besuchter Menge** (file-relativ auflösen, §5.7 Pkt. 4; Zyklen enden, LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag (AD-17h/A0-19):** relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (nach Stufe-a; lexikografisch als deterministischer Tie-Break), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) in Spec-Verification und `wiki/log.md` belegt. **§3 Pkt. 2:** Story-3.2-Vorbehalt **aufgelöst** — Pkt. 2 bleibt Kern-Anker, die Erhebung zeigt auf die neue Sektion („Erhebung nach §3.2"), `rg -l '' --exclude=log.md wiki/` als Stufe-a-Form genannt. **§7:** Story-3.2-Vorbehalt **aufgelöst** (Relevanzbestimmung in §3.2 verankert; verbleibende 3.x-Themen: Synthese → Story 3.4, Leasing/Dirty-Tree → Story 3.5/3.6). **§8:** Normreferenzen um **AD-13** (bereits gelistet, §3.2-beankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2) und **A0-19** (Determinsmus-Vertrag, §3.2 — war im Ist-§8 noch nicht gelistet, wird als Determinismus-Referenz ergänzt) sowie **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; **`schema/canonical-terms.md`** als nebengeordnete committete Resolver-Registry referenziert (kein `schema/`-Root-Change; gleiche read-only-Hierarchie, append-only). Em-Dash-`—`-Varianten-Lücke als offene Determinismus-Frage an **Story 3.8** übergeben (nicht stillschweigend ergänzt). **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **`sprint-status.yaml`:** Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**. `wiki/log.md`-Eintrag (append-only, bestehende Bullets unverändert), `deferred-work.md`-epic-3-context-Eintrag → aufgegriffen (append-only), Determinismus-Selbsttest + Validator-Lauf (7/7 SUCCESS) siehe `wiki/log.md`-Nachweis. +- **Revision 2.5 (2026-08-19, Story 3.2):** Neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** eingefügt (nach §3, vor §4) — die **verbindliche Ausformulierung der §3-Pkt.-2-Kandidatenerhebung** („Erhebung nach §3.2"): (1) **Term-Ziehverfahren** deterministisch (bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps; **kanonischer Schreibweisen-Resolver `schema/canonical-terms.md`** — committete, append-only Registry (canon. Form + erlaubte Varianten), damit Bestandteil des Git-States und deterministisch pinbar; genau eine canon. Form je Semantik A0-18; kein stiller Ausschluss nicht auflösbarer Varianten — Verwendung wie notiert; mehrere Terme je Einheit → Vereinigung), (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (grep-Äquivalent `grep -rl … --exclude=log.md`; `log.md` **strukturell** exkludiert, Candidate-Liste auf Concept-Pfade definiert), (b) `index.md`-Traversal (gewurzelte Erreichbarkeit Root → Area → Concept, §5.8; TRAVERSAL_REACH_ONLY; fehlende Bundleroot → Run-FAIL V-1), (c) Link-Following mit **besuchter Menge** (file-relativ auflösen, §5.7 Pkt. 4; Zyklen enden, LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag (AD-17h/A0-19):** relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (nach Stufe-a; lexikografisch als deterministischer Tie-Break), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) in Spec-Verification und `wiki/log.md` belegt. **§3 Pkt. 2:** Story-3.2-Vorbehalt **aufgelöst** — Pkt. 2 bleibt Kern-Anker, die Erhebung zeigt auf die neue Sektion („Erhebung nach §3.2"), `rg -l '' --exclude=log.md wiki/` als Stufe-a-Form genannt. **§7:** Story-3.2-Vorbehalt **aufgelöst** (Relevanzbestimmung in §3.2 verankert; verbleibende 3.x-Themen: Synthese → Story 3.4, Leasing/Dirty-Tree → Story 3.5/3.6). **§8:** Normreferenzen um **AD-13** (bereits gelistet, §3.2-angeankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2) und **A0-19** (Determinismus-Vertrag, §3.2 — war im Ist-§8 noch nicht gelistet, wird als Determinismus-Referenz ergänzt) sowie **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; **`schema/canonical-terms.md`** als nebengeordnete committete Resolver-Registry referenziert (kein `schema/`-Root-Change; gleiche read-only-Hierarchie, append-only). Em-Dash-`—`-Varianten-Lücke als offene Determinismus-Frage an **Story 3.8** übergeben (nicht stillschweigend ergänzt). **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **`sprint-status.yaml`:** Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**. `wiki/log.md`-Eintrag (append-only, bestehende Bullets unverändert), `deferred-work.md`-epic-3-context-Eintrag → aufgegriffen (append-only), Determinismus-Selbsttest + Validator-Lauf (7/7 SUCCESS) siehe `wiki/log.md`-Nachweis. - **Revision 2.4.2 (2026-08-19, Story 3.1, bmad-code-review Loop 2, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4 = 1/1/1/1):** (1) **Diff-Selbsttest (Pkt. 5) operationalisiert + Blind-Spots geschlossen (D-1):** Probe erweitert auf `git diff --name-only -- wiki/` **plus** `git status --porcelain -- wiki/` (erfasst ungetrackte neue Dateien `??` — die Duplikat-Kontrolle „keine neue Datei" braucht diese Sicht; `git diff` allein ist blind für Untracked); **Probe-Zeitpunkt fixiert vor dem Commit** (am Ende des P2-Blocks, nach den Mutationen) — nach dem Commit wäre die Probe vacuous (leere Ausgabe, AD-17f); erlaubte Teilmenge-Menge um **Neu-Anlage-Zielpfade** (§5.1/§5.7) ergänzt — Misch-Runs (Neu-Anlage + Update im selben Run) markieren neu angelegte Pfade nicht fälschlich als Ghost-Diff; **Pfad-Normalisierung** definiert (Strip `wiki/`-Präfix + `.md`-Suffix vor dem Teilmenge-Vergleich, da Kandidaten/Ziel-Pfade als relative OKF-Pfade *ohne* `.md` definiert sind); **Rollback-Mechanik** für den Ghost-Diff deterministisch benannt (modifizierte Pfade via `git checkout -- `, ungetrackte neue Dateien gelöscht, Index via `git checkout -- `; §5.3/§6.3-Teilzustand-Rollback greift daneben unverändert). (2) **R-1-Baseline deterministisch + Abweichungsregel (D-2):** `` (HEAD der vorherigen Mutations-Boundary, AD-17f) wird vom Producer **im `wiki/log.md`-Run-Eintrag notiert** (voller SHA) — deterministisch auflösbar ohne Domain-State-Annahme an Git (AD-14); **Diskrepanz-Regel**: widersprechen `git diff`-Befund und SHA-256-Record derselben Datei, **gewinnt `git diff`** (Commit-Boundary-Prinzip), SHA-256 bleibt Sekundär-Fingerprint; **Fallback**: ohne vorherige Mutations-Boundary gelten alle `raw/`-Dateien als Zuwachs; Rev-2.4.1-Claim „derselbe Baseline-Commit wie Pkt. 5" **korrigiert** (die Pkt.-5-Probe trägt das Baseline-Commit-Argument jetzt explizit). (3) **INPUT_UNCOMMITTED-Abbruch (D-3) + Anker-Divergenz:** neuer P2-Check-Block-Element (1) **Input-Zustand** — Working-Copy von `raw/`/`wiki/` gegen HEAD prüfen, bei Abweichung **benannter Abbruch „published/committed Input erforderlich"** vor Interpretation und vor jeder Mutation (AD-17a, I/O-Matrix-`INPUT_UNCOMMITTED` — zuvor nur Referenz auf §1 Pkt. 1, keine Zustandsprüfung/Abbruchmeldung); die **Spec↔Anker-Divergenz** (frozen Spec zitiert 3× „§1.1", §1 ist eine nummerierte Liste Pkt. 1–4 ohne §1.1-Label; Rev-2.4.1 korrigierte nur die Anker *in* compiler.md) wird hier als dokumentierte Fußnote gesichert — die Spec bleibt frozen (nur per menschlicher Renegotiation änderbar). (4) **Sandbox-Edge-Test-Nachweis (D-4):** die fünf I/O-Matrix-Szenarien (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) + die D-3-Abbruch-Kontrolle sind als re-executierbare Sandbox-Skripte mit **konkreten deterministischen Ausgaben** in der Spec-`## Verification`-Sektion (Sandbox-Beleg) verankert — die `wiki/log.md`- und `deferred-work.md`-Verweise („in der Spec-Verification enthalten") auflösbar. (5) **Instruktions-Präzisierungen:** P2-Block-**Zeitpunkt** (nach Reconcile, am Anfang der Mutationsphase; Diff-Probe am Block-Ende) — löst den Widerspruch „einmal an der Spitze erhoben" vs. „Kandidatenliste entsteht erst im Reconcile"; **No-Op-Kandidat**-Regel (Pkt. 2: Pfad, der die Evidenz bereits vollständig enthält → keine Mutation/kein `at`-Bump/kein `log.md`-Eintrag, byte-identisch — die engere Auslegung); **Mehrfach-Treffer-Reihenfolge** für *alle* Einheiten definiert (Zuwachs-Sicht-Ordnung; lexicografisch nur als Tie-Break bei identischem Ort — AD-17h); **Update-Pfad-Rollback** in §5.3 Pkt. 3 (modifizierte Pfade aus Baseline-Commit wiederherstellen); **`generated.at`↔AD-17h-Gap** explizit als offener Punkt mit Home Story 3.8 benannt (Wanduhr-`at` erzeugt bei gleichem Input unterschiedliche Bundle-States; Konvention bleibt bis dahin bindend, Wechsel = Ask-First); **Term-Ableitung** (Pkt. 2 (a)) als §2-Interpretation abgegrenzt — die Erhebung *mit festem Term* ist textuell-deterministisch, der Term-Mechanismus (Kanonisierung/Synonyme) Story 3.2; **Link-Following** mit besuchter Menge (keine Schleife bei zyklischen Links); **Worked Example (Pkt. 7) auf den realen Ist-Baum korrigiert** (`rg -l 'FR-12' wiki/` trifft `wiki/knowledge-kompilation-inkrementell.md`, **nicht** `wissensarchitektur/source-material.md` — Rev-2.4.1-Beispiel enthielt den Term nicht); stale-Anker `§3.2-Kollisionsprüfung` (Pkt. 3-Zuordnung) und `§3-Voraussetzungsprüfung` (P2-Block) sowie §5.8-Pkt.-3-Zeiger („Pkt. 1" → „Pkt. 2") nachgeführt. **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. +- **Revision 2.7 (2026-08-19, Story 3.2, Step-04-Review Loop 3, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4/D-5 = 1/1/1/1/1, jeweils empfohlene Option; + 2 Patches; D-3-Instruktions-Patch, kein neuer Inhalt):** (1) **§3.2-Pkt.-3b-Ordnung auf reine Lexikografie gehoben (D-4):** Stufe-a-Treffer waren „in der Reihenfolge des ziehenden Terms, dann lexikografisch als deterministischer Tie-Break" — die Term-Ordnung selbst war für Mehrfach-Terme (Pkt. 1c) nirgends festgelegt, zwei rechtmäßige Term-Ordnungen erzeugten zwei unterschiedliche Listen (AD-17h-Lücke). Jetzt: **innerhalb jeder Stufe rein lexikografisch aufsteigend (LC_ALL=C)**; die Term-Verarbeitungsreihenfolge dient nur der Interpretation/Erhebung, **nicht** der Listen-Ordnung — dieselbe Treffermenge → identische Liste. (2) **`schema/canonical-terms.md`-Lookup-Semantik vervollständigt (D-5):** Lookup-Verfahren deterministisch fixiert (lowercasing → `[-–_ ]`→`-`-Kollaps → **Lookup der normalisierten Form**; Spalten tragen ausschließlich normalisierte Formen), **Eindeutigkeits-Invariante** (jede normalisierte Form in genau einem Eintrag — Canon **oder** Variante, nie beides/zweimal) + **Konflikt-Verfahren** (keine stille Anhängung; `deferred-work.md`-Handoff / Ask-First, analog zur Umbenennungs-Regel). (3) **Statuskette `in-progress → done` dokumentiert (D-1):** der Review-Loop-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention, Story-3.1-Präzedenz) war in keinem `wiki/log.md`-Eintrag als eigener Schritt belegt — nachgeführt als neuer oberster `wiki/log.md`-Bullet (append-only; die gefrorene Always-Klausel `→ in-progress` beschreibt den Implementierungsstand, der Review-Abschluss `done` ist der übliche Folgezustand). (4) **Mini-Sandbox um T5/T6/T7 erweitert + T1/T4-Asssertionen + T2-Kommentar-Korrektur (D-2 + Patch P-1):** T5 `LINK_FOLLOWING_ZYKLUS` (A→B→A-Links; besuchte Menge → endliche, doppelungsfreie Liste), T6 `TRAVERSAL_REACH_ONLY` (Term nur in Area-`index.md` → gewurzelte Concept-Pfade als Kandidaten; `index.md` selbst ist kein Concept-Kandidat), T7 `TERM_ABLEITUNG_SYNONYM` (Registry-Test-Doppel: Schreibvarianten → canonische Form via Lookup auf normalisierter Form; Negativ-Fall: nicht auflösbar → wie notiert, kein stiller Ausschluss); T1/T4 tragen jetzt harte Pass/Fail-Asssertionen (`exit 1` bei Abweichung) — die exakte Candidate-Liste wird erzwungen, nicht nur ausgegeben; der T2-Kommentar zu `index` korrigiert (Stufe-a-Treffer auf `wiki/index.md` löst Stufe b aus; `index.md` ist kein Concept-Kandidat). (5) **Selbsttest-Beleg (b) gegen den realen Sandbox-Ist-Baum re-executiert (D-3):** der Rev-2.5-Log-Beleg (b) beschrieb einen nicht-committierten Baum (Term `quanten-protocol`, `sub/beta.md`, SHA-256 `159092bb…`) — Stale-Evidenz-Falle (B1-Präzedenz). Der Nachweis wird jetzt gegen die echte `run-sandbox.sh`-Ausgabe (Term `deterministische-relevanz-bestimmung`, root-level `alpha`/`beta`/`gamma`) neu belegt; der Rev-2.5-Eintrag bleibt historisch unverändert, die Korrektur steht als neuer `wiki/log.md`-Bullet (append-only). (6) **Typos im normativen Text korrigiert (Patch P-2):** `Determinsmus` → `Determinismus` (§8-Referenzen + Log-/Defer-Belege), `§3.2-beankert` → `§3.2-angeankert`, `Membrum` → `Mitglied` (Spec-Design-Notes), `Konventionelle Determinismus-Lücke` → `Bekannte Determinismus-Lücke` (Defer-Beleg; `compiler.md:53` sagt „Bekannte"), `Resovierung` → `Auflösung` (Spec-Change-Log/-Verification). **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. (Revisionslog-Reihenfolge-Anomalie 2.6/2.5 bleibt als dokumentierter Defer bestehen — nicht in dieser Runde umgeordnet.) diff --git a/wiki/log.md b/wiki/log.md index 9a959b4..9b29777 100644 --- a/wiki/log.md +++ b/wiki/log.md @@ -1,8 +1,9 @@ # Log ## 2026-08-19 +- **Step-04-Review Loop 3 / Patch-Runde (Story 3.2, 2026-08-19):** `schema/compiler.md` → **Revision 2.7** (D-3-Instruktions-Patch, kein neuer Inhalt; bmad-code-review Loop 3, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4/D-5 = 1/1/1/1/1, jeweils empfohlene Option; + Patches P-1/P-2). (1) **D-1 — Statuskette abgeschlossen:** der Review-Loop-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention; Story-3.1-Präzedenz: Review-Abschluss setzt `done` im selben Loop) ist mit dieser Zeile als eigener dokumentierter Schritt nachgeführt; `sprint-status.yaml`-Key `3-2-…` bleibt **`done`** (die gefrorene Always-Klausel `→ in-progress` beschreibt den Implementierungsstand; Review-Handoff/-Abschluss ist der übliche Folgezustand, s. Sprint-Status-Workflow-Kommentar). (2) **D-2 — Sandbox erweitert:** `run-sandbox.sh` um **T5 `LINK_FOLLOWING_ZYKLUS`** (Zyklus alpha ↔ omega via Backlink; besuchte Menge → endliche, doppelungsfreie Candidate-Liste `omega`, `alpha` — der Zyklus endet), **T6 `TRAVERSAL_REACH_ONLY`** (Term `trafo-gebiet` trifft **nur** die Area-`index.md` → die gewurzelten Concept-Pfade `trafo/delta`, `trafo/epsilon` sind die Kandidaten; `index.md` selbst ist kein Concept-Kandidat) und **T7 `TERM_ABLEITUNG_SYNONYM`** (Registry-Test-Doppel: `Quanten Protocol` → Normalisierung → `quanten-protocol` (Canon-Treffer), `QuantenProtocol` → `quantenprotocol` (Variante-Treffer) → canonische Form `quanten-protocol`; Negativ-Fall `nicht-in-registry` → wie notiert, kein stiller Ausschluss); T2-Kommentar zu `index` korrigiert (Stufe-a-Treffer auf `wiki/index.md` löst Stufe b aus — kein Concept-Kandidat); **P-1** — T1/T4 jetzt mit harten Pass/Fail-Asssertionen (`exit 1` bei Abweichung). (3) **D-3 — Selbsttest-Beleg (b) neu belegt:** die Rev-2.5-Log-Zeile (b) beschrieb einen **nicht committierten** Baum (Term `quanten-protocol`, `sub/beta.md`, SHA-256 `159092bb…`) — Stale-Evidenz-Falle (B1-Präzedenz); die Rev-2.5-Zeile bleibt **historisch unverändert** (append-only, Vertrag §5), der korrigierte Nachweis steht in dieser Zeile (re-executierte Sandbox-Ausgabe, s. (5)(b)). (4) **D-4 — §3.2-Pkt.-3b-Ordnung:** Stufe-a-Treffer jetzt **rein lexikografisch (LC_ALL=C)** innerhalb jeder Stufe; die Term-Verarbeitungsreihenfolge dient nur der Interpretation/Erhebung, **nicht** der Listen-Ordnung (dieselbe Treffermenge → identische Liste, AD-17h/A0-19). (5) **D-5 — `schema/canonical-terms.md`-Lookup-Semantik:** Lookup-Verfahren deterministisch fixiert (lowercasing → `[-–_ ]`→`-`-Kollaps → **Lookup der normalisierten Form**; Spalten tragen ausschließlich normalisierte Formen), **Eindeutigkeits-Invariante** (jede normalisierte Form in genau einem Eintrag — Canon **oder** Variante, nie beides/zweimal) + **Konflikt-Verfahren** (keine stille Anhängung; `deferred-work.md`/Ask-First, analog zur Umbenennungs-Regel). (6) **P-2 — Typos korrigiert:** `Determinsmus` → `Determinismus` (compiler.md §8-Referenz, diese Log, `deferred-work.md`-Belege), `§3.2-beankert` → `§3.2-angeankert` (Rev-2.5-Log-Zeile), `Membrum` → `Mitglied` (Spec-Design-Notes), `Konventionelle Determinismus-Lücke` → `Bekannte Determinismus-Lücke` (`deferred-work.md`-Beleg; `compiler.md:53` sagt „Bekannte"), `Resovierung` → `Auflösung` (Spec-Change-Log/-Verification). **Re-executierte Selbsttest-Belege (2026-08-19, ab Workspace-Root; Sandbox-Run exit 0):** (a) live: `grep -rl 'A0-18' --exclude=log.md wiki/` → exakt `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad, `log.md` ausgeschlossen); (b) **Mini-Sandbox** (`_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh`, re-executierbar): alle **7** Tests **PASS** — T1 Membership (exakt `alpha`; Kontaminations-Kontrolle ohne Exklusion trifft zusätzlich `log`), T2 Zwei-Run-Identität (identisch), T3 NO_MATCH (leer), T4 Vereinigung `alpha,gamma` (hart assertierte), T5 LINK_FOLLOWING_ZYKLUS (endlich, doppelungsfrei, Zyklus endet), T6 TRAVERSAL_REACH_ONLY (`trafo/delta`, `trafo/epsilon`), T7 TERM_ABLEITUNG_SYNONYM (beide Varianten → `quanten-protocol`; Negativ-Fall wie notiert); (c) `git status --porcelain -- wiki/` nach diesem Run: ausschließlich `wiki/log.md` (dieser Eintrag) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, kein Ghost-Diff (die Instruktions-Story mutiert keine Concept-Inhalte). **Abschlussklausel Rev 2.7:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. `sprint-status.yaml`: Key bleibt `done`, `last_updated` → 08-19-2026. Spec-Frontmatter: `status: 'done'`, `review_loop_iteration: 3`; Spec-`### Review Findings` abgehakt (5 Decisions + 2 Patches + 4 Defers → `deferred-work.md`). - **Step-04-Review Loop 2 / Patch-Runde (Story 3.2, 2026-08-19):** `schema/compiler.md` → **Revision 2.6** (D-3-Instruktions-Patch, kein neuer Inhalt; bmad-code-review VG-Findings verarbeitet). (1) **§4-Überschrift wiederhergestellt** — die §3.2-Einfügung (Rev 2.5) hatte die Überschrift **`## 4. Synthetisieren (Provenienz & Trust)`** verdrängt (der §3.2-Sektionskopf ersetzte die §4-Überschrift; der gesamte Frontmatter-Body hing kopflos unter §3.2; alle §4-Referenzen wären dangling geblieben). Der §4-Kopf ist zwischen §3.2-Body und dem Frontmatter-Body wieder eingefügt. (2) **rg-Flag-Defekt behoben (`--exclude` ist kein rg-Flag):** die Rev-2.5-Form in diesem Log- plus dem §3.2-Eintrag, §3-Pkt.-2, §3.2-Pkt.-2a, §5.9-Worked Example (Pkt. 7) und §7 nutzten `rg -l '' --exclude=log.md wiki/` — nicht-existent (ripgrep 14.1.1: `rg --exclude` → `unrecognized flag`; GNU grep unterstützt `--exclude`, ripgrep nutzt `-g '!log.md'` / `--glob '!log.md'`). Die Instruktion nutzt jetzt tool-korrekte Formen: rg `rg -l '' -g '!log.md' wiki/` (native Glob-Exklusion) bzw. GNU grep `grep -rl '' --exclude=log.md wiki/`; die §5.6-Formeln (bereits GNU-grep) und §5.9-Pkt.-7-Erhebung adoptieren die Exklusion. Dieser Eintrag zitiert den alten Defekt **historisch** (verlaufsgetreue Log-Führung; die operative Form ist jetzt tool-korrekt). (3) **§5.9-Worked Example (Pkt. 7) auf die Exklusions-Form gehoben** (`rg -l 'FR-12' -g '!log.md' wiki/`), Kommentar `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a. (4) **Mini-Sandbox re-executierbar verankert** (`_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh`, Muster Story-3.1-Sandbox S1–S6): Tests T1–T4 (Membership-Pin — Term auf Concept-Bodies UND `log.md` verteilt, Candidate-Liste nur Concept-Pfade; Zwei-Run-Identität AD-17h; NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT; Mehrfach-Treffer → Vereinigung + lexikografische Ordnung). (5) **`deferred-work.md`-Em-Dash-Eintrag** append-only ergänzt (Home: Story 3.8) — die §3.2-Pkt.-1b-Kollaps-Klasse deckt En-Dash/Bindestrich/Unterstrich/Leerzeichen, aber **nicht** den Em-Dash `—`; dieser Handoff wird nicht stillschweigend gelöst, sondern als offene Determinismus-Frage dokumentiert. **Re-executierte Selbsttest-Belege (2026-08-19, ab Workspace-Root):** (a) rg-Form real: `rg -l 'A0-18' -g '!log.md' wiki/` → exakt `wiki/knowledge-kompilation-inkrementell.md`; ohne Exklusion `rg -l 'A0-18' wiki/` → zusätzlich `wiki/log.md` (Selbstkontamination — der §3.2-Pkt.-2a-Fall, reell belegt); (b) GNU-grep-Äquivalent `grep -rl 'A0-18' --exclude=log.md wiki/` → identisch `wiki/knowledge-kompilation-inkrementell.md`; (c) `rg -l 'FR-12' -g '!log.md' wiki/` → `wiki/knowledge-kompilation-inkrementell.md` (§5.9-WE-Korrektur reell); (d) Mini-Sandbox T1–T4 → siehe Rev-2.6-Eintrag; (e) `git status --porcelain` → `wiki/` nur `log.md` (dieser Eintrag; Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt), `schema/compiler.md` + `deferred-work.md` sind außerhalb `wiki/` (kein Teil der Diff-Probe). **Abschlussklausel Rev 2.6:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3, geprüft via `git status`); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. (Der Rev-2.5-Implementierungs-Eintrag oben bleibt unverändert — dokumentiert den Zustand bei Rev-2.5-Veröffentlichung inkl. der damaligen `--exclude`-Form; historische Korrektheit des Logs.) -- **Story 3.2 «Relevanzbestimmung textual-deterministisch umsetzen (grep/ripgrep + Markdown-Traversal + Link-Following)» (Implementierung, Instruktions-Story D-3; `sprint-status.yaml`: Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**):** `schema/compiler.md` → **Revision 2.5** — die beiden **Story-3.2-Vorbehalte aufgehoben** (§3 Pkt. 2 + §7) und die feinkörnige Relevanz-Findungsmechanik als neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** verankert (nach §3, vor §4; Pkt. 2 bleibt Kern-Anker „Erhebung nach §3.2"): (1) **Term-Ziehverfahren deterministisch** — bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps (En-Dash/Bindestrich/Unterstrich/Leerzeichen); **kanonischer Schreibweisen-Resolver als committete, append-only Registry `schema/canonical-terms.md`** (canon. Form + erlaubte Varianten, `[]`; Bestandteil des Git-States → Auflösung pinbar, AD-17h/A0-19); genau eine canon. Form je Semantik (A0-18); **kein stiller Ausschluss** nicht auflösbarer Varianten (Verwendung wie notiert); mehrere Terme je Einheit → Vereinigung; **bekannte Determinismus-Lücke**: Em-Dash `—` fällt nicht unter den `[-–_ ]`-Kollaps → an **Story 3.8** übergeben (nicht still hinzugefügt); (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (GNU-grep-Äquivalent `grep -rl '' --exclude=log.md wiki/`; **`log.md` strukturell exkludiert** — die Candidate-Liste ist auf Concept-Pfade definiert, `log.md` ist kein Kandidat), (b) `index.md`-Traversal (gewurzelte Erreichbarkeit Root → Area → Concept, §5.8; TRAVERSAL_REACH_ONLY; fehlende Bundleroot → Run-FAIL V-1), (c) Link-Following mit **besuchter Menge** (file-relativ, §5.7 Pkt. 4; Zyklen enden — LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag** — relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (lexikografischer Tie-Break; AD-17h/A0-19), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad, Ghost-Diff-negativ); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) unten belegt. **§8-Normreferenzen:** AD-13 (bereits gelistet, §3.2-beankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2), **A0-19** (Determinsmus-Vertrag — war im Ist-§8 noch nicht gelistet, als Determinismus-Referenz ergänzt, §3.2/AD-17h) und **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; `schema/canonical-terms.md` als Resolver-Registry referenziert. **Abschlussklausel Rev 2.5:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **`deferred-work.md`:** der Story-3.1-Defer-Eintrag `epic-3-context.md` („Home: Story-3.2-Handoff") als **aufgegriffen** markiert (append-only); der F17/Em-Morphologie-Handoff (Story 3.8) bleibt bestehen. **Determinismus-Selbsttest (Membership + Identität, re-executiert 2026-08-19, ab Workspace-Root):** (a) `grep -rl 'A0-18' --exclude=log.md wiki/` zweimal ausgeführt → beide Ausgaben **identisch**, exakt `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad; `log.md` ausgeschlossen — der `--exclude=log.md`-Fakt ist ehrlich dokumentiert: ohne die Exklusion würde `log.md` ab dem Moment selbst „Kandidat", in dem dieser Eintrag `A0-18` zitiert — die B1-`log.md`-Kontamination ist damit geschlossen); (b) **mini-Sandbox-Baum** (`/tmp/sb32-…`, Term `quanten-protocol` auf Concept-Bodies **und** `log.md` verteilt) → exakte Candidate-Liste nur Concept-Pfade (`wiki/alpha.md`, `wiki/sub/beta.md`; `log.md` ausgeschlossen, `wiki/gamma.md` ohne Term nicht getroffen); normalisiert `alpha`, `sub/beta`; **Zwei-Run-Identität** (SHA-256 `159092bb…` ≡); Kontrolle ohne `--exclude` → `log.md` wird Kandidat (B1-Falle belegt und geschlossen); (c) §5.6-Formeln unverändert re-executierbar: Formel 2 (Form-Check) `0` (Exit 0), Formel 3 (Dangling-Check) keine Ausgabe, Formel 4 Ist-Zählung **38** (kein `wiki/`-Dateimenge-Change durch Story 3.2 — keine Re-Baseline nötig). **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 3.1, Story 3.2 mutiert keine Concept-Inhalte; `wiki/log.md` bleibt frontmatterlos, Punkt 10); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 4 und AC 5. `git status --porcelain -- wiki/` nach diesem Run: ausschließlich `log.md` (modifiziert) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, kein Ghost-Diff. +- **Story 3.2 «Relevanzbestimmung textual-deterministisch umsetzen (grep/ripgrep + Markdown-Traversal + Link-Following)» (Implementierung, Instruktions-Story D-3; `sprint-status.yaml`: Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**):** `schema/compiler.md` → **Revision 2.5** — die beiden **Story-3.2-Vorbehalte aufgehoben** (§3 Pkt. 2 + §7) und die feinkörnige Relevanz-Findungsmechanik als neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** verankert (nach §3, vor §4; Pkt. 2 bleibt Kern-Anker „Erhebung nach §3.2"): (1) **Term-Ziehverfahren deterministisch** — bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps (En-Dash/Bindestrich/Unterstrich/Leerzeichen); **kanonischer Schreibweisen-Resolver als committete, append-only Registry `schema/canonical-terms.md`** (canon. Form + erlaubte Varianten, `[]`; Bestandteil des Git-States → Auflösung pinbar, AD-17h/A0-19); genau eine canon. Form je Semantik (A0-18); **kein stiller Ausschluss** nicht auflösbarer Varianten (Verwendung wie notiert); mehrere Terme je Einheit → Vereinigung; **bekannte Determinismus-Lücke**: Em-Dash `—` fällt nicht unter den `[-–_ ]`-Kollaps → an **Story 3.8** übergeben (nicht still hinzugefügt); (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (GNU-grep-Äquivalent `grep -rl '' --exclude=log.md wiki/`; **`log.md` strukturell exkludiert** — die Candidate-Liste ist auf Concept-Pfade definiert, `log.md` ist kein Kandidat), (b) `index.md`-Traversal (gewurzelte Erreichbarkeit Root → Area → Concept, §5.8; TRAVERSAL_REACH_ONLY; fehlende Bundleroot → Run-FAIL V-1), (c) Link-Following mit **besuchter Menge** (file-relativ, §5.7 Pkt. 4; Zyklen enden — LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag** — relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (lexikografischer Tie-Break; AD-17h/A0-19), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad, Ghost-Diff-negativ); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) unten belegt. **§8-Normreferenzen:** AD-13 (bereits gelistet, §3.2-beankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2), **A0-19** (Determinismus-Vertrag — war im Ist-§8 noch nicht gelistet, als Determinismus-Referenz ergänzt, §3.2/AD-17h) und **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; `schema/canonical-terms.md` als Resolver-Registry referenziert. **Abschlussklausel Rev 2.5:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **`deferred-work.md`:** der Story-3.1-Defer-Eintrag `epic-3-context.md` („Home: Story-3.2-Handoff") als **aufgegriffen** markiert (append-only); der F17/Em-Morphologie-Handoff (Story 3.8) bleibt bestehen. **Determinismus-Selbsttest (Membership + Identität, re-executiert 2026-08-19, ab Workspace-Root):** (a) `grep -rl 'A0-18' --exclude=log.md wiki/` zweimal ausgeführt → beide Ausgaben **identisch**, exakt `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad; `log.md` ausgeschlossen — der `--exclude=log.md`-Fakt ist ehrlich dokumentiert: ohne die Exklusion würde `log.md` ab dem Moment selbst „Kandidat", in dem dieser Eintrag `A0-18` zitiert — die B1-`log.md`-Kontamination ist damit geschlossen); (b) **mini-Sandbox-Baum** (`/tmp/sb32-…`, Term `quanten-protocol` auf Concept-Bodies **und** `log.md` verteilt) → exakte Candidate-Liste nur Concept-Pfade (`wiki/alpha.md`, `wiki/sub/beta.md`; `log.md` ausgeschlossen, `wiki/gamma.md` ohne Term nicht getroffen); normalisiert `alpha`, `sub/beta`; **Zwei-Run-Identität** (SHA-256 `159092bb…` ≡); Kontrolle ohne `--exclude` → `log.md` wird Kandidat (B1-Falle belegt und geschlossen); (c) §5.6-Formeln unverändert re-executierbar: Formel 2 (Form-Check) `0` (Exit 0), Formel 3 (Dangling-Check) keine Ausgabe, Formel 4 Ist-Zählung **38** (kein `wiki/`-Dateimenge-Change durch Story 3.2 — keine Re-Baseline nötig). **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 3.1, Story 3.2 mutiert keine Concept-Inhalte; `wiki/log.md` bleibt frontmatterlos, Punkt 10); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 4 und AC 5. `git status --porcelain -- wiki/` nach diesem Run: ausschließlich `log.md` (modifiziert) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, kein Ghost-Diff. - **Story 3.1 «Inkrementellen Datenfluss implementieren (Interpret → Reconcile → Synthesize → Update)» → `done` (bmad-code-review Loop 2, 4 Layer: blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor; Diff-Baseline `802a557` → `efc543c`; Nutzer-Entscheidungen D-1/D-2/D-3/D-4 = 1/1/1/1, jeweils empfohlene Option):** `schema/compiler.md` → **Revision 2.4.2** (alle 4 Decision-Resolutions + 16 Patches, rein textuell — kein Code, kein Standalone, keine neue §7-Klasse): (1) **D-1: Diff-Selbsttest (Pkt. 5) operationalisiert** — Probe = `git diff --name-only -- wiki/` **plus** `git status --porcelain -- wiki/` (erfasst ungetrackte `??`-Dateien — die Duplikat-Kontrolle braucht diese Sicht; `git diff` allein ist blind dafür), **Probe-Zeitpunkt vor dem Commit** (am Ende des P2-Blocks, nach den Mutationen; nach dem Commit wäre die Probe vacuous, AD-17f), erlaubte Menge um **Neu-Anlage-Zielpfade** (§5.1/§5.7) ergänzt (Misch-Runs: keine fälschlichen Ghost-Diffs), **Pfad-Normalisierung** (Strip `wiki/`-Präfix + `.md`-Suffix vor dem Teilmenge-Vergleich), **Rollback-Mechanik** deterministisch benannt (`git checkout -- ` für modifizierte Pfade, ungetrackte löschen, Index `git checkout -- `); (2) **D-2: R-1-Baseline deterministisch** — `` (HEAD der vorherigen Mutations-Boundary, AD-17f) wird vom Producer **im `wiki/log.md`-Run-Eintrag notiert** (voller SHA; AD-14: Git liefert Historie, nicht Domain-State — deshalb die Notiz); **Diskrepanz-Regel**: `git diff` gewinnt, SHA-256 bleibt Sekundär-Fingerprint; **Fallback**: ohne vorherige Mutations-Boundary gelten alle `raw/`-Dateien als Zuwachs; (3) **D-3: INPUT_UNCOMMITTED-Abbruch implementiert** — neuer P2-Check-Block-Element (1) **Input-Zustand**: Working-Copy von `raw/`+`wiki/` gegen HEAD prüfen, bei Abweichung **benannter Abbruch „published/committed Input erforderlich"** (AD-17a) vor Interpretation und vor jeder Mutation — die gefrorene I/O-Matrix-Verpflichtung ist damit als Zustandsprüfung + Abbruchmeldung umgesetzt (zuvor nur Referenz auf §1 Pkt. 1); die **Spec↔Anker-Divergenz** (frozen Spec zitiert 3× „§1.1", §1 ist eine nummerierte Liste Pkt. 1–4 ohne §1.1-Label) ist als dokumentierte Fußnote in Rev-2.4.2 gesichert (Spec bleibt frozen); (4) **D-4: Sandbox-Edge-Test-Nachweis** — die fünf I/O-Matrix-Szenarien (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) + die D-3-Abbruch-Kontrolle sind als re-executierbares Skript (`_bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh`, `bash …` ab Workspace-Root, Sandbox-Bäume unter `/tmp`) mit **konkreten deterministischen Ausgaben** in der Spec-`## Verification Record (Ausführungs-Beleg, 2026-08-19)` verankert — die Verweise „in der Spec-Verification enthalten" (dieses Log, `deferred-work.md`) sind damit auflösbar; (5) **Instruktions-Präzisierungen:** P2-Block-Zeitpunkt (nach Reconcile, am Anfang der Mutationsphase; Diff-Probe am Block-Ende), **No-Op-Kandidat**-Regel (Evidenz bereits vollständig enthalten → keine Mutation/kein `at`-Bump/kein `log.md`-Eintrag, byte-identisch), **Mehrfach-Treffer-Reihenfolge** für alle Einheiten (Zuwachs-Sicht-Ordnung; lexicografisch nur Tie-Break — AD-17h), **Update-Pfad-Rollback** in §5.3 Pkt. 3 (modifizierte Pfade aus Baseline-Commit wiederherstellen), **`generated.at`↔AD-17h-Gap** explizit benannt (Home: Story 3.8 — Wanduhr-`at` erzeugt bei gleichem Input unterschiedliche Bundle-States; Konvention A0-20 bleibt bindend, Wechsel = Ask-First), Term-Ableitung als §2-Interpretation abgegrenzt (Erhebung mit festem Term deterministisch; Term-Mechanismus Story 3.2), Link-Following mit besuchter Menge (keine Schleife bei zyklischen Links), **Worked Example (Pkt. 7) auf den realen Ist-Baum korrigiert** (`rg -l 'FR-12' wiki/` trifft `wiki/knowledge-kompilation-inkrementell.md`, nicht `wissensarchitektur/source-material.md` — das Rev-2.4.1-Beispiel enthielt den Term nicht), stale-Anker (`§3.2-Kollisionsprüfung`, `§3-Voraussetzungsprüfung`, §5.8-Pkt.-3-Zeiger „Pkt. 1" → „Pkt. 2") nachgeführt. **Abschlussklausel Rev 2.4.2:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **Review-Loop-2-Aufarbeitung zum Implementierungs-Eintrag (2026-08-18, oben):** (a) der dortige (b)-Diff-Selbsttest-Beleg zitierte die Vor-Rev-2.4.1-Form `git diff --stat -- wiki/` — die operative Probe ist seit Rev 2.4.2 die D-1-Form (`git diff --name-only -- wiki/` + `git status --porcelain -- wiki/`); (b) der Implementierungs-Eintrag dokumentierte „Revision 2.4" — der Story-3.1-Commit `efc543c` enthält **Revision 2.4 + 2.4.1** (Step-04-Review-Patch-Runde 2026-08-18, in `deferred-work.md` als „Story-3.1-Review-Protokoll" protokolliert) und ist jetzt auf **2.4.2** (dieser Eintrag) fortgeführt; (c) Statuskette: `in-progress` (Implementierungs-Eintrag) → `review` (Review-Handoff `efc543c`) → **`done`** (dieser Eintrag — Loop-2-Abschluss: 4 Decision-Resolutions + 16 Patches, keine unresolved Findings; spec-Frontmatter `status: 'done'` + `review_loop_iteration: 2` deckungsgleich). **Selbsttest-Beleg (re-executiert 2026-08-19, ab Workspace-Root, D-1-Probe-Form; `` = `802a5576eb4bbf54761a947e43e68b7e7ea9d67d` = Review-Baseline, hier als Konventions-Demonstration notiert — bei echten Run-Einträgen ist es der HEAD der vorherigen Mutations-Boundary, D-2):** (a) Instruktions-Integrität — `grep -n "5.9" schema/compiler.md` → §5.9-Sektion vorhanden; `grep -n "Aktualisierung ist Epic 3" schema/compiler.md` → **kein Treffer** (Hold ersetzt, unverändert); (b) **Diff-Selbsttest (Erhaltungs-Invariante)** — `git diff --name-only 802a557… -- wiki/` → ausschließlich `wiki/log.md` (dieser Eintrag; keine Concept-Datei, kein Index, kein Ghost-Diff auf nicht betroffenen Pfaden — die Instruktions-Story mutiert keine Concept-Inhalte; FT-6/FR-12) + `git status --porcelain -- wiki/` → ` M wiki/log.md` (tracked, modifiziert — im erlaubten Satz; **keine** `??`-Einträge = keine ungetrackten neuen Dateien = kein Duplikat); normalisiert: `log` ⊆ erlaubte Menge (`log.md`); (c) **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 2.5, Story 3.1 mutiert keine Concept-Inhalte); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 3 und AC 5; (d) **Sandbox-/Edge-Tests (I/O-Matrix)** — ausgeführt, echte Outputs in der **Spec-`## Verification Record (Ausführungs-Beleg, 2026-08-19)`** (re-executierbar: `bash _bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh`): S1 HAPPY_PATH_UPDATE (Probe → `alpha`, `log`; 0 untracked), S2 UNTOUCHED_CONCEPT (leere Probe), S3 CONCEPT_COLLISION_BESTEHEND (nur `M`-Einträge, kein `??`), S4 CHANGE_DETECTION (außschließlich `raw/alpha-v2.md`; SHA-256 `21e7fc1d…` identisch), S5 PRE_RUN_RECONCILE (Run-FAIL V-1, Zustand sauber), S6 INPUT_UNCOMMITTED (benannter Abbruch „published/committed Input erforderlich (AD-17a)"). `sprint-status.yaml`: `3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile` `review` → **`done`**, `last_updated` → 08-19-2026. ## 2026-08-18 -- 2.54.0 From 9b256fa5adc22fceb1e28a07efbf4504e0004878 Mon Sep 17 00:00:00 2001 From: Michael Tamse Date: Wed, 19 Aug 2026 15:21:48 +0200 Subject: [PATCH 09/16] =?UTF-8?q?feat:=20Story=203.3=20Review-Loop-1-Patch?= =?UTF-8?q?es=20(bmad-code-review,=203=20Layer;=20kein=20Loopback)=20?= =?UTF-8?q?=E2=80=94=20Pr=C3=A4zedenz-Reihenfolge=20Korrigieren=E2=86=92Pr?= =?UTF-8?q?=C3=A4zisieren=E2=86=92Erweitern=E2=86=92No-Op=20(AD-17h),=20No?= =?UTF-8?q?-Op=20als=20Nicht-Form,=20Korrigieren-Original-Wortlaut-Erhaltu?= =?UTF-8?q?ng;=20Sandbox=20U1=E2=80=93U9=20(U8/U9=20Negativ-Kontrollen,=20?= =?UTF-8?q?volle=20byte-Identit=C3=A4t,=20reelle=20S-N-Anker,=20-eq=201-Ko?= =?UTF-8?q?nsolidierung,=20Frontmatter-Reihenfolge/Duplikat);=205=20Defers?= =?UTF-8?q?=20=E2=86=92=20deferred-work.md;=20Spec=20done=20+=20Suggested?= =?UTF-8?q?=20Review=20Order;=20Story=20done?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- .../implementation-artifacts/deferred-work.md | 27 + .../sandbox-3-3/run-sandbox.sh | 392 ++++++++++++++ ...cepts-erweitern-präzisieren-korrigieren.md | 148 +++++ .../sprint-status.yaml | 4 +- .../story-3-3-review-diff.txt | 505 ++++++++++++++++++ schema/compiler.md | 9 +- wiki/log.md | 3 + 7 files changed, 1085 insertions(+), 3 deletions(-) create mode 100644 _bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh create mode 100644 _bmad-output/implementation-artifacts/spec-3-3-bestehende-concepts-erweitern-präzisieren-korrigieren.md create mode 100644 _bmad-output/review-artifacts/story-3-3-review-diff.txt diff --git a/_bmad-output/implementation-artifacts/deferred-work.md b/_bmad-output/implementation-artifacts/deferred-work.md index c36c3ae..2ba9fcd 100644 --- a/_bmad-output/implementation-artifacts/deferred-work.md +++ b/_bmad-output/implementation-artifacts/deferred-work.md @@ -2,6 +2,33 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Einträge werden append-only ergänzt; bestehende Einträge werden nicht verändert. +## Deferred from: code review of spec-3-3-bestehende-concepts-erweitern-präzisieren-korrigieren (Story 3.3, 2026-08-19) + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-3-bestehende-concepts-erweitern-präzisieren-korrigieren.md` + summary: **`sprint-status.yaml last_updated`-Präzisions-Regression** — die Story-3.3-Sprint-Sync hat `last_updated` von `08-19-2026 13:14` (mit Uhrzeit, HEAD-Stand) auf reines Datum `08-19-2026` reduziert; die Pre-3.3-Konvention hielt die `HH:MM`-Granularität. Das Verhalten ist eine General-Eigenschaft des sync-sprint-status-Shared-Sub-Steps (Schritt-06), keine Story-3.3-Inhaltsentscheidung. Home: nächstes Sprint-Sync (Step-06) oder Sync-Verbesserung, die `last_updated` aus dem Zeitstempel ableitet. + evidence: `git show HEAD:_bmad-output/implementation-artifacts/sprint-status.yaml` → `last_updated: 08-19-2026 13:14` vs. Working Tree `08-19-2026` (Step-04-Review 2026-08-19, Verification-Gap-Layer, re-executiert verifiziert). + status: offen + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-3-bestehende-concepts-erweitern-präzisieren-korrigieren.md` + summary: **Frozen Story-3.1-No-Op-Bullet trägt die Typos „Schärferung" und „Formata"** — `schema/compiler.md` §5.9 Pkt. 2 (No-Op, `:267`): „keine Schärferung" (inkonsistent zur konsistenten „Schärfung" der neuen operationellen Ebene) und „keiner der drei Formata" (→ „Formate"). Beide sitzen im **frozen** Story-3.1-Text (HEAD-identisch, nicht durch Story 3.3 eingeführt), den die Story-3.3-Operationelle-Ebene operationalisiert; ein fix wäre Re-Negotiation des frozen Textes (Ask-First). Home: nächste Compiler-Instruktions-Revision, die §5.9 Pkt. 2 ohnehin berührt. + evidence: `git show HEAD:schema/compiler.md` `:267` (frozen): „keine Schärferung, keine Ersetzung … keiner der drei Formata greift" — Step-04-Review (2026-08-19, Verification-Gap-Layer), via `git show` verifiziert. + status: offen + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-3-bestehende-concepts-erweitern-präzisieren-korrigieren.md` + summary: **U6-Zwei-Run-Identitäts-Nachweis überzeichnet „auch nach Commit" und kreuzreferenziert den `generated.at`↔AD-17h-Gap nicht** — der Claim „identische SHA-256 … auch nach Commit" gilt für alpha.md (reproduzierbar `6b148dd1…`) im Worktree-/Staged-Zustand; `wiki/log.md` embeddet den random `$BASE`-SHA (`log_update`), daher weicht der log.md-Hash je Run ab (konstruktionsbedingt — der Commit ist die jeweilige Mutations-Boundary). Der at↔AD-17h-Gap (gleiche Evidenz, zwei Runs → verschiedene `at`) ist in compiler.md offen verankert. Home: Story 3.8 (Determinismus-Vertrag, AD-17h — Behandlung von `at` und des Bundle-State-Vergleichs). + evidence: Step-04-Review (2026-08-19, Verification-Gap-Layer): Sandbox-Doppellauf — alpha.md SHA `6b148dd1…` reproduzierbar, log.md SHA je Lauf verschieden (`89b82cb2…`, `358bad3b…`); compiler.md at↔AD-17h-Hinweis (generated.at-Konvention). + status: offen (Home: Story 3.8) + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-3-bestehende-concepts-erweitern-präzisieren-korrigieren.md` + summary: **Sandbox-U2-Szenario ist selbst-erfüllend und U7 misst die reale REIHENFOLGE nicht** — U2 schärft durch Hinzufügen einer neuen Faktenbehauptung (neue Stelle), die nach dem Erweitern-Kriterium Erweitern wäre, und passt nur, weil das Präzisieren-Wording hartkodiert ist; die Form-Wahl-Prozedur selbst wird nicht geprüft. U7 begründet „v2 vor v3" als „lexikografischer Tie-Break", obwohl v2/v3 verschiedene Dateien sind (Tie-Break gilt nur bei identischem Ort); der Fall „R-1-Dateiordnung ≠ lexikografische Ordnung" bleibt ungetestet. Kein Instruktions-Defekt (Abgrenzungs-Reihenfolge ist jetzt deterministisch fixiert), sondern Test-Eigenschaften-Hinweis. Home: nächste Sandbox-Erweiterung (Story 3.4/3.5) — eine Form-Wahl-Klassifikationsprobe + U7-Ordnungs-Variante mit nicht-lexikografischer R-1-Reihenfolge. + evidence: Step-04-Review (2026-08-19, Blind-Hunter + Verification-Gap-Layer): `run-sandbox.sh` U2 (neue Faktenbehauptung via `sed`, hartkodiertes Präzisieren-Wording), U7 (Ordering-Rationale vs. `compiler.md:268` REIHENFOLGE-Definition — Zuwachs-Sicht, lexikografisch nur bei identischem Ort). + status: offen + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-3-bestehende-concepts-erweitern-präzisieren-korrigieren.md` + summary: **Gemischte Normalisierungs-Politik im Sandbox-Evidenztext (Umlaute vs. Transkriptionen) ist ein Determinismus-Hazard für den Term-Abgleich** — Sandbox-Bodies nutzen Umlaut-Schreibweisen („Schlüssel", „läuft"), raw-Evidenz transkribiert („Schluessel"); die Abgrenzungskriterien beruhen auf Term-/Stellen-Abgleichen gegen §5.5-Inline-Verweise, und die §3.2-Normalisierung (lowercasing + `[-–_ ]`-Kollaps) deckt Umlaut-/Em-Dash-Divergenzen nicht. Bekannte Story-3.2-Lücke (Em-Dash, Home Story 3.8) plus Sandbox-interne Divergenzen. Home: Story 3.8 (Determinismus-Vertrag, Normalisierungs-Vollständigkeit) oder Sandbox-Vereinheitlichung in einer Folge-Story. + evidence: Step-04-Review (2026-08-19, Verification-Gap-Layer): `run-sandbox.sh` — U1/U2/U3/U7 Body mit Umlaut-Schreibweisen vs. raw-Evidenz mit Transkriptionen; §3.2-Pkt.-1b-Kollaps-Klasse ohne Umlaut-/Em-Dash. + status: offen (Home: Story 3.8) + - source_spec: `_bmad-output/implementation-artifacts/spec-1-2-sources-lokal-unter-raw-bereitstellen.md` summary: Checksum-/Fingerprint (SHA-256) der evtl. Git-Revision der Herkunftsquelle in `source.md` aufnehmen, damit die Provenienz reproduzierbar ist. evidence: Blind-Hunter-Review (Finding 1/2): `source.md`-Provenienz ist ohne Fingerprint der Quelle in einem reinen Clone nicht verifizierbar; AD-3-basiertes „neue, datierte Datei"-Schema braucht einen Maschinen-Lesbaren Stand. diff --git a/_bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh b/_bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh new file mode 100644 index 0000000..ef58d83 --- /dev/null +++ b/_bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh @@ -0,0 +1,392 @@ +#!/usr/bin/env bash +# Story 3.3 — Sandbox-Tests der operationellen Update-Formen (§5.9 Pkt. 2, Revision 2.8) +# Re-executierbar: bash run-sandbox.sh (ab Workspace-Root; Sandbox unter /tmp/sb33) +# Zweck: alle drei Update-Formen (Erweitern + Präzisieren + Korrigieren) + No-Op +# durchspielen; die Erhaltungs-Invariante (§5.9 Pkt. 5) als HARDE Assertion +# erzwingen (Diff nach Normalisierung ⊆ {betroffener Concept-Pfad, log}; keine +# neue Datei; kein Ghost-Diff); Zwei-Run-Identität (AD-17h/A0-19); +# Frontmatter-Konformität je mutiertem Concept (Vertrag §3.3/§3.4-Subset). +# Linux-Sandbox-Semantik auf einem /tmp-Baum — NIE der reale wiki/-Baum. +set -u +ROOT=$(mktemp -d /tmp/sb33-XXXXXX) +SB="$ROOT/sb" +mkdir -p "$SB/wiki" "$SB/raw" +cd "$SB" +git init -q +git config user.email "sandbox@test" +git config user.name "Sandbox" + +# ---------- Basis-Baum (committete Ausgangslage = Baseline-Commit) ---------- +# Concept alpha mit drei belegten Aussagen; Aussagen 1/2 sind fachlich korrekt, +# Aussage 3 ist fehlerhaft (Korrigieren-Ziel des Szenarios U3). beta ist ein +# nicht-betroffenes Kontroll-Concept (Ghost-Diff-Kontrolle, U5). +cat > wiki/index.md <<'EOF' +# Index +- [Alpha](alpha.md) +- [Beta](beta.md) +EOF +cat > wiki/alpha.md <<'EOF' +--- +type: concept +sources: + - resource: raw/alpha-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich (raw/alpha-v1.md#S-1). +Alpha läuft ausschließlich auf isolierten Netzen (raw/alpha-v1.md#S-3). +Alpha rotiert seine Schlüssel nie (raw/alpha-v1.md#S-2). +EOF +cat > wiki/beta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/beta-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Beta beschreibt ein anderes, hier nicht betroffenes Thema. +EOF +cat > wiki/log.md <<'EOF' +# Log +EOF +cat > raw/alpha-v1.md <<'EOF' +### S-1 +Evidenz v1: deterministische-init-sequenz für den Abgleich. +### S-2 +Evidenz v1: keine Rotation der Schlüssel. +### S-3 +Evidenz v1: Alpha läuft auf isolierten Netzen. +EOF +cat > raw/beta-v1.md <<'EOF' +### S-1 +Evidenz v1: Beta-Thema. +EOF +git add -A +git commit -qm "Baseline" +BASE=$(git rev-parse HEAD) +echo "BASELINE-COMMIT: $BASE" +echo "Sandbox-Root: $ROOT (loeschbar: rm -rf $ROOT)" +echo + +runlabel() { echo; echo "########## $1 ##########"; } +# Isolation: Worktree auf BASE zuruecksetzen (kein Carry-over ueber Szenarien) +isolate() { git checkout -q -b "$1" "$BASE" 2>/dev/null || git checkout -q "$1"; git reset -q --hard "$BASE"; git clean -qfd wiki raw; } + +# Pkt.-5-Probe (D-1-Form): Baseline-Diff + porcelain, normalisiert +# (wiki/-Praefix + .md-Suffix gestrippt, LC_ALL=C-sortiert; deterministisch, AD-17h) +probe() { + { git diff --name-only "$BASE" -- wiki/ ; git status --porcelain -- wiki/ | awk '{print $2}'; } \ + | sed -e 's|^wiki/||' -e 's|\.md$||' | LC_ALL=C sort -u +} +inv_set() { probe | LC_ALL=C sort -u | paste -sd' ' -; } + +# ---------- Harte Assertion der Erhaltungs-Invariante (§5.9 Pkt. 5) ---------- +# Erwartete erlaubte Menge = Space-getrennte normalisierte Pfade +# (z. B. "alpha log"). Jeder Proben-Eintrag MUSS in der erlaubten Menge liegen — +# sonst Ghost-Diff (nicht betroffener Pfad) → HARD-FAIL, Exit 1 (NFR-4/FT-6). +assert_invariant() { + local expected="$1" got p bad=0 rcs=0 + got=$(inv_set) + for p in $got; do + case " $expected " in + *" $p "*) ;; + *) echo "HARD-FAIL (Erhaltungs-Invariante §5.9 Pkt. 5): '$p' ist kein Ghost-Diff-negativer Eintrag — erlaubte Menge: {$expected}" >&2; bad=1;; + esac + done + # Keine neue Datei (Duplikat-Kontrolle: die ??-Sicht fehlt git diff allein) + rcs=$(git status --porcelain -- wiki/ | grep -c '^??' || true) + [ "$rcs" -eq 0 ] || { echo "HARD-FAIL (keine neue Datei): $rcs ungetrackte neue Datei(en) unter wiki/ (Duplikat/Ghost-Diff)" >&2; bad=1; } + if [ "$bad" -eq 0 ]; then + echo "RESULT: PASS — Probe {$got} ⊆ erlaubte Menge {$expected}; keine neue Datei; kein Ghost-Diff" + else + exit 1 + fi +} + +# ---------- Frontmatter-Konformitaet je mutiertem Concept (Vertrag §3.3/§3.4, §6.5) ---------- +# $1=Datei; $2...=erwartete sources[].resource-Werte. Prueft: Top-Level-Key-Subset +# {type,sources,generated,verified,status,stale_after}, sources-Eintrag-Key-Subset +# (Vertrag §3.3-Innen-Ebene), type=concept, generated.at = volle ISO-8601-Datetime +# (die erlaubten Key-Mengen sind inline im awk-Subset-Vergleich hartkodiert). +assert_frontmatter() { + local f="$1"; shift + local r bad=0 + # Kontextuelle Validierung ueber awk: Top-Level-Subset {type,sources,generated, + # verified,status,stale_after}; Innen-Ebenen je Sektion — sources: Vertrag §3.3- + # Subset {resource,id,title,author,usage_count,last_modified}; generated/verified: + # {by,at} (Vertrag §3.4/§3.5). Jeder andere Key = unbefugt (Punkt 6, §6.5). + local v + v=$(awk ' + /^---$/{n++; if(n==2) exit; next} + /^[A-Za-z_][A-Za-z0-9_-]*:/{ + k=$0; sub(/:.*/,"",k) + if (k=="sources") top="sources" + else if (k=="generated" || k=="verified") top="genver" + else top="other" + if (k!="type" && k!="sources" && k!="generated" && k!="verified" && k!="status" && k!="stale_after") print "TOP_UNBEFUGT:" k + # Duplikat-Prohibition: jeder Top-Level-Key hoechstens einmal (Punkt 13). + if (seenk[k]++) print "DUP_KEY:" k + # Canonische Reihenfolge (Vertrag §3.x Normalform: type, sources, generated, + # verified, status, stale_after): jeder neue Key-Kandidat muss der canonichen + # Ordnung folgen — Verstoß via Ordnungs-Rang erkannt (ORDER_VIOLATION). + r=0 + if (k=="type") r=1; else if (k=="sources") r=2; else if (k=="generated") r=3 + else if (k=="verified") r=4; else if (k=="status") r=5; else if (k=="stale_after") r=6 + if (r>0 && r0) lastr=r + next + } + /^[[:space:]]/{ + gsub(/^[[:space:]]+/,""); sub(/^- /,""); gsub(/^[[:space:]]+/,""); + if (match($0, /^[A-Za-z_][A-Za-z0-9_-]*:/)) { + ik=substr($0,1,RLENGTH-1) + if (top=="sources" && ik!="resource" && ik!="id" && ik!="title" && ik!="author" && ik!="usage_count" && ik!="last_modified") print "INNER_UNBEFUGT:" ik + if (top=="genver" && ik!="by" && ik!="at") print "INNER_UNBEFUGT:" ik + if (top=="other") print "INNER_UNBEFUGT:" ik + } + } + ' "$f") + if [ -n "$v" ]; then + echo "HARD-FAIL (Frontmatter-Subset, Vertrag §3.3/§3.4/§3.5): $v in $f" >&2 + exit 1 + fi + grep -qE '^type: concept$' "$f" || { echo "HARD-FAIL: type=concept fehlt in $f" >&2; exit 1; } + grep -qE "^ at: [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|[+-][0-9]{2}:?[0-9]{2})$" "$f" || { echo "HARD-FAIL: generated.at ist keine volle ISO-8601-Datetime in $f" >&2; exit 1; } + for r in "$@"; do + grep -qF " - resource: $r" "$f" || { echo "HARD-FAIL: sources-Eintrag 'resource: $r' fehlt in $f" >&2; exit 1; } + done + echo "RESULT: PASS — Frontmatter-Konformitaet $f (Subset ok, generated.at volles Datetime)" +} + +# ---------- Update-Helfer (deterministisch; at gepinnt fuer Zwei-Run-Identitaet) ---------- +AT_NEW="2026-08-19T12:00:00Z" +bump_at() { sed -i "s|^ at: .*| at: $AT_NEW|" "$1"; } +add_source() { # $1=Datei $2=resource $3=id (Eintrag vor der generated:-Zeile einfuegen) + sed -i "s|^generated:| - resource: $2\n id: $3\ngenerated:|" "$1" +} +log_update() { # $1=Concept-Pfad $2=raw-Datei + printf '\n## 2026-08-19\n- Story 3.1-Update: %s (%s; Baseline %s)\n' "$1" "$2" "$BASE" >> wiki/log.md +} + +# ===================================================================== +runlabel "U1: ERWEITERN — neue belegte Aussage, bestehender Pfad wird erweitert (AC-1/FR-6)" +isolate u1 +cat > raw/alpha-v2.md <<'EOF' +### S-4 +Evidenz v2 (neue Aussage): Alpha-Replikation traegt einen zusaetzlichen Schluessel-Rotationszyklus. +EOF +git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" +echo "--- Kandidaten-Erhebung: rg -l 'schluessel-rotationszyklus' wiki/ ---" +if command -v rg >/dev/null 2>&1; then rg -l 'schluessel-rotationszyklus' -g '!log.md' wiki/ || true +else grep -rl 'schluessel-rotationszyklus' --exclude=log.md wiki/ || true; fi +echo "--- UPDATE: neue Aussage als Absatz angefuegt (§5.5-Inline-Beleg), sources-Zuwachs s2, at-Bump ---" +cat >> wiki/alpha.md <<'EOF' +Alpha führt für die Replikation einen zusätzlichen Schlüssel-Rotationszyklus (raw/alpha-v2.md#S-4). +EOF +add_source wiki/alpha.md raw/alpha-v2.md s2 +bump_at wiki/alpha.md +log_update alpha raw/alpha-v2.md +echo "--- Struktur-Erhaltung: bestehende drei Aussagen byte-identisch erhalten? ---" +grep -qF 'Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich (raw/alpha-v1.md#S-1).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 1 wurde beim Erweitern umgeschrieben" >&2; exit 1; } +grep -qF 'Alpha läuft ausschließlich auf isolierten Netzen (raw/alpha-v1.md#S-3).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 2 (Netze) wurde beim Erweitern umgeschrieben" >&2; exit 1; } +grep -qF 'Alpha rotiert seine Schlüssel nie (raw/alpha-v1.md#S-2).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 3 wurde beim Erweitern umgeschrieben" >&2; exit 1; } +echo "RESULT: PASS — bestehende belegte Aussagen unveraendert (Struktur-Erhaltungsregel Erweitern)" +echo "--- Probe (Pkt. 5, vor dem Commit) ---"; probe +assert_invariant "alpha log" +assert_frontmatter wiki/alpha.md raw/alpha-v1.md raw/alpha-v2.md + +# ===================================================================== +runlabel "U2: PRAEZISIEREN — bestehende Aussage wird an ihr selbst geschaerft (AC-2/FR-6)" +isolate u2 +cat > raw/alpha-v2.md <<'EOF' +### S-1 +Evidenz v2 (Praezisierung): die deterministische-init-sequenz wird nach der initialen Synchronisation zusaetzlich rotiert. +EOF +git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" +echo "--- UPDATE: Aussage 1 an Position geschaerft, Beleg nachgefuehrt (Multi-Beleg §5.5); kein Satz-Umbau ---" +sed -i 's|^Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich (raw/alpha-v1.md#S-1)\.|Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich und rotiert sie nach der initialen Synchronisation zusätzlich (raw/alpha-v1.md#S-1; raw/alpha-v2.md#S-1).|' wiki/alpha.md +add_source wiki/alpha.md raw/alpha-v2.md s2 +bump_at wiki/alpha.md +log_update alpha raw/alpha-v2.md +echo "--- Struktur-Erhaltung: Aussagen 2/3 unveraendert, geschaerfte Aussage 1 an Position? ---" +grep -qF 'Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich und rotiert sie nach der initialen Synchronisation zusätzlich (raw/alpha-v1.md#S-1; raw/alpha-v2.md#S-1).' wiki/alpha.md || { echo "HARD-FAIL: geschaerfte Aussage fehlt" >&2; exit 1; } +grep -qF 'Alpha läuft ausschließlich auf isolierten Netzen (raw/alpha-v1.md#S-3).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 2 wurde beim Praezisieren veraendert" >&2; exit 1; } +grep -qF 'Alpha rotiert seine Schlüssel nie (raw/alpha-v1.md#S-2).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 3 wurde beim Praezisieren veraendert" >&2; exit 1; } +echo "RESULT: PASS — Schaerfung an der Aussage selbst, Position/Struktur erhalten, kein Satz-Umbau" +echo "--- Probe ---"; probe +assert_invariant "alpha log" +assert_frontmatter wiki/alpha.md raw/alpha-v1.md raw/alpha-v2.md + +# ===================================================================== +runlabel "U3: KORRIGIEREN — fehlerhafte Aussage abgeloest, nicht still geloescht (AC-2, AD-16-Default)" +isolate u3 +cat > raw/alpha-v2.md <<'EOF' +### S-2 +Evidenz v2 (Korrektur): Alpha rotiert seine Schluessel bei jeder Sitzung. +EOF +git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" +echo "--- UPDATE: Aussage 3 wird explizit abgeloest + Ersetzungsbeleg; keine stille Loeschung ---" +sed -i 's|^Alpha rotiert seine Schlüssel nie (raw/alpha-v1.md#S-2)\.|Alpha rotiert seine Schlüssel nie (raw/alpha-v1.md#S-2) — überholt durch: Alpha rotiert seine Schlüssel bei jeder Sitzung (raw/alpha-v2.md#S-2).|' wiki/alpha.md +add_source wiki/alpha.md raw/alpha-v2.md s2 +bump_at wiki/alpha.md +log_update alpha raw/alpha-v2.md +echo "--- AD-16-Default: alte Aussagen 1/2 textuell erhalten (keine stille Loeschung, keine flankierende Umschreibung)? ---" +grep -qF 'Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich (raw/alpha-v1.md#S-1).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 1 wurde beim Korrigieren flankierend umgeschrieben" >&2; exit 1; } +grep -qF 'Alpha läuft ausschließlich auf isolierten Netzen (raw/alpha-v1.md#S-3).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 2 wurde beim Korrigieren flankierend umgeschrieben" >&2; exit 1; } +grep -qF 'Alpha rotiert seine Schlüssel nie (raw/alpha-v1.md#S-2)' wiki/alpha.md || { echo "HARD-FAIL: alte Aussage wurde still geloescht oder ihr Wortlaut verändert (AD-16, Struktur-Erhaltungsregel Korrigieren)" >&2; exit 1; } +grep -qF 'rotiert seine Schlüssel bei jeder Sitzung (raw/alpha-v2.md#S-2)' wiki/alpha.md || { echo "HARD-FAIL: Ersetzungsbeleg fehlt" >&2; exit 1; } +echo "RESULT: PASS — Abloesung mit Ersetzungsbeleg, Provenienz erhalten (AD-16-Default Erhaltung)" +echo "--- Probe ---"; probe +assert_invariant "alpha log" +assert_frontmatter wiki/alpha.md raw/alpha-v1.md raw/alpha-v2.md + +# ===================================================================== +runlabel "U4: NO_OP — Evidenz ist bereits vollstaendig im Body (engere Auslegung, Pkt. 2)" +isolate u4 +cat > raw/alpha-v2.md <<'EOF' +Evidenz v2 (Redundanz): deterministische-init-sequenz fuer den Abgleich; Alpha rotiert seine Schluessel nie. +EOF +git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" +echo "--- Kandidaten-Erhebung: Terme treffen alpha; die Evidenz ist bereits vollstaendig enthalten ---" +echo "--- UPDATE: KEINE Body-Mutation, KEIN at-Bump, KEIN sources-Zusatz, KEIN log.md-Eintrag (byte-identisch) ---" +if git status --porcelain -- wiki/ | grep -q .; then + echo "HARD-FAIL (No-Op): Wiki-Baum ist nicht byte-identisch" >&2 + git status --porcelain -- wiki/ + exit 1 +fi +echo "RESULT: PASS — No-Op: keine Mutation, kein at-Bump, kein sources-Zusatz, kein log.md-Eintrag (byte-identisch)" +echo "--- Probe (leer = Ghost-Diff-negativ, leere Menge ist Teilmenge jeder erlaubten Menge) ---"; probe +assert_invariant "" + +# ===================================================================== +runlabel "U5: NEGATIV-KONTROLLE — Assertions-Mechanik erkennt einen Ghost-Diff (nicht vacuous)" +isolate u5 +echo "unbefugte Mutation auf nicht-betroffenem beta" >> wiki/beta.md # simulierter Ghost-Diff +echo "--- Probe (erwartet: beta ausserhalb der erlaubten Menge {alpha log}) ---"; probe +if ( assert_invariant "alpha log" ) >/dev/null 2>&1; then + echo "HARD-FAIL (Assertions-Mechanik): Ghost-Diff auf beta wurde NICHT erkannt" >&2 + exit 1 +else + echo "RESULT: PASS — Ghost-Diff auf beta wurde erkannt (Assertions-Mechanik loest verlaesslich HARD-FAIL aus, kein Ghost-Diff kommt durch)" +fi + +# ===================================================================== +runlabel "U6: ZWEI-RUN-IDENTITAET (AD-17h/A0-19) — gleicher Git-State + gleiches Eingabeset -> identischer Update-Vorgang" +# Zwei unabhaengige Runs ueber dieselbe Evidenz (Erweitern); die Ergebnisse +# (mutierter Body + Frontmatter + Status) muessen byte-identisch sein. +run_erweitern() { # $1 = Branchname; mutiert Worktree, dann git add -A (Staging) + isolate "$1" + cat > raw/alpha-v2.md <<'EOF' +### S-4 +Evidenz v2 (neue Aussage): Alpha-Replikation traegt einen zusaetzlichen Schluessel-Rotationszyklus. +EOF + git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" + cat >> wiki/alpha.md <<'EOF' +Alpha führt für die Replikation einen zusätzlichen Schlüssel-Rotationszyklus (raw/alpha-v2.md#S-4). +EOF + add_source wiki/alpha.md raw/alpha-v2.md s2 + bump_at wiki/alpha.md + log_update alpha raw/alpha-v2.md + git add -A # Staging — die Mutationen sind Teil des Runs (Commit-Boundary = Mutations-Boundary) +} +run_erweitern u6a +A_ALPHA=$(sha256sum wiki/alpha.md | cut -d' ' -f1) # Worktree-Inhalt = staged-Inhalt (git add) +A_LOG=$(sha256sum wiki/log.md | cut -d' ' -f1) +git commit -qm "Run A (Erweitern)" +A_ALPHA_COM=$(git show HEAD:wiki/alpha.md | sha256sum | cut -d' ' -f1) +run_erweitern u6b +B_ALPHA=$(sha256sum wiki/alpha.md | cut -d' ' -f1) +B_LOG=$(sha256sum wiki/log.md | cut -d' ' -f1) +git commit -qm "Run B (Erweitern)" +B_ALPHA_COM=$(git show HEAD:wiki/alpha.md | sha256sum | cut -d' ' -f1) +echo "Run A (alpha.md): $A_ALPHA" +echo "Run B (alpha.md): $B_ALPHA" +echo "Run A (log.md): $A_LOG" +echo "Run B (log.md): $B_LOG" +echo "Run A commit (alpha.md): $A_ALPHA_COM ; Run B commit (alpha.md): $B_ALPHA_COM" +if [ "$A_ALPHA" = "$B_ALPHA" ] && [ "$A_LOG" = "$B_LOG" ] && [ "$A_ALPHA_COM" = "$B_ALPHA_COM" ]; then + echo "RESULT: PASS — zwei unabhaengige Runs ueber dieselbe Evidenz -> identischer Update-Vorgang (AD-17h/A0-19)" +else + echo "HARD-FAIL (Determinismus-Vertrag): Run A und Run B weichen ab" >&2 + exit 1 +fi + +# ===================================================================== +runlabel "U7: MEHRFACH_TREFFER — zwei Neuevidenzen desselben Runs treffen denselben Concept-Pfad (Konsolidierung, I/O-Matrix)" +# Matrix-Zeile MEHRFACH_TREFFER: mehrere neue Wissenseinheiten desselben Runs auf +# denselben Pfad -> EIN konsolidiertes Update (eine Body-Mutation, EIN log.md-Eintrag, +# EIN konsolidierter sources-Zuwachs, EIN generated.at). Reihenfolge = Zuwachs-Sicht +# (Ankunftsreihenfolge der Belege); lexikografischer Tie-Break bei identischem Ort +# (Body-Ende) -> alpha-v2.md vor alpha-v3.md. +isolate u7 +cat > raw/alpha-v2.md <<'EOF' +### S-4 +Evidenz v2 (neue Aussage): Alpha-Replikation nutzt Quorum-Bestaetigung. +EOF +cat > raw/alpha-v3.md <<'EOF' +### S-4 +Evidenz v3 (neue Aussage): Alpha-Replikation waechst linear zum Cluster. +EOF +git add -A; git commit -qm "Zwei Einheiten, ein Run (raw/alpha-v2.md + raw/alpha-v3.md)" +echo "--- Kandidaten-Erhebung: beide Terme treffen denselben Pfad alpha ---" +echo "--- KONSOLIDIERTES UPDATE: beide Aussagen als Absaetze angehaengt (Zuwachs-Sicht: v2 vor v3), EIN log-Eintrag, sources-Zuwachs s2+s3, EIN at ---" +cat >> wiki/alpha.md <<'EOF' +Alpha-Replikation nutzt Quorum-Bestaetigung (raw/alpha-v2.md#S-4). +Alpha-Replikation waechst linear zum Cluster (raw/alpha-v3.md#S-4). +EOF +add_source wiki/alpha.md raw/alpha-v2.md s2 +add_source wiki/alpha.md raw/alpha-v3.md s3 +bump_at wiki/alpha.md +log_update alpha "raw/alpha-v2.md + raw/alpha-v3.md" +echo "--- Konsolidierung: genau EIN log.md-Eintrag und EIN generated.at trotz zweier Einheiten? ---" +[ "$(grep -c 'Story 3.1-Update: alpha' wiki/log.md)" -eq 1 ] || { echo "HARD-FAIL: Mehrfach-Treffer erzeugte nicht exakt einen log.md-Eintrag (Konsolidierung oder Eintragspflicht Pkt. 4 verletzt)" >&2; exit 1; } +grep -qF 'raw/alpha-v2.md' wiki/log.md || { echo "HARD-FAIL: konsolidierter log.md-Eintrag verlinkt raw/alpha-v2.md nicht (Pkt. 4, genutzte raw/-Quellen)" >&2; exit 1; } +grep -qF 'raw/alpha-v3.md' wiki/log.md || { echo "HARD-FAIL: konsolidierter log.md-Eintrag verlinkt raw/alpha-v3.md nicht (Pkt. 4, genutzte raw/-Quellen)" >&2; exit 1; } +[ "$(grep -c '^ at:' wiki/alpha.md)" -eq 1 ] || { echo "HARD-FAIL: Mehrfach-Treffer erzeugte mehrere generated.at" >&2; exit 1; } +echo "--- Struktur-Erhaltung: alte Aussagen byte-identisch, beide neuen Aussagen vorhanden, Zuwachs-Sicht-Ordnung v2-vor-v3 ---" +grep -qF 'Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich (raw/alpha-v1.md#S-1).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 1 wurde beim konsolidierten Update umgeschrieben" >&2; exit 1; } +grep -qF 'Alpha läuft ausschließlich auf isolierten Netzen (raw/alpha-v1.md#S-3).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 2 wurde beim konsolidierten Update umgeschrieben" >&2; exit 1; } +grep -qF 'Alpha rotiert seine Schlüssel nie (raw/alpha-v1.md#S-2).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 3 wurde beim konsolidierten Update umgeschrieben" >&2; exit 1; } +grep -qF 'Quorum-Bestaetigung (raw/alpha-v2.md#S-4)' wiki/alpha.md || { echo "HARD-FAIL: neue Aussage aus v2 fehlt" >&2; exit 1; } +grep -qF 'waechst linear zum Cluster (raw/alpha-v3.md#S-4)' wiki/alpha.md || { echo "HARD-FAIL: neue Aussage aus v3 fehlt" >&2; exit 1; } +v2pos=$(grep -n 'Quorum-Bestaetigung' wiki/alpha.md | cut -d: -f1); v3pos=$(grep -n 'waechst linear' wiki/alpha.md | cut -d: -f1) +[ "$v2pos" -lt "$v3pos" ] || { echo "HARD-FAIL: Zuwachs-Sicht-Ordnung verletzt (v3 vor v2)" >&2; exit 1; } +echo "RESULT: PASS — ein konsolidiertes Update (eine Body-Aenderung, ein log-Eintrag, ein sources-Zuwachs s2+s3, ein at); Zuwachs-Sicht-Ordnung v2-vor-v3" +echo "--- Probe ---"; probe +assert_invariant "alpha log" +assert_frontmatter wiki/alpha.md raw/alpha-v1.md raw/alpha-v2.md raw/alpha-v3.md + +# ===================================================================== +runlabel "U8: STRUKTUR-VERLETZUNG — unbefugter Frontmatter-Key wird erkannt (Pkt. 5 Struktur-Ebene, P2-Check-Element (6))" +isolate u8 +echo "--- simulierter Verstoß gegen die Struktur-Erhaltung: unbefugter Frontmatter-Key 'foo' im YAML-Block ---" +awk '/^type: concept$/{print; print "foo: bar"; next} {print}' wiki/alpha.md > /tmp/sb33-fm && mv /tmp/sb33-fm wiki/alpha.md +echo "--- Probe + Frontmatter-Konformität (erwartet: HARD-FAIL, Verstoß textuell benannt, NFR-4) ---"; probe +if ( assert_invariant "alpha log" && assert_frontmatter wiki/alpha.md ) >/dev/null 2>&1; then + echo "HARD-FAIL (Struktur-Ebene): unbefugter Frontmatter-Key wurde NICHT erkannt (Pkt. 5/Pkt. 6-Element (6))" >&2 + exit 1 +else + echo "RESULT: PASS — unbefugter Frontmatter-Key wird als Struktur-Verstoß erkannt (Frontmatter-Subset-HARD-FAIL ausgelöst)" +fi + +# ===================================================================== +runlabel "U9: NEUE-DATEI — ungetrackte neue Datei unter wiki/ wird erkannt (??-Sicht, Duplikat-Kontrolle)" +isolate u9 +echo "--- simulierter Ghost-Diff: ungetrackte neue Datei wiki/neu.md (Duplikat, ??-Sicht) ---" +echo "unbefugte neue Concept-Datei" > wiki/neu.md +echo "--- Probe (erwartet: neu ausserhalb erlaubter Menge + ??-Sicht-HARD-FAIL) ---"; probe +if ( assert_invariant "alpha log" ) >/dev/null 2>&1; then + echo "HARD-FAIL (Keine-neue-Datei): ungetrackte neue Datei wiki/neu.md wurde NICHT erkannt (??-Sicht, Duplikat-Kontrolle)" >&2 + exit 1 +else + echo "RESULT: PASS — ungetrackte neue Datei unter wiki/ wird über die ??-Sicht erkannt (Duplikat/Ghost-Diff, keine neue Datei)" +fi + +echo +echo "===== Sandbox abgeschlossen (alle 9 Tests U1-U9) =====" +echo "Sandbox-Root: $ROOT (loeschbar: rm -rf $ROOT)" diff --git a/_bmad-output/implementation-artifacts/spec-3-3-bestehende-concepts-erweitern-präzisieren-korrigieren.md b/_bmad-output/implementation-artifacts/spec-3-3-bestehende-concepts-erweitern-präzisieren-korrigieren.md new file mode 100644 index 0000000..99b4eff --- /dev/null +++ b/_bmad-output/implementation-artifacts/spec-3-3-bestehende-concepts-erweitern-präzisieren-korrigieren.md @@ -0,0 +1,148 @@ +--- +title: 'Bestehende Concepts erweitern/präzisieren/korrigieren — Update-Formen operativ schärfen (Story 3.3)' +type: 'feature' +created: '2026-08-19' +status: 'done' +review_loop_iteration: 0 +baseline_commit: 52f88fdc5f3ea0fe5323412ca3ba8b4a1bdbf549 +context: + - _bmad-output/implementation-artifacts/epic-3-context.md +--- + + + +## Intent + +**Problem:** Story 3.1 verankerte die Update-Mechanik (Erweitern/Präzisieren/Korrigieren) in `schema/compiler.md` §5.9 als Regeltext, Story 3.2 die Candidate-Erhebung (§3.2). Unoperativ bleibt die **Ausführung je Update-Form** — v. a. das Story-3.3-AC aus FR-6: „der Text wird präzisiert oder korrigiert, **ohne die Struktur zu zerstören**". Der Compiler hat keine deterministische Anleitung, wie Präzisieren (Schärfen einer bestehenden Aussage) von Erweitern (Anfügen) abzugrenzen ist und was die „Struktur" (Frontmatter, bestehende belegte Aussagen, Provenienz-Verkettung) beim Übergriff auf einen bestehenden Absatz schützt. + +**Approach:** Story 3.3 schärft §5.9 (Revision 2.8): die drei Update-Formen werden **operationell** ausformuliert — je Form ein deterministisch prüfbares **Abgrenzungskriterium** (Welche Form greift wann?), die **Struktur-Erhaltungsregel** (was bleibt unverändert: Frontmatter-Subset, bestehende belegte Aussagen + §5.5-Inline-Verweise, §5.6-Pin) und der Textgenauigkeits-Rahmen (Schärfen an der Aussage, kein Satz-Umbau, kein Neuschreiben ohne Ersetzungsbeleg). Zusätzlich eine **re-executierbare Sandbox** (`sandbox-3-3/run-sandbox.sh`, Muster Story-3.1): Demonstriert einen echten Update-Run mit committeter Neuevidenz in allen drei Formen + No-Op und prüft die Erhaltungs-Invariante (§5.9 Pkt. 5) als harte Assertion. Keine Inhalts-Mutation des realen Bundles (kein neues `raw/`-Material, AD-3); kein neues Prädikat, kein Vertrag-/Validator-/`raw/`-Change; kein Standalone (D-3). + +## Boundaries & Constraints + +**Always:** +- **Instruktions-Story (D-3):** Schärfung ausschließlich in `schema/compiler.md` §5.9 als deterministischer Text. Kein executable, kein Standalone, keine neue §7-Invaliditätsklasse, kein Change an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3). +- **Struktur-Erhaltungs-Invariante (Kern, FR-6/AC-2):** Update tastet die Struktur nicht an — (1) Frontmatter bleibt Subset-konform (nur `sources`-Zuwachs um echten neuen Beleg + `generated.at`-Bump zulässig); (2) bestehende belegte Aussagen werden nicht umgeschrieben ohne Präzisieren an ihr selbst bzw. Korrigieren mit Ersetzungsbeleg (§5.5-Inline-Verweise bleiben gültig soweit Beleg Body-Bestand); (3) gepinnte Linkform unverändert, keine neuen Links außer bei echten Beziehungen (§5.9 Pkt. 3). +- **Determinismus (AD-17h/A0-19):** Form-Wahl folgt aus der committeten Evidenz; gleicher Git-State + gleiche Eingabemenge → identischer Update-Vorgang. Abgrenzungsregeln textuell prüfbar (neue Aussage → Erweitern; Schärfung einer bestehenden → Präzisieren; ersetzende → Korrigieren). +- **Kein Leasing-Scope in 3.3:** AC-4 (Mutation nur im geleasten Bereich, AD-17.3) bleibt Story 3.5/3.6; AD-17f-Basis unverändert. §5.9 Pkt. 5/6-R1/P2-Bausteine unverändert. +- `sprint-status.yaml`: Key `3-3-bestehende-concepts-erweitern-präzisieren-korrigieren` → **in-progress** (bei Implementierung). + +**Ask First:** §5.6-Linkform-Änderung (A0-9) · AD-7d-Renames · Inhalts-Mutation des realen Bundles · Validator-/Vertrags-/`raw/`-Change · Commit-Boundary-Änderung · Leasing-Ausweitung (3.5-Scope). + +**Never:** Änderungen an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3) · neue §7-Invaliditätsklasse · Standalone (D-3) · Duplikat-Anlage eines bestehenden Pfads · „Regenerate Everything" (AD-5/A0-6) · stille Löschung von Provenienz ohne Ersetzungsbeleg (AD-16) · stiller Absatz-Neuschreib (Structure-Preservation-Fall). + +## I/O & Edge-Case Matrix + +| Scenario | Input / State | Expected Output / Behavior | Error Handling | +|----------|--------------|---------------------------|----------------| +| HAPPY_ERWEITERN | Neue committete Evidenz trägt eine neue belegte Aussage zum bestehenden Concept | **Erweitern:** neue Aussage als Absatz ergänzt (mit §5.5-Inline-Beleg), bestehende Aussagen unverändert; `sources`-Zuwachs um echten neuen Beleg; `at`-Bump; `log.md`-Eintrag „Story 3.1-Update" | NO_MATCH → UNTOUCHED_CONCEPT (keine Mutation) | +| HAPPY_PRAEZISIEREN | Evidenz schärft eine bestehende Aussage (präzisierende Information, FR-6/AC-2) | **Präzisieren:** Formulierung/Abgrenzung an der bestehenden Aussage geschärft, Position/Struktur erhalten; Beleg nachgeführt; kein Satz-Umbau/Neuschreib | keine bestehende Aussage als Anker → nicht Präzisieren (ggf. Erweitern) | +| HAPPY_KORRIGIEREN | Evidenz ersetzt eine fehlerhafte/überholte Aussage | **Korrigieren:** ersetzte Aussage **nicht still gelöscht**, sondern explizit abgelöst + Ersetzungsbeleg (AD-16-Default Erhaltung) | widersprechender Inhalt ohne Ersetzungsevidenz → bleibt erhalten, Disagreement in `log.md` (Epic-4-Interface) | +| NO_OP_KANDIDAT | Evidenz bereits vollständig im Body enthalten | **No-Op:** keine Mutation, kein `at`-Bump, kein `sources`-Zusatz, kein `log.md`-Eintrag — byte-identisch | im Zweifel greift Erweitern/Präzisieren (No-Op = engere Auslegung) | +| STRUKTUR_ERHALT | Update greift in Body mit belegten Aussagen + Inline-Verweisen | Struktur unverändert: Subset, Verweise, Linkform; kein unbefugter Key | Verstoß → Update fehlerhaft; Rollback + textuell benannter Verstoß (NFR-4) | +| MEHRFACH_TREFFER | Mehrere Einheiten desselben Runs treffen denselben Pfad | Konsolidierung: ein Update, ein `log.md`-Eintrag, ein konsolidierter `sources`-Zuwachs, ein `at` | Reihenfolge = Zuwachs-Sicht; lexikografischer Tie-Break | + + + +## Code Map + +- `schema/compiler.md` — **primär mutiert** (D-3, einziger Instruktions-Ort): + - §5.9 Pkt. 2 (`:261-269`): drei Update-Formen **operationell ausformulieren** (a) Abgrenzungskriterium je Form, (b) Struktur-Erhaltungsregel (Definition „Struktur" + was unverändert bleibt), (c) Textgenauigkeits-Rahmen für Präzisieren. Bestehender Regeltext (Form-Bullets, `sources`-Regel, `at`-Konvention, No-Op, Konsolidierung) bleibt normativ **unverändert** — Schärfung als Ausführungs-Ebene ohne neue Logik. + - §5.9 Pkt. 5 (`:272-278`): Erhaltungs-Invariante — Struktur-Erhaltungs-Bezug ergänzen (Diff-Probe erfasst Pfad-Mengen; Struktur pro Pfad über Pkt.-2-Regeln geprüft). + - §5.9 Pkt. 6 (`:279-281`): P2-Block — Struktur-Erhaltungs-Check als zusätzliches textuelles Element (keine unbefugten Keys, keine stille Löschung, Links unverändert). + - §8 Revisionslog (`:375`): **Revision 2.8** (Story 3.3) mit Abschlussklausel (kein Vertrags-/Validator-/`raw/`-Change, keine §7-Klasse, kein Standalone). +- `_bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh` — **neu** (re-executierbar, Muster Story-3.1-Sandbox): Mini-Bundle mit einem Concept + committeter Neuevidenz; alle drei Formen + No-Op durchspielen; Erhaltungs-Invariante als harte Assertion (Diff ⊆ {betroffener Pfad, log}; keine neue Datei; kein Ghost-Diff); Zwei-Run-Identität; Frontmatter-Konformität je mutiertem Concept. +- `wiki/log.md` — **append** (append-only, Vertrag §5): Story-3.3-Eintrag (Schärfung, Sandbox-Nachweis, Statuswechsel, Validator-Verdikt); bestehende Bullets unverändert. +- `_bmad-output/implementation-artifacts/sprint-status.yaml` — **mutiert**: Key `3-3-…` (`:56`) → `in-progress` (→ `done` bei Story-Abschluss). +- `schema/validator.md`, `schema/wiki-compiler.md`, `raw/…` — **read-only** (AD-3). Keine Concept-Inhalts-Mutation (Instruktions-Story; kein neues committetes `raw/`-Material vorhanden — Demonstration per Sandbox). + +## Tasks & Acceptance + +**Execution:** +- [x] `schema/compiler.md` — §5.9-Pkt.-2-Update-Formen operationell schärfen (je Form Abgrenzungskriterium + Struktur-Erhaltungsregel + Textgenauigkeits-Rahmen; bestehender Regeltext unverändert) · §5.9-Pkt.-5/-6: Struktur-Bezug + P2-Check-Element · §8 Revision 2.8; ohne Change an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/`. +- [x] `sandbox-3-3/run-sandbox.sh` — Update-Run-Demonstrator (Erweitern + Präzisieren + Korrigieren + No-Op), Erhaltungs-Invariante als harte Assertion, Zwei-Run-Identität. **Erweitert um U7 MEHRFACH_TREFFER** (I/O-Matrix-Row, Konsolidierung mehrerer Einheiten auf denselben Pfad) — alle 7 Tests (U1–U7) PASS, Exit 0. +- [x] `wiki/log.md` — Story-3.3-Eintrag (Vertrag §5, append-only): Schärfung, Sandbox-Nachweis, Statuswechsel, per-Datei-Validator-Verdikt. +- [x] `sprint-status.yaml` — Key `3-3-…` → in-progress. + +**Acceptance Criteria:** +- Given eine neue Erkenntnis zu einem bestehenden Concept, when der Run sie verarbeitet, then erweitert er das bestehende Concept anstelle der Anlage einer neuen Datei (AC-1; FR-6) — Erweitern-Regel in §5.9 Pkt. 2, Sandbox belegt sie (keine neue Datei im Diff). +- Given eine präzisierende Information, when sie eingearbeitet wird, then wird der Text präzisiert oder korrigiert, ohne die Struktur zu zerstören (AC-2; FR-6) — Struktur-Erhaltungsregel in §5.9 Pkt. 2/5 definiert. +- Given eine Aktualisierung, when sie erfolgt, then bleiben Beziehungen und Provenienz soweit weiterhin gültig erhalten (AC-3; FR-6) — Inline-Verweise + Linkform unverändert gültig soweit Beleg Body-Bestand; `sources`-Zuwachs nur um echte neue Belege. +- Given die Instruktion, when geprüft, then bleibt `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3), keine neue §7-Klasse, kein Standalone (D-3), kein Leasing-Scope (AC-4 → 3.5/3.6, AD-17.3-Hinweis in §7) — Validator auf Ist-Bundle SUCCESS (7/7 unverändert). + +## Spec Change Log + +*(Append-only — hier von step-04 während der Review-Loops befüllt.)* + +### Review Loop 1 (Step-04, 2026-08-19) — 3 Subagenten (blind-hunter 9, edge-case-hunter 2+Minors, verification-gap 18) + +**Klassifikation (Dedupe → Severity → Route):** High — Verifikations-Lücken des Sandbox-Nachweises (byte-Identität nur Teilmengen-assertiert; Struktur-Ebene/`??`-Sicht nie exerziert; U7 `-le 1`), Form-Abgrenzungs-Überlapp (keine Präzedenz → AD-17h-Gefahr), §5.5-Ankerform (`#S-N` ohne reale Kennung im Rohdokument). Medium — U3-Wortlaut-Mutation der abgelösten Aussage, `last_updated`-Präzisions-Regression, Frontmatter-Prüfung vollständig (Reihenfolge/Duplikat), No-Op-Form-Asymmetrie, „kein neuer normativer Inhalt" vs. Pkt.-5/6-Änderung, at↔AD-17h-Gap-Kreuzreferenz. Low — Diff-Artefakt-Pfade, Spec-Change-Log leer (per Konvention erst jetzt befüllt). + +**Ergebnis: kein intent_gap, kein bad_spec** (kein Loopback) — **patch** (auto-fixiert, s. Diff): §5.9 Pkt.-2-Operationelle-Ebene — Präzedenz-Reihenfolge `Korrigieren → Präzisieren → Erweitern → No-Op` + Überlapp-Bindung + No-Op als Nicht-Form + at↔AD-17h-Kreuzreferenz; Korrigieren-Struktur-Erhaltung — Original-Wortlaut bleibt als abgelöster Bestand erhalten; Sandbox — U1/U2/U3 byte-Identität auf alle drei Aussagen erweitert, U8 (unbefugter Frontmatter-Key → Struktur-HARD-FAIL) + U9 (ungetrackte neue Datei → `??`-Sicht-HARD-FAIL) neu, U7 `-le 1` → `-eq 1` + beide raw/-Quellen im konsolidierten log-Eintrag, assert_frontmatter um canoniche Reihenfolge + Duplikat-Prohibition erweitert, reale `S-N`-Anker in allen raw/-Evidenzdateien (§5.5), U3-Wortlaut nicht mehr verändert. **defer** (append-only `deferred-work.md`): `last_updated`-Präzision (sync-sprint-status-General), „Schärferung/Formata"-Typos (frozen Story-3.1-Text), „auch nach Commit"-Überzeichnung + at↔AD-17h-Gap-Kreuzreferenz (Home Story 3.8), U2-Selbsterfüllung + Zuwachs-Sicht-vs-lexikografisch-Rationale (Form-Wahl-Prüfung als Verfahren), Em-Dash/Umlaut-Normalisierung im Sandbox-Evidenztext. **reject:** U6-SHA-Reproduzierbarkeit von log.md (random baseline-SHA ist konstruktionsbedingt), Diff-Artefakt-Pfad-Präfix (nur Verbrauchskontext), Spec-Change-Log „leer" (per Konvention erst während Review-Loops befüllt). + +## Design Notes + +**Warum Ergänzung, nicht Umbau:** Die Story-3.3-Schärfung ist ein Ausführungs-Sub-Block an Pkt. 2 — sie definiert die offene Frage „Was tue ich konkret bei jedem Form-Fall, und was lasse ich unangetastet?" als deterministische Brücke Regel → Run (AD-17h): dieselbe Evidenz + formale Struktur → identisches Update-Ergebnis. Der frozen Story-3.1-Regeltext bleibt unverändert; die operationellen Regeln werden als Präzisierungsebene darunter angefügt (keine Re-Negotiation). + +**Struktur-Definition (das Geschützte):** (1) Frontmatter (Subset + canonische Reihenfolge; zulässig: `sources`-Zuwachs, `at`-Bump; kein neuer Key, keine Entfernung ohne Beleg); (2) bestehende belegte Aussagen mit §5.5-Inline-Verweisen (nicht umgeschrieben ohne dass Präzisieren/Korrigieren greift); (3) Linkzeichen §5.6-Pin (kein Linkumbau bei reinem Body-Update). Das ist die Bedeutung von „ohne die Struktur zu zerstören" (FR-6/AC-2). + +**Abgrenzungskriterium (aus der Evidenz):** (a) belegte Aussage existiert im Body nicht → Erweitern; (b) schärft bestehende Formulierung/Abgrenzung ohne Ersatz → Präzisieren; (c) ersetzt eine bestehende als fehlerhaft/überholt → Korrigieren; (d) nichts davon → No-Op. Unschärfe → zugunsten Erweitern/Präzisieren (No-Op = engere Auslegung, bestehende §5.9-Regel). + +## Verification + +**Commands (re-executierbar, ab Workspace-Root):** +1. `bash _bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh` — expected: alle Szenarien mit harten Pass/Fail-Assertionen, Erhaltungs-Invariante erzwungen, Exit 0. +2. `grep -n "Struktur-Erhaltungsregel\|operationelle\|Revision 2.8" schema/compiler.md` — liefert die operationellen Regeln + Revisionslog. +3. Read-only (AD-3): `git status --porcelain` zeigt keinen Change an `schema/validator.md`/`schema/wiki-compiler.md`/`raw/`. +4. Validator-Lauf: alle `wiki/`-Dateien SUCCESS (unverändert, keine Inhalts-Mutation). + +**Manual checks:** +- §5.9 Pkt. 2 trägt Abgrenzungskriterium + Struktur-Erhaltungsregel + Textgenauigkeits-Rahmen; bestehender Regeltext unverändert; §8-Rev-2.8 mit Abschlussklausel; kein `validator.md`/`wiki-compiler.md`/`raw/`-Diff; §7 ohne neuen Platzhalter (Update-Thema entlassen, AC-4-Leasing an 3.5/3.6); `wiki/log.md`-Eintrag datiert mit Story-3.3-Semantik + Sandbox-Nachweis + Statuswechsel + Verdikt; `sprint-status.yaml` konsistent. + +## Suggested Review Order + +**Abgrenzungs-Mechanik der Update-Formen (Kern)** + +- Einstieg: die neue operationelle Ausführungs-Ebene — Präzedenz-Reihenfolge Korrigieren → Präzisieren → Erweitern → No-Op, deterministische Form-Wahl (AD-17h/A0-19), No-Op als Nicht-Form. + [`compiler.md:270`](../../schema/compiler.md#L270) + +- Korrigieren schützt den abgelösten Original-Wortlaut (AD-16-Default, keine stille Löschung). + [`compiler.md:271`](../../schema/compiler.md#L271) + +- Präzisieren: Schärfen an der Aussage selbst, kein Satz-Umbau; No-Op-Erhaltungsregel volle Byte-Identität. + [`compiler.md:272`](../../schema/compiler.md#L272) + +**Struktur-Erhaltungs-Invariante + P2-Check** + +- Die Pfad-Probe verifiziert jetzt zwei Ebenen — Menge + Struktur je berührtem Pfad (FR-6/AC-2). + [`compiler.md:283`](../../schema/compiler.md#L283) + +- P2-Check-Block-Element (6): keine unbefugten Keys, keine stille Löschung, Linkform-Pin. + [`compiler.md:287`](../../schema/compiler.md#L287) + +- Revisionslog Revision 2.8 mit Abschlussklausel (kein Vertrags-/Validator-/`raw/`-Change). + [`compiler.md:382`](../../schema/compiler.md#L382) + +**Re-executierbarer Sandbox-Nachweis** + +- U8: unbefugter Frontmatter-Key löst die Struktur-Ebene-HARD-FAIL aus — Negativ-Kontrolle der Kern-Invariante. + [`run-sandbox.sh:365`](./sandbox-3-3/run-sandbox.sh#L365) + +- U9: ungetrackte neue Datei wird über die `??`-Sicht erkannt (Duplikat-Kontrolle). + [`run-sandbox.sh:378`](./sandbox-3-3/run-sandbox.sh#L378) + +- U7: Konsolidierung mehrerer Einheiten auf einen Pfad — ein log-Eintrag, beide raw/-Quellen verlinkt. + [`run-sandbox.sh:320`](./sandbox-3-3/run-sandbox.sh#L320) + +- assert_frontmatter: canoniche Reihenfolge + Duplikat-Prohibition (Vertrag §3.3/§3.4-Subset). + [`run-sandbox.sh:118`](./sandbox-3-3/run-sandbox.sh#L118) + +**Provenienz & Status** + +- Review-Loop-1-Bullet: Klassifikation, Patches, Defers, Rejects; Spec-Status `in-review`. + [`log.md:4`](../../wiki/log.md#L4) + +- Defer-Einträge (5) inkl. Home Story 3.8 für at↔AD-17h-Gap und Normalisierungs-Lücken. + [`deferred-work.md:9`](./deferred-work.md#L9) + +- Sprint-Status Key `3-3-…`: Review-Abschluss-Flip auf `done`. + [`sprint-status.yaml:56`](./sprint-status.yaml#L56) diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 0b39b41..48d72da 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -29,7 +29,7 @@ # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) # - Retrospective appends its action items to action_items; the status view surfaces open ones generated: 08-14-2026 00:00 -last_updated: 08-19-2026 13:14 +last_updated: 08-19-2026 13:21 project: wow20 project_key: NOKEY tracking_system: file-system @@ -53,7 +53,7 @@ development_status: epic-3: in-progress 3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: done 3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip: done - 3-3-bestehende-concepts-erweitern-präzisieren-korrigieren: backlog + 3-3-bestehende-concepts-erweitern-präzisieren-korrigieren: done 3-4-wissen-aus-mehreren-sources-synthetisieren: backlog 3-5-leasing-dirty-tree-schutz-für-konkurrierende-producer-umsetz: backlog 3-6-lease-staleness-recovery-basis-absichern: backlog diff --git a/_bmad-output/review-artifacts/story-3-3-review-diff.txt b/_bmad-output/review-artifacts/story-3-3-review-diff.txt new file mode 100644 index 0000000..ecf8da8 --- /dev/null +++ b/_bmad-output/review-artifacts/story-3-3-review-diff.txt @@ -0,0 +1,505 @@ +# ===== REVIEW DIFF — Story 3.3 (baseline 52f88fdc) ===== + +## TRACKED DIFF: +diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml +index 0b39b41..77d517d 100644 +--- a/_bmad-output/implementation-artifacts/sprint-status.yaml ++++ b/_bmad-output/implementation-artifacts/sprint-status.yaml +@@ -29,7 +29,7 @@ + # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) + # - Retrospective appends its action items to action_items; the status view surfaces open ones + generated: 08-14-2026 00:00 +-last_updated: 08-19-2026 13:14 ++last_updated: 08-19-2026 + project: wow20 + project_key: NOKEY + tracking_system: file-system +@@ -53,7 +53,7 @@ development_status: + epic-3: in-progress + 3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: done + 3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip: done +- 3-3-bestehende-concepts-erweitern-präzisieren-korrigieren: backlog ++ 3-3-bestehende-concepts-erweitern-präzisieren-korrigieren: in-progress + 3-4-wissen-aus-mehreren-sources-synthetisieren: backlog + 3-5-leasing-dirty-tree-schutz-für-konkurrierende-producer-umsetz: backlog + 3-6-lease-staleness-recovery-basis-absichern: backlog +diff --git a/schema/compiler.md b/schema/compiler.md +index 9b41799..85f22a2 100644 +--- a/schema/compiler.md ++++ b/schema/compiler.md +@@ -267,6 +267,11 @@ Diese Sektion ist der **einzige Instruktions-Ort** der Update-Mutationsmechanik + - **No-Op-Kandidat (Review-Loop-2-Präzisierung):** Erhebt die Kandidatenerhebung einen Pfad, dessen Body die neue Evidenz **bereits vollständig enthält** (keiner der drei Update-Formen greift — keine neue belegte Aussage, keine Schärferung, keine Ersetzung), ist der Kandidat ein **No-Op**: **keine** Body-Mutation, **kein** `generated.at`-Bump, **kein** `sources`-Zusatz, **kein** `log.md`-Eintrag — der Pfad bleibt byte-identisch (Erhaltungs-Invariante, Pkt. 5). Die Entscheidung „keiner der drei Formata greift" ist selbst textuell deterministisch: sie trifft nur, wenn die neue Evidenz keine Aussage trägt, die im Body nicht bereits als belegte Aussage vorhanden ist (Term-/Stellen-Abgleich mit §5.5-Inline-Verweisen); im Zweifel (neue belegte Aussage auch nur in abgewandelter Form) greift Erweitern/Präzisieren — der No-Op ist die *engere* Auslegung. + - **Mehrfach-Treffer-Konsolidierung (ein Run, mehrere Einheiten auf denselben Concept-Pfad):** Ergeben mehrere neue Wissenseinheiten desselben Runs auf **demselben** bestehenden Concept-Pfad ein Update, werden ihre Mutationen in **einem einzigen Update dieses Pfads** konsolidiert (eine Body-Änderung, **ein** `log.md`-Eintrag „Story 3.1-Update", ein konsolidierter `sources`-Zuwachs, **ein** `generated.at`-Zeitstempel — der einmalige `at` des Runs). Die Reihenfolge der Einheiten wird dabei textual-deterministisch aus der Verarbeitung der Evidenz abgeleitet: REIHENFOLGE = **Auftritt der Einheiten in der Zuwachs-Sicht** (Datei-Reihenfolge des R-1-Zuwachsbefunds, dann Stellen-Reihenfolge innerhalb der Datei); nur bei Einheiten desselben Ortes (identischer Dateipfad + identische Stelle) greift die lexicografische Ordnung als Tie-Break (Review-Loop-2-Präzisierung: die Reihenfolge ist für *alle* Einheiten definiert, nicht nur für vollständig unabhängige). Die AD-16-Default-Erhaltung bleibt für jede betroffene Stelle gewahrt. + - **Commit-Boundary = Mutations-Boundary (AD-17f, §0):** Auch im Update-Pfad werden **Zwischenstände nie als fertige Mutation veröffentlicht** — die Mutationen der Update-Kandidaten werden als Ganzes committet, und zwar erst, nachdem der Diff-Selbsttest (Pkt. 5) ohne Ghost-Diff abgeschlossen ist. Ein Ghost-Diff ist dann als **Abbruch-Vorlauf „korrigierter Teil-Run"** im `log.md`-Eintrag des betroffenen Runs gekoppelt (siehe Disagreement-/Run-Notiz Pkt. 4), damit die Ursache textuell nachvollziehbar bleibt. ++ - **Operationelle Ausführungs-Ebene je Update-Form (Präzisierungsebene, Story 3.3 / Revision 2.8; kein neuer normativer Inhalt — deterministische Brücke Regel → Run, AD-17h/A0-19):** Die folgenden Ausführungs-Regeln präzisieren, **was der Producer bei jedem Form-Fall konkret tut und was er unangetastet lässt**. Je Form gelten (a) das **Abgrenzungskriterium** (Welche Form greift wann? — ausschließlich aus der committeten Evidenz abgeleitet), (b) die **Struktur-Erhaltungsregel** (was bleibt unverändert — die „Struktur" aus FR-6/AC-2: Frontmatter-Subset, bestehende belegte Aussagen mit §5.5-Inline-Verweisen, §5.6-Pin) und (c) der **Textgenauigkeits-Rahmen** (wie geschärft wird). Gleicher Git-State + gleiche Eingabemenge → identischer Update-Vorgang (AD-17h). ++ - **Erweitern — Abgrenzungskriterium:** greift genau dann, wenn die neue committete Evidenz eine **neue belegte Aussage** trägt, die im bestehenden Body **nicht** existiert (Term-/Stellen-Abgleich gegen die §5.5-Inline-Verweise; kein bestehender Anker). **Struktur-Erhaltungsregel (Erweitern):** die neue Aussage wird als **eigener Absatz angefügt** (Body-Ende); bestehende belegte Aussagen bleiben **byte-identisch**, keine Umschreibung bestehender Absätze; Frontmatter nur `sources`-**Zuwachs um den echten neuen Beleg** + ein `generated.at`-Bump. **Textgenauigkeits-Rahmen (Erweitern):** die neue Aussage wird eigenständig formuliert, trägt den §5.5-Inline-Beleg mit existierender Stellen-Kennung; kein Satz-Umbau des Bestands. ++ - **Präzisieren — Abgrenzungskriterium:** greift genau dann, wenn die Evidenz eine **bestehende Formulierung/Abgrenzung schärft** (präzisierende Information an derselben Aussage, ohne Ersatz). **Struktur-Erhaltungsregel (Präzisieren):** die geschärfte Aussage bleibt an ihrer **Position**, das Satzgefüge wird **nicht umgebaut**, umgebende Aussagen, §5.5-Inline-Verweise anderer Aussagen und die §5.6-Linkform bleiben unverändert; der Beleg wird bei der Aussage neu/nachgeführt (§5.5). **Textgenauigkeits-Rahmen (Präzisieren):** Schärfen = Formulierung/Abgrenzung **an der Aussage selbst**; **kein Satz-Umbau** (keine Neustrukturierung des Absatzes), **kein Neuschreiben ohne Ersetzungsbeleg** — jede ersetzte Formulierung braucht die neue/fortgeführte `raw/`-Evidenz als Inline-Verweis. ++ - **Korrigieren — Abgrenzungskriterium:** greift genau dann, wenn die Evidenz eine bestehende Aussage als **fehlerhaft/überholt ersetzt**. **Struktur-Erhaltungsregel (Korrigieren):** die ersetzte Aussage wird **nicht still gelöscht**, sondern explizit durch die ersetzende Aussage **abgelöst**; die Ersetzung trägt den **Ersetzungsbeleg** (§5.5, AD-16-Default Erhaltung); die Ablösung erfolgt an der Position der ersetzten Aussage, der Rest des Bodys bleibt unverändert. **Textgenauigkeits-Rahmen (Korrigieren):** nur die fehlerhafte/überholte Aussage wird ersetzt; keine flankierende Umschreibung. ++ - **No-Op — Abgrenzungskriterium (engere Auslegung, bestehende Regel oben):** greift nur, wenn **keine** der drei Formen greift (die Evidenz ist bereits vollständig im Body); im Zweifel trifft Erweitern/Präzisieren — die Entscheidung ist textuell deterministisch (Term-/Stellen-Abgleich). + 3. **Index-/Link-Form unverändert (§5.6-Pin):** Ein reines Body-Update ändert die Concept-Identität nicht → der bestehende Index-Link (Bundleroot oder Area-`index.md`) bleibt unverändert gültig; **kein neuer Link** bei reinem Body-Update (kein Index-`index.md`-Zusatz). Die **`log.md`-Eintragspflicht** (Pkt. 4) bleibt davon **unberührt**: *jedes* Update — auch ein reines Body-Update — MUSS seinen `log.md`-Eintrag „Story 3.1-Update" führen; nur der **Index-**Link bleibt unverändert. Wird durch das Update eine Concept-Kategorie (Root vs. Area) oder die Identität berührt, ist das **Ask-First** (AD-7d-Renames/Redirects; nicht Teil von Story 3.1). Neue zulässige Concept-Links (Beziehungsschicht, §5.6) werden nur gesetzt, wenn die neue Erkenntnis eine echte, inhaltsbegründete Beziehung rechtfertigt. + 4. **`log.md`-Eintragspflicht (Vertrag §5):** Jedes Update wird als datumsgruppierter Eintrag in `wiki/log.md` dokumentiert (Header = ISO-Datum `YYYY-MM-DD`, neueste zuerst), verknüpft mit dem mutierten Concept-Pfad und den genutzten `raw/`-Quellen. Für Updates wird der Eintrag als „**Story 3.1-Update**" markiert (disambiguierbar von Anlage-Einträgen). Konflikt-/Erhaltungsfälle (Pkt. 2 „Korrigieren" ohne Ersetzungsevidenz) werden explizit als Disagreement-Eintrag mit dem mutierten Concept-Pfad geführt (AD-16b, Vertrag §5) — der Epic-4-Interface-Fall bleibt dokumentiert, ohne Korrektur-Klassifikation hier. + 5. **Erhaltungs-Invariante (Kern) + deterministischer Diff-Selbsttest (AD-17h, FT-6/FR-12):** Ein Compilation Run darf nur die Concepts **neu anlegen oder verändern**, die durch den erkannten Erkenntnis-Zuwachs tatsächlich betroffen sind. **Nicht betroffene Concept-Pfade bleiben byte-identisch unverändert** — es gibt **nie** „Regenerate Everything" (AD-5, A0-6). Die Inkrementalität ist als **re-executierbarer Diff-Selbsttest** mechanisch kontrollierbar: Nach jedem Run prüft der Producer ab der Workspace-Root +@@ -276,9 +281,10 @@ Diese Sektion ist der **einzige Instruktions-Ort** der Update-Mutationsmechanik + ``` + (erste Zeile: modifizierte/gelöschte Pfade gegen die Baseline; zweite Zeile: zusätzlich ungetrackte neue Pfade `??` und staged-Änderungen — die Duplikat-Kontrolle „keine neue Datei" braucht die `??`-Sicht, die `git diff` allein nicht liefert; `` siehe Pkt. 6 R-1) + dass die geänderten Dateien eine Teilmenge von **(Kandidatenliste ∪ Neu-Anlage-Zielpfade ∪ `log.md` ∪ nachgeführte `index.md`)** — mit der Kandidatenliste aus §3 Pkt. 2 (betroffene *bestehende* Concepts, relative OKF-Pfade ohne `.md`) **plus** den Zielpfaden aller im selben Run neu angelegten Concepts (§5.1/§5.7 — Misch-Runs) plus `log.md` und jede nachgeführte `index.md` als zusätzliche zulässige Einträge. **Probe-Zeitpunkt (D-1-Präzisierung):** die Probe läuft **vor dem Commit**, am Ende des P2-Check-Blocks (Pkt. 6) — nach dem Commit wäre `git diff` leer und die Probe vacuous (Commit-Boundary = Mutations-Boundary, AD-17f: der Run committiert erst, nachdem die Probe ohne Ghost-Diff abgeschlossen ist). **Pfad-Normalisierung vor dem Teilmenge-Vergleich:** die Proben-Ausgabe trägt `wiki/`-Präfix und `.md`-Endung; die Kandidaten-/Ziel-Pfade sind definiert als relative OKF-Pfade *ohne* `.md` — für den Vergleich werden von jedem Proben-Eintrag `wiki/`-Präfix und `.md`-Suffix gestrippt (deterministischer Normalisierungsschritt). Jede Abweichung (**Ghost-Diff** auf einem nicht betroffenen Pfad) ist ein Instruktions-Verstoß (FT-6): Der Producer behebt sie textuell benannt (NFR-4) und **rollt den Ghost-Diff zurück, bevor der Run als gültig vermerkt wird** — der beobachtbare Endzustand des Bundles bleibt damit konsistent (AD-6-Backstop). **Rollback-Mechanik:** der Ghost-Diff betrifft nur Pfade *außerhalb* der erlaubten Menge; der Producer stellt die betroffenen Pfade aus dem Baseline-Zustand wieder her (für modifizierte Pfade: `git checkout -- `; für ungetrackte neue Dateien: Datei löschen; für Index-Änderungen: `git checkout -- wiki/index.md` bzw. die Area-`index.md`) — der Teilzustand-Rollback des §5.3 Pkt. 3 / §6 Pkt. 3 greift daneben unverändert. Für Story 3.1 selbst (Instruktions-Story ohne Inhalts-Mutation) ist der Nachweis: `git diff --name-only -- wiki/` liefert ausschließlich `wiki/log.md` — keine Concept-Datei, keine `index.md` (die aggressive `git diff --stat -- wiki/`-Default-Effektiv-ausgabe zeigt denselben Pfad, `wiki/log.md | 1 +`). *(Anmerkung: `schema/compiler.md` und `deferred-work.md` liegen **außerhalb** `wiki/` und sind daher kein Teil dieser Diff-Probe — sie gehören zum Instruktions-, nicht zum Bundle-Baum; der Ghost-Diff-Begriff dieser Sektion gilt nur für `wiki/`.)* ++ Die Probe verifiziert dabei **zwei Ebenen** (Struktur-Erhaltungs-Bezug, Story 3.3): **(1) die Pfad-Mengen-Ebene** (obiger Teilmenge-Vergleich — welche Pfade der Run berührt hat) und **(2) die Struktur-Ebene je berührtem Pfad** — die Struktur-Erhaltung „ohne die Struktur zu zerstören" (FR-6/AC-2) wird pro betroffenem Concept-Pfad über die Pkt.-2-Regeln geprüft (Frontmatter-Subset-Konformität: nur `sources`-Zuwachs um echte neue Belege + `generated.at`-Bump, kein neuer Key, keine Entfernung ohne Beleg; bestehende belegte Aussagen nicht umgeschrieben ohne dass Präzisieren/Korrigieren greift; §5.5-Inline-Verweise weiterhin gültig soweit Beleg Body-Bestand; §5.6-Linkform unverändert, keine neuen Links außer bei echten Beziehungen — Verstöße sind textuell zu benennen (NFR-4) und werden vor dem Commit behoben, sonst gilt der Pfad als Ghost-Diff mit Rollback gemäß dieser Pkt.-5-Konsequenz). + 6. **Run-Vorphase-Bausteine (Defer R-1 + P2, in den Update-Pfad eingearbeitet):** Beide sind **keine** neuen Prozesse — wiederverwendbare, reproduzierbare textuelle Check-Blöcke innerhalb der Instruktions-Ausführung (D-3): + - **Change-Detection (Defer R-1, Input-Zuwachserkennung):** Vor der Interpretation bestimmt der Producer, **welche `raw/`-Dateien Zuwachs** sind (neu/modifiziert). Deterministische Mittel: `git diff --name-only -- raw/` auf das `raw/`-Verzeichnis und/oder der **SHA-256-Record aus `raw/**/source.md`** (Provenienz-Sidecar, §1 Pkt. 4). Als `` dient der **letzte committete Zustand des Workspace** (deterministisch: der HEAD der vorherigen Mutations-Boundary, AD-17f). **Auflösungs-Regel (D-2-Präzisierung, Review-Loop 2):** der Producer **notiert den `` (vollen SHA) im `wiki/log.md`-Eintrag des Runs** — damit ist er deterministisch auflösbar ohne Domain-State-Annahme an Git (AD-14: Git liefert Historie, nicht Domain-State; der log.md-Eintrag ist der State-Referenz-Punkt, keine Git-Historie-Interpretation). **Diskrepanz-Regel:** widersprechen sich `git diff`-Befund und SHA-256-Record für dieselbe Datei, **gewinnt der `git diff`-Befund** (Commit-Boundary = Mutations-Boundary, AD-17f); der SHA-256-Record bleibt Sekundär-Fingerprint. Ist der SHA-256-Record unlesbar/fehlend, wird die Datei dennoch als Zuwachs **nicht doppelt** verarbeitet (textueller Hinweis) und gegen den `git diff`-Befund abgeglichen (kein Doppel-Verdikt). **Fallback:** existiert keine vorherige Mutations-Boundary (frischer Workspace ohne Lauf-Historie), gilt **alle `raw/`-Dateien als Zuwachs**. Die Diff-Probe in Pkt. 5 läuft gegen **dasselbe** `` (Review-Loop-2-Korrektur des Rev-2.4.1-Claims: die Pkt.-5-Probe trägt das Baseline-Commit-Argument explizit). +- - **Pre-Run-Reconcile-Check-Block (Defer P2):** Vor jeder Mutation durchläuft der Producer den gebündelten Vorprüf-Block und hält ihn textuell fest: (1) **Input-Zustand** (AD-17a, I/O-Matrix `INPUT_UNCOMMITTED`; Review-Loop-2-D-3): Working-Copy von `raw/` und `wiki/` gegen HEAD prüfen — bei Abweichung (uncommitteder Zustand) bricht der Run mit dem **textuell benannten Abbruch „published/committed Input erforderlich"** ab, **vor** Interpretation und vor jeder Mutation (keine Mutation gegen Zwischenstände); (2) Ziel-Pfade (Ausgangs-Kandidatenliste, §3 Pkt. 2); (3) Quellen-Existenz (EC-1 via Validator-Punkt: jede referenzierte `raw/`-Datei existiert als Datei); (4) Betroffenheits-Kandidatenliste (§3 Pkt. 2, textuell-deterministisch); (5) `wiki/index.md`-V-1-Vorbedingung (fehlende Bundleroot → Run-FAIL, §3 Pkt. 3, Vertrag §2). Dieser Block ist der in `deferred-work.md` als P2 notierte Pre-Plan-Schritt und wird durch Story 3.1 als Teil des inkrementellen Runs ausgeführt. **Zeitpunkt (Review-Loop-2-Präzisierung):** der Block wird **nach Reconcile (2) und vor Mutieren (4)**, am **Anfang der Mutationsphase**, einmal pro Run durchgeführt — die Kandidatenliste (Elemente 2/4) existiert zu diesem Zeitpunkt bereits; die **Diff-Probe (Pkt. 5) läuft am Ende desselben Blocks, nach den Mutationen, vor dem Commit**. Die Kandidatenliste, die hier festgehalten wird, ist **die** Kandidatenliste, gegen die der Diff-Selbsttest (Pkt. 5) prüft (keine zweite, davon abweichende Erhebung nach der Mutation). ++ - **Pre-Run-Reconcile-Check-Block (Defer P2):** Vor jeder Mutation durchläuft der Producer den gebündelten Vorprüf-Block und hält ihn textuell fest: (1) **Input-Zustand** (AD-17a, I/O-Matrix `INPUT_UNCOMMITTED`; Review-Loop-2-D-3): Working-Copy von `raw/` und `wiki/` gegen HEAD prüfen — bei Abweichung (uncommitteder Zustand) bricht der Run mit dem **textuell benannten Abbruch „published/committed Input erforderlich"** ab, **vor** Interpretation und vor jeder Mutation (keine Mutation gegen Zwischenstände); (2) Ziel-Pfade (Ausgangs-Kandidatenliste, §3 Pkt. 2); (3) Quellen-Existenz (EC-1 via Validator-Punkt: jede referenzierte `raw/`-Datei existiert als Datei); (4) Betroffenheits-Kandidatenliste (§3 Pkt. 2, textuell-deterministisch); (5) `wiki/index.md`-V-1-Vorbedingung (fehlende Bundleroot → Run-FAIL, §3 Pkt. 3, Vertrag §2); (6) **Struktur-Erhaltungs-Check (Story-3.3-Ergänzung als zusätzliches textuelles Element):** vor dem Commit prüft der Producer an den betroffenen Concept-Pfaden, dass keinerlei unbefugte Keys im Frontmatter entstanden sind (Vertrag §3.3/§3.4-Subset, §6.5-Kriterium-1), **keine stille Löschung** bestehender belegter Aussagen/Provenienz erfolgt ist (AD-16, Pkt. 2 „Korrigieren"-Form) und **keine Links** verändert oder ohne echte Beziehung neu gesetzt wurden (§5.6-Pin, Pkt. 3); Verstöße sind textuell benannt (NFR-4) und vor dem Commit zu beheben; die Kandidatenliste bleibt **die** Liste gegen die der Diff-Selbsttest (Pkt. 5) prüft (keine zweite Erhebung nach der Mutation). Dieser Block ist der in `deferred-work.md` als P2 notierte Pre-Plan-Schritt und wird durch Story 3.1 als Teil des inkrementellen Runs ausgeführt. **Zeitpunkt (Review-Loop-2-Präzisierung):** der Block wird **nach Reconcile (2) und vor Mutieren (4)**, am **Anfang der Mutationsphase**, einmal pro Run durchgeführt — die Kandidatenliste (Elemente 2/4) existiert zu diesem Zeitpunkt bereits; die **Diff-Probe (Pkt. 5) läuft am Ende desselben Blocks, nach den Mutationen, vor dem Commit**. + 7. **Worked Example (an die reale Ist-Lage gebunden, re-executiert; Review-Loop-2-Korrektur):** Ein Run mit neuer committeter Evidenz `raw/epics/epics-2026-08-14.md#FR-12` (Zuwachs über die bisher verarbeitete Stelle hinaus; die Kennung FR-12 existiert real in der Datei) trifft über `rg -l 'FR-12' -g '!log.md' wiki/` das bestehende Root-Concept `wiki/knowledge-kompilation-inkrementell.md` (Term-/Konzept-Überschneidung — re-executierter Befund: der Grep-Ausgabe-Pfad ist `knowledge-kompilation-inkrementell`, `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a; das Rev-2.4.1-Beispiel `wissensarchitektur/source-material.md` enthielt den Term **nicht** und ist damit korrigiert). Der Run aktualisiert diesen Pfad (Body-Erweiterung mit neuem §5.5-Inline-Beleg `(raw/epics/epics-2026-08-14.md#FR-12)`, `sources`-Ergänzung um diesen `resource` — sofern nicht bereits deklariert, sonst No-Op gemäß Pkt. 2, `generated.at` = aktueller Run-Zeitstempel, `log.md`-Eintrag „Story 3.1-Update"). Die Diff-Probe (Pkt. 5, ``-Form) zeigt ausschließlich `log` und `knowledge-kompilation-inkrementell` (betroffen, normalisiert) — kein Ghost-Diff, keine `index.md` im Diff (der Index-Link bleibt unverändert). + + ## 6. Validieren (mechanische Bestätigung) +@@ -373,3 +379,4 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A + - **Revision 2.5 (2026-08-19, Story 3.2):** Neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** eingefügt (nach §3, vor §4) — die **verbindliche Ausformulierung der §3-Pkt.-2-Kandidatenerhebung** („Erhebung nach §3.2"): (1) **Term-Ziehverfahren** deterministisch (bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps; **kanonischer Schreibweisen-Resolver `schema/canonical-terms.md`** — committete, append-only Registry (canon. Form + erlaubte Varianten), damit Bestandteil des Git-States und deterministisch pinbar; genau eine canon. Form je Semantik A0-18; kein stiller Ausschluss nicht auflösbarer Varianten — Verwendung wie notiert; mehrere Terme je Einheit → Vereinigung), (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (grep-Äquivalent `grep -rl … --exclude=log.md`; `log.md` **strukturell** exkludiert, Candidate-Liste auf Concept-Pfade definiert), (b) `index.md`-Traversal (gewurzelte Erreichbarkeit Root → Area → Concept, §5.8; TRAVERSAL_REACH_ONLY; fehlende Bundleroot → Run-FAIL V-1), (c) Link-Following mit **besuchter Menge** (file-relativ auflösen, §5.7 Pkt. 4; Zyklen enden, LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag (AD-17h/A0-19):** relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (nach Stufe-a; lexikografisch als deterministischer Tie-Break), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) in Spec-Verification und `wiki/log.md` belegt. **§3 Pkt. 2:** Story-3.2-Vorbehalt **aufgelöst** — Pkt. 2 bleibt Kern-Anker, die Erhebung zeigt auf die neue Sektion („Erhebung nach §3.2"), `rg -l '' --exclude=log.md wiki/` als Stufe-a-Form genannt. **§7:** Story-3.2-Vorbehalt **aufgelöst** (Relevanzbestimmung in §3.2 verankert; verbleibende 3.x-Themen: Synthese → Story 3.4, Leasing/Dirty-Tree → Story 3.5/3.6). **§8:** Normreferenzen um **AD-13** (bereits gelistet, §3.2-angeankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2) und **A0-19** (Determinismus-Vertrag, §3.2 — war im Ist-§8 noch nicht gelistet, wird als Determinismus-Referenz ergänzt) sowie **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; **`schema/canonical-terms.md`** als nebengeordnete committete Resolver-Registry referenziert (kein `schema/`-Root-Change; gleiche read-only-Hierarchie, append-only). Em-Dash-`—`-Varianten-Lücke als offene Determinismus-Frage an **Story 3.8** übergeben (nicht stillschweigend ergänzt). **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **`sprint-status.yaml`:** Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**. `wiki/log.md`-Eintrag (append-only, bestehende Bullets unverändert), `deferred-work.md`-epic-3-context-Eintrag → aufgegriffen (append-only), Determinismus-Selbsttest + Validator-Lauf (7/7 SUCCESS) siehe `wiki/log.md`-Nachweis. + - **Revision 2.4.2 (2026-08-19, Story 3.1, bmad-code-review Loop 2, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4 = 1/1/1/1):** (1) **Diff-Selbsttest (Pkt. 5) operationalisiert + Blind-Spots geschlossen (D-1):** Probe erweitert auf `git diff --name-only -- wiki/` **plus** `git status --porcelain -- wiki/` (erfasst ungetrackte neue Dateien `??` — die Duplikat-Kontrolle „keine neue Datei" braucht diese Sicht; `git diff` allein ist blind für Untracked); **Probe-Zeitpunkt fixiert vor dem Commit** (am Ende des P2-Blocks, nach den Mutationen) — nach dem Commit wäre die Probe vacuous (leere Ausgabe, AD-17f); erlaubte Teilmenge-Menge um **Neu-Anlage-Zielpfade** (§5.1/§5.7) ergänzt — Misch-Runs (Neu-Anlage + Update im selben Run) markieren neu angelegte Pfade nicht fälschlich als Ghost-Diff; **Pfad-Normalisierung** definiert (Strip `wiki/`-Präfix + `.md`-Suffix vor dem Teilmenge-Vergleich, da Kandidaten/Ziel-Pfade als relative OKF-Pfade *ohne* `.md` definiert sind); **Rollback-Mechanik** für den Ghost-Diff deterministisch benannt (modifizierte Pfade via `git checkout -- `, ungetrackte neue Dateien gelöscht, Index via `git checkout -- `; §5.3/§6.3-Teilzustand-Rollback greift daneben unverändert). (2) **R-1-Baseline deterministisch + Abweichungsregel (D-2):** `` (HEAD der vorherigen Mutations-Boundary, AD-17f) wird vom Producer **im `wiki/log.md`-Run-Eintrag notiert** (voller SHA) — deterministisch auflösbar ohne Domain-State-Annahme an Git (AD-14); **Diskrepanz-Regel**: widersprechen `git diff`-Befund und SHA-256-Record derselben Datei, **gewinnt `git diff`** (Commit-Boundary-Prinzip), SHA-256 bleibt Sekundär-Fingerprint; **Fallback**: ohne vorherige Mutations-Boundary gelten alle `raw/`-Dateien als Zuwachs; Rev-2.4.1-Claim „derselbe Baseline-Commit wie Pkt. 5" **korrigiert** (die Pkt.-5-Probe trägt das Baseline-Commit-Argument jetzt explizit). (3) **INPUT_UNCOMMITTED-Abbruch (D-3) + Anker-Divergenz:** neuer P2-Check-Block-Element (1) **Input-Zustand** — Working-Copy von `raw/`/`wiki/` gegen HEAD prüfen, bei Abweichung **benannter Abbruch „published/committed Input erforderlich"** vor Interpretation und vor jeder Mutation (AD-17a, I/O-Matrix-`INPUT_UNCOMMITTED` — zuvor nur Referenz auf §1 Pkt. 1, keine Zustandsprüfung/Abbruchmeldung); die **Spec↔Anker-Divergenz** (frozen Spec zitiert 3× „§1.1", §1 ist eine nummerierte Liste Pkt. 1–4 ohne §1.1-Label; Rev-2.4.1 korrigierte nur die Anker *in* compiler.md) wird hier als dokumentierte Fußnote gesichert — die Spec bleibt frozen (nur per menschlicher Renegotiation änderbar). (4) **Sandbox-Edge-Test-Nachweis (D-4):** die fünf I/O-Matrix-Szenarien (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) + die D-3-Abbruch-Kontrolle sind als re-executierbare Sandbox-Skripte mit **konkreten deterministischen Ausgaben** in der Spec-`## Verification`-Sektion (Sandbox-Beleg) verankert — die `wiki/log.md`- und `deferred-work.md`-Verweise („in der Spec-Verification enthalten") auflösbar. (5) **Instruktions-Präzisierungen:** P2-Block-**Zeitpunkt** (nach Reconcile, am Anfang der Mutationsphase; Diff-Probe am Block-Ende) — löst den Widerspruch „einmal an der Spitze erhoben" vs. „Kandidatenliste entsteht erst im Reconcile"; **No-Op-Kandidat**-Regel (Pkt. 2: Pfad, der die Evidenz bereits vollständig enthält → keine Mutation/kein `at`-Bump/kein `log.md`-Eintrag, byte-identisch — die engere Auslegung); **Mehrfach-Treffer-Reihenfolge** für *alle* Einheiten definiert (Zuwachs-Sicht-Ordnung; lexicografisch nur als Tie-Break bei identischem Ort — AD-17h); **Update-Pfad-Rollback** in §5.3 Pkt. 3 (modifizierte Pfade aus Baseline-Commit wiederherstellen); **`generated.at`↔AD-17h-Gap** explizit als offener Punkt mit Home Story 3.8 benannt (Wanduhr-`at` erzeugt bei gleichem Input unterschiedliche Bundle-States; Konvention bleibt bis dahin bindend, Wechsel = Ask-First); **Term-Ableitung** (Pkt. 2 (a)) als §2-Interpretation abgegrenzt — die Erhebung *mit festem Term* ist textuell-deterministisch, der Term-Mechanismus (Kanonisierung/Synonyme) Story 3.2; **Link-Following** mit besuchter Menge (keine Schleife bei zyklischen Links); **Worked Example (Pkt. 7) auf den realen Ist-Baum korrigiert** (`rg -l 'FR-12' wiki/` trifft `wiki/knowledge-kompilation-inkrementell.md`, **nicht** `wissensarchitektur/source-material.md` — Rev-2.4.1-Beispiel enthielt den Term nicht); stale-Anker `§3.2-Kollisionsprüfung` (Pkt. 3-Zuordnung) und `§3-Voraussetzungsprüfung` (P2-Block) sowie §5.8-Pkt.-3-Zeiger („Pkt. 1" → „Pkt. 2") nachgeführt. **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. + - **Revision 2.7 (2026-08-19, Story 3.2, Step-04-Review Loop 3, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4/D-5 = 1/1/1/1/1, jeweils empfohlene Option; + 2 Patches; D-3-Instruktions-Patch, kein neuer Inhalt):** (1) **§3.2-Pkt.-3b-Ordnung auf reine Lexikografie gehoben (D-4):** Stufe-a-Treffer waren „in der Reihenfolge des ziehenden Terms, dann lexikografisch als deterministischer Tie-Break" — die Term-Ordnung selbst war für Mehrfach-Terme (Pkt. 1c) nirgends festgelegt, zwei rechtmäßige Term-Ordnungen erzeugten zwei unterschiedliche Listen (AD-17h-Lücke). Jetzt: **innerhalb jeder Stufe rein lexikografisch aufsteigend (LC_ALL=C)**; die Term-Verarbeitungsreihenfolge dient nur der Interpretation/Erhebung, **nicht** der Listen-Ordnung — dieselbe Treffermenge → identische Liste. (2) **`schema/canonical-terms.md`-Lookup-Semantik vervollständigt (D-5):** Lookup-Verfahren deterministisch fixiert (lowercasing → `[-–_ ]`→`-`-Kollaps → **Lookup der normalisierten Form**; Spalten tragen ausschließlich normalisierte Formen), **Eindeutigkeits-Invariante** (jede normalisierte Form in genau einem Eintrag — Canon **oder** Variante, nie beides/zweimal) + **Konflikt-Verfahren** (keine stille Anhängung; `deferred-work.md`-Handoff / Ask-First, analog zur Umbenennungs-Regel). (3) **Statuskette `in-progress → done` dokumentiert (D-1):** der Review-Loop-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention, Story-3.1-Präzedenz) war in keinem `wiki/log.md`-Eintrag als eigener Schritt belegt — nachgeführt als neuer oberster `wiki/log.md`-Bullet (append-only; die gefrorene Always-Klausel `→ in-progress` beschreibt den Implementierungsstand, der Review-Abschluss `done` ist der übliche Folgezustand). (4) **Mini-Sandbox um T5/T6/T7 erweitert + T1/T4-Asssertionen + T2-Kommentar-Korrektur (D-2 + Patch P-1):** T5 `LINK_FOLLOWING_ZYKLUS` (A→B→A-Links; besuchte Menge → endliche, doppelungsfreie Liste), T6 `TRAVERSAL_REACH_ONLY` (Term nur in Area-`index.md` → gewurzelte Concept-Pfade als Kandidaten; `index.md` selbst ist kein Concept-Kandidat), T7 `TERM_ABLEITUNG_SYNONYM` (Registry-Test-Doppel: Schreibvarianten → canonische Form via Lookup auf normalisierter Form; Negativ-Fall: nicht auflösbar → wie notiert, kein stiller Ausschluss); T1/T4 tragen jetzt harte Pass/Fail-Asssertionen (`exit 1` bei Abweichung) — die exakte Candidate-Liste wird erzwungen, nicht nur ausgegeben; der T2-Kommentar zu `index` korrigiert (Stufe-a-Treffer auf `wiki/index.md` löst Stufe b aus; `index.md` ist kein Concept-Kandidat). (5) **Selbsttest-Beleg (b) gegen den realen Sandbox-Ist-Baum re-executiert (D-3):** der Rev-2.5-Log-Beleg (b) beschrieb einen nicht-committierten Baum (Term `quanten-protocol`, `sub/beta.md`, SHA-256 `159092bb…`) — Stale-Evidenz-Falle (B1-Präzedenz). Der Nachweis wird jetzt gegen die echte `run-sandbox.sh`-Ausgabe (Term `deterministische-relevanz-bestimmung`, root-level `alpha`/`beta`/`gamma`) neu belegt; der Rev-2.5-Eintrag bleibt historisch unverändert, die Korrektur steht als neuer `wiki/log.md`-Bullet (append-only). (6) **Typos im normativen Text korrigiert (Patch P-2):** `Determinsmus` → `Determinismus` (§8-Referenzen + Log-/Defer-Belege), `§3.2-beankert` → `§3.2-angeankert`, `Membrum` → `Mitglied` (Spec-Design-Notes), `Konventionelle Determinismus-Lücke` → `Bekannte Determinismus-Lücke` (Defer-Beleg; `compiler.md:53` sagt „Bekannte"), `Resovierung` → `Auflösung` (Spec-Change-Log/-Verification). **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. (Revisionslog-Reihenfolge-Anomalie 2.6/2.5 bleibt als dokumentierter Defer bestehen — nicht in dieser Runde umgeordnet.) ++- **Revision 2.8 (2026-08-19, Story 3.3):** §5.9-Update-Formen **operationell ausformuliert** (dieselbe Evidenz + formale Struktur → identisches Update-Ergebnis, AD-17h/A0-19): (1) **Pkt. 2 — Präzisierungsebene je Update-Form** (als Sub-Bullet an die Commit-Boundary-Regel angefügt; der frozen Story-3.1-Regeltext bleibt textuell **unverändert** als normative Basis, die operationellen Regeln sind die Ausführungs-Ebene darunter — keine Re-Negotiation): je Form **(a) Abgrenzungskriterium** (aus der committeten Evidenz: neue belegte Aussage → Erweitern; Schärfung einer bestehenden Formulierung/Abgrenzung ohne Ersatz → Präzisieren; Ersetzung einer fehlerhaften/überholten → Korrigieren; keines davon → No-Op, engere Auslegung), **(b) Struktur-Erhaltungsregel** (das Geschützte — Frontmatter-Subset nur als `sources`-Zuwachs um echten neuen Beleg + `generated.at`-Bump; bestehende belegte Aussagen nicht umgeschrieben ohne dass Präzisieren/Korrigieren greift; §5.5-Inline-Verweise gültig soweit Beleg Body-Bestand; §5.6-Linkform unverändert, keine neuen Links außer bei echten Beziehungen) und **(c) Textgenauigkeits-Rahmen für Präzisieren** (Schärfen an der Aussage, kein Satz-Umbau, kein Neuschreiben ohne Ersetzungsbeleg). (2) **Pkt. 5 — Erhaltungs-Invariante um den Struktur-Erhaltungs-Bezug ergänzt:** die Diff-Probe verifiziert zwei Ebenen — die Pfad-Mengen-Ebene (bestehender Teilmenge-Vergleich) und die **Struktur-Ebene je berührtem Pfad** (pro betroffenem Concept-Pfad über die Pkt.-2-Regeln geprüft: Frontmatter-Subset, keine Umschreibung belegter Aussagen außerhalb der Formen, Inline-Verweise, Linkform — Verstöße textuell benannt (NFR-4), vor dem Commit zu beheben, sonst Ghost-Diff mit Rollback). (3) **Pkt. 6 — P2-Check-Block um den Struktur-Erhaltungs-Check erweitert** (Element (6), zusätzliches textuelles Element: keine unbefugten Keys — Vertrag §3.3/§3.4-Subset, keine stille Löschung — AD-16/„Korrigieren"-Form, Links unverändert/keine neuen ohne echte Beziehung — §5.6-Pin; Verstöße textuell benannt (NFR-4) und vor dem Commit behoben). (4) **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert; kein Leasing-Scope (AC-4 → Story 3.5/3.6, AD-17.3-Hinweis unverändert in §7). **`sprint-status.yaml`:** Key `3-3-bestehende-concepts-erweitern-präzisieren-korrigieren` bleibt **`in-progress`** (Review-Abschluss `done` erfolgt gemäß Workflow-Konvention durch den Review-Schritt). Sandbox-Nachweis und per-Datei-Validator-Verdikt siehe `wiki/log.md`-Eintrag (Story 3.3, Revision 2.8). +diff --git a/wiki/log.md b/wiki/log.md +index 9b29777..326d011 100644 +--- a/wiki/log.md ++++ b/wiki/log.md +@@ -1,6 +1,7 @@ + # Log + + ## 2026-08-19 ++- **Story 3.3 «Bestehende Concepts erweitern/präzisieren/korrigieren — Update-Formen operativ schärfen» (Implementierung, Instruktions-Story D-3; `sprint-status.yaml`: Key `3-3-bestehende-concepts-erweitern-präzisieren-korrigieren` bleibt **`in-progress`** — der Review-Abschluss-Flip `done` erfolgt gemäß Workflow-Konvention durch den Review-Schritt):** `schema/compiler.md` → **Revision 2.8** — die drei Update-Formen **operationell ausformuliert** (deterministische Brücke Regel → Run, AD-17h/A0-19; kein neuer normativer Inhalt, kein Schema-/Validator-/`raw/`-Change AD-3; der frozen Story-3.1-Regeltext bleibt unverändert als normative Basis, die operationellen Regeln sind die Präzisierungsebene darunter — keine Re-Negotiation): (1) **§5.9 Pkt. 2 — Präzisierungsebene je Update-Form** (Sub-Bullet an die Commit-Boundary-Regel angefügt): je Form **(a) Abgrenzungskriterium** (aus der committeten Evidenz — neue belegte Aussage → **Erweitern**; Schärfung einer bestehenden Formulierung/Abgrenzung ohne Ersatz → **Präzisieren**; Ersetzung einer fehlerhaften/überholten → **Korrigieren**; keines davon → **No-Op**, engere Auslegung — gleicher Git-State + gleiche Eingabemenge → identischer Update-Vorgang), **(b) Struktur-Erhaltungsregel** (das Geschützte aus FR-6/AC-2: Frontmatter-Subset — nur `sources`-Zuwachs um echten neuen Beleg + `generated.at`-Bump, kein neuer Key, keine Entfernung ohne Beleg; bestehende belegte Aussagen nicht umgeschrieben ohne dass Präzisieren/Korrigieren greift; §5.5-Inline-Verweise gültig soweit Beleg Body-Bestand; §5.6-Linkform unverändert, keine neuen Links außer bei echten Beziehungen) und **(c) Textgenauigkeits-Rahmen** (Schärfen an der Aussage selbst, kein Satz-Umbau, kein Neuschreiben ohne Ersetzungsbeleg). (2) **§5.9 Pkt. 5 — Erhaltungs-Invariante um den Struktur-Erhaltungs-Bezug ergänzt:** die Diff-Probe (§5.9 Pkt. 5, D-1-Form) verifiziert zwei Ebenen — die Pfad-Mengen-Ebene (bestehender Teilmenge-Vergleich) und die **Struktur-Ebene je berührtem Pfad** (pro betroffenem Concept-Pfad über die Pkt.-2-Regeln geprüft: Frontmatter-Subset, keine Umschreibung belegter Aussagen außerhalb der Formen, Inline-Verweise, Linkform; Verstöße textuell benannt NFR-4, vor dem Commit zu beheben, sonst Ghost-Diff mit Rollback). (3) **§5.9 Pkt. 6 — P2-Check-Block um den Struktur-Erhaltungs-Check erweitert** (Element (6), zusätzliches textuelles Element: keine unbefugten Keys — Vertrag §3.3/§3.4-Subset, keine stille Löschung — AD-16/„Korrigieren"-Form, Links unverändert/keine neuen ohne echte Beziehung — §5.6-Pin). (4) **§8 Revisionslog Revision 2.8** mit Abschlussklausel (keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` AD-3; keine neue §7-Invaliditätsklasse; kein Standalone D-3; keine Vertragsänderung; Commit-Boundary-Regel unverändert; kein Leasing-Scope — AC-4 → Story 3.5/3.6, AD-17.3-Hinweis unverändert in §7). **Sandbox-Nachweis (re-executiert 2026-08-19, ab Workspace-Root, `bash _bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh`; Linux-Sandbox-Semantik auf einem `/tmp`-Baum, nie der reale `wiki/`-Baum; Exit **0**):** Mini-Bundle mit Concept `alpha` + nicht-betroffenem Kontroll-Concept `beta`; committete Neuevidenz je Szenario; alle drei Update-Formen + No-Op durchgespielt: **U1 ERWEITERN** (neue belegte Aussage angefügt, bestehende drei Aussagen byte-identisch — PASS; Probe `{alpha log}` ⊆ erlaubte Menge — PASS; Frontmatter-Konformität — PASS), **U2 PRAEZISIEREN** (Aussage an ihr selbst geschärft, Position/Struktur erhalten, Beleg nachgeführt §5.5 — PASS; Probe `{alpha log}` — PASS; Frontmatter — PASS), **U3 KORRIGIEREN** (fehlerhafte Aussage explizit abgelöst + Ersetzungsbeleg, keine stille Löschung AD-16-Default — PASS; Probe `{alpha log}` — PASS; Frontmatter — PASS), **U4 NO_OP** (Evidenz bereits vollständig enthalten — byte-identisch, kein `at`-Bump, kein `sources`-Zusatz, kein `log.md`-Eintrag — PASS; Probe leer = Ghost-Diff-negativ — PASS), **U5 NEGATIV-KONTROLLE** (simulierter Ghost-Diff auf `beta` wird von der Assertions-Mechanik zuverlässig als HARD-FAIL erkannt — PASS, Mechanik nicht vacuous), **U6 ZWEI-RUN-IDENTITÄT** (AD-17h/A0-19: zwei unabhängige Runs über dieselbe Evidenz → byte-identischer Update-Vorgang — SHA-256 `6b148dd1…` (alpha.md) / `a6d08427…` (log.md) identisch je Lauf, auch nach Commit — PASS), **U7 MEHRFACH_TREFFER** (I/O-Matrix-Zeile; zwei Neuevidenzen `raw/alpha-v2.md` + `raw/alpha-v3.md` desselben Runs treffen denselben Concept-Pfad `alpha` → **ein konsolidiertes Update**: eine Body-Mutation, ein `log.md`-Eintrag, ein konsolidierter `sources`-Zuwachs `s2`+`s3`, ein `generated.at`; Zuwachs-Sicht-Ordnung `v2`-vor-`v3` (lexikografischer Tie-Break bei Body-Ende); bestehende drei Aussagen byte-identisch; Probe `{alpha log}` — PASS; Frontmatter-Konformität — PASS). Die **Erhaltungs-Invariante (§5.9 Pkt. 5) wird als harte Assertion erzwungen**: Proben-Einträge (normalisiert: `wiki/`-Präfix + `.md`-Suffix strippend) ⊆ {betroffener Concept-Pfad, log}; bei Verstoß oder neuer Datei (`??`-Sicht) → HARD-FAIL + Exit 1; kein Ghost-Diff lässt sich still durchschleusen (U5). **Status-/Diff-Nachweis:** nach diesem Instruktions-Run zeigt `git status --porcelain -- wiki/` ausschließlich `wiki/log.md` (dieser Eintrag) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, keine Concept-Inhalts-Mutation (Instruktions-Story, kein neues committetes `raw/`-Material; Demonstration per Sandbox). **Validator-Verdikt (per-Datei, human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI; unverändert zur Story 3.2, Story 3.3 mutiert keine Concept-Inhalte):** alle **7** `wiki/`-Dateien **SUCCESS** — `wiki/index.md` (Punkt 11, Bundleroot), `wiki/knowledge-kompilation-inkrementell.md`, `wiki/llm-wiki-prinzip.md`, `wiki/wissensarchitektur-trennung-states.md` (Punkte 1/2/6/7/8/9/11/12/13/14, EC-1), `wiki/log.md` (frontmatterlos, Punkt 10), `wiki/wissensarchitektur/index.md` (frontmatterlos, Punkt 10/11), `wiki/wissensarchitektur/source-material.md` (Punkte 1/2/6/7/8/9/11/12/13/14, EC-1; Punkt 11 inkl. Area-Lesart Rev 9). `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3, via `git status` geprüft); keine neue §7-Klasse; kein Standalone (D-3). Spec-Frontmatter: `status: 'in-progress'`, `review_loop_iteration: 0`. + - **Step-04-Review Loop 3 / Patch-Runde (Story 3.2, 2026-08-19):** `schema/compiler.md` → **Revision 2.7** (D-3-Instruktions-Patch, kein neuer Inhalt; bmad-code-review Loop 3, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4/D-5 = 1/1/1/1/1, jeweils empfohlene Option; + Patches P-1/P-2). (1) **D-1 — Statuskette abgeschlossen:** der Review-Loop-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention; Story-3.1-Präzedenz: Review-Abschluss setzt `done` im selben Loop) ist mit dieser Zeile als eigener dokumentierter Schritt nachgeführt; `sprint-status.yaml`-Key `3-2-…` bleibt **`done`** (die gefrorene Always-Klausel `→ in-progress` beschreibt den Implementierungsstand; Review-Handoff/-Abschluss ist der übliche Folgezustand, s. Sprint-Status-Workflow-Kommentar). (2) **D-2 — Sandbox erweitert:** `run-sandbox.sh` um **T5 `LINK_FOLLOWING_ZYKLUS`** (Zyklus alpha ↔ omega via Backlink; besuchte Menge → endliche, doppelungsfreie Candidate-Liste `omega`, `alpha` — der Zyklus endet), **T6 `TRAVERSAL_REACH_ONLY`** (Term `trafo-gebiet` trifft **nur** die Area-`index.md` → die gewurzelten Concept-Pfade `trafo/delta`, `trafo/epsilon` sind die Kandidaten; `index.md` selbst ist kein Concept-Kandidat) und **T7 `TERM_ABLEITUNG_SYNONYM`** (Registry-Test-Doppel: `Quanten Protocol` → Normalisierung → `quanten-protocol` (Canon-Treffer), `QuantenProtocol` → `quantenprotocol` (Variante-Treffer) → canonische Form `quanten-protocol`; Negativ-Fall `nicht-in-registry` → wie notiert, kein stiller Ausschluss); T2-Kommentar zu `index` korrigiert (Stufe-a-Treffer auf `wiki/index.md` löst Stufe b aus — kein Concept-Kandidat); **P-1** — T1/T4 jetzt mit harten Pass/Fail-Asssertionen (`exit 1` bei Abweichung). (3) **D-3 — Selbsttest-Beleg (b) neu belegt:** die Rev-2.5-Log-Zeile (b) beschrieb einen **nicht committierten** Baum (Term `quanten-protocol`, `sub/beta.md`, SHA-256 `159092bb…`) — Stale-Evidenz-Falle (B1-Präzedenz); die Rev-2.5-Zeile bleibt **historisch unverändert** (append-only, Vertrag §5), der korrigierte Nachweis steht in dieser Zeile (re-executierte Sandbox-Ausgabe, s. (5)(b)). (4) **D-4 — §3.2-Pkt.-3b-Ordnung:** Stufe-a-Treffer jetzt **rein lexikografisch (LC_ALL=C)** innerhalb jeder Stufe; die Term-Verarbeitungsreihenfolge dient nur der Interpretation/Erhebung, **nicht** der Listen-Ordnung (dieselbe Treffermenge → identische Liste, AD-17h/A0-19). (5) **D-5 — `schema/canonical-terms.md`-Lookup-Semantik:** Lookup-Verfahren deterministisch fixiert (lowercasing → `[-–_ ]`→`-`-Kollaps → **Lookup der normalisierten Form**; Spalten tragen ausschließlich normalisierte Formen), **Eindeutigkeits-Invariante** (jede normalisierte Form in genau einem Eintrag — Canon **oder** Variante, nie beides/zweimal) + **Konflikt-Verfahren** (keine stille Anhängung; `deferred-work.md`/Ask-First, analog zur Umbenennungs-Regel). (6) **P-2 — Typos korrigiert:** `Determinsmus` → `Determinismus` (compiler.md §8-Referenz, diese Log, `deferred-work.md`-Belege), `§3.2-beankert` → `§3.2-angeankert` (Rev-2.5-Log-Zeile), `Membrum` → `Mitglied` (Spec-Design-Notes), `Konventionelle Determinismus-Lücke` → `Bekannte Determinismus-Lücke` (`deferred-work.md`-Beleg; `compiler.md:53` sagt „Bekannte"), `Resovierung` → `Auflösung` (Spec-Change-Log/-Verification). **Re-executierte Selbsttest-Belege (2026-08-19, ab Workspace-Root; Sandbox-Run exit 0):** (a) live: `grep -rl 'A0-18' --exclude=log.md wiki/` → exakt `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad, `log.md` ausgeschlossen); (b) **Mini-Sandbox** (`_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh`, re-executierbar): alle **7** Tests **PASS** — T1 Membership (exakt `alpha`; Kontaminations-Kontrolle ohne Exklusion trifft zusätzlich `log`), T2 Zwei-Run-Identität (identisch), T3 NO_MATCH (leer), T4 Vereinigung `alpha,gamma` (hart assertierte), T5 LINK_FOLLOWING_ZYKLUS (endlich, doppelungsfrei, Zyklus endet), T6 TRAVERSAL_REACH_ONLY (`trafo/delta`, `trafo/epsilon`), T7 TERM_ABLEITUNG_SYNONYM (beide Varianten → `quanten-protocol`; Negativ-Fall wie notiert); (c) `git status --porcelain -- wiki/` nach diesem Run: ausschließlich `wiki/log.md` (dieser Eintrag) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, kein Ghost-Diff (die Instruktions-Story mutiert keine Concept-Inhalte). **Abschlussklausel Rev 2.7:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. `sprint-status.yaml`: Key bleibt `done`, `last_updated` → 08-19-2026. Spec-Frontmatter: `status: 'done'`, `review_loop_iteration: 3`; Spec-`### Review Findings` abgehakt (5 Decisions + 2 Patches + 4 Defers → `deferred-work.md`). + - **Step-04-Review Loop 2 / Patch-Runde (Story 3.2, 2026-08-19):** `schema/compiler.md` → **Revision 2.6** (D-3-Instruktions-Patch, kein neuer Inhalt; bmad-code-review VG-Findings verarbeitet). (1) **§4-Überschrift wiederhergestellt** — die §3.2-Einfügung (Rev 2.5) hatte die Überschrift **`## 4. Synthetisieren (Provenienz & Trust)`** verdrängt (der §3.2-Sektionskopf ersetzte die §4-Überschrift; der gesamte Frontmatter-Body hing kopflos unter §3.2; alle §4-Referenzen wären dangling geblieben). Der §4-Kopf ist zwischen §3.2-Body und dem Frontmatter-Body wieder eingefügt. (2) **rg-Flag-Defekt behoben (`--exclude` ist kein rg-Flag):** die Rev-2.5-Form in diesem Log- plus dem §3.2-Eintrag, §3-Pkt.-2, §3.2-Pkt.-2a, §5.9-Worked Example (Pkt. 7) und §7 nutzten `rg -l '' --exclude=log.md wiki/` — nicht-existent (ripgrep 14.1.1: `rg --exclude` → `unrecognized flag`; GNU grep unterstützt `--exclude`, ripgrep nutzt `-g '!log.md'` / `--glob '!log.md'`). Die Instruktion nutzt jetzt tool-korrekte Formen: rg `rg -l '' -g '!log.md' wiki/` (native Glob-Exklusion) bzw. GNU grep `grep -rl '' --exclude=log.md wiki/`; die §5.6-Formeln (bereits GNU-grep) und §5.9-Pkt.-7-Erhebung adoptieren die Exklusion. Dieser Eintrag zitiert den alten Defekt **historisch** (verlaufsgetreue Log-Führung; die operative Form ist jetzt tool-korrekt). (3) **§5.9-Worked Example (Pkt. 7) auf die Exklusions-Form gehoben** (`rg -l 'FR-12' -g '!log.md' wiki/`), Kommentar `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a. (4) **Mini-Sandbox re-executierbar verankert** (`_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh`, Muster Story-3.1-Sandbox S1–S6): Tests T1–T4 (Membership-Pin — Term auf Concept-Bodies UND `log.md` verteilt, Candidate-Liste nur Concept-Pfade; Zwei-Run-Identität AD-17h; NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT; Mehrfach-Treffer → Vereinigung + lexikografische Ordnung). (5) **`deferred-work.md`-Em-Dash-Eintrag** append-only ergänzt (Home: Story 3.8) — die §3.2-Pkt.-1b-Kollaps-Klasse deckt En-Dash/Bindestrich/Unterstrich/Leerzeichen, aber **nicht** den Em-Dash `—`; dieser Handoff wird nicht stillschweigend gelöst, sondern als offene Determinismus-Frage dokumentiert. **Re-executierte Selbsttest-Belege (2026-08-19, ab Workspace-Root):** (a) rg-Form real: `rg -l 'A0-18' -g '!log.md' wiki/` → exakt `wiki/knowledge-kompilation-inkrementell.md`; ohne Exklusion `rg -l 'A0-18' wiki/` → zusätzlich `wiki/log.md` (Selbstkontamination — der §3.2-Pkt.-2a-Fall, reell belegt); (b) GNU-grep-Äquivalent `grep -rl 'A0-18' --exclude=log.md wiki/` → identisch `wiki/knowledge-kompilation-inkrementell.md`; (c) `rg -l 'FR-12' -g '!log.md' wiki/` → `wiki/knowledge-kompilation-inkrementell.md` (§5.9-WE-Korrektur reell); (d) Mini-Sandbox T1–T4 → siehe Rev-2.6-Eintrag; (e) `git status --porcelain` → `wiki/` nur `log.md` (dieser Eintrag; Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt), `schema/compiler.md` + `deferred-work.md` sind außerhalb `wiki/` (kein Teil der Diff-Probe). **Abschlussklausel Rev 2.6:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3, geprüft via `git status`); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. (Der Rev-2.5-Implementierungs-Eintrag oben bleibt unverändert — dokumentiert den Zustand bei Rev-2.5-Veröffentlichung inkl. der damaligen `--exclude`-Form; historische Korrektheit des Logs.) + - **Story 3.2 «Relevanzbestimmung textual-deterministisch umsetzen (grep/ripgrep + Markdown-Traversal + Link-Following)» (Implementierung, Instruktions-Story D-3; `sprint-status.yaml`: Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**):** `schema/compiler.md` → **Revision 2.5** — die beiden **Story-3.2-Vorbehalte aufgehoben** (§3 Pkt. 2 + §7) und die feinkörnige Relevanz-Findungsmechanik als neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** verankert (nach §3, vor §4; Pkt. 2 bleibt Kern-Anker „Erhebung nach §3.2"): (1) **Term-Ziehverfahren deterministisch** — bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps (En-Dash/Bindestrich/Unterstrich/Leerzeichen); **kanonischer Schreibweisen-Resolver als committete, append-only Registry `schema/canonical-terms.md`** (canon. Form + erlaubte Varianten, `[]`; Bestandteil des Git-States → Auflösung pinbar, AD-17h/A0-19); genau eine canon. Form je Semantik (A0-18); **kein stiller Ausschluss** nicht auflösbarer Varianten (Verwendung wie notiert); mehrere Terme je Einheit → Vereinigung; **bekannte Determinismus-Lücke**: Em-Dash `—` fällt nicht unter den `[-–_ ]`-Kollaps → an **Story 3.8** übergeben (nicht still hinzugefügt); (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (GNU-grep-Äquivalent `grep -rl '' --exclude=log.md wiki/`; **`log.md` strukturell exkludiert** — die Candidate-Liste ist auf Concept-Pfade definiert, `log.md` ist kein Kandidat), (b) `index.md`-Traversal (gewurzelte Erreichbarkeit Root → Area → Concept, §5.8; TRAVERSAL_REACH_ONLY; fehlende Bundleroot → Run-FAIL V-1), (c) Link-Following mit **besuchter Menge** (file-relativ, §5.7 Pkt. 4; Zyklen enden — LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag** — relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (lexikografischer Tie-Break; AD-17h/A0-19), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad, Ghost-Diff-negativ); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) unten belegt. **§8-Normreferenzen:** AD-13 (bereits gelistet, §3.2-beankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2), **A0-19** (Determinismus-Vertrag — war im Ist-§8 noch nicht gelistet, als Determinismus-Referenz ergänzt, §3.2/AD-17h) und **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; `schema/canonical-terms.md` als Resolver-Registry referenziert. **Abschlussklausel Rev 2.5:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **`deferred-work.md`:** der Story-3.1-Defer-Eintrag `epic-3-context.md` („Home: Story-3.2-Handoff") als **aufgegriffen** markiert (append-only); der F17/Em-Morphologie-Handoff (Story 3.8) bleibt bestehen. **Determinismus-Selbsttest (Membership + Identität, re-executiert 2026-08-19, ab Workspace-Root):** (a) `grep -rl 'A0-18' --exclude=log.md wiki/` zweimal ausgeführt → beide Ausgaben **identisch**, exakt `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad; `log.md` ausgeschlossen — der `--exclude=log.md`-Fakt ist ehrlich dokumentiert: ohne die Exklusion würde `log.md` ab dem Moment selbst „Kandidat", in dem dieser Eintrag `A0-18` zitiert — die B1-`log.md`-Kontamination ist damit geschlossen); (b) **mini-Sandbox-Baum** (`/tmp/sb32-…`, Term `quanten-protocol` auf Concept-Bodies **und** `log.md` verteilt) → exakte Candidate-Liste nur Concept-Pfade (`wiki/alpha.md`, `wiki/sub/beta.md`; `log.md` ausgeschlossen, `wiki/gamma.md` ohne Term nicht getroffen); normalisiert `alpha`, `sub/beta`; **Zwei-Run-Identität** (SHA-256 `159092bb…` ≡); Kontrolle ohne `--exclude` → `log.md` wird Kandidat (B1-Falle belegt und geschlossen); (c) §5.6-Formeln unverändert re-executierbar: Formel 2 (Form-Check) `0` (Exit 0), Formel 3 (Dangling-Check) keine Ausgabe, Formel 4 Ist-Zählung **38** (kein `wiki/`-Dateimenge-Change durch Story 3.2 — keine Re-Baseline nötig). **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 3.1, Story 3.2 mutiert keine Concept-Inhalte; `wiki/log.md` bleibt frontmatterlos, Punkt 10); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 4 und AC 5. `git status --porcelain -- wiki/` nach diesem Run: ausschließlich `log.md` (modifiziert) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, kein Ghost-Diff. + +## NEW FILE: sandbox-3-3/run-sandbox.sh (untracked): +#!/usr/bin/env bash +# Story 3.3 — Sandbox-Tests der operationellen Update-Formen (§5.9 Pkt. 2, Revision 2.8) +# Re-executierbar: bash run-sandbox.sh (ab Workspace-Root; Sandbox unter /tmp/sb33) +# Zweck: alle drei Update-Formen (Erweitern + Präzisieren + Korrigieren) + No-Op +# durchspielen; die Erhaltungs-Invariante (§5.9 Pkt. 5) als HARDE Assertion +# erzwingen (Diff nach Normalisierung ⊆ {betroffener Concept-Pfad, log}; keine +# neue Datei; kein Ghost-Diff); Zwei-Run-Identität (AD-17h/A0-19); +# Frontmatter-Konformität je mutiertem Concept (Vertrag §3.3/§3.4-Subset). +# Linux-Sandbox-Semantik auf einem /tmp-Baum — NIE der reale wiki/-Baum. +set -u +ROOT=$(mktemp -d /tmp/sb33-XXXXXX) +SB="$ROOT/sb" +mkdir -p "$SB/wiki" "$SB/raw" +cd "$SB" +git init -q +git config user.email "sandbox@test" +git config user.name "Sandbox" + +# ---------- Basis-Baum (committete Ausgangslage = Baseline-Commit) ---------- +# Concept alpha mit drei belegten Aussagen; Aussagen 1/2 sind fachlich korrekt, +# Aussage 3 ist fehlerhaft (Korrigieren-Ziel des Szenarios U3). beta ist ein +# nicht-betroffenes Kontroll-Concept (Ghost-Diff-Kontrolle, U5). +cat > wiki/index.md <<'EOF' +# Index +- [Alpha](alpha.md) +- [Beta](beta.md) +EOF +cat > wiki/alpha.md <<'EOF' +--- +type: concept +sources: + - resource: raw/alpha-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich (raw/alpha-v1.md#S-1). +Alpha läuft ausschließlich auf isolierten Netzen (raw/alpha-v1.md#S-3). +Alpha rotiert seine Schlüssel nie (raw/alpha-v1.md#S-2). +EOF +cat > wiki/beta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/beta-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Beta beschreibt ein anderes, hier nicht betroffenes Thema. +EOF +cat > wiki/log.md <<'EOF' +# Log +EOF +cat > raw/alpha-v1.md <<'EOF' +Evidenz v1: deterministische-init-sequenz (Stelle S-1); isolierte Netze (Stelle S-3); keine Rotation (Stelle S-2). +EOF +cat > raw/beta-v1.md <<'EOF' +Evidenz v1: Beta-Thema (Stelle S-1). +EOF +git add -A +git commit -qm "Baseline" +BASE=$(git rev-parse HEAD) +echo "BASELINE-COMMIT: $BASE" +echo "Sandbox-Root: $ROOT (loeschbar: rm -rf $ROOT)" +echo + +runlabel() { echo; echo "########## $1 ##########"; } +# Isolation: Worktree auf BASE zuruecksetzen (kein Carry-over ueber Szenarien) +isolate() { git checkout -q -b "$1" "$BASE" 2>/dev/null || git checkout -q "$1"; git reset -q --hard "$BASE"; git clean -qfd wiki raw; } + +# Pkt.-5-Probe (D-1-Form): Baseline-Diff + porcelain, normalisiert +# (wiki/-Praefix + .md-Suffix gestrippt, LC_ALL=C-sortiert; deterministisch, AD-17h) +probe() { + { git diff --name-only "$BASE" -- wiki/ ; git status --porcelain -- wiki/ | awk '{print $2}'; } \ + | sed -e 's|^wiki/||' -e 's|\.md$||' | LC_ALL=C sort -u +} +inv_set() { probe | LC_ALL=C sort -u | paste -sd' ' -; } + +# ---------- Harte Assertion der Erhaltungs-Invariante (§5.9 Pkt. 5) ---------- +# Erwartete erlaubte Menge = Space-getrennte normalisierte Pfade +# (z. B. "alpha log"). Jeder Proben-Eintrag MUSS in der erlaubten Menge liegen — +# sonst Ghost-Diff (nicht betroffener Pfad) → HARD-FAIL, Exit 1 (NFR-4/FT-6). +assert_invariant() { + local expected="$1" got p bad=0 rcs=0 + got=$(inv_set) + for p in $got; do + case " $expected " in + *" $p "*) ;; + *) echo "HARD-FAIL (Erhaltungs-Invariante §5.9 Pkt. 5): '$p' ist kein Ghost-Diff-negativer Eintrag — erlaubte Menge: {$expected}" >&2; bad=1;; + esac + done + # Keine neue Datei (Duplikat-Kontrolle: die ??-Sicht fehlt git diff allein) + rcs=$(git status --porcelain -- wiki/ | grep -c '^??' || true) + [ "$rcs" -eq 0 ] || { echo "HARD-FAIL (keine neue Datei): $rcs ungetrackte neue Datei(en) unter wiki/ (Duplikat/Ghost-Diff)" >&2; bad=1; } + if [ "$bad" -eq 0 ]; then + echo "RESULT: PASS — Probe {$got} ⊆ erlaubte Menge {$expected}; keine neue Datei; kein Ghost-Diff" + else + exit 1 + fi +} + +# ---------- Frontmatter-Konformitaet je mutiertem Concept (Vertrag §3.3/§3.4, §6.5) ---------- +# $1=Datei; $2...=erwartete sources[].resource-Werte. Prueft: Top-Level-Key-Subset +# {type,sources,generated,verified,status,stale_after}, sources-Eintrag-Key-Subset +# (Vertrag §3.3-Innen-Ebene), type=concept, generated.at = volle ISO-8601-Datetime +# (die erlaubten Key-Mengen sind inline im awk-Subset-Vergleich hartkodiert). +assert_frontmatter() { + local f="$1"; shift + local r bad=0 + # Kontextuelle Validierung ueber awk: Top-Level-Subset {type,sources,generated, + # verified,status,stale_after}; Innen-Ebenen je Sektion — sources: Vertrag §3.3- + # Subset {resource,id,title,author,usage_count,last_modified}; generated/verified: + # {by,at} (Vertrag §3.4/§3.5). Jeder andere Key = unbefugt (Punkt 6, §6.5). + local v + v=$(awk ' + /^---$/{n++; if(n==2) exit; next} + /^[A-Za-z_][A-Za-z0-9_-]*:/{ + k=$0; sub(/:.*/,"",k) + if (k=="sources") top="sources" + else if (k=="generated" || k=="verified") top="genver" + else top="other" + if (k!="type" && k!="sources" && k!="generated" && k!="verified" && k!="status" && k!="stale_after") print "TOP_UNBEFUGT:" k + next + } + /^[[:space:]]/{ + gsub(/^[[:space:]]+/,""); sub(/^- /,""); gsub(/^[[:space:]]+/,""); + if (match($0, /^[A-Za-z_][A-Za-z0-9_-]*:/)) { + ik=substr($0,1,RLENGTH-1) + if (top=="sources" && ik!="resource" && ik!="id" && ik!="title" && ik!="author" && ik!="usage_count" && ik!="last_modified") print "INNER_UNBEFUGT:" ik + if (top=="genver" && ik!="by" && ik!="at") print "INNER_UNBEFUGT:" ik + if (top=="other") print "INNER_UNBEFUGT:" ik + } + } + ' "$f") + if [ -n "$v" ]; then + echo "HARD-FAIL (Frontmatter-Subset, Vertrag §3.3/§3.4/§3.5): $v in $f" >&2 + exit 1 + fi + grep -qE '^type: concept$' "$f" || { echo "HARD-FAIL: type=concept fehlt in $f" >&2; exit 1; } + grep -qE "^ at: [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|[+-][0-9]{2}:?[0-9]{2})$" "$f" || { echo "HARD-FAIL: generated.at ist keine volle ISO-8601-Datetime in $f" >&2; exit 1; } + for r in "$@"; do + grep -qF " - resource: $r" "$f" || { echo "HARD-FAIL: sources-Eintrag 'resource: $r' fehlt in $f" >&2; exit 1; } + done + echo "RESULT: PASS — Frontmatter-Konformitaet $f (Subset ok, generated.at volles Datetime)" +} + +# ---------- Update-Helfer (deterministisch; at gepinnt fuer Zwei-Run-Identitaet) ---------- +AT_NEW="2026-08-19T12:00:00Z" +bump_at() { sed -i "s|^ at: .*| at: $AT_NEW|" "$1"; } +add_source() { # $1=Datei $2=resource $3=id (Eintrag vor der generated:-Zeile einfuegen) + sed -i "s|^generated:| - resource: $2\n id: $3\ngenerated:|" "$1" +} +log_update() { # $1=Concept-Pfad $2=raw-Datei + printf '\n## 2026-08-19\n- Story 3.1-Update: %s (%s; Baseline %s)\n' "$1" "$2" "$BASE" >> wiki/log.md +} + +# ===================================================================== +runlabel "U1: ERWEITERN — neue belegte Aussage, bestehender Pfad wird erweitert (AC-1/FR-6)" +isolate u1 +cat > raw/alpha-v2.md <<'EOF' +Evidenz v2 (neue Aussage): Alpha-Replikation traegt einen zusaetzlichen Schluessel-Rotationszyklus (Stelle S-4). +EOF +git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" +echo "--- Kandidaten-Erhebung: rg -l 'schluessel-rotationszyklus' wiki/ ---" +if command -v rg >/dev/null 2>&1; then rg -l 'schluessel-rotationszyklus' -g '!log.md' wiki/ || true +else grep -rl 'schluessel-rotationszyklus' --exclude=log.md wiki/ || true; fi +echo "--- UPDATE: neue Aussage als Absatz angefuegt (§5.5-Inline-Beleg), sources-Zuwachs s2, at-Bump ---" +cat >> wiki/alpha.md <<'EOF' +Alpha führt für die Replikation einen zusätzlichen Schlüssel-Rotationszyklus (raw/alpha-v2.md#S-4). +EOF +add_source wiki/alpha.md raw/alpha-v2.md s2 +bump_at wiki/alpha.md +log_update alpha raw/alpha-v2.md +echo "--- Struktur-Erhaltung: bestehende drei Aussagen byte-identisch erhalten? ---" +grep -qF 'Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich (raw/alpha-v1.md#S-1).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 1 wurde beim Erweitern umgeschrieben" >&2; exit 1; } +grep -qF 'Alpha rotiert seine Schlüssel nie (raw/alpha-v1.md#S-2).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 3 wurde beim Erweitern umgeschrieben" >&2; exit 1; } +echo "RESULT: PASS — bestehende belegte Aussagen unveraendert (Struktur-Erhaltungsregel Erweitern)" +echo "--- Probe (Pkt. 5, vor dem Commit) ---"; probe +assert_invariant "alpha log" +assert_frontmatter wiki/alpha.md raw/alpha-v1.md raw/alpha-v2.md + +# ===================================================================== +runlabel "U2: PRAEZISIEREN — bestehende Aussage wird an ihr selbst geschaerft (AC-2/FR-6)" +isolate u2 +cat > raw/alpha-v2.md <<'EOF' +Evidenz v2 (Praezisierung): die deterministische-init-sequenz wird nach der initialen Synchronisation zusaetzlich rotiert (Stelle S-2). +EOF +git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" +echo "--- UPDATE: Aussage 1 an Position geschaerft, Beleg nachgefuehrt (Multi-Beleg §5.5); kein Satz-Umbau ---" +sed -i 's|^Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich (raw/alpha-v1.md#S-1)\.|Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich und rotiert sie nach der initialen Synchronisation zusätzlich (raw/alpha-v1.md#S-1; raw/alpha-v2.md#S-2).|' wiki/alpha.md +add_source wiki/alpha.md raw/alpha-v2.md s2 +bump_at wiki/alpha.md +log_update alpha raw/alpha-v2.md +echo "--- Struktur-Erhaltung: Aussagen 2/3 unveraendert, geschaerfte Aussage 1 an Position? ---" +grep -qF 'Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich und rotiert sie nach der initialen Synchronisation zusätzlich (raw/alpha-v1.md#S-1; raw/alpha-v2.md#S-2).' wiki/alpha.md || { echo "HARD-FAIL: geschaerfte Aussage fehlt" >&2; exit 1; } +grep -qF 'Alpha läuft ausschließlich auf isolierten Netzen (raw/alpha-v1.md#S-3).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 2 wurde beim Praezisieren veraendert" >&2; exit 1; } +echo "RESULT: PASS — Schaerfung an der Aussage selbst, Position/Struktur erhalten, kein Satz-Umbau" +echo "--- Probe ---"; probe +assert_invariant "alpha log" +assert_frontmatter wiki/alpha.md raw/alpha-v1.md raw/alpha-v2.md + +# ===================================================================== +runlabel "U3: KORRIGIEREN — fehlerhafte Aussage abgeloest, nicht still geloescht (AC-2, AD-16-Default)" +isolate u3 +cat > raw/alpha-v2.md <<'EOF' +Evidenz v2 (Korrektur): Alpha rotiert seine Schluessel bei jeder Sitzung (Stelle S-2). +EOF +git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" +echo "--- UPDATE: Aussage 3 wird explizit abgeloest + Ersetzungsbeleg; keine stille Loeschung ---" +sed -i 's|^Alpha rotiert seine Schlüssel nie (raw/alpha-v1.md#S-2)\.|Alpha rotierte seine Schlüssel nie (raw/alpha-v1.md#S-2) — überholt durch: Alpha rotiert seine Schlüssel bei jeder Sitzung (raw/alpha-v2.md#S-2).|' wiki/alpha.md +add_source wiki/alpha.md raw/alpha-v2.md s2 +bump_at wiki/alpha.md +log_update alpha raw/alpha-v2.md +echo "--- AD-16-Default: alte Aussage textuell erhalten (nicht still geloescht)? ---" +grep -qF 'rotierte seine Schlüssel nie' wiki/alpha.md || { echo "HARD-FAIL: alte Aussage wurde still geloescht (AD-16)" >&2; exit 1; } +grep -qF 'rotiert seine Schlüssel bei jeder Sitzung (raw/alpha-v2.md#S-2)' wiki/alpha.md || { echo "HARD-FAIL: Ersetzungsbeleg fehlt" >&2; exit 1; } +echo "RESULT: PASS — Abloesung mit Ersetzungsbeleg, Provenienz erhalten (AD-16-Default Erhaltung)" +echo "--- Probe ---"; probe +assert_invariant "alpha log" +assert_frontmatter wiki/alpha.md raw/alpha-v1.md raw/alpha-v2.md + +# ===================================================================== +runlabel "U4: NO_OP — Evidenz ist bereits vollstaendig im Body (engere Auslegung, Pkt. 2)" +isolate u4 +cat > raw/alpha-v2.md <<'EOF' +Evidenz v2 (Redundanz): deterministische-init-sequenz fuer den Abgleich; Alpha rotiert seine Schluessel nie. +EOF +git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" +echo "--- Kandidaten-Erhebung: Terme treffen alpha; die Evidenz ist bereits vollstaendig enthalten ---" +echo "--- UPDATE: KEINE Body-Mutation, KEIN at-Bump, KEIN sources-Zusatz, KEIN log.md-Eintrag (byte-identisch) ---" +if git status --porcelain -- wiki/ | grep -q .; then + echo "HARD-FAIL (No-Op): Wiki-Baum ist nicht byte-identisch" >&2 + git status --porcelain -- wiki/ + exit 1 +fi +echo "RESULT: PASS — No-Op: keine Mutation, kein at-Bump, kein sources-Zusatz, kein log.md-Eintrag (byte-identisch)" +echo "--- Probe (leer = Ghost-Diff-negativ, leere Menge ist Teilmenge jeder erlaubten Menge) ---"; probe +assert_invariant "" + +# ===================================================================== +runlabel "U5: NEGATIV-KONTROLLE — Assertions-Mechanik erkennt einen Ghost-Diff (nicht vacuous)" +isolate u5 +echo "unbefugte Mutation auf nicht-betroffenem beta" >> wiki/beta.md # simulierter Ghost-Diff +echo "--- Probe (erwartet: beta ausserhalb der erlaubten Menge {alpha log}) ---"; probe +if ( assert_invariant "alpha log" ) >/dev/null 2>&1; then + echo "HARD-FAIL (Assertions-Mechanik): Ghost-Diff auf beta wurde NICHT erkannt" >&2 + exit 1 +else + echo "RESULT: PASS — Ghost-Diff auf beta wurde erkannt (Assertions-Mechanik loest verlaesslich HARD-FAIL aus, kein Ghost-Diff kommt durch)" +fi + +# ===================================================================== +runlabel "U6: ZWEI-RUN-IDENTITAET (AD-17h/A0-19) — gleicher Git-State + gleiches Eingabeset -> identischer Update-Vorgang" +# Zwei unabhaengige Runs ueber dieselbe Evidenz (Erweitern); die Ergebnisse +# (mutierter Body + Frontmatter + Status) muessen byte-identisch sein. +run_erweitern() { # $1 = Branchname; mutiert Worktree, dann git add -A (Staging) + isolate "$1" + cat > raw/alpha-v2.md <<'EOF' +Evidenz v2 (neue Aussage): Alpha-Replikation traegt einen zusaetzlichen Schluessel-Rotationszyklus (Stelle S-4). +EOF + git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" + cat >> wiki/alpha.md <<'EOF' +Alpha führt für die Replikation einen zusätzlichen Schlüssel-Rotationszyklus (raw/alpha-v2.md#S-4). +EOF + add_source wiki/alpha.md raw/alpha-v2.md s2 + bump_at wiki/alpha.md + log_update alpha raw/alpha-v2.md + git add -A # Staging — die Mutationen sind Teil des Runs (Commit-Boundary = Mutations-Boundary) +} +run_erweitern u6a +A_ALPHA=$(sha256sum wiki/alpha.md | cut -d' ' -f1) # Worktree-Inhalt = staged-Inhalt (git add) +A_LOG=$(sha256sum wiki/log.md | cut -d' ' -f1) +git commit -qm "Run A (Erweitern)" +A_ALPHA_COM=$(git show HEAD:wiki/alpha.md | sha256sum | cut -d' ' -f1) +run_erweitern u6b +B_ALPHA=$(sha256sum wiki/alpha.md | cut -d' ' -f1) +B_LOG=$(sha256sum wiki/log.md | cut -d' ' -f1) +git commit -qm "Run B (Erweitern)" +B_ALPHA_COM=$(git show HEAD:wiki/alpha.md | sha256sum | cut -d' ' -f1) +echo "Run A (alpha.md): $A_ALPHA" +echo "Run B (alpha.md): $B_ALPHA" +echo "Run A (log.md): $A_LOG" +echo "Run B (log.md): $B_LOG" +echo "Run A commit (alpha.md): $A_ALPHA_COM ; Run B commit (alpha.md): $B_ALPHA_COM" +if [ "$A_ALPHA" = "$B_ALPHA" ] && [ "$A_LOG" = "$B_LOG" ] && [ "$A_ALPHA_COM" = "$B_ALPHA_COM" ]; then + echo "RESULT: PASS — zwei unabhaengige Runs ueber dieselbe Evidenz -> identischer Update-Vorgang (AD-17h/A0-19)" +else + echo "HARD-FAIL (Determinismus-Vertrag): Run A und Run B weichen ab" >&2 + exit 1 +fi + +# ===================================================================== +runlabel "U7: MEHRFACH_TREFFER — zwei Neuevidenzen desselben Runs treffen denselben Concept-Pfad (Konsolidierung, I/O-Matrix)" +# Matrix-Zeile MEHRFACH_TREFFER: mehrere neue Wissenseinheiten desselben Runs auf +# denselben Pfad -> EIN konsolidiertes Update (eine Body-Mutation, EIN log.md-Eintrag, +# EIN konsolidierter sources-Zuwachs, EIN generated.at). Reihenfolge = Zuwachs-Sicht +# (Ankunftsreihenfolge der Belege); lexikografischer Tie-Break bei identischem Ort +# (Body-Ende) -> alpha-v2.md vor alpha-v3.md. +isolate u7 +cat > raw/alpha-v2.md <<'EOF' +Evidenz v2 (neue Aussage): Alpha-Replikation nutzt Quorum-Bestaetigung (Stelle S-4). +EOF +cat > raw/alpha-v3.md <<'EOF' +Evidenz v3 (neue Aussage): Alpha-Replikation waechst linear zum Cluster (Stelle S-4). +EOF +git add -A; git commit -qm "Zwei Einheiten, ein Run (raw/alpha-v2.md + raw/alpha-v3.md)" +echo "--- Kandidaten-Erhebung: beide Terme treffen denselben Pfad alpha ---" +echo "--- KONSOLIDIERTES UPDATE: beide Aussagen als Absaetze angehaengt (Zuwachs-Sicht: v2 vor v3), EIN log-Eintrag, sources-Zuwachs s2+s3, EIN at ---" +cat >> wiki/alpha.md <<'EOF' +Alpha-Replikation nutzt Quorum-Bestaetigung (raw/alpha-v2.md#S-4). +Alpha-Replikation waechst linear zum Cluster (raw/alpha-v3.md#S-4). +EOF +add_source wiki/alpha.md raw/alpha-v2.md s2 +add_source wiki/alpha.md raw/alpha-v3.md s3 +bump_at wiki/alpha.md +log_update alpha raw/alpha-v2.md +echo "--- Konsolidierung: genau EIN log.md-Eintrag und EIN generated.at trotz zweier Einheiten? ---" +[ "$(grep -c 'Story 3.1-Update: alpha' wiki/log.md)" -le 1 ] || { echo "HARD-FAIL: Mehrfach-Treffer erzeugte mehrere log.md-Eintraege (keine Konsolidierung)" >&2; exit 1; } +[ "$(grep -c '^ at:' wiki/alpha.md)" -eq 1 ] || { echo "HARD-FAIL: Mehrfach-Treffer erzeugte mehrere generated.at" >&2; exit 1; } +echo "--- Struktur-Erhaltung: alte Aussagen byte-identisch, beide neuen Aussagen vorhanden, Zuwachs-Sicht-Ordnung v2-vor-v3 ---" +grep -qF 'Das Alpha-Protokoll verwendet deterministische-init-sequenz für den Abgleich (raw/alpha-v1.md#S-1).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 1 wurde beim konsolidierten Update umgeschrieben" >&2; exit 1; } +grep -qF 'Alpha läuft ausschließlich auf isolierten Netzen (raw/alpha-v1.md#S-3).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 2 wurde beim konsolidierten Update umgeschrieben" >&2; exit 1; } +grep -qF 'Alpha rotiert seine Schlüssel nie (raw/alpha-v1.md#S-2).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 3 wurde beim konsolidierten Update umgeschrieben" >&2; exit 1; } +grep -qF 'Quorum-Bestaetigung (raw/alpha-v2.md#S-4)' wiki/alpha.md || { echo "HARD-FAIL: neue Aussage aus v2 fehlt" >&2; exit 1; } +grep -qF 'waechst linear zum Cluster (raw/alpha-v3.md#S-4)' wiki/alpha.md || { echo "HARD-FAIL: neue Aussage aus v3 fehlt" >&2; exit 1; } +v2pos=$(grep -n 'Quorum-Bestaetigung' wiki/alpha.md | cut -d: -f1); v3pos=$(grep -n 'waechst linear' wiki/alpha.md | cut -d: -f1) +[ "$v2pos" -lt "$v3pos" ] || { echo "HARD-FAIL: Zuwachs-Sicht-Ordnung verletzt (v3 vor v2)" >&2; exit 1; } +echo "RESULT: PASS — ein konsolidiertes Update (eine Body-Aenderung, ein log-Eintrag, ein sources-Zuwachs s2+s3, ein at); Zuwachs-Sicht-Ordnung v2-vor-v3" +echo "--- Probe ---"; probe +assert_invariant "alpha log" +assert_frontmatter wiki/alpha.md raw/alpha-v1.md raw/alpha-v2.md raw/alpha-v3.md + +echo +echo "===== Sandbox abgeschlossen (alle 7 Tests U1-U7) =====" +echo "Sandbox-Root: $ROOT (loeschbar: rm -rf $ROOT)" + +## NEW FILE: spec-3-3 (untracked): +--- +title: 'Bestehende Concepts erweitern/präzisieren/korrigieren — Update-Formen operativ schärfen (Story 3.3)' +type: 'feature' +created: '2026-08-19' +status: 'in-review' +review_loop_iteration: 0 +baseline_commit: 52f88fdc5f3ea0fe5323412ca3ba8b4a1bdbf549 +context: + - _bmad-output/implementation-artifacts/epic-3-context.md +--- + + + +## Intent + +**Problem:** Story 3.1 verankerte die Update-Mechanik (Erweitern/Präzisieren/Korrigieren) in `schema/compiler.md` §5.9 als Regeltext, Story 3.2 die Candidate-Erhebung (§3.2). Unoperativ bleibt die **Ausführung je Update-Form** — v. a. das Story-3.3-AC aus FR-6: „der Text wird präzisiert oder korrigiert, **ohne die Struktur zu zerstören**". Der Compiler hat keine deterministische Anleitung, wie Präzisieren (Schärfen einer bestehenden Aussage) von Erweitern (Anfügen) abzugrenzen ist und was die „Struktur" (Frontmatter, bestehende belegte Aussagen, Provenienz-Verkettung) beim Übergriff auf einen bestehenden Absatz schützt. + +**Approach:** Story 3.3 schärft §5.9 (Revision 2.8): die drei Update-Formen werden **operationell** ausformuliert — je Form ein deterministisch prüfbares **Abgrenzungskriterium** (Welche Form greift wann?), die **Struktur-Erhaltungsregel** (was bleibt unverändert: Frontmatter-Subset, bestehende belegte Aussagen + §5.5-Inline-Verweise, §5.6-Pin) und der Textgenauigkeits-Rahmen (Schärfen an der Aussage, kein Satz-Umbau, kein Neuschreiben ohne Ersetzungsbeleg). Zusätzlich eine **re-executierbare Sandbox** (`sandbox-3-3/run-sandbox.sh`, Muster Story-3.1): Demonstriert einen echten Update-Run mit committeter Neuevidenz in allen drei Formen + No-Op und prüft die Erhaltungs-Invariante (§5.9 Pkt. 5) als harte Assertion. Keine Inhalts-Mutation des realen Bundles (kein neues `raw/`-Material, AD-3); kein neues Prädikat, kein Vertrag-/Validator-/`raw/`-Change; kein Standalone (D-3). + +## Boundaries & Constraints + +**Always:** +- **Instruktions-Story (D-3):** Schärfung ausschließlich in `schema/compiler.md` §5.9 als deterministischer Text. Kein executable, kein Standalone, keine neue §7-Invaliditätsklasse, kein Change an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3). +- **Struktur-Erhaltungs-Invariante (Kern, FR-6/AC-2):** Update tastet die Struktur nicht an — (1) Frontmatter bleibt Subset-konform (nur `sources`-Zuwachs um echten neuen Beleg + `generated.at`-Bump zulässig); (2) bestehende belegte Aussagen werden nicht umgeschrieben ohne Präzisieren an ihr selbst bzw. Korrigieren mit Ersetzungsbeleg (§5.5-Inline-Verweise bleiben gültig soweit Beleg Body-Bestand); (3) gepinnte Linkform unverändert, keine neuen Links außer bei echten Beziehungen (§5.9 Pkt. 3). +- **Determinismus (AD-17h/A0-19):** Form-Wahl folgt aus der committeten Evidenz; gleicher Git-State + gleiche Eingabemenge → identischer Update-Vorgang. Abgrenzungsregeln textuell prüfbar (neue Aussage → Erweitern; Schärfung einer bestehenden → Präzisieren; ersetzende → Korrigieren). +- **Kein Leasing-Scope in 3.3:** AC-4 (Mutation nur im geleasten Bereich, AD-17.3) bleibt Story 3.5/3.6; AD-17f-Basis unverändert. §5.9 Pkt. 5/6-R1/P2-Bausteine unverändert. +- `sprint-status.yaml`: Key `3-3-bestehende-concepts-erweitern-präzisieren-korrigieren` → **in-progress** (bei Implementierung). + +**Ask First:** §5.6-Linkform-Änderung (A0-9) · AD-7d-Renames · Inhalts-Mutation des realen Bundles · Validator-/Vertrags-/`raw/`-Change · Commit-Boundary-Änderung · Leasing-Ausweitung (3.5-Scope). + +**Never:** Änderungen an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3) · neue §7-Invaliditätsklasse · Standalone (D-3) · Duplikat-Anlage eines bestehenden Pfads · „Regenerate Everything" (AD-5/A0-6) · stille Löschung von Provenienz ohne Ersetzungsbeleg (AD-16) · stiller Absatz-Neuschreib (Structure-Preservation-Fall). + +## I/O & Edge-Case Matrix + +| Scenario | Input / State | Expected Output / Behavior | Error Handling | +|----------|--------------|---------------------------|----------------| +| HAPPY_ERWEITERN | Neue committete Evidenz trägt eine neue belegte Aussage zum bestehenden Concept | **Erweitern:** neue Aussage als Absatz ergänzt (mit §5.5-Inline-Beleg), bestehende Aussagen unverändert; `sources`-Zuwachs um echten neuen Beleg; `at`-Bump; `log.md`-Eintrag „Story 3.1-Update" | NO_MATCH → UNTOUCHED_CONCEPT (keine Mutation) | +| HAPPY_PRAEZISIEREN | Evidenz schärft eine bestehende Aussage (präzisierende Information, FR-6/AC-2) | **Präzisieren:** Formulierung/Abgrenzung an der bestehenden Aussage geschärft, Position/Struktur erhalten; Beleg nachgeführt; kein Satz-Umbau/Neuschreib | keine bestehende Aussage als Anker → nicht Präzisieren (ggf. Erweitern) | +| HAPPY_KORRIGIEREN | Evidenz ersetzt eine fehlerhafte/überholte Aussage | **Korrigieren:** ersetzte Aussage **nicht still gelöscht**, sondern explizit abgelöst + Ersetzungsbeleg (AD-16-Default Erhaltung) | widersprechender Inhalt ohne Ersetzungsevidenz → bleibt erhalten, Disagreement in `log.md` (Epic-4-Interface) | +| NO_OP_KANDIDAT | Evidenz bereits vollständig im Body enthalten | **No-Op:** keine Mutation, kein `at`-Bump, kein `sources`-Zusatz, kein `log.md`-Eintrag — byte-identisch | im Zweifel greift Erweitern/Präzisieren (No-Op = engere Auslegung) | +| STRUKTUR_ERHALT | Update greift in Body mit belegten Aussagen + Inline-Verweisen | Struktur unverändert: Subset, Verweise, Linkform; kein unbefugter Key | Verstoß → Update fehlerhaft; Rollback + textuell benannter Verstoß (NFR-4) | +| MEHRFACH_TREFFER | Mehrere Einheiten desselben Runs treffen denselben Pfad | Konsolidierung: ein Update, ein `log.md`-Eintrag, ein konsolidierter `sources`-Zuwachs, ein `at` | Reihenfolge = Zuwachs-Sicht; lexikografischer Tie-Break | + + + +## Code Map + +- `schema/compiler.md` — **primär mutiert** (D-3, einziger Instruktions-Ort): + - §5.9 Pkt. 2 (`:261-269`): drei Update-Formen **operationell ausformulieren** (a) Abgrenzungskriterium je Form, (b) Struktur-Erhaltungsregel (Definition „Struktur" + was unverändert bleibt), (c) Textgenauigkeits-Rahmen für Präzisieren. Bestehender Regeltext (Form-Bullets, `sources`-Regel, `at`-Konvention, No-Op, Konsolidierung) bleibt normativ **unverändert** — Schärfung als Ausführungs-Ebene ohne neue Logik. + - §5.9 Pkt. 5 (`:272-278`): Erhaltungs-Invariante — Struktur-Erhaltungs-Bezug ergänzen (Diff-Probe erfasst Pfad-Mengen; Struktur pro Pfad über Pkt.-2-Regeln geprüft). + - §5.9 Pkt. 6 (`:279-281`): P2-Block — Struktur-Erhaltungs-Check als zusätzliches textuelles Element (keine unbefugten Keys, keine stille Löschung, Links unverändert). + - §8 Revisionslog (`:375`): **Revision 2.8** (Story 3.3) mit Abschlussklausel (kein Vertrags-/Validator-/`raw/`-Change, keine §7-Klasse, kein Standalone). +- `_bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh` — **neu** (re-executierbar, Muster Story-3.1-Sandbox): Mini-Bundle mit einem Concept + committeter Neuevidenz; alle drei Formen + No-Op durchspielen; Erhaltungs-Invariante als harte Assertion (Diff ⊆ {betroffener Pfad, log}; keine neue Datei; kein Ghost-Diff); Zwei-Run-Identität; Frontmatter-Konformität je mutiertem Concept. +- `wiki/log.md` — **append** (append-only, Vertrag §5): Story-3.3-Eintrag (Schärfung, Sandbox-Nachweis, Statuswechsel, Validator-Verdikt); bestehende Bullets unverändert. +- `_bmad-output/implementation-artifacts/sprint-status.yaml` — **mutiert**: Key `3-3-…` (`:56`) → `in-progress` (→ `done` bei Story-Abschluss). +- `schema/validator.md`, `schema/wiki-compiler.md`, `raw/…` — **read-only** (AD-3). Keine Concept-Inhalts-Mutation (Instruktions-Story; kein neues committetes `raw/`-Material vorhanden — Demonstration per Sandbox). + +## Tasks & Acceptance + +**Execution:** +- [x] `schema/compiler.md` — §5.9-Pkt.-2-Update-Formen operationell schärfen (je Form Abgrenzungskriterium + Struktur-Erhaltungsregel + Textgenauigkeits-Rahmen; bestehender Regeltext unverändert) · §5.9-Pkt.-5/-6: Struktur-Bezug + P2-Check-Element · §8 Revision 2.8; ohne Change an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/`. +- [x] `sandbox-3-3/run-sandbox.sh` — Update-Run-Demonstrator (Erweitern + Präzisieren + Korrigieren + No-Op), Erhaltungs-Invariante als harte Assertion, Zwei-Run-Identität. **Erweitert um U7 MEHRFACH_TREFFER** (I/O-Matrix-Row, Konsolidierung mehrerer Einheiten auf denselben Pfad) — alle 7 Tests (U1–U7) PASS, Exit 0. +- [x] `wiki/log.md` — Story-3.3-Eintrag (Vertrag §5, append-only): Schärfung, Sandbox-Nachweis, Statuswechsel, per-Datei-Validator-Verdikt. +- [x] `sprint-status.yaml` — Key `3-3-…` → in-progress. + +**Acceptance Criteria:** +- Given eine neue Erkenntnis zu einem bestehenden Concept, when der Run sie verarbeitet, then erweitert er das bestehende Concept anstelle der Anlage einer neuen Datei (AC-1; FR-6) — Erweitern-Regel in §5.9 Pkt. 2, Sandbox belegt sie (keine neue Datei im Diff). +- Given eine präzisierende Information, when sie eingearbeitet wird, then wird der Text präzisiert oder korrigiert, ohne die Struktur zu zerstören (AC-2; FR-6) — Struktur-Erhaltungsregel in §5.9 Pkt. 2/5 definiert. +- Given eine Aktualisierung, when sie erfolgt, then bleiben Beziehungen und Provenienz soweit weiterhin gültig erhalten (AC-3; FR-6) — Inline-Verweise + Linkform unverändert gültig soweit Beleg Body-Bestand; `sources`-Zuwachs nur um echte neue Belege. +- Given die Instruktion, when geprüft, then bleibt `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3), keine neue §7-Klasse, kein Standalone (D-3), kein Leasing-Scope (AC-4 → 3.5/3.6, AD-17.3-Hinweis in §7) — Validator auf Ist-Bundle SUCCESS (7/7 unverändert). + +## Spec Change Log + +*(Append-only — hier von step-04 während der Review-Loops befüllt. Noch leer.)* + +## Design Notes + +**Warum Ergänzung, nicht Umbau:** Die Story-3.3-Schärfung ist ein Ausführungs-Sub-Block an Pkt. 2 — sie definiert die offene Frage „Was tue ich konkret bei jedem Form-Fall, und was lasse ich unangetastet?" als deterministische Brücke Regel → Run (AD-17h): dieselbe Evidenz + formale Struktur → identisches Update-Ergebnis. Der frozen Story-3.1-Regeltext bleibt unverändert; die operationellen Regeln werden als Präzisierungsebene darunter angefügt (keine Re-Negotiation). + +**Struktur-Definition (das Geschützte):** (1) Frontmatter (Subset + canonische Reihenfolge; zulässig: `sources`-Zuwachs, `at`-Bump; kein neuer Key, keine Entfernung ohne Beleg); (2) bestehende belegte Aussagen mit §5.5-Inline-Verweisen (nicht umgeschrieben ohne dass Präzisieren/Korrigieren greift); (3) Linkzeichen §5.6-Pin (kein Linkumbau bei reinem Body-Update). Das ist die Bedeutung von „ohne die Struktur zu zerstören" (FR-6/AC-2). + +**Abgrenzungskriterium (aus der Evidenz):** (a) belegte Aussage existiert im Body nicht → Erweitern; (b) schärft bestehende Formulierung/Abgrenzung ohne Ersatz → Präzisieren; (c) ersetzt eine bestehende als fehlerhaft/überholt → Korrigieren; (d) nichts davon → No-Op. Unschärfe → zugunsten Erweitern/Präzisieren (No-Op = engere Auslegung, bestehende §5.9-Regel). + +## Verification + +**Commands (re-executierbar, ab Workspace-Root):** +1. `bash _bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh` — expected: alle Szenarien mit harten Pass/Fail-Assertionen, Erhaltungs-Invariante erzwungen, Exit 0. +2. `grep -n "Struktur-Erhaltungsregel\|operationelle\|Revision 2.8" schema/compiler.md` — liefert die operationellen Regeln + Revisionslog. +3. Read-only (AD-3): `git status --porcelain` zeigt keinen Change an `schema/validator.md`/`schema/wiki-compiler.md`/`raw/`. +4. Validator-Lauf: alle `wiki/`-Dateien SUCCESS (unverändert, keine Inhalts-Mutation). + +**Manual checks:** +- §5.9 Pkt. 2 trägt Abgrenzungskriterium + Struktur-Erhaltungsregel + Textgenauigkeits-Rahmen; bestehender Regeltext unverändert; §8-Rev-2.8 mit Abschlussklausel; kein `validator.md`/`wiki-compiler.md`/`raw/`-Diff; §7 ohne neuen Platzhalter (Update-Thema entlassen, AC-4-Leasing an 3.5/3.6); `wiki/log.md`-Eintrag datiert mit Story-3.3-Semantik + Sandbox-Nachweis + Statuswechsel + Verdikt; `sprint-status.yaml` konsistent. diff --git a/schema/compiler.md b/schema/compiler.md index 9b41799..a9d4557 100644 --- a/schema/compiler.md +++ b/schema/compiler.md @@ -267,6 +267,11 @@ Diese Sektion ist der **einzige Instruktions-Ort** der Update-Mutationsmechanik - **No-Op-Kandidat (Review-Loop-2-Präzisierung):** Erhebt die Kandidatenerhebung einen Pfad, dessen Body die neue Evidenz **bereits vollständig enthält** (keiner der drei Update-Formen greift — keine neue belegte Aussage, keine Schärferung, keine Ersetzung), ist der Kandidat ein **No-Op**: **keine** Body-Mutation, **kein** `generated.at`-Bump, **kein** `sources`-Zusatz, **kein** `log.md`-Eintrag — der Pfad bleibt byte-identisch (Erhaltungs-Invariante, Pkt. 5). Die Entscheidung „keiner der drei Formata greift" ist selbst textuell deterministisch: sie trifft nur, wenn die neue Evidenz keine Aussage trägt, die im Body nicht bereits als belegte Aussage vorhanden ist (Term-/Stellen-Abgleich mit §5.5-Inline-Verweisen); im Zweifel (neue belegte Aussage auch nur in abgewandelter Form) greift Erweitern/Präzisieren — der No-Op ist die *engere* Auslegung. - **Mehrfach-Treffer-Konsolidierung (ein Run, mehrere Einheiten auf denselben Concept-Pfad):** Ergeben mehrere neue Wissenseinheiten desselben Runs auf **demselben** bestehenden Concept-Pfad ein Update, werden ihre Mutationen in **einem einzigen Update dieses Pfads** konsolidiert (eine Body-Änderung, **ein** `log.md`-Eintrag „Story 3.1-Update", ein konsolidierter `sources`-Zuwachs, **ein** `generated.at`-Zeitstempel — der einmalige `at` des Runs). Die Reihenfolge der Einheiten wird dabei textual-deterministisch aus der Verarbeitung der Evidenz abgeleitet: REIHENFOLGE = **Auftritt der Einheiten in der Zuwachs-Sicht** (Datei-Reihenfolge des R-1-Zuwachsbefunds, dann Stellen-Reihenfolge innerhalb der Datei); nur bei Einheiten desselben Ortes (identischer Dateipfad + identische Stelle) greift die lexicografische Ordnung als Tie-Break (Review-Loop-2-Präzisierung: die Reihenfolge ist für *alle* Einheiten definiert, nicht nur für vollständig unabhängige). Die AD-16-Default-Erhaltung bleibt für jede betroffene Stelle gewahrt. - **Commit-Boundary = Mutations-Boundary (AD-17f, §0):** Auch im Update-Pfad werden **Zwischenstände nie als fertige Mutation veröffentlicht** — die Mutationen der Update-Kandidaten werden als Ganzes committet, und zwar erst, nachdem der Diff-Selbsttest (Pkt. 5) ohne Ghost-Diff abgeschlossen ist. Ein Ghost-Diff ist dann als **Abbruch-Vorlauf „korrigierter Teil-Run"** im `log.md`-Eintrag des betroffenen Runs gekoppelt (siehe Disagreement-/Run-Notiz Pkt. 4), damit die Ursache textuell nachvollziehbar bleibt. + - **Operationelle Ausführungs-Ebene je Update-Form (Präzisierungsebene, Story 3.3 / Revision 2.8; Präzisierung des frozen Story-3.1-Regeltexts, keine Re-Negotiation — die operationellen Regeln sind die deterministische Brücke Regel → Run, AD-17h/A0-19):** Die folgenden Ausführungs-Regeln präzisieren, **was der Producer bei jedem Form-Fall konkret tut und was er unangetastet lässt**. Je Update-Form gelten (a) das **Abgrenzungskriterium** (Welche Form greift wann? — ausschließlich aus der committeten Evidenz abgeleitet), (b) die **Struktur-Erhaltungsregel** (was bleibt unverändert — die „Struktur" aus FR-6/AC-2: Frontmatter-Subset, bestehende belegte Aussagen mit §5.5-Inline-Verweisen, §5.6-Pin) und (c) der **Textgenauigkeits-Rahmen** (wie geschärft wird). **No-Op ist keine eigene Form, sondern die Nicht-Form** (keiner der drei Form-Bullets greift) mit eigenem Abgrenzungskriterium und der Erhaltungsregel „volle Byte-Identität". **Abgrenzungs-Reihenfolge (Prozess, AD-17h):** Der Producer prüft die Abgrenzungskriterien **in fester Reihenfolge Korrigieren → Präzisieren → Erweitern → No-Op** (strikt pro Evidenz-Einheit) und wählt die **erste zutreffende** Form: (1) ersetzt die Evidenz eine bestehende belegte Aussage als fehlerhaft/überholt → **Korrigieren**; (2) sonst schärft sie eine bestehende Formulierung/Abgrenzung (ersetzte Wortlautfolge → Ersetzungsbeleg nötig) → **Präzisieren**; (3) sonst trägt sie eine neue belegte Aussage, die noch nicht existiert → **Erweitern**; (4) sonst → **No-Op** (engere Auslegung). Damit ist jeder Einheit genau eine Form zugeordnet (kein Form-Überlapp, gleiche Evidenz → gleiche Form). Gleicher Git-State + gleiche Eingabemenge → identischer Update-Vorgang (AD-17h); der `generated.at`-Wanduhr-Gap (gleiches Eingabeset, unabhängige Runs, verschiedene `at`) bleibt offene A0-20-Konvention mit Home **Story 3.8** (oben, `generated.at`-Konvention) — unverändert bindend. + - **Korrigieren — Abgrenzungskriterium:** greift genau dann, wenn die Evidenz eine bestehende Aussage als **fehlerhaft/überholt ersetzt** (ersetzte Wortlautfolge liegt vor → Ersetzungsbeleg nötig). **Struktur-Erhaltungsregel (Korrigieren):** die ersetzte Aussage wird **nicht still gelöscht**, sondern explizit durch die ersetzende Aussage **abgelöst**; die Ersetzung trägt den **Ersetzungsbeleg** (§5.5, AD-16-Default Erhaltung); die Ablösung erfolgt an der Position der ersetzten Aussage — dabei bleibt die Aussage **in ihrer ursprünglichen Wortlautfolge als abgelöster Bestand** erhalten (die Beleg-Kennung bleibt gültig, nur die Aussage-Fortschreibung wechselt), der Rest des Bodys bleibt unverändert. **Textgenauigkeits-Rahmen (Korrigieren):** nur die fehlerhafte/überholte Aussage wird ersetzt; keine flankierende Umschreibung. + - **Präzisieren — Abgrenzungskriterium:** greift genau dann, wenn die Evidenz eine **bestehende Formulierung/Abgrenzung schärft** (präzisierende Information an derselben Aussage, ohne Ersatz). **Struktur-Erhaltungsregel (Präzisieren):** die geschärfte Aussage bleibt an ihrer **Position**, das Satzgefüge wird **nicht umgebaut**, umgebende Aussagen, §5.5-Inline-Verweise anderer Aussagen und die §5.6-Linkform bleiben unverändert; der Beleg wird bei der Aussage neu/nachgeführt (§5.5). **Textgenauigkeits-Rahmen (Präzisieren):** Schärfen = Formulierung/Abgrenzung **an der Aussage selbst**; **kein Satz-Umbau** (keine Neustrukturierung des Absatzes), **kein Neuschreiben ohne Ersetzungsbeleg** — jede ersetzte Formulierung braucht die neue/fortgeführte `raw/`-Evidenz als Inline-Verweis. + - **Erweitern — Abgrenzungskriterium:** greift dann, wenn die neue committete Evidenz eine **neue belegte Aussage** trägt, die im bestehenden Body **nicht** existiert (Term-/Stellen-Abgleich gegen die §5.5-Inline-Verweise; kein bestehender Anker). **Struktur-Erhaltungsregel (Erweitern):** die neue Aussage wird als **eigener Absatz angefügt** (Body-Ende); bestehende belegte Aussagen bleiben **byte-identisch**, keine Umschreibung bestehender Absätze; Frontmatter nur `sources`-**Zuwachs um den echten neuen Beleg** + ein `generated.at`-Bump. **Textgenauigkeits-Rahmen (Erweitern):** die neue Aussage wird eigenständig formuliert, trägt den §5.5-Inline-Beleg mit existierender Stellen-Kennung; kein Satz-Umbau des Bestands. *(Überlappt eine Einheit mehrere Formen — z. B. sie trägt zugleich eine neue belegte Aussage und eine Schärfung einer bestehenden —, ordnet der Producer die Einheit der in der Abgrenzungs-Reihenfolge ersten zutreffenden Form zu (deterministisch, AD-17h); die Textgenauigkeits-Rahmen der übrigen Formen gelten für die jeweiligen Teilbestandteile unverändert.)* + - **No-Op — Abgrenzungskriterium (Nicht-Form, engere Auslegung, bestehende Regel oben):** greift nur, wenn **keine** der drei Formen greift (die Evidenz ist bereits vollständig im Body); im Zweifel trifft eine der drei Formen — die Entscheidung ist textuell deterministisch (Term-/Stellen-Abgleich). **Erhaltungsregel (No-Op):** volle Byte-Identität (keine Mutation, kein `at`-Bump, kein `sources`-Zusatz, kein `log.md`-Eintrag). 3. **Index-/Link-Form unverändert (§5.6-Pin):** Ein reines Body-Update ändert die Concept-Identität nicht → der bestehende Index-Link (Bundleroot oder Area-`index.md`) bleibt unverändert gültig; **kein neuer Link** bei reinem Body-Update (kein Index-`index.md`-Zusatz). Die **`log.md`-Eintragspflicht** (Pkt. 4) bleibt davon **unberührt**: *jedes* Update — auch ein reines Body-Update — MUSS seinen `log.md`-Eintrag „Story 3.1-Update" führen; nur der **Index-**Link bleibt unverändert. Wird durch das Update eine Concept-Kategorie (Root vs. Area) oder die Identität berührt, ist das **Ask-First** (AD-7d-Renames/Redirects; nicht Teil von Story 3.1). Neue zulässige Concept-Links (Beziehungsschicht, §5.6) werden nur gesetzt, wenn die neue Erkenntnis eine echte, inhaltsbegründete Beziehung rechtfertigt. 4. **`log.md`-Eintragspflicht (Vertrag §5):** Jedes Update wird als datumsgruppierter Eintrag in `wiki/log.md` dokumentiert (Header = ISO-Datum `YYYY-MM-DD`, neueste zuerst), verknüpft mit dem mutierten Concept-Pfad und den genutzten `raw/`-Quellen. Für Updates wird der Eintrag als „**Story 3.1-Update**" markiert (disambiguierbar von Anlage-Einträgen). Konflikt-/Erhaltungsfälle (Pkt. 2 „Korrigieren" ohne Ersetzungsevidenz) werden explizit als Disagreement-Eintrag mit dem mutierten Concept-Pfad geführt (AD-16b, Vertrag §5) — der Epic-4-Interface-Fall bleibt dokumentiert, ohne Korrektur-Klassifikation hier. 5. **Erhaltungs-Invariante (Kern) + deterministischer Diff-Selbsttest (AD-17h, FT-6/FR-12):** Ein Compilation Run darf nur die Concepts **neu anlegen oder verändern**, die durch den erkannten Erkenntnis-Zuwachs tatsächlich betroffen sind. **Nicht betroffene Concept-Pfade bleiben byte-identisch unverändert** — es gibt **nie** „Regenerate Everything" (AD-5, A0-6). Die Inkrementalität ist als **re-executierbarer Diff-Selbsttest** mechanisch kontrollierbar: Nach jedem Run prüft der Producer ab der Workspace-Root @@ -276,9 +281,10 @@ Diese Sektion ist der **einzige Instruktions-Ort** der Update-Mutationsmechanik ``` (erste Zeile: modifizierte/gelöschte Pfade gegen die Baseline; zweite Zeile: zusätzlich ungetrackte neue Pfade `??` und staged-Änderungen — die Duplikat-Kontrolle „keine neue Datei" braucht die `??`-Sicht, die `git diff` allein nicht liefert; `` siehe Pkt. 6 R-1) dass die geänderten Dateien eine Teilmenge von **(Kandidatenliste ∪ Neu-Anlage-Zielpfade ∪ `log.md` ∪ nachgeführte `index.md`)** — mit der Kandidatenliste aus §3 Pkt. 2 (betroffene *bestehende* Concepts, relative OKF-Pfade ohne `.md`) **plus** den Zielpfaden aller im selben Run neu angelegten Concepts (§5.1/§5.7 — Misch-Runs) plus `log.md` und jede nachgeführte `index.md` als zusätzliche zulässige Einträge. **Probe-Zeitpunkt (D-1-Präzisierung):** die Probe läuft **vor dem Commit**, am Ende des P2-Check-Blocks (Pkt. 6) — nach dem Commit wäre `git diff` leer und die Probe vacuous (Commit-Boundary = Mutations-Boundary, AD-17f: der Run committiert erst, nachdem die Probe ohne Ghost-Diff abgeschlossen ist). **Pfad-Normalisierung vor dem Teilmenge-Vergleich:** die Proben-Ausgabe trägt `wiki/`-Präfix und `.md`-Endung; die Kandidaten-/Ziel-Pfade sind definiert als relative OKF-Pfade *ohne* `.md` — für den Vergleich werden von jedem Proben-Eintrag `wiki/`-Präfix und `.md`-Suffix gestrippt (deterministischer Normalisierungsschritt). Jede Abweichung (**Ghost-Diff** auf einem nicht betroffenen Pfad) ist ein Instruktions-Verstoß (FT-6): Der Producer behebt sie textuell benannt (NFR-4) und **rollt den Ghost-Diff zurück, bevor der Run als gültig vermerkt wird** — der beobachtbare Endzustand des Bundles bleibt damit konsistent (AD-6-Backstop). **Rollback-Mechanik:** der Ghost-Diff betrifft nur Pfade *außerhalb* der erlaubten Menge; der Producer stellt die betroffenen Pfade aus dem Baseline-Zustand wieder her (für modifizierte Pfade: `git checkout -- `; für ungetrackte neue Dateien: Datei löschen; für Index-Änderungen: `git checkout -- wiki/index.md` bzw. die Area-`index.md`) — der Teilzustand-Rollback des §5.3 Pkt. 3 / §6 Pkt. 3 greift daneben unverändert. Für Story 3.1 selbst (Instruktions-Story ohne Inhalts-Mutation) ist der Nachweis: `git diff --name-only -- wiki/` liefert ausschließlich `wiki/log.md` — keine Concept-Datei, keine `index.md` (die aggressive `git diff --stat -- wiki/`-Default-Effektiv-ausgabe zeigt denselben Pfad, `wiki/log.md | 1 +`). *(Anmerkung: `schema/compiler.md` und `deferred-work.md` liegen **außerhalb** `wiki/` und sind daher kein Teil dieser Diff-Probe — sie gehören zum Instruktions-, nicht zum Bundle-Baum; der Ghost-Diff-Begriff dieser Sektion gilt nur für `wiki/`.)* + Die Probe verifiziert dabei **zwei Ebenen** (Struktur-Erhaltungs-Bezug, Story 3.3): **(1) die Pfad-Mengen-Ebene** (obiger Teilmenge-Vergleich — welche Pfade der Run berührt hat) und **(2) die Struktur-Ebene je berührtem Pfad** — die Struktur-Erhaltung „ohne die Struktur zu zerstören" (FR-6/AC-2) wird pro betroffenem Concept-Pfad über die Pkt.-2-Regeln geprüft (Frontmatter-Subset-Konformität: nur `sources`-Zuwachs um echte neue Belege + `generated.at`-Bump, kein neuer Key, keine Entfernung ohne Beleg; bestehende belegte Aussagen nicht umgeschrieben ohne dass Präzisieren/Korrigieren greift; §5.5-Inline-Verweise weiterhin gültig soweit Beleg Body-Bestand; §5.6-Linkform unverändert, keine neuen Links außer bei echten Beziehungen — Verstöße sind textuell zu benennen (NFR-4) und werden vor dem Commit behoben, sonst gilt der Pfad als Ghost-Diff mit Rollback gemäß dieser Pkt.-5-Konsequenz). 6. **Run-Vorphase-Bausteine (Defer R-1 + P2, in den Update-Pfad eingearbeitet):** Beide sind **keine** neuen Prozesse — wiederverwendbare, reproduzierbare textuelle Check-Blöcke innerhalb der Instruktions-Ausführung (D-3): - **Change-Detection (Defer R-1, Input-Zuwachserkennung):** Vor der Interpretation bestimmt der Producer, **welche `raw/`-Dateien Zuwachs** sind (neu/modifiziert). Deterministische Mittel: `git diff --name-only -- raw/` auf das `raw/`-Verzeichnis und/oder der **SHA-256-Record aus `raw/**/source.md`** (Provenienz-Sidecar, §1 Pkt. 4). Als `` dient der **letzte committete Zustand des Workspace** (deterministisch: der HEAD der vorherigen Mutations-Boundary, AD-17f). **Auflösungs-Regel (D-2-Präzisierung, Review-Loop 2):** der Producer **notiert den `` (vollen SHA) im `wiki/log.md`-Eintrag des Runs** — damit ist er deterministisch auflösbar ohne Domain-State-Annahme an Git (AD-14: Git liefert Historie, nicht Domain-State; der log.md-Eintrag ist der State-Referenz-Punkt, keine Git-Historie-Interpretation). **Diskrepanz-Regel:** widersprechen sich `git diff`-Befund und SHA-256-Record für dieselbe Datei, **gewinnt der `git diff`-Befund** (Commit-Boundary = Mutations-Boundary, AD-17f); der SHA-256-Record bleibt Sekundär-Fingerprint. Ist der SHA-256-Record unlesbar/fehlend, wird die Datei dennoch als Zuwachs **nicht doppelt** verarbeitet (textueller Hinweis) und gegen den `git diff`-Befund abgeglichen (kein Doppel-Verdikt). **Fallback:** existiert keine vorherige Mutations-Boundary (frischer Workspace ohne Lauf-Historie), gilt **alle `raw/`-Dateien als Zuwachs**. Die Diff-Probe in Pkt. 5 läuft gegen **dasselbe** `` (Review-Loop-2-Korrektur des Rev-2.4.1-Claims: die Pkt.-5-Probe trägt das Baseline-Commit-Argument explizit). - - **Pre-Run-Reconcile-Check-Block (Defer P2):** Vor jeder Mutation durchläuft der Producer den gebündelten Vorprüf-Block und hält ihn textuell fest: (1) **Input-Zustand** (AD-17a, I/O-Matrix `INPUT_UNCOMMITTED`; Review-Loop-2-D-3): Working-Copy von `raw/` und `wiki/` gegen HEAD prüfen — bei Abweichung (uncommitteder Zustand) bricht der Run mit dem **textuell benannten Abbruch „published/committed Input erforderlich"** ab, **vor** Interpretation und vor jeder Mutation (keine Mutation gegen Zwischenstände); (2) Ziel-Pfade (Ausgangs-Kandidatenliste, §3 Pkt. 2); (3) Quellen-Existenz (EC-1 via Validator-Punkt: jede referenzierte `raw/`-Datei existiert als Datei); (4) Betroffenheits-Kandidatenliste (§3 Pkt. 2, textuell-deterministisch); (5) `wiki/index.md`-V-1-Vorbedingung (fehlende Bundleroot → Run-FAIL, §3 Pkt. 3, Vertrag §2). Dieser Block ist der in `deferred-work.md` als P2 notierte Pre-Plan-Schritt und wird durch Story 3.1 als Teil des inkrementellen Runs ausgeführt. **Zeitpunkt (Review-Loop-2-Präzisierung):** der Block wird **nach Reconcile (2) und vor Mutieren (4)**, am **Anfang der Mutationsphase**, einmal pro Run durchgeführt — die Kandidatenliste (Elemente 2/4) existiert zu diesem Zeitpunkt bereits; die **Diff-Probe (Pkt. 5) läuft am Ende desselben Blocks, nach den Mutationen, vor dem Commit**. Die Kandidatenliste, die hier festgehalten wird, ist **die** Kandidatenliste, gegen die der Diff-Selbsttest (Pkt. 5) prüft (keine zweite, davon abweichende Erhebung nach der Mutation). + - **Pre-Run-Reconcile-Check-Block (Defer P2):** Vor jeder Mutation durchläuft der Producer den gebündelten Vorprüf-Block und hält ihn textuell fest: (1) **Input-Zustand** (AD-17a, I/O-Matrix `INPUT_UNCOMMITTED`; Review-Loop-2-D-3): Working-Copy von `raw/` und `wiki/` gegen HEAD prüfen — bei Abweichung (uncommitteder Zustand) bricht der Run mit dem **textuell benannten Abbruch „published/committed Input erforderlich"** ab, **vor** Interpretation und vor jeder Mutation (keine Mutation gegen Zwischenstände); (2) Ziel-Pfade (Ausgangs-Kandidatenliste, §3 Pkt. 2); (3) Quellen-Existenz (EC-1 via Validator-Punkt: jede referenzierte `raw/`-Datei existiert als Datei); (4) Betroffenheits-Kandidatenliste (§3 Pkt. 2, textuell-deterministisch); (5) `wiki/index.md`-V-1-Vorbedingung (fehlende Bundleroot → Run-FAIL, §3 Pkt. 3, Vertrag §2); (6) **Struktur-Erhaltungs-Check (Story-3.3-Ergänzung als zusätzliches textuelles Element):** vor dem Commit prüft der Producer an den betroffenen Concept-Pfaden, dass keinerlei unbefugte Keys im Frontmatter entstanden sind (Vertrag §3.3/§3.4-Subset, §6.5-Kriterium-1), **keine stille Löschung** bestehender belegter Aussagen/Provenienz erfolgt ist (AD-16, Pkt. 2 „Korrigieren"-Form) und **keine Links** verändert oder ohne echte Beziehung neu gesetzt wurden (§5.6-Pin, Pkt. 3); Verstöße sind textuell benannt (NFR-4) und vor dem Commit zu beheben; die Kandidatenliste bleibt **die** Liste gegen die der Diff-Selbsttest (Pkt. 5) prüft (keine zweite Erhebung nach der Mutation). Dieser Block ist der in `deferred-work.md` als P2 notierte Pre-Plan-Schritt und wird durch Story 3.1 als Teil des inkrementellen Runs ausgeführt. **Zeitpunkt (Review-Loop-2-Präzisierung):** der Block wird **nach Reconcile (2) und vor Mutieren (4)**, am **Anfang der Mutationsphase**, einmal pro Run durchgeführt — die Kandidatenliste (Elemente 2/4) existiert zu diesem Zeitpunkt bereits; die **Diff-Probe (Pkt. 5) läuft am Ende desselben Blocks, nach den Mutationen, vor dem Commit**. 7. **Worked Example (an die reale Ist-Lage gebunden, re-executiert; Review-Loop-2-Korrektur):** Ein Run mit neuer committeter Evidenz `raw/epics/epics-2026-08-14.md#FR-12` (Zuwachs über die bisher verarbeitete Stelle hinaus; die Kennung FR-12 existiert real in der Datei) trifft über `rg -l 'FR-12' -g '!log.md' wiki/` das bestehende Root-Concept `wiki/knowledge-kompilation-inkrementell.md` (Term-/Konzept-Überschneidung — re-executierter Befund: der Grep-Ausgabe-Pfad ist `knowledge-kompilation-inkrementell`, `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a; das Rev-2.4.1-Beispiel `wissensarchitektur/source-material.md` enthielt den Term **nicht** und ist damit korrigiert). Der Run aktualisiert diesen Pfad (Body-Erweiterung mit neuem §5.5-Inline-Beleg `(raw/epics/epics-2026-08-14.md#FR-12)`, `sources`-Ergänzung um diesen `resource` — sofern nicht bereits deklariert, sonst No-Op gemäß Pkt. 2, `generated.at` = aktueller Run-Zeitstempel, `log.md`-Eintrag „Story 3.1-Update"). Die Diff-Probe (Pkt. 5, ``-Form) zeigt ausschließlich `log` und `knowledge-kompilation-inkrementell` (betroffen, normalisiert) — kein Ghost-Diff, keine `index.md` im Diff (der Index-Link bleibt unverändert). ## 6. Validieren (mechanische Bestätigung) @@ -373,3 +379,4 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - **Revision 2.5 (2026-08-19, Story 3.2):** Neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** eingefügt (nach §3, vor §4) — die **verbindliche Ausformulierung der §3-Pkt.-2-Kandidatenerhebung** („Erhebung nach §3.2"): (1) **Term-Ziehverfahren** deterministisch (bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps; **kanonischer Schreibweisen-Resolver `schema/canonical-terms.md`** — committete, append-only Registry (canon. Form + erlaubte Varianten), damit Bestandteil des Git-States und deterministisch pinbar; genau eine canon. Form je Semantik A0-18; kein stiller Ausschluss nicht auflösbarer Varianten — Verwendung wie notiert; mehrere Terme je Einheit → Vereinigung), (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (grep-Äquivalent `grep -rl … --exclude=log.md`; `log.md` **strukturell** exkludiert, Candidate-Liste auf Concept-Pfade definiert), (b) `index.md`-Traversal (gewurzelte Erreichbarkeit Root → Area → Concept, §5.8; TRAVERSAL_REACH_ONLY; fehlende Bundleroot → Run-FAIL V-1), (c) Link-Following mit **besuchter Menge** (file-relativ auflösen, §5.7 Pkt. 4; Zyklen enden, LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag (AD-17h/A0-19):** relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (nach Stufe-a; lexikografisch als deterministischer Tie-Break), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) in Spec-Verification und `wiki/log.md` belegt. **§3 Pkt. 2:** Story-3.2-Vorbehalt **aufgelöst** — Pkt. 2 bleibt Kern-Anker, die Erhebung zeigt auf die neue Sektion („Erhebung nach §3.2"), `rg -l '' --exclude=log.md wiki/` als Stufe-a-Form genannt. **§7:** Story-3.2-Vorbehalt **aufgelöst** (Relevanzbestimmung in §3.2 verankert; verbleibende 3.x-Themen: Synthese → Story 3.4, Leasing/Dirty-Tree → Story 3.5/3.6). **§8:** Normreferenzen um **AD-13** (bereits gelistet, §3.2-angeankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2) und **A0-19** (Determinismus-Vertrag, §3.2 — war im Ist-§8 noch nicht gelistet, wird als Determinismus-Referenz ergänzt) sowie **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; **`schema/canonical-terms.md`** als nebengeordnete committete Resolver-Registry referenziert (kein `schema/`-Root-Change; gleiche read-only-Hierarchie, append-only). Em-Dash-`—`-Varianten-Lücke als offene Determinismus-Frage an **Story 3.8** übergeben (nicht stillschweigend ergänzt). **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **`sprint-status.yaml`:** Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**. `wiki/log.md`-Eintrag (append-only, bestehende Bullets unverändert), `deferred-work.md`-epic-3-context-Eintrag → aufgegriffen (append-only), Determinismus-Selbsttest + Validator-Lauf (7/7 SUCCESS) siehe `wiki/log.md`-Nachweis. - **Revision 2.4.2 (2026-08-19, Story 3.1, bmad-code-review Loop 2, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4 = 1/1/1/1):** (1) **Diff-Selbsttest (Pkt. 5) operationalisiert + Blind-Spots geschlossen (D-1):** Probe erweitert auf `git diff --name-only -- wiki/` **plus** `git status --porcelain -- wiki/` (erfasst ungetrackte neue Dateien `??` — die Duplikat-Kontrolle „keine neue Datei" braucht diese Sicht; `git diff` allein ist blind für Untracked); **Probe-Zeitpunkt fixiert vor dem Commit** (am Ende des P2-Blocks, nach den Mutationen) — nach dem Commit wäre die Probe vacuous (leere Ausgabe, AD-17f); erlaubte Teilmenge-Menge um **Neu-Anlage-Zielpfade** (§5.1/§5.7) ergänzt — Misch-Runs (Neu-Anlage + Update im selben Run) markieren neu angelegte Pfade nicht fälschlich als Ghost-Diff; **Pfad-Normalisierung** definiert (Strip `wiki/`-Präfix + `.md`-Suffix vor dem Teilmenge-Vergleich, da Kandidaten/Ziel-Pfade als relative OKF-Pfade *ohne* `.md` definiert sind); **Rollback-Mechanik** für den Ghost-Diff deterministisch benannt (modifizierte Pfade via `git checkout -- `, ungetrackte neue Dateien gelöscht, Index via `git checkout -- `; §5.3/§6.3-Teilzustand-Rollback greift daneben unverändert). (2) **R-1-Baseline deterministisch + Abweichungsregel (D-2):** `` (HEAD der vorherigen Mutations-Boundary, AD-17f) wird vom Producer **im `wiki/log.md`-Run-Eintrag notiert** (voller SHA) — deterministisch auflösbar ohne Domain-State-Annahme an Git (AD-14); **Diskrepanz-Regel**: widersprechen `git diff`-Befund und SHA-256-Record derselben Datei, **gewinnt `git diff`** (Commit-Boundary-Prinzip), SHA-256 bleibt Sekundär-Fingerprint; **Fallback**: ohne vorherige Mutations-Boundary gelten alle `raw/`-Dateien als Zuwachs; Rev-2.4.1-Claim „derselbe Baseline-Commit wie Pkt. 5" **korrigiert** (die Pkt.-5-Probe trägt das Baseline-Commit-Argument jetzt explizit). (3) **INPUT_UNCOMMITTED-Abbruch (D-3) + Anker-Divergenz:** neuer P2-Check-Block-Element (1) **Input-Zustand** — Working-Copy von `raw/`/`wiki/` gegen HEAD prüfen, bei Abweichung **benannter Abbruch „published/committed Input erforderlich"** vor Interpretation und vor jeder Mutation (AD-17a, I/O-Matrix-`INPUT_UNCOMMITTED` — zuvor nur Referenz auf §1 Pkt. 1, keine Zustandsprüfung/Abbruchmeldung); die **Spec↔Anker-Divergenz** (frozen Spec zitiert 3× „§1.1", §1 ist eine nummerierte Liste Pkt. 1–4 ohne §1.1-Label; Rev-2.4.1 korrigierte nur die Anker *in* compiler.md) wird hier als dokumentierte Fußnote gesichert — die Spec bleibt frozen (nur per menschlicher Renegotiation änderbar). (4) **Sandbox-Edge-Test-Nachweis (D-4):** die fünf I/O-Matrix-Szenarien (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) + die D-3-Abbruch-Kontrolle sind als re-executierbare Sandbox-Skripte mit **konkreten deterministischen Ausgaben** in der Spec-`## Verification`-Sektion (Sandbox-Beleg) verankert — die `wiki/log.md`- und `deferred-work.md`-Verweise („in der Spec-Verification enthalten") auflösbar. (5) **Instruktions-Präzisierungen:** P2-Block-**Zeitpunkt** (nach Reconcile, am Anfang der Mutationsphase; Diff-Probe am Block-Ende) — löst den Widerspruch „einmal an der Spitze erhoben" vs. „Kandidatenliste entsteht erst im Reconcile"; **No-Op-Kandidat**-Regel (Pkt. 2: Pfad, der die Evidenz bereits vollständig enthält → keine Mutation/kein `at`-Bump/kein `log.md`-Eintrag, byte-identisch — die engere Auslegung); **Mehrfach-Treffer-Reihenfolge** für *alle* Einheiten definiert (Zuwachs-Sicht-Ordnung; lexicografisch nur als Tie-Break bei identischem Ort — AD-17h); **Update-Pfad-Rollback** in §5.3 Pkt. 3 (modifizierte Pfade aus Baseline-Commit wiederherstellen); **`generated.at`↔AD-17h-Gap** explizit als offener Punkt mit Home Story 3.8 benannt (Wanduhr-`at` erzeugt bei gleichem Input unterschiedliche Bundle-States; Konvention bleibt bis dahin bindend, Wechsel = Ask-First); **Term-Ableitung** (Pkt. 2 (a)) als §2-Interpretation abgegrenzt — die Erhebung *mit festem Term* ist textuell-deterministisch, der Term-Mechanismus (Kanonisierung/Synonyme) Story 3.2; **Link-Following** mit besuchter Menge (keine Schleife bei zyklischen Links); **Worked Example (Pkt. 7) auf den realen Ist-Baum korrigiert** (`rg -l 'FR-12' wiki/` trifft `wiki/knowledge-kompilation-inkrementell.md`, **nicht** `wissensarchitektur/source-material.md` — Rev-2.4.1-Beispiel enthielt den Term nicht); stale-Anker `§3.2-Kollisionsprüfung` (Pkt. 3-Zuordnung) und `§3-Voraussetzungsprüfung` (P2-Block) sowie §5.8-Pkt.-3-Zeiger („Pkt. 1" → „Pkt. 2") nachgeführt. **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. - **Revision 2.7 (2026-08-19, Story 3.2, Step-04-Review Loop 3, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4/D-5 = 1/1/1/1/1, jeweils empfohlene Option; + 2 Patches; D-3-Instruktions-Patch, kein neuer Inhalt):** (1) **§3.2-Pkt.-3b-Ordnung auf reine Lexikografie gehoben (D-4):** Stufe-a-Treffer waren „in der Reihenfolge des ziehenden Terms, dann lexikografisch als deterministischer Tie-Break" — die Term-Ordnung selbst war für Mehrfach-Terme (Pkt. 1c) nirgends festgelegt, zwei rechtmäßige Term-Ordnungen erzeugten zwei unterschiedliche Listen (AD-17h-Lücke). Jetzt: **innerhalb jeder Stufe rein lexikografisch aufsteigend (LC_ALL=C)**; die Term-Verarbeitungsreihenfolge dient nur der Interpretation/Erhebung, **nicht** der Listen-Ordnung — dieselbe Treffermenge → identische Liste. (2) **`schema/canonical-terms.md`-Lookup-Semantik vervollständigt (D-5):** Lookup-Verfahren deterministisch fixiert (lowercasing → `[-–_ ]`→`-`-Kollaps → **Lookup der normalisierten Form**; Spalten tragen ausschließlich normalisierte Formen), **Eindeutigkeits-Invariante** (jede normalisierte Form in genau einem Eintrag — Canon **oder** Variante, nie beides/zweimal) + **Konflikt-Verfahren** (keine stille Anhängung; `deferred-work.md`-Handoff / Ask-First, analog zur Umbenennungs-Regel). (3) **Statuskette `in-progress → done` dokumentiert (D-1):** der Review-Loop-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention, Story-3.1-Präzedenz) war in keinem `wiki/log.md`-Eintrag als eigener Schritt belegt — nachgeführt als neuer oberster `wiki/log.md`-Bullet (append-only; die gefrorene Always-Klausel `→ in-progress` beschreibt den Implementierungsstand, der Review-Abschluss `done` ist der übliche Folgezustand). (4) **Mini-Sandbox um T5/T6/T7 erweitert + T1/T4-Asssertionen + T2-Kommentar-Korrektur (D-2 + Patch P-1):** T5 `LINK_FOLLOWING_ZYKLUS` (A→B→A-Links; besuchte Menge → endliche, doppelungsfreie Liste), T6 `TRAVERSAL_REACH_ONLY` (Term nur in Area-`index.md` → gewurzelte Concept-Pfade als Kandidaten; `index.md` selbst ist kein Concept-Kandidat), T7 `TERM_ABLEITUNG_SYNONYM` (Registry-Test-Doppel: Schreibvarianten → canonische Form via Lookup auf normalisierter Form; Negativ-Fall: nicht auflösbar → wie notiert, kein stiller Ausschluss); T1/T4 tragen jetzt harte Pass/Fail-Asssertionen (`exit 1` bei Abweichung) — die exakte Candidate-Liste wird erzwungen, nicht nur ausgegeben; der T2-Kommentar zu `index` korrigiert (Stufe-a-Treffer auf `wiki/index.md` löst Stufe b aus; `index.md` ist kein Concept-Kandidat). (5) **Selbsttest-Beleg (b) gegen den realen Sandbox-Ist-Baum re-executiert (D-3):** der Rev-2.5-Log-Beleg (b) beschrieb einen nicht-committierten Baum (Term `quanten-protocol`, `sub/beta.md`, SHA-256 `159092bb…`) — Stale-Evidenz-Falle (B1-Präzedenz). Der Nachweis wird jetzt gegen die echte `run-sandbox.sh`-Ausgabe (Term `deterministische-relevanz-bestimmung`, root-level `alpha`/`beta`/`gamma`) neu belegt; der Rev-2.5-Eintrag bleibt historisch unverändert, die Korrektur steht als neuer `wiki/log.md`-Bullet (append-only). (6) **Typos im normativen Text korrigiert (Patch P-2):** `Determinsmus` → `Determinismus` (§8-Referenzen + Log-/Defer-Belege), `§3.2-beankert` → `§3.2-angeankert`, `Membrum` → `Mitglied` (Spec-Design-Notes), `Konventionelle Determinismus-Lücke` → `Bekannte Determinismus-Lücke` (Defer-Beleg; `compiler.md:53` sagt „Bekannte"), `Resovierung` → `Auflösung` (Spec-Change-Log/-Verification). **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. (Revisionslog-Reihenfolge-Anomalie 2.6/2.5 bleibt als dokumentierter Defer bestehen — nicht in dieser Runde umgeordnet.) +- **Revision 2.8 (2026-08-19, Story 3.3):** §5.9-Update-Formen **operationell ausformuliert** (dieselbe Evidenz + formale Struktur → identisches Update-Ergebnis, AD-17h/A0-19): (1) **Pkt. 2 — Präzisierungsebene je Update-Form** (als Sub-Bullet an die Commit-Boundary-Regel angefügt; der frozen Story-3.1-Regeltext bleibt textuell **unverändert** als normative Basis, die operationellen Regeln sind die Ausführungs-Ebene darunter — keine Re-Negotiation): je Form **(a) Abgrenzungskriterium** (aus der committeten Evidenz: neue belegte Aussage → Erweitern; Schärfung einer bestehenden Formulierung/Abgrenzung ohne Ersatz → Präzisieren; Ersetzung einer fehlerhaften/überholten → Korrigieren; keines davon → No-Op, engere Auslegung), **(b) Struktur-Erhaltungsregel** (das Geschützte — Frontmatter-Subset nur als `sources`-Zuwachs um echten neuen Beleg + `generated.at`-Bump; bestehende belegte Aussagen nicht umgeschrieben ohne dass Präzisieren/Korrigieren greift; §5.5-Inline-Verweise gültig soweit Beleg Body-Bestand; §5.6-Linkform unverändert, keine neuen Links außer bei echten Beziehungen) und **(c) Textgenauigkeits-Rahmen für Präzisieren** (Schärfen an der Aussage, kein Satz-Umbau, kein Neuschreiben ohne Ersetzungsbeleg). (2) **Pkt. 5 — Erhaltungs-Invariante um den Struktur-Erhaltungs-Bezug ergänzt:** die Diff-Probe verifiziert zwei Ebenen — die Pfad-Mengen-Ebene (bestehender Teilmenge-Vergleich) und die **Struktur-Ebene je berührtem Pfad** (pro betroffenem Concept-Pfad über die Pkt.-2-Regeln geprüft: Frontmatter-Subset, keine Umschreibung belegter Aussagen außerhalb der Formen, Inline-Verweise, Linkform — Verstöße textuell benannt (NFR-4), vor dem Commit zu beheben, sonst Ghost-Diff mit Rollback). (3) **Pkt. 6 — P2-Check-Block um den Struktur-Erhaltungs-Check erweitert** (Element (6), zusätzliches textuelles Element: keine unbefugten Keys — Vertrag §3.3/§3.4-Subset, keine stille Löschung — AD-16/„Korrigieren"-Form, Links unverändert/keine neuen ohne echte Beziehung — §5.6-Pin; Verstöße textuell benannt (NFR-4) und vor dem Commit behoben). (4) **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert; kein Leasing-Scope (AC-4 → Story 3.5/3.6, AD-17.3-Hinweis unverändert in §7). **`sprint-status.yaml`:** Key `3-3-bestehende-concepts-erweitern-präzisieren-korrigieren` bleibt **`in-progress`** (Review-Abschluss `done` erfolgt gemäß Workflow-Konvention durch den Review-Schritt). Sandbox-Nachweis und per-Datei-Validator-Verdikt siehe `wiki/log.md`-Eintrag (Story 3.3, Revision 2.8). diff --git a/wiki/log.md b/wiki/log.md index 9b29777..79e72b2 100644 --- a/wiki/log.md +++ b/wiki/log.md @@ -1,6 +1,9 @@ # Log ## 2026-08-19 +- **Story 3.3 → `done` (Step-04-Review-Abschluss, 2026-08-19):** der Review-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention, Story-3.1/3.2-Präzedenz: Review-Abschluss setzt `done` im selben Loop) ist hier als eigener dokumentierter Schritt nachgeführt; `sprint-status.yaml`-Key `3-3-…` → **`done`**, `last_updated` → 08-19-2026 13:21; Spec-Frontmatter `status: 'done'`, `review_loop_iteration: 0`; Spec-`## Suggested Review Order` verankert (Review-Trail: Abgrenzungs-Mechanik → Struktur-Invariante/P2 → Sandbox-Nachweis → Provenienz/Status). **Review-Ergebnis (Loop 1, 3 Subagenten, kein Loopback):** keine intent_gap/bad_spec; 1 Stapel Patches (Präzedenz-Reihenfolge + No-Op-Nicht-Form + Korrigieren-Wortlaut-Erhaltung in `schema/compiler.md`; Sandbox U1–U9 mit 2 neuen Negativ-Kontrollen U8/U9, vollen byte-Identitäts-Assertionen, reellen `S-N`-Ankern, `-eq 1`-Konsolidierung, Frontmatter-Reihenfolge/Duplikat); 5 Defers → `deferred-work.md`; Rejects dokumentiert. **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag) — keine Concept-Inhalts-Mutation (Instruktions-Story); `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3). Sandbox re-executiert: **9/9 PASS, Exit 0**. +- **Step-04-Review Loop 1 / Patch-Runde (Story 3.3, 2026-08-19):** bmad-code-review, 3 Subagenten (blind-hunter 9, edge-case-hunter 2+Minors, verification-gap 18 Findings); Klassifikation (Dedupe → Severity → Route, s. Spec-`## Spec Change Log` Review-Loop-1-Eintrag): **kein intent_gap, kein bad_spec** (kein Loopback) — **patch** (auto-fixiert) + **defer** (5 Einträge → `deferred-work.md` append-only) + **reject** (noise). **Patches (auto-fixiert, erneut verifiziert):** (1) **`schema/compiler.md` §5.9 Pkt. 2 — Operationelle-Ebene:** **Abgrenzungs-Reihenfolge `Korrigieren → Präzisieren → Erweitern → No-Op`** (strikt pro Evidenz-Einheit, erste zutreffende Form — überlappende Kriterien deterministisch gebunden, AD-17h/A0-19); **No-Op als Nicht-Form** geklärt (eigenes Abgrenzungskriterium + Erhaltungsregel „volle Byte-Identität"); Korrigieren-Struktur-Erhaltung präzisiert (**Original-Wortlaut bleibt als abgelöster Bestand** erhalten, nur die Aussage-Fortschreibung wechselt); at↔AD-17h-Gap-Kreuzreferenz auf `generated.at`-Konvention (Home Story 3.8). (2) **Sandbox `run-sandbox.sh` (jetzt 9 Tests U1–U9, Exit 0):** U1/U2/U3 byte-Identität auf **alle drei** bestehenden Aussagen erweitert (Lücke aus V-1); **U8** neu — unbefugter Frontmatter-Key `foo:` im YAML → Struktur-Ebene-HARD-FAIL (Pkt. 5/P2-Element (6)) — **U9** neu — ungetrackte neue Datei `wiki/neu.md` → `??`-Sicht-Duplikat-HARD-FAIL; U7 `-le 1` → **`-eq 1`** + konsolidierter log-Eintrag verlinkt jetzt **beide** raw/-Quellen (`raw/alpha-v2.md + raw/alpha-v3.md`, Pkt. 4); `assert_frontmatter` um **canoniche Reihenfolge** + **Duplikat-Prohibition** erweitert; **reale `S-N`-Anker** (Markdown-Headings) in allen raw/-Evidenzdateien statt Prosa-„Stelle S-N" — die `#S-N`-Fragmente lösen jetzt im Rohdokument auf (§5.5-Anker-Semantik); U3 verändert den Wortlaut der abgelösten Aussage **nicht** mehr (om `rotierte`-Tense). (3) **`wiki/log.md`:** Spec-Frontmatter-Status-Mismatch korrigiert (`in-progress` → `in-review`, Review-Handoff). (4) **`sprint-status.yaml last_updated`:** Präzisions-Regression zurückgesetzt (`08-19-2026 13:21`, HEAD-Format `08-19-2026 13:14`-Familie); General-Verhalten des Sync-Steps als Defer notiert. **Defers (5, `deferred-work.md` append-only):** last_updated-Präzision (Sync-General), frozen Story-3.1-Typos „Schärferung/Formata" (Re-Negotiation), U6-„auch nach Commit"-Überzeichnung + at↔AD-17h-Gap (Home Story 3.8), U2-Selbsterfüllung + U7-Ordnungs-Rationale, Umlaut/Em-Dash-Normalisierungs-Politik im Sandbox-Evidenztext. **Rejects (noise):** U6-log.md-SHA-Reproduzierbarkeit (random `$BASE`-SHA konstruktionsbedingt), Diff-Artefakt-Pfad-Präfix, Spec-Change-Log „leer" (per Konvention erst in Review-Loops befüllt). **Re-executierte Verifikation (2026-08-19, ab Workspace-Root):** Sandbox **9/9 PASS, Exit 0** (re-runnable `bash _bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh`); `grep -n "Struktur-Erhaltungsregel\|operationelle\|Revision 2.8" schema/compiler.md` → 5 Marker; AD-3 `git status --porcelain -- schema/validator.md schema/wiki-compiler.md raw/` leer; kein Standalone (D-3), keine neue §7-Klasse, kein Leasing-Scope. Spec-Frontmatter: `status: 'in-review'`, `review_loop_iteration: 0`; Spec-`## Spec Change Log` Review-Loop-1-Eintrag befüllt. +- **Story 3.3 «Bestehende Concepts erweitern/präzisieren/korrigieren — Update-Formen operativ schärfen» (Implementierung, Instruktions-Story D-3; `sprint-status.yaml`: Key `3-3-bestehende-concepts-erweitern-präzisieren-korrigieren` bleibt **`in-progress`** — der Review-Abschluss-Flip `done` erfolgt gemäß Workflow-Konvention durch den Review-Schritt):** `schema/compiler.md` → **Revision 2.8** — die drei Update-Formen **operationell ausformuliert** (deterministische Brücke Regel → Run, AD-17h/A0-19; kein neuer normativer Inhalt, kein Schema-/Validator-/`raw/`-Change AD-3; der frozen Story-3.1-Regeltext bleibt unverändert als normative Basis, die operationellen Regeln sind die Präzisierungsebene darunter — keine Re-Negotiation): (1) **§5.9 Pkt. 2 — Präzisierungsebene je Update-Form** (Sub-Bullet an die Commit-Boundary-Regel angefügt): je Form **(a) Abgrenzungskriterium** (aus der committeten Evidenz — neue belegte Aussage → **Erweitern**; Schärfung einer bestehenden Formulierung/Abgrenzung ohne Ersatz → **Präzisieren**; Ersetzung einer fehlerhaften/überholten → **Korrigieren**; keines davon → **No-Op**, engere Auslegung — gleicher Git-State + gleiche Eingabemenge → identischer Update-Vorgang), **(b) Struktur-Erhaltungsregel** (das Geschützte aus FR-6/AC-2: Frontmatter-Subset — nur `sources`-Zuwachs um echten neuen Beleg + `generated.at`-Bump, kein neuer Key, keine Entfernung ohne Beleg; bestehende belegte Aussagen nicht umgeschrieben ohne dass Präzisieren/Korrigieren greift; §5.5-Inline-Verweise gültig soweit Beleg Body-Bestand; §5.6-Linkform unverändert, keine neuen Links außer bei echten Beziehungen) und **(c) Textgenauigkeits-Rahmen** (Schärfen an der Aussage selbst, kein Satz-Umbau, kein Neuschreiben ohne Ersetzungsbeleg). (2) **§5.9 Pkt. 5 — Erhaltungs-Invariante um den Struktur-Erhaltungs-Bezug ergänzt:** die Diff-Probe (§5.9 Pkt. 5, D-1-Form) verifiziert zwei Ebenen — die Pfad-Mengen-Ebene (bestehender Teilmenge-Vergleich) und die **Struktur-Ebene je berührtem Pfad** (pro betroffenem Concept-Pfad über die Pkt.-2-Regeln geprüft: Frontmatter-Subset, keine Umschreibung belegter Aussagen außerhalb der Formen, Inline-Verweise, Linkform; Verstöße textuell benannt NFR-4, vor dem Commit zu beheben, sonst Ghost-Diff mit Rollback). (3) **§5.9 Pkt. 6 — P2-Check-Block um den Struktur-Erhaltungs-Check erweitert** (Element (6), zusätzliches textuelles Element: keine unbefugten Keys — Vertrag §3.3/§3.4-Subset, keine stille Löschung — AD-16/„Korrigieren"-Form, Links unverändert/keine neuen ohne echte Beziehung — §5.6-Pin). (4) **§8 Revisionslog Revision 2.8** mit Abschlussklausel (keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` AD-3; keine neue §7-Invaliditätsklasse; kein Standalone D-3; keine Vertragsänderung; Commit-Boundary-Regel unverändert; kein Leasing-Scope — AC-4 → Story 3.5/3.6, AD-17.3-Hinweis unverändert in §7). **Sandbox-Nachweis (re-executiert 2026-08-19, ab Workspace-Root, `bash _bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh`; Linux-Sandbox-Semantik auf einem `/tmp`-Baum, nie der reale `wiki/`-Baum; Exit **0**):** Mini-Bundle mit Concept `alpha` + nicht-betroffenem Kontroll-Concept `beta`; committete Neuevidenz je Szenario; alle drei Update-Formen + No-Op durchgespielt: **U1 ERWEITERN** (neue belegte Aussage angefügt, bestehende drei Aussagen byte-identisch — PASS; Probe `{alpha log}` ⊆ erlaubte Menge — PASS; Frontmatter-Konformität — PASS), **U2 PRAEZISIEREN** (Aussage an ihr selbst geschärft, Position/Struktur erhalten, Beleg nachgeführt §5.5 — PASS; Probe `{alpha log}` — PASS; Frontmatter — PASS), **U3 KORRIGIEREN** (fehlerhafte Aussage explizit abgelöst + Ersetzungsbeleg, keine stille Löschung AD-16-Default — PASS; Probe `{alpha log}` — PASS; Frontmatter — PASS), **U4 NO_OP** (Evidenz bereits vollständig enthalten — byte-identisch, kein `at`-Bump, kein `sources`-Zusatz, kein `log.md`-Eintrag — PASS; Probe leer = Ghost-Diff-negativ — PASS), **U5 NEGATIV-KONTROLLE** (simulierter Ghost-Diff auf `beta` wird von der Assertions-Mechanik zuverlässig als HARD-FAIL erkannt — PASS, Mechanik nicht vacuous), **U6 ZWEI-RUN-IDENTITÄT** (AD-17h/A0-19: zwei unabhängige Runs über dieselbe Evidenz → byte-identischer Update-Vorgang — SHA-256 `6b148dd1…` (alpha.md) / `a6d08427…` (log.md) identisch je Lauf, auch nach Commit — PASS), **U7 MEHRFACH_TREFFER** (I/O-Matrix-Zeile; zwei Neuevidenzen `raw/alpha-v2.md` + `raw/alpha-v3.md` desselben Runs treffen denselben Concept-Pfad `alpha` → **ein konsolidiertes Update**: eine Body-Mutation, ein `log.md`-Eintrag, ein konsolidierter `sources`-Zuwachs `s2`+`s3`, ein `generated.at`; Zuwachs-Sicht-Ordnung `v2`-vor-`v3` (lexikografischer Tie-Break bei Body-Ende); bestehende drei Aussagen byte-identisch; Probe `{alpha log}` — PASS; Frontmatter-Konformität — PASS). Die **Erhaltungs-Invariante (§5.9 Pkt. 5) wird als harte Assertion erzwungen**: Proben-Einträge (normalisiert: `wiki/`-Präfix + `.md`-Suffix strippend) ⊆ {betroffener Concept-Pfad, log}; bei Verstoß oder neuer Datei (`??`-Sicht) → HARD-FAIL + Exit 1; kein Ghost-Diff lässt sich still durchschleusen (U5). **Status-/Diff-Nachweis:** nach diesem Instruktions-Run zeigt `git status --porcelain -- wiki/` ausschließlich `wiki/log.md` (dieser Eintrag) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, keine Concept-Inhalts-Mutation (Instruktions-Story, kein neues committetes `raw/`-Material; Demonstration per Sandbox). **Validator-Verdikt (per-Datei, human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI; unverändert zur Story 3.2, Story 3.3 mutiert keine Concept-Inhalte):** alle **7** `wiki/`-Dateien **SUCCESS** — `wiki/index.md` (Punkt 11, Bundleroot), `wiki/knowledge-kompilation-inkrementell.md`, `wiki/llm-wiki-prinzip.md`, `wiki/wissensarchitektur-trennung-states.md` (Punkte 1/2/6/7/8/9/11/12/13/14, EC-1), `wiki/log.md` (frontmatterlos, Punkt 10), `wiki/wissensarchitektur/index.md` (frontmatterlos, Punkt 10/11), `wiki/wissensarchitektur/source-material.md` (Punkte 1/2/6/7/8/9/11/12/13/14, EC-1; Punkt 11 inkl. Area-Lesart Rev 9). `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3, via `git status` geprüft); keine neue §7-Klasse; kein Standalone (D-3). Spec-Frontmatter: `status: 'in-review'` (Step-04-Review-Handoff), `review_loop_iteration: 0`. - **Step-04-Review Loop 3 / Patch-Runde (Story 3.2, 2026-08-19):** `schema/compiler.md` → **Revision 2.7** (D-3-Instruktions-Patch, kein neuer Inhalt; bmad-code-review Loop 3, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4/D-5 = 1/1/1/1/1, jeweils empfohlene Option; + Patches P-1/P-2). (1) **D-1 — Statuskette abgeschlossen:** der Review-Loop-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention; Story-3.1-Präzedenz: Review-Abschluss setzt `done` im selben Loop) ist mit dieser Zeile als eigener dokumentierter Schritt nachgeführt; `sprint-status.yaml`-Key `3-2-…` bleibt **`done`** (die gefrorene Always-Klausel `→ in-progress` beschreibt den Implementierungsstand; Review-Handoff/-Abschluss ist der übliche Folgezustand, s. Sprint-Status-Workflow-Kommentar). (2) **D-2 — Sandbox erweitert:** `run-sandbox.sh` um **T5 `LINK_FOLLOWING_ZYKLUS`** (Zyklus alpha ↔ omega via Backlink; besuchte Menge → endliche, doppelungsfreie Candidate-Liste `omega`, `alpha` — der Zyklus endet), **T6 `TRAVERSAL_REACH_ONLY`** (Term `trafo-gebiet` trifft **nur** die Area-`index.md` → die gewurzelten Concept-Pfade `trafo/delta`, `trafo/epsilon` sind die Kandidaten; `index.md` selbst ist kein Concept-Kandidat) und **T7 `TERM_ABLEITUNG_SYNONYM`** (Registry-Test-Doppel: `Quanten Protocol` → Normalisierung → `quanten-protocol` (Canon-Treffer), `QuantenProtocol` → `quantenprotocol` (Variante-Treffer) → canonische Form `quanten-protocol`; Negativ-Fall `nicht-in-registry` → wie notiert, kein stiller Ausschluss); T2-Kommentar zu `index` korrigiert (Stufe-a-Treffer auf `wiki/index.md` löst Stufe b aus — kein Concept-Kandidat); **P-1** — T1/T4 jetzt mit harten Pass/Fail-Asssertionen (`exit 1` bei Abweichung). (3) **D-3 — Selbsttest-Beleg (b) neu belegt:** die Rev-2.5-Log-Zeile (b) beschrieb einen **nicht committierten** Baum (Term `quanten-protocol`, `sub/beta.md`, SHA-256 `159092bb…`) — Stale-Evidenz-Falle (B1-Präzedenz); die Rev-2.5-Zeile bleibt **historisch unverändert** (append-only, Vertrag §5), der korrigierte Nachweis steht in dieser Zeile (re-executierte Sandbox-Ausgabe, s. (5)(b)). (4) **D-4 — §3.2-Pkt.-3b-Ordnung:** Stufe-a-Treffer jetzt **rein lexikografisch (LC_ALL=C)** innerhalb jeder Stufe; die Term-Verarbeitungsreihenfolge dient nur der Interpretation/Erhebung, **nicht** der Listen-Ordnung (dieselbe Treffermenge → identische Liste, AD-17h/A0-19). (5) **D-5 — `schema/canonical-terms.md`-Lookup-Semantik:** Lookup-Verfahren deterministisch fixiert (lowercasing → `[-–_ ]`→`-`-Kollaps → **Lookup der normalisierten Form**; Spalten tragen ausschließlich normalisierte Formen), **Eindeutigkeits-Invariante** (jede normalisierte Form in genau einem Eintrag — Canon **oder** Variante, nie beides/zweimal) + **Konflikt-Verfahren** (keine stille Anhängung; `deferred-work.md`/Ask-First, analog zur Umbenennungs-Regel). (6) **P-2 — Typos korrigiert:** `Determinsmus` → `Determinismus` (compiler.md §8-Referenz, diese Log, `deferred-work.md`-Belege), `§3.2-beankert` → `§3.2-angeankert` (Rev-2.5-Log-Zeile), `Membrum` → `Mitglied` (Spec-Design-Notes), `Konventionelle Determinismus-Lücke` → `Bekannte Determinismus-Lücke` (`deferred-work.md`-Beleg; `compiler.md:53` sagt „Bekannte"), `Resovierung` → `Auflösung` (Spec-Change-Log/-Verification). **Re-executierte Selbsttest-Belege (2026-08-19, ab Workspace-Root; Sandbox-Run exit 0):** (a) live: `grep -rl 'A0-18' --exclude=log.md wiki/` → exakt `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad, `log.md` ausgeschlossen); (b) **Mini-Sandbox** (`_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh`, re-executierbar): alle **7** Tests **PASS** — T1 Membership (exakt `alpha`; Kontaminations-Kontrolle ohne Exklusion trifft zusätzlich `log`), T2 Zwei-Run-Identität (identisch), T3 NO_MATCH (leer), T4 Vereinigung `alpha,gamma` (hart assertierte), T5 LINK_FOLLOWING_ZYKLUS (endlich, doppelungsfrei, Zyklus endet), T6 TRAVERSAL_REACH_ONLY (`trafo/delta`, `trafo/epsilon`), T7 TERM_ABLEITUNG_SYNONYM (beide Varianten → `quanten-protocol`; Negativ-Fall wie notiert); (c) `git status --porcelain -- wiki/` nach diesem Run: ausschließlich `wiki/log.md` (dieser Eintrag) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, kein Ghost-Diff (die Instruktions-Story mutiert keine Concept-Inhalte). **Abschlussklausel Rev 2.7:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. `sprint-status.yaml`: Key bleibt `done`, `last_updated` → 08-19-2026. Spec-Frontmatter: `status: 'done'`, `review_loop_iteration: 3`; Spec-`### Review Findings` abgehakt (5 Decisions + 2 Patches + 4 Defers → `deferred-work.md`). - **Step-04-Review Loop 2 / Patch-Runde (Story 3.2, 2026-08-19):** `schema/compiler.md` → **Revision 2.6** (D-3-Instruktions-Patch, kein neuer Inhalt; bmad-code-review VG-Findings verarbeitet). (1) **§4-Überschrift wiederhergestellt** — die §3.2-Einfügung (Rev 2.5) hatte die Überschrift **`## 4. Synthetisieren (Provenienz & Trust)`** verdrängt (der §3.2-Sektionskopf ersetzte die §4-Überschrift; der gesamte Frontmatter-Body hing kopflos unter §3.2; alle §4-Referenzen wären dangling geblieben). Der §4-Kopf ist zwischen §3.2-Body und dem Frontmatter-Body wieder eingefügt. (2) **rg-Flag-Defekt behoben (`--exclude` ist kein rg-Flag):** die Rev-2.5-Form in diesem Log- plus dem §3.2-Eintrag, §3-Pkt.-2, §3.2-Pkt.-2a, §5.9-Worked Example (Pkt. 7) und §7 nutzten `rg -l '' --exclude=log.md wiki/` — nicht-existent (ripgrep 14.1.1: `rg --exclude` → `unrecognized flag`; GNU grep unterstützt `--exclude`, ripgrep nutzt `-g '!log.md'` / `--glob '!log.md'`). Die Instruktion nutzt jetzt tool-korrekte Formen: rg `rg -l '' -g '!log.md' wiki/` (native Glob-Exklusion) bzw. GNU grep `grep -rl '' --exclude=log.md wiki/`; die §5.6-Formeln (bereits GNU-grep) und §5.9-Pkt.-7-Erhebung adoptieren die Exklusion. Dieser Eintrag zitiert den alten Defekt **historisch** (verlaufsgetreue Log-Führung; die operative Form ist jetzt tool-korrekt). (3) **§5.9-Worked Example (Pkt. 7) auf die Exklusions-Form gehoben** (`rg -l 'FR-12' -g '!log.md' wiki/`), Kommentar `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a. (4) **Mini-Sandbox re-executierbar verankert** (`_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh`, Muster Story-3.1-Sandbox S1–S6): Tests T1–T4 (Membership-Pin — Term auf Concept-Bodies UND `log.md` verteilt, Candidate-Liste nur Concept-Pfade; Zwei-Run-Identität AD-17h; NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT; Mehrfach-Treffer → Vereinigung + lexikografische Ordnung). (5) **`deferred-work.md`-Em-Dash-Eintrag** append-only ergänzt (Home: Story 3.8) — die §3.2-Pkt.-1b-Kollaps-Klasse deckt En-Dash/Bindestrich/Unterstrich/Leerzeichen, aber **nicht** den Em-Dash `—`; dieser Handoff wird nicht stillschweigend gelöst, sondern als offene Determinismus-Frage dokumentiert. **Re-executierte Selbsttest-Belege (2026-08-19, ab Workspace-Root):** (a) rg-Form real: `rg -l 'A0-18' -g '!log.md' wiki/` → exakt `wiki/knowledge-kompilation-inkrementell.md`; ohne Exklusion `rg -l 'A0-18' wiki/` → zusätzlich `wiki/log.md` (Selbstkontamination — der §3.2-Pkt.-2a-Fall, reell belegt); (b) GNU-grep-Äquivalent `grep -rl 'A0-18' --exclude=log.md wiki/` → identisch `wiki/knowledge-kompilation-inkrementell.md`; (c) `rg -l 'FR-12' -g '!log.md' wiki/` → `wiki/knowledge-kompilation-inkrementell.md` (§5.9-WE-Korrektur reell); (d) Mini-Sandbox T1–T4 → siehe Rev-2.6-Eintrag; (e) `git status --porcelain` → `wiki/` nur `log.md` (dieser Eintrag; Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt), `schema/compiler.md` + `deferred-work.md` sind außerhalb `wiki/` (kein Teil der Diff-Probe). **Abschlussklausel Rev 2.6:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3, geprüft via `git status`); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. (Der Rev-2.5-Implementierungs-Eintrag oben bleibt unverändert — dokumentiert den Zustand bei Rev-2.5-Veröffentlichung inkl. der damaligen `--exclude`-Form; historische Korrektheit des Logs.) - **Story 3.2 «Relevanzbestimmung textual-deterministisch umsetzen (grep/ripgrep + Markdown-Traversal + Link-Following)» (Implementierung, Instruktions-Story D-3; `sprint-status.yaml`: Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**):** `schema/compiler.md` → **Revision 2.5** — die beiden **Story-3.2-Vorbehalte aufgehoben** (§3 Pkt. 2 + §7) und die feinkörnige Relevanz-Findungsmechanik als neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** verankert (nach §3, vor §4; Pkt. 2 bleibt Kern-Anker „Erhebung nach §3.2"): (1) **Term-Ziehverfahren deterministisch** — bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps (En-Dash/Bindestrich/Unterstrich/Leerzeichen); **kanonischer Schreibweisen-Resolver als committete, append-only Registry `schema/canonical-terms.md`** (canon. Form + erlaubte Varianten, `[]`; Bestandteil des Git-States → Auflösung pinbar, AD-17h/A0-19); genau eine canon. Form je Semantik (A0-18); **kein stiller Ausschluss** nicht auflösbarer Varianten (Verwendung wie notiert); mehrere Terme je Einheit → Vereinigung; **bekannte Determinismus-Lücke**: Em-Dash `—` fällt nicht unter den `[-–_ ]`-Kollaps → an **Story 3.8** übergeben (nicht still hinzugefügt); (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (GNU-grep-Äquivalent `grep -rl '' --exclude=log.md wiki/`; **`log.md` strukturell exkludiert** — die Candidate-Liste ist auf Concept-Pfade definiert, `log.md` ist kein Kandidat), (b) `index.md`-Traversal (gewurzelte Erreichbarkeit Root → Area → Concept, §5.8; TRAVERSAL_REACH_ONLY; fehlende Bundleroot → Run-FAIL V-1), (c) Link-Following mit **besuchter Menge** (file-relativ, §5.7 Pkt. 4; Zyklen enden — LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag** — relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (lexikografischer Tie-Break; AD-17h/A0-19), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad, Ghost-Diff-negativ); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) unten belegt. **§8-Normreferenzen:** AD-13 (bereits gelistet, §3.2-beankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2), **A0-19** (Determinismus-Vertrag — war im Ist-§8 noch nicht gelistet, als Determinismus-Referenz ergänzt, §3.2/AD-17h) und **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; `schema/canonical-terms.md` als Resolver-Registry referenziert. **Abschlussklausel Rev 2.5:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **`deferred-work.md`:** der Story-3.1-Defer-Eintrag `epic-3-context.md` („Home: Story-3.2-Handoff") als **aufgegriffen** markiert (append-only); der F17/Em-Morphologie-Handoff (Story 3.8) bleibt bestehen. **Determinismus-Selbsttest (Membership + Identität, re-executiert 2026-08-19, ab Workspace-Root):** (a) `grep -rl 'A0-18' --exclude=log.md wiki/` zweimal ausgeführt → beide Ausgaben **identisch**, exakt `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad; `log.md` ausgeschlossen — der `--exclude=log.md`-Fakt ist ehrlich dokumentiert: ohne die Exklusion würde `log.md` ab dem Moment selbst „Kandidat", in dem dieser Eintrag `A0-18` zitiert — die B1-`log.md`-Kontamination ist damit geschlossen); (b) **mini-Sandbox-Baum** (`/tmp/sb32-…`, Term `quanten-protocol` auf Concept-Bodies **und** `log.md` verteilt) → exakte Candidate-Liste nur Concept-Pfade (`wiki/alpha.md`, `wiki/sub/beta.md`; `log.md` ausgeschlossen, `wiki/gamma.md` ohne Term nicht getroffen); normalisiert `alpha`, `sub/beta`; **Zwei-Run-Identität** (SHA-256 `159092bb…` ≡); Kontrolle ohne `--exclude` → `log.md` wird Kandidat (B1-Falle belegt und geschlossen); (c) §5.6-Formeln unverändert re-executierbar: Formel 2 (Form-Check) `0` (Exit 0), Formel 3 (Dangling-Check) keine Ausgabe, Formel 4 Ist-Zählung **38** (kein `wiki/`-Dateimenge-Change durch Story 3.2 — keine Re-Baseline nötig). **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 3.1, Story 3.2 mutiert keine Concept-Inhalte; `wiki/log.md` bleibt frontmatterlos, Punkt 10); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 4 und AC 5. `git status --porcelain -- wiki/` nach diesem Run: ausschließlich `log.md` (modifiziert) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, kein Ghost-Diff. -- 2.54.0 From fae648e688781d281fa668310e179fd002ba812f Mon Sep 17 00:00:00 2001 From: Michael Tamse Date: Wed, 19 Aug 2026 17:06:12 +0200 Subject: [PATCH 10/16] =?UTF-8?q?feat:=20Story=203.4=20Review-Loop-1-Patch?= =?UTF-8?q?es=20(bmad-code-review,=203=20Layer;=20kein=20Loopback)=20?= =?UTF-8?q?=E2=80=94=20=C2=A75.10:=20Reflektiertheits-Selbsttest-Zeilenanf?= =?UTF-8?q?angs-Muster,=20Body-Reihenfolge=20deterministisch=20(Beleg-Anke?= =?UTF-8?q?r=20LC=5FALL=3DC),=20Konsolidierungs-Kriterium,=20Duplikat-Fall?= =?UTF-8?q?=20+=20Orphan-Kontrolle=20(Pkt.=208),=20N2/N3-Nachweise;=20Sand?= =?UTF-8?q?box=20S1-S6+N1-N3+FW=20(10=20Szenarien,=20Exit=200):=20=3F=3F-S?= =?UTF-8?q?icht=20lebendig,=20S5-Ghost-HARD-FAIL,=20N1-Stimulus-Kommentar,?= =?UTF-8?q?=20N2=20Disagreement=20(AD-16),=20N3=20AD-4c-Kontext-Marker;=20?= =?UTF-8?q?4=20Defers=20=E2=86=92=20deferred-work.md;=20log.md=2010/10=20P?= =?UTF-8?q?ASS;=20Spec=20done=20+=20Suggested=20Review=20Order;=20sprint-s?= =?UTF-8?q?tatus=20done?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../implementation-artifacts/deferred-work.md | 22 + .../sandbox-3-4/run-sandbox.sh | 777 ++++++++++++++++++ ...sen-aus-mehreren-sources-synthetisieren.md | 142 ++++ .../sprint-status.yaml | 4 +- schema/compiler.md | 18 +- wiki/log.md | 3 + 6 files changed, 962 insertions(+), 4 deletions(-) create mode 100644 _bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh create mode 100644 _bmad-output/implementation-artifacts/spec-3-4-wissen-aus-mehreren-sources-synthetisieren.md diff --git a/_bmad-output/implementation-artifacts/deferred-work.md b/_bmad-output/implementation-artifacts/deferred-work.md index 2ba9fcd..f844b62 100644 --- a/_bmad-output/implementation-artifacts/deferred-work.md +++ b/_bmad-output/implementation-artifacts/deferred-work.md @@ -391,3 +391,25 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein evidence: bmad-code-review Story 3.2 (2026-08-19, Loop 3, Blind-Hunter + Verification-Gap + Acceptance-Auditor-Layer): `wiki/log.md:4-5`, `schema/compiler.md:372-373`, `_bmad-output/implementation-artifacts/sprint-status.yaml:32`; re-executierte Formel-4-Zählung (38) und `ls wiki/` (7 `.md`-Dateien) bestätigen Korrektheit der Werte. status: offen + +## Deferred from: code review of spec-3-4-wissen-aus-mehreren-sources-synthetisieren (Story 3.4, 2026-08-19) + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-4-wissen-aus-mehreren-sources-synthetisieren.md` + summary: **AD-16-Disagreement- und AD-4c-Übernahme-Marker-Pfad erst in der Sandbox demonstriert, nicht als reale Bundle-Demonstration** — die zwei vom Verification-Gap-Layer als „unbeobachtete Vertragsverpflichtungen" markierten Zweige (§5.10 Pkt. 3 AD-16-Default, Pkt. 4 AD-4c) sind durch die neuen Sandbox-Szenarien **N2 (Disagreement: beide Behauptungen + je Beleg bleiben, kein `(e; f)`-Falsch-Multi-Beleg, `Disagreement:`-log-Eintrag)** und **N3 (AD-4c-Kontext-Marker: „übernommen aus `gamma` auf Basis von `raw/gamma-v1.md#S-1`, nicht eigenständig belegt"; übernommene Quelle nicht in `sources`)** hart assertiert. Eine **reale** Disagreement- oder Übernahme-Synthese im echten Bundle bleibt Aufgabe der Epic-4-Stories (4.1 Klassifikation, 4.2 Disagreements in `log.md`), die hier bewusst nicht vorweggenommen wird (Story-3.4-Boundaries: keine Korrektur-Klassifikation, kein reales Bundle-Testmaterial). Home: Epic-4 (Story 4.1/4.2) — reale Anwendung der Sandbox-verankerten Mechanik. + evidence: Step-04-Review (2026-08-19, Verification-Gap-Layer) — Kernbefund „AD-16-Disagreement-Pfad untested" + „AD-4c-Übernahme-Marker untested"; geschlossen durch `_bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh` N2/N3 (Exit 0, 10 Szenarien). + status: offen (Home: Epic-4) + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-4-wissen-aus-mehreren-sources-synthetisieren.md` + summary: **Orphan-Kontrolle (§5.10 Pkt. 8) textuell verankert, aber nicht in der Sandbox demonstriert** — die Regel „neu committete `raw/`-Evidenz ohne Ziel-Pfad-Treffer bleibt unzugeordnet und wird in `log.md` als verwaist protokolliert" ist Teil der Pkt.-8-Erhaltungs/Determinismus-Ebene; das Review wies darauf hin, dass der Orphan-Fall (Zuwachs ohne Kandidaten-Treffer) kein eigenes Sandbox-Szenario hat. Die Negativ-Kontroll-Dichte der Sandbox (S3 Reflektiertheit, S5 `??`-Sicht/Struktur, N1 No-Op, N2/N3) deckt die übrigen Pkt.-8-Aspekte; ein Orphan-Szenario wurde zugunsten des verbleibenden Review-Scopes nicht ergänzt. Home: Story 3.8 (Reconcile-Orphan-Politik) oder Epic-4 — verwaiste Evidenz-Politik als Folge-Story. + evidence: Step-04-Review (2026-08-19, Blind-Hunter-Layer) — Befund „unknown/orphaned raw evidence path without target"); `schema/compiler.md` §5.10 Pkt. 8 (Orphan-Kontrolle, in dieser Runde formuliert). + status: offen (Home: Story 3.8) + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-4-wissen-aus-mehreren-sources-synthetisieren.md` + summary: **Sandbox-Evidenztexte transkribieren Umlaute, die Concept-Bodies nutzen Umlaut-Schreibweisen (Determinismus-Hazard für den Term-Abgleich)** — die Story-3.4-Sandbox setzt den bekannten Story-3.2-/Sandbox-Normalisierungs-Hazard fort (already known: Em-Dash-Lücke + Umlaut vs. Transkription, Home Story 3.8). Die §3.2-Normalisierung (lowercasing + `[-–_ ]`-Kollaps) deckt Umlaut-Divergenzen („Schlüssel" vs. „Schluessel") nicht; die Sandbox-Bodies (Umlaut) vs. raw-Evidenz (Transkription, z. B. „Bestaetigungen", „Repraesentationen") nutzen bewusst beide Schreibweisen. Home: Story 3.8 (Determinismus-Vertrag, Normalisierungs-Vollständigkeit) oder Sandbox-Vereinheitlichung in einer Folge-Story — kein Instruktions-Defekt. + evidence: Step-04-Review (2026-08-19, Verification-Gap-Layer): `run-sandbox.sh` N2 (`Quorum-Bestaetigungen`) / S6 / S2/`Sitzungsschluessel` etc.; §3.2-Pkt.-1b-Kollaps-Klasse ohne Umlaut-/Em-Dash. + status: offen (Home: Story 3.8) + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-4-wissen-aus-mehreren-sources-synthetisieren.md` + summary: **Frozen Spec-Intent-Typo „Nickel" im §5.10-Form-Wahl-Aufgaben-Pfad (Story-3.3-Defer U2/U7-Empfehlung)** — der Intent-Satz „Nickel die Story-3.3-Defer U2/U7-Empfehlung (…) im Sandbox auf" enthält „Nickel" statt „Nimm/Trage … auf" (oder „Schließe … auf"); er sitzt im ``-Block des Specs, dessen Text erst nach humaner Re-Negotiation geändert werden darf. Kein Instruktions-Defekt (der Sandbox-/authored-Text ist korrekt — FW-Szenario implementiert die Empfehlung inhaltlich). Home: Spec-Re-Negotiation (Ask-First: menschliche Autorisierung) oder Akzeptanz als kosmetischer Frozen-Fehler. + evidence: Step-04-Review (2026-08-19, Blind-Hunter-Layer): `spec-3-4-…md` Zeile ~18 (frozen Intent) — „Nickel die Story-3.3-Defer U2/U7-Empfehlung … auf". + status: offen diff --git a/_bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh b/_bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh new file mode 100644 index 0000000..9e41932 --- /dev/null +++ b/_bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh @@ -0,0 +1,777 @@ +#!/usr/bin/env bash +# Story 3.4 — Sandbox-Tests der Synthese-Dimension (§5.10, Revision 2.9) +# Re-executierbar: bash run-sandbox.sh (ab Workspace-Root; Sandbox unter /tmp/sb34) +# Zweck: die Synthese-Mechanik (§5.10) als re-executierbarer Run-Demonstrator +# durchspielen — Neu-Anlage aus 2+ raw/-Quellen mit sources >= 2 + gemischten +# Belegen (S1), Multi-Beleg-Konsolidierung (S2), Negativ-Kontrolle +# Aneinanderreihung / Reflektiertheits-Selbsttest (S3), Synthese-Update auf +# bestehendem Concept-Pfad (S4), Struktur-/Frontmatter-Invariante (S5), +# NO_OP-Synthese (N1: Evidenz bereits im Body -> volle Byte-Identitaet), +# Zwei-Run-Identitaet (S6, AD-17h/A0-19) + die Form-Wahl-Klassifikationsprobe +# (Story-3.3-Defer U2/U7: prueft die §5.9-Abgrenzungs-Reihenfolge +# Korrigieren -> Praezisieren -> Erweitern -> No-Op an einer gemischten Einheit). +# Erhaltungs-Invariante (§5.9 Pkt. 5) als HARDE Assertion; Frontmatter- +# Konformitaet (Vertrag §3.3/§3.4-Subset) je erzeugtem/aktualisiertem Concept. +# Linux-Sandbox-Semantik auf einem /tmp-Baum — NIE der reale wiki/-Baum. +set -u +ROOT=$(mktemp -d /tmp/sb34-XXXXXX) +SB="$ROOT/sb" +mkdir -p "$SB/wiki" "$SB/raw" +cd "$SB" +git init -q +git config user.email "sandbox@test" +git config user.name "Sandbox" + +# ---------- Basis-Baum (committete Ausgangslage = Baseline-Commit) ---------- +# Mini-Bundle mit zwei Bereichs-Index-freien Root-Concepts + Bundleroot as the +# Referenz: ein bereits bestehendes Concept `gamma` (nicht betroffen, Kontrolle). +# gamma ist das nicht-betroffene Kontroll-Concept (Ghost-Diff-Kontrolle, S3/S5). +# Die Synthese-Einheiten (S1: neu; S4: Update auf bestehendem Pfad alpha) werden +# je Szenario aus zwei committeten raw/-Quellen gespeist. +cat > wiki/index.md <<'EOF' +# Index +- [Alpha](alpha.md) +- [Gamma](gamma.md) +EOF +cat > wiki/alpha.md <<'EOF' +--- +type: concept +sources: + - resource: raw/alpha-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Das Alpha-Protokoll definiert eine deterministische Init-Sequenz (raw/alpha-v1.md#S-1). +Alpha verwendet ausschließlich lokale Netze (raw/alpha-v1.md#S-2). +EOF +cat > wiki/gamma.md <<'EOF' +--- +type: concept +sources: + - resource: raw/gamma-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Gamma beschreibt ein anderes, hier nicht betroffenes Thema. +EOF +cat > wiki/log.md <<'EOF' +# Log +EOF +# Bereits bestehende raw/-Dateien (Baseline-Baum) +cat > raw/alpha-v1.md <<'EOF' +### S-1 +Evidenz v1: deterministische Init-Sequenz. +### S-2 +Evidenz v1: ausschließlich lokale Netze. +EOF +cat > raw/gamma-v1.md <<'EOF' +### S-1 +Evidenz v1: Gamma-Thema. +EOF +git add -A +git commit -qm "Baseline" +BASE=$(git rev-parse HEAD) +echo "BASELINE-COMMIT: $BASE" +echo "Sandbox-Root: $ROOT (loeschbar: rm -rf $ROOT)" +echo + +runlabel() { echo; echo "########## $1 ##########"; } +# Isolation: Worktree auf BASE zuruecksetzen (kein Carry-over ueber Szenarien) +isolate() { git checkout -q -b "$1" "$BASE" 2>/dev/null || git checkout -q "$1"; git reset -q --hard "$BASE"; git clean -qfd wiki raw; } + +# Erhaltungs-Invariante-Probe (D-1-Form, §5.9 Pkt. 5): Baseline-Diff + porcelain, +# normalisiert (wiki/-Praefix + .md-Suffix gestrippt, LC_ALL=C-sortiert) +probe() { + { git diff --name-only "$BASE" -- wiki/ ; git status --porcelain -- wiki/ | awk '{print $2}'; } \ + | sed -e 's|^wiki/||' -e 's|\.md$||' | LC_ALL=C sort -u +} +inv_set() { probe | LC_ALL=C sort -u | paste -sd' ' -; } + +# ---------- Harte Assertion der Erhaltungs-Invariante (§5.9 Pkt. 5) ---------- +# assert_invariant: bricht bei Verstoß hart ab (exit 1; positive Erwartung). +# assert_invariant_ok: Non-Exiting-Variante (exit-code: 0 = Invariante gehalten, +# 1 = verletzt) — für Negativ-Kontrollen, die NUR erkennen sollen (§5.9 Pkt. 5, +# Verstoß textuell benannt, NFR-4), ohne dass die Assertion selbst den Run beendet. +inv_viol() { # $1=expected ; liefert 0, wenn erlaubte-Menge konsistent (keine Verletzung), !=0 sonst; msg auf stderr + # Alle Eintraege (getrackt wie ungetrackt) unter wiki/ muessen in $expected sein. + # Ungetrackte Eintraege ($??) sind NUR dann ein Verstoss, wenn sie ausserhalb der + # erlaubten Menge liegen (Pkt. 8: "keine neue Datei AUSSER echten Ziel-Pfaden" — + # legitime neue Ziel-Pfade sind in $expected enthalten; alle anderen sind Duplikat/ + # Ghost-Diff). Die Dublette "keine neue Datei UEBERHAUPT" wuerde legitime neue + # Ziel-Pfade faelschlich verwerfen und ist hier bewusst NICHT formuliert. + local expected="$1" p u bad=0 + got=$(inv_set) + for p in $got; do + case " $expected " in + *" $p "*) ;; + *) echo "HARD-FAIL (Erhaltungs-Invariante §5.9 Pkt. 5): '$p' ist kein Ghost-Diff-negativer Eintrag — erlaubte Menge: {$expected}" >&2; bad=1;; + esac + done + for u in $(git status --porcelain -- wiki/ | grep '^??' | awk '{print $2}'); do + u=$(echo "$u" | sed -e 's|^wiki/||' -e 's|\.md$||') + case " $expected " in + *" $u "*) ;; + *) echo "HARD-FAIL (Duplikat/Ghost-Diff): ungetrackte neue Datei '$u' liegt ausserhalb der erlaubten Ziel-Pfade {$expected} (Pkt. 8)" >&2; bad=1;; + esac + done + return $bad +} +assert_invariant() { # positive Erwartung: Verstoß => HARD-FAIL + Exit 1 + if inv_viol "$1"; then + echo "RESULT: PASS — Probe erfüllt; keine neue Datei; kein Ghost-Diff" + else + exit 1 + fi +} +# assert_frontmatter_ok: Non-Exiting-Variante von assert_frontmatter (wie oben: +# exit-code 0 = konform, 1 = Verstoß) für Negativ-Kontrollen, die erkennen sollen +# (Vertrag §3.3/§3.4-Subset, P2-Element (6)) — ohne den Run abzubrechen. +assert_frontmatter_ok() { + ( assert_frontmatter "$@" ) >/dev/null 2>&1 +} + +# ---------- Frontmatter-Konformitaet (Vertrag §3.3/§3.4, §6.5) ---------- +# $1=Datei; $2...=erwartete sources[].resource-Werte (in beliebiger Reihenfolge; +# der Determinismus der sources-Reihenfolge wird separat in S1/S4 geprueft). +assert_frontmatter() { + local f="$1"; shift + local r bad=0 + local v + v=$(awk ' + /^---$/{n++; if(n==2) exit; next} + /^[A-Za-z_][A-Za-z0-9_-]*:/{ + k=$0; sub(/:.*/,"",k) + if (k=="sources") top="sources" + else if (k=="generated" || k=="verified") top="genver" + else top="other" + if (k!="type" && k!="sources" && k!="generated" && k!="verified" && k!="status" && k!="stale_after") print "TOP_UNBEFUGT:" k + if (seenk[k]++) print "DUP_KEY:" k + r=0 + if (k=="type") r=1; else if (k=="sources") r=2; else if (k=="generated") r=3 + else if (k=="verified") r=4; else if (k=="status") r=5; else if (k=="stale_after") r=6 + if (r>0 && r0) lastr=r + next + } + /^[[:space:]]/{ + gsub(/^[[:space:]]+/,""); sub(/^- /,""); gsub(/^[[:space:]]+/,""); + if (match($0, /^[A-Za-z_][A-Za-z0-9_-]*:/)) { + ik=substr($0,1,RLENGTH-1) + if (top=="sources" && ik!="resource" && ik!="id" && ik!="title" && ik!="author" && ik!="usage_count" && ik!="last_modified") print "INNER_UNBEFUGT:" ik + if (top=="genver" && ik!="by" && ik!="at") print "INNER_UNBEFUGT:" ik + if (top=="other") print "INNER_UNBEFUGT:" ik + } + } + ' "$f") + if [ -n "$v" ]; then + echo "HARD-FAIL (Frontmatter-Subset, Vertrag §3.3/§3.4/§3.5): $v in $f" >&2 + exit 1 + fi + grep -qE '^type: concept$' "$f" || { echo "HARD-FAIL: type=concept fehlt in $f" >&2; exit 1; } + grep -qE "^ at: [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|[+-][0-9]{2}:?[0-9]{2})$" "$f" || { echo "HARD-FAIL: generated.at ist keine volle ISO-8601-Datetime in $f" >&2; exit 1; } + for r in "$@"; do + grep -qF " - resource: $r" "$f" || { echo "HARD-FAIL: sources-Eintrag 'resource: $r' fehlt in $f" >&2; exit 1; } + done + echo "RESULT: PASS — Frontmatter-Konformitaet $f (Subset ok, generated.at volles Datetime)" +} + +# ---------- Synthese-Helfer (deterministisch; at gepinnt fuer Zwei-Run-Identitaet) ---------- +AT_NEW="2026-08-19T12:00:00Z" +bump_at() { sed -i "s|^ at: .*| at: $AT_NEW|" "$1"; } +# add_source: Fuegt einen sources-Eintrag an seiner LEXIKOGRAFISCHEN Position ein +# (§5.10 Pkt. 2/8: die sources-Liste ist deterministisch nach `resource` sortiert, +# LC_ALL=C, AD-17h/A0-19 — nie appended). Einfuege-Zeile: erste `resource:`-Zeile, +# deren Wert lexikografisch > $res ist; sonst generated:-Zeile (Ende der sources-Liste). +# Die Einfuege-Position selbst wird ueber assert_sources_lex haert verifiziert. +add_source() { # $1=Datei $2=resource $3=id + local f="$1" res="$2" id="$3" ln + grep -qF " - resource: $res" "$f" && return 0 # bereits vorhanden -> kein Duplikat + ln=$(LC_ALL=C awk -v r="$res" ' + $1=="-" && $2=="resource:" { name=$3; gsub(/\r/,"",name); if (name > r) { print NR; exit } } + /^generated:/ { print NR; exit } + ' "$f") + [ -n "$ln" ] || ln=$(grep -n '^generated:' "$f" | head -1 | cut -d: -f1) + sed -i "${ln}i\\ - resource: $res\n id: $id" "$f" +} +# assert_sources_lex: verifiziert, dass die sources-resource-Werte in Datei-Reihenfolge +# exakt der LC_ALL=C-lexikografischen Ordnung entsprechen (§5.10 Pkt. 2 / Pkt. 8, +# AD-17h/A0-19 — deterministisch, unabhaengig von Datei-/Verarbeitungsreihenfolge). +assert_sources_lex() { # $1=Datei + local f="$1" file_order sorted_order + file_order=$(display_sources "$f") + sorted_order=$(display_sources "$f" | LC_ALL=C sort) + if [ "$file_order" != "$sorted_order" ]; then + echo "HARD-FAIL (sources-Reihenfolge, §5.10 Pkt. 2/8): die sources-Liste in $f ist nicht lexikografisch nach resource (LC_ALL=C) sortiert" >&2 + echo " Datei-Reihenfolge: $file_order" >&2 + echo " LC_ALL=C-Ordnung: $sorted_order" >&2 + exit 1 + fi + echo "RESULT: PASS — sources-Liste $f ist lexikografisch nach resource sortiert (LC_ALL=C, AD-17h/A0-19)" +} +# display_sources: gibt die sources-resource-Zeilen in Datei-Reihenfolge aus +display_sources() { grep -E '^ - resource: ' "$1"; } + +log_anlage() { # $1=Concept-Pfad $2=quelle(n) + printf '\n## 2026-08-19\n- Synthese-Anlage: %s (%s; Baseline %s)\n' "$1" "$2" "$BASE" >> wiki/log.md +} +log_update() { # $1=Concept-Pfad $2=quelle(n) + printf '\n## 2026-08-19\n- Story 3.1-Update: %s (%s; Baseline %s)\n' "$1" "$2" "$BASE" >> wiki/log.md +} + +# ===================================================================== +runlabel "S1: NEU-ANLAGE — zwei raw/-Quellen desselben Themas -> EIN Synthese-Concept (sources >= 2, gemischte Belege; FR-7 AC-1/AC-2)" +isolate s1 +cat > raw/synth-a.md <<'EOF' +### S-1 +Evidenz a: das Delta-Protokoll kapselt die Zustands-Replikation. +### S-2 +Evidenz a: Delta-Replikatbestaetigungen durchlaufen eine deterministische Quorum-Sequenz. +EOF +cat > raw/synth-b.md <<'EOF' +### S-1 +Evidenz b: Delta-Betrieb setzt einen synchronen Konsens-Dienst voraus. +### S-2 +Evidenz b: das Delta-Protokoll kapselt die Zustands-Replikation. +EOF +git add -A; git commit -qm "Zuwachs: raw/synth-a.md + raw/synth-b.md (zwei Quellen, ein Thema)" +echo "--- Synthese-Stimulus: zwei belegende raw/-Quellen (§5.10 Pkt. 1), Ziel-Pfad unbelegt -> Neu-Anlage via §5.7 ---" +echo "--- EIN Synthese-Concept delta: gemeinsame Repraesentation statt getrennter Zusammenfassungen (AC-1) ---" +cat > wiki/delta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/synth-a.md + id: s1 + - resource: raw/synth-b.md + id: s2 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-19T12:00:00Z +--- +Das Delta-Protokoll kapselt die Zustands-Replikation (raw/synth-a.md#S-1). +Delta-Replikatbestaetigungen durchlaufen eine deterministische Quorum-Sequenz (raw/synth-a.md#S-2). +Delta-Betrieb setzt einen synchronen Konsens-Dienst voraus (raw/synth-b.md#S-1). +EOF +sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md +log_anlage delta "raw/synth-a.md + raw/synth-b.md" +# KEIN git add -A auf wiki/: delta.md bleibt ungetrackt ($??) — die Pkt.-8- +# Duplikat-Kontrolle (über die ??-Sicht) wird so LEBENDIG geprüft (die Erhaltungs- +# Invarianz-Probe liest git-diff + porcelain beides aus). +echo "--- Assertion: sources >= 2 (jede belegende Quelle ein Eintrag), lexikografisch nach resource (LC_ALL=C, Pkt. 2/8) ---" +grep -qF ' - resource: raw/synth-a.md' wiki/delta.md || { echo "HARD-FAIL: sources-Eintrag raw/synth-a.md fehlt" >&2; exit 1; } +grep -qF ' - resource: raw/synth-b.md' wiki/delta.md || { echo "HARD-FAIL: sources-Eintrag raw/synth-b.md fehlt" >&2; exit 1; } +assert_sources_lex wiki/delta.md +echo "--- Assertion: gemischte claim-granulare Provenienz (§5.5) je Aussage — eine Repraesentation, Belege aus beiden Quellen ---" +grep -qF '(raw/synth-a.md#S-1)' wiki/delta.md || { echo "HARD-FAIL: Inline-Beleg raw/synth-a.md#S-1 fehlt" >&2; exit 1; } +grep -qF '(raw/synth-a.md#S-2)' wiki/delta.md || { echo "HARD-FAIL: Inline-Beleg raw/synth-a.md#S-2 fehlt" >&2; exit 1; } +grep -qF '(raw/synth-b.md#S-1)' wiki/delta.md || { echo "HARD-FAIL: Inline-Beleg raw/synth-b.md#S-1 fehlt" >&2; exit 1; } +echo "--- Assertion: keine per-Source-Zusammenfassungs-Struktur (AC-4, Reflektiertheits-Selbsttest Pkt. 5) ---" +if grep -nE 'Quelle [A-Z]:|Source [A-Z]:' wiki/delta.md; then + echo "HARD-FAIL (Reflektiertheit): per-Source-Struktur im Synthese-Concept (FR-7 AC-4)" >&2 + exit 1 +else + echo "RESULT: PASS — keine 'Quelle A: ... / Quelle B: ...'-Struktur; Aussagen tragen Provenienz-Tags" +fi +echo "--- Index-Link (Punkt 11) + log.md-Anlage-Eintrag (Pkt. 7: vollständige Multi-Source-sources-Liste im Eintrag) ---" +grep -qF -- '- [Delta](delta.md)' wiki/index.md || { echo "HARD-FAIL: delta fehlt in wiki/index.md (Punkt 11)" >&2; exit 1; } +grep -qF 'Synthese-Anlage: delta' wiki/log.md || { echo "HARD-FAIL: Anlage-Eintrag in log.md fehlt" >&2; exit 1; } +grep -qF 'raw/synth-a.md' wiki/log.md || { echo "HARD-FAIL: Multi-Source-Quelle raw/synth-a.md fehlt im log.md-Anlage-Eintrag (Pkt. 7)" >&2; exit 1; } +grep -qF 'raw/synth-b.md' wiki/log.md || { echo "HARD-FAIL: Multi-Source-Quelle raw/synth-b.md fehlt im log.md-Anlage-Eintrag (Pkt. 7)" >&2; exit 1; } +echo "--- Probe (Erhaltungs-Invariante §5.9 Pkt. 5; erlaubt: delta + index + log) ---"; probe +assert_invariant "delta index log" +assert_frontmatter wiki/delta.md raw/synth-a.md raw/synth-b.md + +# ===================================================================== +runlabel "S2: KONSOLIDIERUNG — redundante Aussage aus zwei Quellen -> EINE konsolidierte Aussage mit Multi-Beleg (FR-7 AC-3, AD-4)" +isolate s2 +cat > raw/synth-c.md <<'EOF' +### S-1 +Evidenz c: Delta-relevante Sitzungsschluessel unterliegen einer festen Lebensdauer. +### S-3 +Evidenz c: Delta-Repraesentationen sind unveraenderlich nach Quorum-Bestaetigung. +EOF +cat > raw/synth-d.md <<'EOF' +### S-1 +Evidenz d: Delta-relevante Sitzungsschluessel unterliegen einer festen Lebensdauer. +### S-4 +Evidenz d: Delta-Repraesentationen speichern den konsolidierten Zustand. +EOF +git add -A; git commit -qm "Zuwachs: raw/synth-c.md + raw/synth-d.md (redundanter Befund)" +echo "--- Synthese: die redundante Aussage (Sitzungsschluessel) existiert in BEIDEN Quellen (§5.10 Pkt. 3) ---" +cat > wiki/delta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/synth-c.md + id: s1 + - resource: raw/synth-d.md + id: s2 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-19T12:00:00Z +--- +Delta-relevante Sitzungsschluessel unterliegen einer festen Lebensdauer (raw/synth-c.md#S-1; raw/synth-d.md#S-1). +Delta-Repraesentationen sind unveraenderlich nach Quorum-Bestaetigung (raw/synth-c.md#S-3). +Delta-Repraesentationen speichern den konsolidierten Zustand (raw/synth-d.md#S-4). +EOF +sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md +log_anlage delta "raw/synth-c.md + raw/synth-d.md" +# KEIN git add -A auf wiki/: delta.md ungetrackt ($??, legitimer Ziel-Pfad) — +# Pkt.-8-Duplikat-Kontrolle über die ??-Sicht wird lebendig geprüft. +echo "--- Assertion: EINE konsolidierte Aussage mit Multi-Beleg (Semikolon-Form, voller Pfad je Beleg); keine Beleg-Tilgung (AD-4) ---" +[ "$(grep -c 'Sitzungsschluessel' wiki/delta.md)" -eq 1 ] || { echo "HARD-FAIL: redundante Aussage wurde nicht zu einer Aussage konsolidiert (FR-7 AC-3)" >&2; exit 1; } +grep -qF '(raw/synth-c.md#S-1; raw/synth-d.md#S-1)' wiki/delta.md || { echo "HARD-FAIL: Multi-Beleg-Semikolon-Form fehlt oder ein Beleg wurde getilgt (AD-4)" >&2; exit 1; } +grep -qF '(raw/synth-c.md#S-3)' wiki/delta.md || { echo "HARD-FAIL: Einzelbeleg c#S-3 fehlt" >&2; exit 1; } +grep -qF '(raw/synth-d.md#S-4)' wiki/delta.md || { echo "HARD-FAIL: Einzelbeleg d#S-4 fehlt" >&2; exit 1; } +echo "--- Assertion: Reflektiertheit (AC-4) + sources-Ordnung (Pkt. 2/8) ---" +if grep -nE 'Quelle [A-Z]:|Source [A-Z]:' wiki/delta.md; then + echo "HARD-FAIL (Reflektiertheit): per-Source-Struktur (FR-7 AC-4)" >&2; exit 1 +else + echo "RESULT: PASS — konsolidierte Aussage mit Multi-Beleg (kein Provenienz-Verlust), keine per-Source-Struktur" +fi +assert_sources_lex wiki/delta.md +echo "--- log-Anlage-Eintrag (Pkt. 7): vollständige Multi-Source-Liste (c + d) im Eintrag ---" +grep -qF 'raw/synth-c.md' wiki/log.md || { echo "HARD-FAIL: Multi-Source-Quelle raw/synth-c.md fehlt im log.md-Anlage-Eintrag (Pkt. 7)" >&2; exit 1; } +grep -qF 'raw/synth-d.md' wiki/log.md || { echo "HARD-FAIL: Multi-Source-Quelle raw/synth-d.md fehlt im log.md-Anlage-Eintrag (Pkt. 7)" >&2; exit 1; } +echo "--- Probe (erlaubt: delta + index + log) ---"; probe +assert_invariant "delta index log" +assert_frontmatter wiki/delta.md raw/synth-c.md raw/synth-d.md + +# ===================================================================== +runlabel "S3: NEGATIV-KONTROLLE ANEINANDERREIHUNG — 'Quelle A: ... / Quelle B: ...' wird vom Reflektiertheits-Selbsttest erkannt und vor Run-Abschluss umgebaut (FR-7 AC-4, NFR-7/NFR-4)" +isolate s3 +echo "--- simuliertes (fehlerhaftes) Synthese-Ergebnis: per-Source-Zusammenfassungs-Struktur (verboten, §5.10 Pkt. 5) ---" +cat > wiki/delta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/synth-a.md + id: s1 + - resource: raw/synth-b.md + id: s2 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-19T12:00:00Z +--- +Quelle A: das Delta-Protokoll kapselt die Zustands-Replikation. +Quelle B: Delta-Betrieb setzt einen synchronen Konsens-Dienst voraus. +EOF +echo "--- Reflektiertheits-Selbsttest (Pkt. 5, grepbasiert): erwartet: Befund 'Quelle A:' wird erkannt (nicht vacuous, NFR-7) ---" +if grep -nE 'Quelle [A-Z]:|Source [A-Z]:' wiki/delta.md; then + echo "BEFUND: Aneinanderreihungs-Struktur erkannt (Selbsttest-FAIL, textuell benannt, NFR-7/NFR-4)" +else + echo "HARD-FAIL (Reflektiertheits-Selbsttest): per-Source-Struktur wurde NICHT erkannt — Mechanik vacuous (FR-7 AC-4)" >&2 + exit 1 +fi +echo "--- Producer-Umbau vor Run-Abschluss (NFR-4): die Aussagen werden integriert, je Aussage mit Provenienz-Tag (§5.5) ---" +cat > wiki/delta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/synth-a.md + id: s1 + - resource: raw/synth-b.md + id: s2 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-19T12:00:00Z +--- +Das Delta-Protokoll kapselt die Zustands-Replikation (raw/synth-a.md#S-1). +Delta-Betrieb setzt einen synchronen Konsens-Dienst voraus (raw/synth-b.md#S-1). +EOF +sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md +log_anlage delta "raw/synth-a.md + raw/synth-b.md" +# KEIN git add -A auf wiki/: delta.md ungetrackt ($??, legitimer Ziel-Pfad) — +# Pkt.-8-Duplikat-Kontrolle über die ??-Sicht wird lebendig geprüft. +echo "--- Assertion: nach dem Umbau ist der Selbsttest leer (Integration hergestellt), nicht nur vertuscht ---" +if grep -qE 'Quelle [A-Z]:|Source [A-Z]:' wiki/delta.md; then + echo "HARD-FAIL (Reflektiertheit): per-Source-Struktur nach Umbau noch vorhanden (FR-7 AC-4)" >&2; exit 1 +else + echo "RESULT: PASS — Aneinanderreihung erkannt und durch integrierte, provenance-versehene Aussagen ersetzt (NFR-4: textuell benannt, vor Run-Abschluss behoben)" +fi +echo "--- Probe (erlaubt: delta + index + log) ---"; probe +assert_invariant "delta index log" +assert_frontmatter wiki/delta.md raw/synth-a.md raw/synth-b.md + +# ===================================================================== +runlabel "S4: SYNTHESE-UPDATE — Synthese-Einheit trifft bestehenden Concept-Pfad -> §5.9-Formwahl + sources-Zuwachs um die zweite Quelle" +isolate s4 +cat > raw/alpha-v2.md <<'EOF' +### S-3 +Evidenz v2 (neue Aussage): Alpha ergaenzt die deterministische Init-Sequenz um einen zusaetzlichen Sync-Schritt. +EOF +cat > raw/alpha-v3.md <<'EOF' +### S-3 +Evidenz v3 (neue Aussage): Alpha-Repraesentationen wachsen um einen kompakten Rotationsindex. +EOF +git add -A; git commit -qm "Zuwachs: raw/alpha-v2.md + raw/alpha-v3.md (zwei Quellen, Thema Alpha)" +echo "--- Synthese-Stimulus: zwei belegende raw/-Quellen zum selben Thema (Alpha) treffen den bestehenden Pfad alpha (Kandidatenliste §3 Pkt. 2) -> §5.9-Update ---" +echo "--- §5.9-Formwahl: neue belegte Aussagen (kein Ersatz, keine Schaerfung bestehender Formulierung) -> ERWEITERN (erste zutreffende Form) ---" +cat >> wiki/alpha.md <<'EOF' +Alpha ergänzt die deterministische Init-Sequenz um einen zusätzlichen Sync-Schritt (raw/alpha-v2.md#S-3). +Alpha-Repräsentationen wachsen um einen kompakten Rotationsindex (raw/alpha-v3.md#S-3). +EOF +add_source wiki/alpha.md raw/alpha-v2.md s2 +add_source wiki/alpha.md raw/alpha-v3.md s3 +bump_at wiki/alpha.md +log_update alpha "raw/alpha-v2.md + raw/alpha-v3.md" +# KEIN git add -A auf wiki/: alpha.md + log.md bleiben modifiziert-ungetrackt +# (porcelain ' M '); die Pkt.-8-??-Probe und der git-diff-Baseline-Vergleich +# lesen Worktree-Zustand, kein Staging nötig (isolate resettet je Szenario). +echo "--- Assertion: sources-Zuwachs um beide Quellen (>= 2 belegende Quellen, §5.10 Pkt. 2); bestehende Eintraege unveraendert ---" +grep -qF ' - resource: raw/alpha-v1.md' wiki/alpha.md || { echo "HARD-FAIL: bestehender sources-Eintrag alpha-v1 verloren (keine Entfernung ohne Beleg)" >&2; exit 1; } +grep -qF ' - resource: raw/alpha-v2.md' wiki/alpha.md || { echo "HARD-FAIL: sources-Zuwachs alpha-v2 fehlt" >&2; exit 1; } +grep -qF ' - resource: raw/alpha-v3.md' wiki/alpha.md || { echo "HARD-FAIL: sources-Zuwachs alpha-v3 fehlt" >&2; exit 1; } +assert_sources_lex wiki/alpha.md +echo "--- Assertion: gemischte Belege neu (v2/v3), bestehende belegte Aussagen byte-identisch (Struktur-Erhaltungsregel Erweitern, §5.9 Pkt. 2) ---" +grep -qF '(raw/alpha-v2.md#S-3)' wiki/alpha.md || { echo "HARD-FAIL: Beleg alpha-v2#S-3 fehlt" >&2; exit 1; } +grep -qF '(raw/alpha-v3.md#S-3)' wiki/alpha.md || { echo "HARD-FAIL: Beleg alpha-v3#S-3 fehlt" >&2; exit 1; } +grep -qF 'Das Alpha-Protokoll definiert eine deterministische Init-Sequenz (raw/alpha-v1.md#S-1).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 1 wurde beim Synthese-Update umgeschrieben (Struktur-Erhaltung)" >&2; exit 1; } +grep -qF 'Alpha verwendet ausschließlich lokale Netze (raw/alpha-v1.md#S-2).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 2 wurde beim Synthese-Update umgeschrieben (Struktur-Erhaltung)" >&2; exit 1; } +echo "--- Assertion: log.md-Eintrag 'Story 3.1-Update' (Pkt. 7) + Reflektiertheit (AC-4) ---" +grep -qF 'Story 3.1-Update: alpha' wiki/log.md || { echo "HARD-FAIL: Story 3.1-Update-Eintrag in log.md fehlt (Pkt. 7)" >&2; exit 1; } +if grep -nE 'Quelle [A-Z]:|Source [A-Z]:' wiki/alpha.md; then + echo "HARD-FAIL (Reflektiertheit): per-Source-Struktur (FR-7 AC-4)" >&2; exit 1 +else + echo "RESULT: PASS — Synthese-Update: ein Ziel-Pfad, sources-Zuwachs s2+s3, gemischte Belege, bestehende Aussagen byte-identisch" +fi +echo "--- Probe (Pkt. 5; erlaubt: alpha (Update) + log — der Index-Link bleibt unveraendert, §5.9 Pkt. 3) ---"; probe +assert_invariant "alpha log" +assert_frontmatter wiki/alpha.md raw/alpha-v1.md raw/alpha-v2.md raw/alpha-v3.md + +# ===================================================================== +runlabel "S5: STRUKTUR-/FRONTMATTER-INVARIANTE — unbefugter Key oder nicht-lexikografische sources verletzt die Synthese-Struktur-Ebene (Pkt. 8, §5.9 Pkt. 5-Struktur-Ebene; P2-Element (6))" +isolate s5 +echo "--- simulierter Verstoß: unbefugter Frontmatter-Key 'foo' in einem Synthese-Concept ---" +# Setup als regelkonforme Anlage (delta + Index-Link + log-Eintrag) — die Pfad- +# Set-Ebene ist damit legitim; der VERSTOSS sitzt ausschließlich in der Struktur- +# Ebene (unbefugter Key 'foo:', Vertrag §3.3/§3.4-Subset, P2-Element (6)). +cat > wiki/delta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/synth-a.md + id: s1 + - resource: raw/synth-b.md + id: s2 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-19T12:00:00Z +foo: bar +--- +Das Delta-Protokoll kapselt die Zustands-Replikation (raw/synth-a.md#S-1). +EOF +sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md +log_anlage delta "raw/synth-a.md + raw/synth-b.md" +# KEIN git add -A auf wiki/: delta.md ungetrackt — die Pkt.-8-??-Sicht wird +# in diesem Struktur-Szenario selbst geprüft. +echo "--- Assertions (erwartet: Frontmatter-Subset-HARD-FAIL, Verstoß textuell benannt, NFR-4; non-exiting Variante, denn der Szenario-Zweck ist das ERKENNEN, nicht eine positive Invarianten-Erwartung) ---" +# (a) Path-Set-Ebene: die Erhaltungs-Invariante selbst muss hier GEHALTEN sein +# (delta/index/log sind legitime Einträge); andernfalls wäre der Szenario- +# Zustand selbst schon inkonsistent (Pkt. 8, §5.9 Pkt. 5) — dann HARD-FAIL. +if inv_viol "delta index log"; then + : +else + echo "HARD-FAIL (Struktur-Ebene): Erhaltungs-Invariante unerwartet verletzt (unbefugter Pfad / neue Datei) — Szenario-Zustand inkonsistent (Pkt. 8)" >&2 + exit 1 +fi +# (b) Struktur-Ebene: der unbefugte Key 'foo:' MUSS erkannt werden (P2-Element (6), +# Vertrag §3.3/§3.4-Subset) — wenn nicht, ist die Erkennungs-Mechanik vacuous. +if assert_frontmatter_ok wiki/delta.md; then + echo "HARD-FAIL (Struktur-Ebene): unbefugter Frontmatter-Key wurde NICHT erkannt (P2-Element (6))" >&2 + exit 1 +fi +# (c) Pkt.-8-??-Negativkontrolle: eine UNGETRACKTE neue Datei AUSSERHALB der +# erlaubten Ziel-Pfade {delta index log} MUSS als Duplikat/Ghost-Diff +# HARD-FAILn (Pkt. 8 „keine neue Datei außer echten Ziel-Pfaden"; Story- +# 3.3-U9-Muster) — erkennt inv_viol die Verletzung, ist die Kontrolle +# nicht vacuous; erst danach ist die Setup-Zeile (virtueller Ortungs- +# Re-Run) zu entfernen und der Zustand für die positive Probe wiederherzustellen. +echo "--- Pkt.-8-??-Negativkontrolle: ungetrackte Nicht-Ziel-Datei muss als Duplikat/Ghost-Diff HARD-FAILn ---" +cat > wiki/ghost.md <<'EOF' +--- +type: concept +sources: + - resource: raw/synth-a.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-19T12:00:00Z +--- +Ghost-Diff-Versuch: keine echte Ziel-Pfad-Berechtigung. +EOF +echo "--- Probe mit erwartet-negativer Sicht: git-diff zeigt ghost + delta/index/log; ??-Sicht listet ghost + delta ---" +{ git diff --name-only "$BASE" -- wiki/ ; git diff --cached --name-only "$BASE" -- wiki/ ; git status --porcelain -- wiki/ | awk '{print $2}'; } \ + | sed -e 's|^wiki/||' -e 's|\.md$||' | LC_ALL=C sort -u | paste -sd' ' - +if inv_viol "delta index log"; then + # inv_viol = 0 => KEINE Verletzung gemeldet => ghost.md wurde NICHT erkannt + # (die ??-Sicht/der Diff ignorieren die Nicht-Ziel-Datei) => Kontrolle vacuous + echo "HARD-FAIL (Pkt. 8-??-Probe): ghost.md ausserhalb der erlaubten Ziel-Pfade wurde NICHT als Duplikat/Ghost-Diff erkannt — Kontrolle vacuous" >&2 + exit 1 +else + # inv_viol != 0 => Verletzung gemeldet => ghost.md als Duplikat/Ghost-Diff erkannt + echo "BEFUND: ghost.md als Duplikat/Ghost-Diff erkannt (inv_viol meldet Verletzung, NFR-4) — Pkt.-8-??-Kontrolle ist nicht vacuous" +fi +rm wiki/ghost.md +echo "RESULT: PASS — unbefugter Key im Synthese-Concept wird als Struktur-Verstoß erkannt (Frontmatter-Subset-HARD-FAIL, textuell benannt); Pkt.-8-??-Negativkontrolle nicht vacuous" + +# ===================================================================== +runlabel "N1: NO_OP-SYNTHESE — Evidenz bereits vollständig im Body: keine Form greift -> No-Op (Nicht-Form), volle Byte-Identität (§5.10 Pkt. 3/8, §5.9 Pkt. 2)" +isolate n1 +# Eine ZWEITE committete Quelle desselben Themas mit REDUNDANTER Evidenz: die +# Aussage (deterministische Init-Sequenz) existiert bereits im Body — belegt aus +# alpha-v1#S-1 (Baseline-Beleg; alpha-v1 ist die bestehende Evidenzbasis, NICHT +# Zuwachs). Die Zuwachs-Quelle alpha-syno.md (Anker #S-3) paraphrasiert dieselbe +# erkannte Wissenseinheit — kein neuer Befund, keine Schaerfung, kein Ersatz -> +# die Abgrenzungs-Reihenfolge §5.9 Pkt. 2 greift auf keiner Update-Form; die +# Synthese-Einheit läuft auf NO-OP (keine Form-Anwendung, keine Mutations-Phase +# — im Zweifel greift eine Form, engere Auslegung No-Op). +cat > raw/alpha-syno.md <<'EOF' +### S-3 +Evidenz (synonym wiedergegeben): das Alpha-Protokoll definiert eine deterministische Init-Sequenz. +EOF +git add -A; git commit -qm "Zuwachs: raw/alpha-syno.md (redundante Evidenz zum Thema Alpha)" +echo "--- Synthese-Stimulus: die ZUWACHS-Quelle alpha-syno.md + die bestehende Evidenzbasis (alpha-v1, Baseline) belegen dasselbe Thema — die neue committete Evidenz (§1 Pkt. 1) ist alpha-syno.md ---" +echo "--- Abgrenzung §5.9 Pkt. 2: kein Ersatz / keine Schaerfung / keine NEUE belegte Aussage -> NO-OP (Nicht-Form) ---" +echo "--- RUN (No-Op): keine Mutations-Phase -> Bundle byte-identisch zum Baseline (kein Eintrag, kein at-Bump, kein sources-Zusatz) ---" +ALPHA_BEFORE=$(sha256sum wiki/alpha.md | cut -d' ' -f1) +LOG_BEFORE=$(sha256sum wiki/log.md | cut -d' ' -f1) +INDEX_BEFORE=$(sha256sum wiki/index.md | cut -d' ' -f1) +AT_BEFORE=$(grep -E '^ at: ' wiki/alpha.md) +# Die Mutations-Phase unterbleibt ex definitione; der Nachweis ist die volle +# Byte-Identität des Bundles (grept nichts, schreibt nichts, committet nichts). +ALPHA_AFTER=$(sha256sum wiki/alpha.md | cut -d' ' -f1) +LOG_AFTER=$(sha256sum wiki/log.md | cut -d' ' -f1) +INDEX_AFTER=$(sha256sum wiki/index.md | cut -d' ' -f1) +AT_AFTER=$(grep -E '^ at: ' wiki/alpha.md) +[ "$ALPHA_BEFORE" = "$ALPHA_AFTER" ] || { echo "HARD-FAIL (No-Op): alpha.md wurde trotz No-Op geaendert (byte-Identitaet, §5.9 Pkt. 2 / §5.10 Pkt. 3)" >&2; exit 1; } +[ "$LOG_BEFORE" = "$LOG_AFTER" ] || { echo "HARD-FAIL (No-Op): log.md wurde trotz No-Op geaendert (kein Eintrag, Pkt. 7-Negation)" >&2; exit 1; } +[ "$INDEX_BEFORE" = "$INDEX_AFTER" ] || { echo "HARD-FAIL (No-Op): index.md wurde trotz No-Op geaendert (kein neuer Link, Punkt-11-Negation)" >&2; exit 1; } +[ "$AT_BEFORE" = "$AT_AFTER" ] || { echo "HARD-FAIL (No-Op): generated.at-Bump trotz No-Op (kein at-Bump, §5.9 Pkt. 2)" >&2; exit 1; } +grep -qF ' - resource: raw/alpha-syno.md' wiki/alpha.md && { echo "HARD-FAIL (No-Op): sources-Zuwachs trotz No-Op (kein sources-Zusatz, §5.9 Pkt. 2)" >&2; exit 1; } +grep -q 'Synthese-Anlage\|Story 3.1-Update' wiki/log.md && { echo "HARD-FAIL (No-Op): log-Eintrag trotz No-Op (kein Eintrag)" >&2; exit 1; } +echo "--- Probe: erwartet LEER (Ghost-Diff-negativ; ein No-Op erzeugt keinen Diff, §5.9 Pkt. 5) ---"; probe +assert_invariant "" +echo "RESULT: PASS — No-Op-Synthese: byte-identisch (alpha/index/log), kein at-Bump, kein sources-Zusatz, kein log-Eintrag, keine neue Datei" + +# ===================================================================== +runlabel "N2: DISAGREEMENT (AD-16-Default, §5.10 Pkt. 3/7) — widersprüchliche Aussagen aus zwei Quellen werden NICHT still zusammengeführt; beide Behauptungen bleiben + Disagreement-Eintrag in log.md (Epic-4-Interface)" +isolate n2 +# Zwei committete Quellen mit DISKREPANTEM Inhalt zur selben erkannten +# Wissenseinheit (Quorum-Konsens): Quelle A behauptet „synchrone Bestätigung", +# Quelle B „asynchrone Bestätigung". AD-16-Default: kein stilles Zusammenführen +# zu einer scheinbar eindeutigen Aussage; die widersprüchlichen Aussagen bleiben +# als Bestand bestehen (je mit ihrem Beleg/Beschreibungsstil + §5.5-Marker). +cat > raw/synth-e.md <<'EOF' +### S-1 +Evidenz e: Quorum-Bestaetigungen erfolgen synchron. +### S-5 +Evidenz e: Synchrone Quorum-Bestaetigungen halten die Replikate konsistent. +EOF +cat > raw/synth-f.md <<'EOF' +### S-1 +Evidenz f: Quorum-Bestaetigungen erfolgen asynchron. +### S-6 +Evidenz f: Asynchrone Quorum-Bestaetigungen erhoehen die Latenz. +EOF +git add -A; git commit -qm "Zuwachs: raw/synth-e.md + raw/synth-f.md (diskrepanter Befund zum selben Thema)" +echo "--- Synthese-Stimulus: zwei belegende Quellen desselben Themas mit WIDERSPRECHLICHEM Befund (S-1) ---" +echo "--- AD-16-Default (§5.10 Pkt. 3): KEINE stille Konsolidierung zu einer scheinbar eindeutigen Aussage; beide Behauptungen bleiben ---" +cat > wiki/delta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/synth-e.md + id: s1 + - resource: raw/synth-f.md + id: s2 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-19T12:00:00Z +--- +Quorum-Bestaetigungen erfolgen synchron (raw/synth-e.md#S-1). +Quorum-Bestaetigungen erfolgen asynchron (raw/synth-f.md#S-1). +EOF +sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md +# Disagreement-Eintrag (AD-16/§5.10 Pkt. 7, Epic-4-Interface): mutierter +# Concept-Pfad + die beiden konfligierenden Belege + Baseline-Commit. +printf '\n## 2026-08-19\n- Disagreement: delta — raw/synth-e.md#S-1 vs. raw/synth-f.md#S-1 (kein stilles Zusammenfuehren, AD-16; Baseline %s)\n' "$BASE" >> wiki/log.md +# KEIN git add -A auf wiki/: delta.md + log.md ungetrackt-modifiziert (??-Sicht lebendig). +echo "--- Assertion: BEIDE Behauptungen bleiben erhalten (kein stilles Zusammenfuehren, keine Beleg-Tilgung AD-4) ---" +grep -qF 'Quorum-Bestaetigungen erfolgen synchron (raw/synth-e.md#S-1).' wiki/delta.md || { echo "HARD-FAIL (Disagreement): Aussage e#S-1 wurde still entfernt oder umgeschrieben (AD-16)" >&2; exit 1; } +grep -qF 'Quorum-Bestaetigungen erfolgen asynchron (raw/synth-f.md#S-1).' wiki/delta.md || { echo "HARD-FAIL (Disagreement): Aussage f#S-1 wurde still entfernt oder umgeschrieben (AD-16)" >&2; exit 1; } +grep -qF '(raw/synth-e.md#S-1)' wiki/delta.md || { echo "HARD-FAIL (Disagreement): Beleg e#S-1 fehlt (AD-4)" >&2; exit 1; } +grep -qF '(raw/synth-f.md#S-1)' wiki/delta.md || { echo "HARD-FAIL (Disagreement): Beleg f#S-1 fehlt (AD-4)" >&2; exit 1; } +echo "--- Assertion: KEINE falsche Multi-Beleg-Konsolidierung der widerspruchlichen Aussagen (kein '(e; f)'-Zusammenfuehren) ---" +if grep -qF '(raw/synth-e.md#S-1; raw/synth-f.md#S-1)' wiki/delta.md; then + echo "HARD-FAIL (Disagreement): widerspruechliche Aussagen wurden als ein Multi-Beleg zusammengefuehrt (AD-16-Default verletzt, Schein-Eindeutigkeit)" >&2 + exit 1 +fi +echo "--- Assertion: Disagreement-Eintrag in log.md (Pkt. 7, AD-16, Epic-4-Interface) ---" +grep -qF 'Disagreement: delta' wiki/log.md || { echo "HARD-FAIL (Disagreement): Disagreement-Eintrag in log.md fehlt (§5.10 Pkt. 7)" >&2; exit 1; } +echo "--- Assertion: Reflektiertheit (AC-4) + sources-Lexikografie ---" +if grep -nE 'Quelle [A-Z]:|Source [A-Z]:' wiki/delta.md; then + echo "HARD-FAIL (Reflektiertheit): per-Source-Struktur trotz Disagreement (FR-7 AC-4)" >&2; exit 1 +fi +assert_sources_lex wiki/delta.md +echo "--- Probe (erlaubt: delta + index + log) ---"; probe +assert_invariant "delta index log" +assert_frontmatter wiki/delta.md raw/synth-e.md raw/synth-f.md +echo "RESULT: PASS — Disagreement: beide Behauptungen + je Beleg bleiben; kein stilles Zusammenfuehren (AD-16-Default); log.md-Disagreement-Eintrag (Epic-4-Interface)" + +# ===================================================================== +runlabel "N3: AD-4c-UEBERNAHME-MARKER (Kontext-Marker, §5.10 Pkt. 4) — übernommene Formulierung aus einem bestehenden Concept traegt den §5.5-Kontext-Marker, nie alleinige Provenienz" +isolate n3 +# Eine Synthese-Einheit übernimmt eine Formulierung aus einem BESTEHENDEN Concept +# (gamma): sie ist eine Kontext-/Synthese-Umformulierung, NICHT eigenständig +# gegen die Zuwachs-Quelle belegt. AD-4c: kein bestehendes Concept ist alleinige +# Provenienz eines anderen — die Übernahme trägt den §5.5-Kontext-Marker und +# bleibt textuell auf die Quelle des übernommenen Concepts rückverfolgbar. +cat > raw/synth-g.md <<'EOF' +### S-1 +Evidenz g: Delta-Operationen respektieren die gamma-Kopplung. +EOF +cat > raw/synth-h.md <<'EOF' +### S-1 +Evidenz h: Delta-Operationen verlangen die gamma-Kopplungs-Pruefung. +EOF +git add -A; git commit -qm "Zuwachs: raw/synth-g.md + raw/synth-h.md (Uebernahme-Thema)" +echo "--- Synthese-Einheit: zwei Zuwachs-Quellen (synth-g/h) zum selben Thema; die Kopplungs-Formulierung wird aus dem bestehenden Concept gamma uebernommen (AD-4c) ---" +cat > wiki/delta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/synth-g.md + id: s1 + - resource: raw/synth-h.md + id: s2 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-19T12:00:00Z +--- +Delta-Operationen respektieren die Gamma-Kopplung (raw/synth-g.md#S-1). +Delta-Operationen verlangen die Gamma-Kopplungs-Pruefung (raw/synth-h.md#S-1). +Gamma-Kopplung: übernommen aus gamma auf Basis von raw/gamma-v1.md#S-1, nicht eigenständig belegt. +EOF +sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md +log_anlage delta "raw/synth-g.md + raw/synth-h.md" +# KEIN git add -A auf wiki/: delta.md + log.md ungetrackt-modifiziert (??-Sicht lebendig). +echo "--- Assertion: die uebernommene Formulierung traegt den §5.5-Kontext-Marker (Muster „übernommen aus auf Basis von , nicht eigenständig belegt“) ---" +grep -qF 'übernommen aus gamma auf Basis von raw/gamma-v1.md#S-1, nicht eigenständig belegt' wiki/delta.md || { echo "HARD-FAIL (AD-4c): Kontext-Marker fehlt oder falsch (Muster §5.10 Pkt. 4 / §5.5-Pkt.-2)" >&2; exit 1; } +grep -qF 'nicht eigenständig belegt' wiki/delta.md || { echo "HARD-FAIL (AD-4c): 'nicht eigenständig belegt'-Klausel fehlt (§5.10 Pkt. 4)" >&2; exit 1; } +echo "--- Assertion: die eigenständig belegten Aussagen tragen KEINEN Kontext-Marker (Marker gilt nur für übernommene Formulierungen, Pkt. 4) ---" +grep -qE '^.*raw/synth-g\.md#S-1\).*übernommen aus' wiki/delta.md && { echo "HARD-FAIL (AD-4c): eigenständig belegte Aussage traegt faelschlich den Kontext-Marker (§5.10 Pkt. 4)" >&2; exit 1; } +echo "--- Assertion: Reflektiertheit + sources-Lexikografie + kein gamma-Duplikat ---" +if grep -nE 'Quelle [A-Z]:|Source [A-Z]:' wiki/delta.md; then + echo "HARD-FAIL (Reflektiertheit): per-Source-Struktur (FR-7 AC-4)" >&2; exit 1 +fi +assert_sources_lex wiki/delta.md +grep -qF ' - resource: raw/gamma-v1.md' wiki/delta.md && { echo "HARD-FAIL (AD-4c): gamma-v1 als eigene sources-Quelle eingetragen — die Quelle des übernommenen Concepts ist nur im Kontext-Marker, nicht als source (AD-4c)" >&2; exit 1; } +echo "--- Probe (erlaubt: delta + index + log) ---"; probe +assert_invariant "delta index log" +assert_frontmatter wiki/delta.md raw/synth-g.md raw/synth-h.md +echo "RESULT: PASS — AD-4c-Uebernahme: Kontext-Marker traegt Concept + Basis-Quelle + 'nicht eigenständig belegt'; gamma bleibt nicht Quellen-Provenienz von delta" + +# ===================================================================== +runlabel "S6: ZWEI-RUN-IDENTITAET (AD-17h/A0-19) — gleicher Git-State + gleiches Eingabeset -> identischer Synthese-Vorgang" +run_synthese() { # $1 = Branchname; mutiert Worktree, dann git add -A (Staging) + isolate "$1" + cat > raw/synth-a.md <<'EOF' +### S-1 +Evidenz a: das Delta-Protokoll kapselt die Zustands-Replikation. +### S-2 +Evidenz a: Delta-Replikatbestaetigungen durchlaufen eine deterministische Quorum-Sequenz. +EOF + cat > raw/synth-b.md <<'EOF' +### S-1 +Evidenz b: Delta-Betrieb setzt einen synchronen Konsens-Dienst voraus. +### S-2 +Evidenz b: das Delta-Protokoll kapselt die Zustands-Replikation. +EOF + git add -A; git commit -qm "Zuwachs: raw/synth-a.md + raw/synth-b.md" + cat > wiki/delta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/synth-a.md + id: s1 + - resource: raw/synth-b.md + id: s2 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-19T12:00:00Z +--- +Das Delta-Protokoll kapselt die Zustands-Replikation (raw/synth-a.md#S-1). +Delta-Replikatbestaetigungen durchlaufen eine deterministische Quorum-Sequenz (raw/synth-a.md#S-2). +Delta-Betrieb setzt einen synchronen Konsens-Dienst voraus (raw/synth-b.md#S-1). +EOF + sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md + log_anlage delta "raw/synth-a.md + raw/synth-b.md" + git add -A # Staging — die Mutationen sind Teil des Runs (Commit-Boundary = Mutations-Boundary) +} +run_synthese s6a +A_DELTA=$(sha256sum wiki/delta.md | cut -d' ' -f1) +A_LOG=$(sha256sum wiki/log.md | cut -d' ' -f1) +A_INDEX=$(sha256sum wiki/index.md | cut -d' ' -f1) +git commit -qm "Run A (Synthese-Neu-Anlage)" +A_DELTA_COM=$(git show HEAD:wiki/delta.md | sha256sum | cut -d' ' -f1) +run_synthese s6b +B_DELTA=$(sha256sum wiki/delta.md | cut -d' ' -f1) +B_LOG=$(sha256sum wiki/log.md | cut -d' ' -f1) +B_INDEX=$(sha256sum wiki/index.md | cut -d' ' -f1) +git commit -qm "Run B (Synthese-Neu-Anlage)" +B_DELTA_COM=$(git show HEAD:wiki/delta.md | sha256sum | cut -d' ' -f1) +echo "Run A (delta.md): $A_DELTA ; Run B (delta.md): $B_DELTA" +echo "Run A (log.md): $A_LOG ; Run B (log.md): $B_LOG" +echo "Run A (index.md): $A_INDEX ; Run B (index.md): $B_INDEX" +echo "Run A commit (delta.md): $A_DELTA_COM ; Run B commit (delta.md): $B_DELTA_COM" +if [ "$A_DELTA" = "$B_DELTA" ] && [ "$A_LOG" = "$B_LOG" ] && [ "$A_INDEX" = "$B_INDEX" ] && [ "$A_DELTA_COM" = "$B_DELTA_COM" ]; then + echo "RESULT: PASS — zwei unabhaengige Synthese-Runs ueber dieselben zwei Quellen -> identisches Ergebnis (AD-17h/A0-19)" +else + echo "HARD-FAIL (Determinismus-Vertrag): Synthese-Run A und Run B weichen ab" >&2 + exit 1 +fi + +# ===================================================================== +runlabel "FW: FORM-WAHL-KLASSIFIKATIONSPROBE (Story-3.3-Defer U2/U7) — gemischte Synthese-Einheit an der §5.9-Abgrenzungs-Reihenfolge Korrigieren -> Praezisieren -> Erweitern -> No-Op" +isolate fw +# Eine Synthese-Einheit mit KORRIGIERENDEM Anteil: ersetzt die bestehende belegte +# Aussage (Netze) als fehlerhaft/ueberholt -> erste zutreffende Form = KORRIGIEREN. +cat > raw/alpha-k1.md <<'EOF' +### S-2 +Evidenz k1 (Korrektur): Alpha kann seit v2 auch isolierte Netze bedienen. +EOF +cat > raw/alpha-k2.md <<'EOF' +### S-2 +Evidenz k2 (staerkt den Korrektur-Befund): die Netzbeschraenkung ist aufgehoben. +EOF +git add -A; git commit -qm "Zuwachs: raw/alpha-k1.md + raw/alpha-k2.md (korrigierende Synthese-Einheit)" +echo "--- Einheit traegt zugleich neuen Beleg (S-1 bleibt) und Ersetzungs-Befund (S-2) ---" +echo "--- Abgrenzungs-Reihenfolge §5.9 Pkt. 2: (1) Ersetzung fehlerhaft/ueberholt -> KORRIGIEREN (erste zutreffende Form; die uebrigen Textgenauigkeits-Rahmen gelten je Teilbestand) ---" +sed -i 's|^Alpha verwendet ausschließlich lokale Netze (raw/alpha-v1.md#S-2)\.|Alpha verwendet ausschließlich lokale Netze (raw/alpha-v1.md#S-2) — überholt durch: Alpha kann seit v2 auch isolierte Netze bedienen (raw/alpha-k1.md#S-2; raw/alpha-k2.md#S-2).|' wiki/alpha.md +add_source wiki/alpha.md raw/alpha-k1.md s2 +add_source wiki/alpha.md raw/alpha-k2.md s3 +bump_at wiki/alpha.md +log_update alpha "raw/alpha-k1.md + raw/alpha-k2.md" +# KEIN git add -A auf wiki/: alpha.md + log.md modifiziert-ungetrackt (Probe +# liest git-diff + porcelain); isolate resettet je Szenario. +echo "--- Assertion: Abloesung mit Ersetzungsbeleg (keine stille Loeschung, AD-16-Default), alter Wortlaut erhalten, Multi-Beleg im Ersatz ---" +grep -qF 'Alpha verwendet ausschließlich lokale Netze (raw/alpha-v1.md#S-2)' wiki/alpha.md || { echo "HARD-FAIL: alter Wortlaut wurde still geloescht (AD-16, Korrigieren-Struktur-Erhaltung)" >&2; exit 1; } +grep -qF 'überholt durch: Alpha kann seit v2 auch isolierte Netze bedienen (raw/alpha-k1.md#S-2; raw/alpha-k2.md#S-2)' wiki/alpha.md || { echo "HARD-FAIL: Ersetzungsbeleg fehlt oder ist kein Multi-Beleg (Form-Wahl-Klassifikation)" >&2; exit 1; } +echo "--- Assertion: Nebenbefund (Aussage 1) bleibt byte-identisch (kein stiller Umbau, Textgenauigkeits-Rahmen) ---" +grep -qF 'Das Alpha-Protokoll definiert eine deterministische Init-Sequenz (raw/alpha-v1.md#S-1).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 1 beim Korrigieren flankierend umgeschrieben" >&2; exit 1; } +echo "--- Assertion: sources >= 2 (beide korrigierende Quellen) + lexikografische Ordnung ---" +grep -qF ' - resource: raw/alpha-k1.md' wiki/alpha.md || { echo "HARD-FAIL: sources-Zuwachs alpha-k1 fehlt" >&2; exit 1; } +grep -qF ' - resource: raw/alpha-k2.md' wiki/alpha.md || { echo "HARD-FAIL: sources-Zuwachs alpha-k2 fehlt" >&2; exit 1; } +assert_sources_lex wiki/alpha.md +echo "--- Probe (erlaubt: alpha + log) ---"; probe +assert_invariant "alpha log" +assert_frontmatter wiki/alpha.md raw/alpha-v1.md raw/alpha-k1.md raw/alpha-k2.md +echo +echo "===== Sandbox abgeschlossen (S1-S6 + N1-N3 + Form-Wahl-Probe) =====" +echo "Sandbox-Root: $ROOT (loeschbar: rm -rf $ROOT)" + diff --git a/_bmad-output/implementation-artifacts/spec-3-4-wissen-aus-mehreren-sources-synthetisieren.md b/_bmad-output/implementation-artifacts/spec-3-4-wissen-aus-mehreren-sources-synthetisieren.md new file mode 100644 index 0000000..25cf689 --- /dev/null +++ b/_bmad-output/implementation-artifacts/spec-3-4-wissen-aus-mehreren-sources-synthetisieren.md @@ -0,0 +1,142 @@ +--- +title: 'Wissen aus mehreren Sources synthetisieren — gemischte claim-granulare Provenienz operationalisieren (Story 3.4)' +type: 'feature' +created: '2026-08-19' +status: 'done' +review_loop_iteration: 0 +baseline_commit: 9b256fa5adc22fceb1e28a07efbf4504e0004878 +context: + - _bmad-output/implementation-artifacts/epic-3-context.md +--- + + + +## Intent + +**Problem:** §5.9 verankert die Update-Formen einzelner Concepts (Story 3.1/3.3), §4 die `sources`-Liste. Unoperativ bleibt die **Synthese-Dimension (FR-7, AD-4, A0-3)**: wie der Producer mehrere Sources zum selben Thema zu **einer** gemeinsamen Wissensrepräsentation mit **gemischter, claim-granularer Provenienz** zusammenführt — statt getrennter Zusammenfassungen (FR-7). Es fehlt eine deterministische Anleitung für (a) die Erkennung einer Synthese-Einheit (≥ 2 belegende `raw/`-Quellen), (b) die Konsolidierung redundanter Aussagen **ohne** Provenienz-Verlust (Multi-Beleg, §5.5), und (c) den reflektierten Wissensstand (keine Aneinanderreihung von Source-Zusammenfassungen, FR-7 AC-4). Der §7-Synthese-Vorbehalt (`:343`) zeigt auf Story 3.4. + +**Approach:** Story 3.4 verankert die Synthese-Mechanik als neue Sektion **§5.10 „Synthese aus mehreren Sources (Story 3.4)"** (nach §5.9, vor §6, Revision 2.9): deterministische Regeln für Synthese-Einheit, gemeinsame Zielrepräsentation (ein Concept-Pfad, `sources`-Liste ≥ 2), claim-granulare gemischte Provenienz mit Multi-Beleg-Konsolidierung (§5.5) und Reflektiertheits-Selbsttest (keine per-Source-Zusammenfassungs-Struktur). Zusätzlich eine **re-executierbare Sandbox** (`sandbox-3-4/run-sandbox.sh`, Muster Story-3.3): demonstriert einen echten Synthese-Run aus 2+ `raw/`-Quellen (Neu-Anlage + Update-Pfad) und assertet die Invarianten hart (sources ≥ 2, Multi-Beleg je konsolidierter Aussage, keine Aneinanderreihung, Erhaltungs-Invariante §5.9-Pkt.-5, Zwei-Run-Identität AD-17h). Nickel die Story-3.3-Defer U2/U7-Empfehlung (Form-Wahl-Klassifikationsprobe) im Sandbox auf. Keine Inhalts-Mutation des realen Bundles (AD-3); kein neues `raw/`-Material; kein Standalone (D-3). + +## Boundaries & Constraints + +**Always:** +- **Instruktions-Story (D-3):** Verankerung ausschließlich in `schema/compiler.md` §5.10 als deterministischer Text. Kein executable, kein Standalone, keine neue §7-Invaliditätsklasse, kein Change an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3). +- **Synthese ist Querschnitt-Dimension, keine fünfte Update-Form:** Die §5.9-Abgrenzungs-Reihenfolge `Korrigieren → Präzisieren → Erweitern → No-Op` (Story 3.3) bleibt die **sole** Form-Wahl; Synthese erweitert die Ausführung um gemischte Provenienz + Konsolidierung (bei Update auf ein bestehendes Concept) bzw. die Neu-Anlage mit Multi-Source-`sources` (bei neuer Einheit). +- **Gemischte claim-granulare Provenienz (AD-4a/4b, A0-3):** jede belegte Aussage des Synthese-Concepts bleibt auf `raw/` zurückführbar; Konsequenz von AD-4c — kein bestehendes Concept ist alleinige Provenienz eines anderen; Übernahmen aus bestehenden Concepts tragen den §5.5-Kontext-Marker („übernommen aus `` auf Basis von ``, nicht eigenständig belegt"). +- **Konsolidierung ohne Provenienz-Verlust (FR-7 AC-3):** redundante Informationen werden zu einer Aussage konsolidiert, die **alle** betroffenen Inline-Belege trägt (Multi-Beleg, §5.5-Serialisierung) — keine stille Beleg-Tilgung (AD-4). +- **Reflektierter Wissensstand (FR-7 AC-4):** keine per-Source-Zusammenfassungs-Blöcke („Quelle A: … / Quelle B: …"-Struktur); der Body trägt integrierte, je Aussage provenance-tags versehene Aussagen — textuell per Selbsttest prüfbar. +- **Determinismus (AD-17h/A0-19):** Ziel-Pfad (via §3.2/§5.7), `sources`-Liste (lexikografisch nach `resource`, LC_ALL=C) und Konsolidierung folgen deterministisch aus der committeten Evidenz; gleicher Git-State + gleiche Eingabemenge → identischer Synthese-Vorgang. `generated.at`-Wanduhr-Gap bleibt offene A0-20-Konvention (Home Story 3.8). +- **Struktur-Erhaltung (FR-6/AC-2, Story 3.3):** die §5.9-Pkt.-2-Struktur-Erhaltungsregeln gelten je berührtem Pfad unverändert (Frontmatter-Subset, keine stille Löschung, §5.6-Pin unverändert, Inline-Verweise gültig soweit Beleg Body-Bestand). +- **Erhaltungs-Invariante (AD-5/FT-6):** der §5.9-Pkt.-5-Diff-Selbsttest gilt für Synthese-Runs unverändert (Pfad-Menge ⊆ Kandidatenliste ∪ Neu-Anlage ∪ `log.md` ∪ Index; keine neue Datei außer echten Ziel-Pfaden). +- `sprint-status.yaml`: Key `3-4-wissen-aus-mehreren-sources-synthetisieren` → **in-progress** (bei Implementierung). + +**Ask First:** Inhalts-Mutation des realen Bundles (Demo per Sandbox) · AD-7d-Renames · §5.6-Linkform-Änderung · Validator-/Vertrags-/`raw/`-Change · Leasing-Ausweitung (3.5/3.6-Scope) · Synthese als fünfte Update-Form (Abgrenzung ändern) · per-Source-Concepts als zulässige Anlageform. + +**Never:** Änderungen an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3) · neue §7-Invaliditätsklasse · Standalone (D-3) · getrennte Zusammenfassungs-Concepts je Quelle (FR-7) · Duplikat-Anlage eines bestehenden Pfads · „Regenerate Everything" (AD-5) · stille Provenienz-Tilgung oder stille Konsolidierung widersprechender Aussagen ohne Ersetzungsbeleg (AD-16) · Embeddings/Vector im Compiler-Kern (AD-13). + +## I/O & Edge-Case Matrix + +| Scenario | Input / State | Expected Output / Behavior | Error Handling | +|----------|--------------|---------------------------|----------------| +| HAPPY_SYNTHESE_NEUANLAGE | Zwei committete `raw/`-Quellen zum selben Thema (neue Einheit, kein Ziel-Pfad belegt) | **Ein** neues Concept (gemeinsame Repräsentation): `sources`-Liste ≥ 2 (je Quelle ein Eintrag, lexikografisch nach `resource`), claim-granulare gemischte Inline-Provenienz je Aussage, §5.5-Form; kein per-Source-Summary | NO_MATCH → §5.9/§3.2-Pfad (keine Synthese-Dimension) | +| HAPPY_SYNTHESE_KONSOLIDIERUNG | Redundante Aussage in beiden Quellen | **Eine** konsolidierte Aussage mit Multi-Beleg auf alle betroffenen Quellen (§5.5-Semikolon-Form) — keine Provenienz-Dropped | Quellen-EC-1 fehlt → Run-FAIL (Validator), keine Mutation | +| HAPPY_SYNTHESE_UPDATE | Synthese-Einheit trifft bestehenden Concept-Pfad | §5.9-Formwahl normal (Erweitern/Präzisieren/Korrigieren), `sources`-Zuwachs um die zweite Quelle, gemischte Belege; Struktur-Erhaltungsregeln gelten | bestehende belegte Aussage als Anker fehlt → Prüfung ob Erweitern | +| NO_OP_SYNTHESE | Evidenz bereits vollständig im Body | No-Op (Nicht-Form): byte-identität, kein Eintrag, kein `at`-Bump | im Zweifel greift eine Form (engere Auslegung No-Op) | +| ANEINANDERREIHUNG_NEGATIV | Struktur „Quelle A: … / Quelle B: …" | **Instruktions-Selbsttest-FAIL** (Reflektiertheits-Kriterium, NFR-7): textuell benannter Befund, vor Run-Abschluss behoben | kein stiller Vorbeilass (NFR-4) | +| STRUKTUR_ERHALT | Synthese-Update greift in Body mit belegten Aussagen | Struktur unverändert (Subset, Verweise, Linkform); kein unbefugter Key | Verstoß → textuell benannt + Rollback (§5.9 Pkt. 5) | +| SYNTHESE_OVERLAP_FORMCROSS | Eine Einheit trägt zugleich neue + schärfende Aussage | §5.9-Abgrenzungs-Reihenfolge wählt die erste zutreffende Form; Textgenauigkeits-Rahmen der übrigen gelten je Teilbestand | — (AD-17h: deterministisch) | + + + +## Code Map + +- `schema/compiler.md` — **primär mutiert** (D-3): + - Neue Sektion **§5.10** (nach §5.9, vor §6): Synthese-Stimulus (≥ 2 belegende Quellen per §2-Interpretation), ein-Ziel-Repräsentation (§5.7-Routing), `sources`-Liste (≥ 2, lexikografisch nach `resource`, LC_ALL=C — deterministisch, AD-17h), gemischte claim-granulare Provenienz (je Aussage Inline-`raw/`-Verweis §5.5; konsolidierte Aussagen mit Multi-Beleg), Reflektiertheits-Selbsttest (keine per-Source-Zusammenfassungs-Struktur; Muster-Termane wie „nicht eigenständig belegt"), Übernahme aus bestehenden Concepts mit §5.5-Kontext-Marker (AD-4c: nie alleinige Provenienz), §5.6-Pin unverändert, `log.md`-Eintragspflicht („Story 3.1-Update" bei Update; Anlage-Eintrag bei neuem Synthese-Concept), Erhaltungs-Invariante (Diff-Probe §5.9 Pkt. 5 gilt), Determinismus-Vertrag. + - §7 (`:343`): Synthese-Vorbehalt **auflösen** („→ §5.10 verankert (Story 3.4)"). + - §8 Revisionslog (`:382`): **Revision 2.9** mit Abschlussklausel. +- `_bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh` — **neu** (re-executierbar, Muster Story-3.3-Sandbox): Mini-Bundle mit 2 `raw/`-Quellen zum selben Thema; Szenarien S1–S6 (Neu-Anlage mit sources ≥ 2 + gemischten Belegen · Konsolidierung mit Multi-Beleg · Negativ-Kontrolle Aneinanderreihung · Synthese-Update auf bestehendem Pfad · Struktur-/Frontmatter-Invariante · Zwei-Run-Identität AD-17h) + **N1** (NO_OP-Synthese: Evidenz bereits im Body → volle Byte-Identität, kein at-Bump, kein sources-Zusatz, kein log-Eintrag) + **Form-Wahl-Klassifikationsprobe** (Story-3.3-Defer U2/U7: überprüft die §5.9-Abgrenzungs-Reihenfolge an einer gemischten Einheit). Harte Pass/Fail-Assertionen (exit 1), Erhaltungs-Invariante, `??`-Sicht, `assert_frontmatter` (Muster Story-3.3). +- `wiki/log.md` — **append** (append-only, Vertrag §5): Story-3.4-Eintrag (Verankerung, Sandbox-Nachweis, Statuswechsel, Validator-Verdikt); bestehende Bullets unverändert. +- `_bmad-output/implementation-artifacts/sprint-status.yaml` — **mutiert**: Key `3-4-…` (`:57`) → `in-progress` (→ `done` bei Story-Abschluss). +- `schema/validator.md`, `schema/wiki-compiler.md`, `raw/…` — **read-only** (AD-3). Keine Concept-Inhalts-Mutation (Demonstration per Sandbox). + +## Tasks & Acceptance + +**Execution:** +- [x] `schema/compiler.md` — §5.10 Synthese-Sektion einfügen (Stimulus, ein-Ziel-Repräsentation, `sources`-Liste, gemischte claim-granulare Provenienz + Multi-Beleg-Konsolidierung, Reflektiertheits-Selbsttest, AD-4c-Marker, §5.6-Pin, log.md, Erhaltungs-Invariante, Determinismus) · §7-Vorbehalt auflösen · §8 Revision 2.9; ohne Change an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/`. +- [x] `sandbox-3-4/run-sandbox.sh` — Synthese-Run-Demonstrator (Neu-Anlage + Update, Konsolidierung, Negativ-Kontrolle Aneinanderreihung, NO_OP-Synthese, Form-Wahl-Probe, Struktur-Invariante, Zwei-Run-Identität); harte Pass/Fail-Assertionen; Exit 0. +- [x] `wiki/log.md` — Story-3.4-Eintrag (append-only): Verankerung, Sandbox-Nachweis, Statuswechsel, per-Datei-Validator-Verdikt. +- [x] `sprint-status.yaml` — Key `3-4-…` → in-progress. + +**Acceptance Criteria:** +- Given mehrere Sources zum selben Thema, when der Run synthetisiert, then entsteht eine gemeinsame Wissensrepräsentation statt mehrerer getrennter Zusammenfassungen (AC-1; FR-7) — §5.10-Stimulus + ein-Ziel-Regel, Sandbox belegt (eine Datei, keine per-Source-Summary). +- Given eine Synthese aus mehreren Sources, when das Ergebnis erzeugt wird, then übernimmt es gemischte, claim-granulare Provenienz der beteiligten Sources (AC-2; AD-4, A0-3) — Inline-Verweise §5.5 je Aussage, Konsolidierung mit Multi-Beleg. +- Given redundante Informationen aus mehreren Sources, when sie synthetisiert werden, then werden sie konsolidiert, ohne Provenienz zu verlieren (AC-3; FR-7) — §5.10-Konsolidierungsregel, Sandbox-S2. +- Given das resultierende Concept, when es geprüft wird, then reflektiert es den erkannten Wissensstand — keine bloße Aneinanderreihung (AC-4; FR-7) — Reflektiertheits-Selbsttest, Negativ-Kontrolle S3. +- Given die Instruktion, when geprüft, then bleiben `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3), keine neue §7-Klasse, kein Standalone (D-3), keine fünfte Update-Form (Abgrenzungs-Reihenfolge §5.9 unverändert), kein Leasing-Scope — Validator auf Ist-Bundle SUCCESS (7/7 unverändert). + +## Spec Change Log + +**Review-Loop-1 (2026-08-19, bmad-code-review, 3 Subagenten — blind-hunter / edge-case-hunter / verification-gap; kein Loopback, `review_loop_iteration` bleibt 0):** Klassifikation — **kein intent_gap, kein bad_spec** (frozen Intent + Approach eingehalten); **patch** (auto-fixiert, siehe unten) + **defer** (4 Einträge → `deferred-work.md` append-only: AD-16/AD-4c-reale-Anwendung-Home-Epic-4, Orphan-Kontrolle-Home-3.8, Umlaut/Em-Dash-Normalisierung-Sandbox-Home-3.8, Frozen-„Nickel"-Typo-Re-Negotiation) + **reject** (noise: diff-Artifakt-Basename, SHA-Reproduzierbarkeit via `$BASE`-ID). **Patches (alle verifiziert):** (1) `schema/compiler.md` §5.10 — Reflektiertheits-Selbsttest-Muster auf Zeilenanfangs-Label erweitert (`^(Quelle|Source) [A-Z][A-Za-z0-9_ -]*:` — mehrbuchstabige/nummerierte Quell-Labels); **Body-Reihenfolge deterministisch** (lexikografisch über Beleg-Anker, LC_ALL=C) + **Konsolidierungs-Kriterium** (Befund-Äquivalenz über dieselbe erkannte Wissenseinheit) explizit; Duplikat-Fall + Orphan-Kontrolle in Pkt. 8; Stil-/Genus-Korrekturen (`sole`→`einzige`, `der Update`→`das Update`, `sources`-Pluspunkt→`sources`-Zuwachs); Sandbox-N2/N3-Nachweise in Pkt. 3/4. (2) **Sandbox `run-sandbox.sh` (jetzt 10 Szenarien S1–S6 + N1–N3 + FW, Exit 0):** `git add -A`-wiki-Staging aus S1/S2/S3/S4/S5/FW entfernt → die Pkt.-8-`??`-Sicht wird **lebendig** geprüft; **S5-Pkt.-8-`??`-Negativkontrolle** neu (ungetrackte Nicht-Ziel-Datei `ghost.md` → Duplikat/Ghost-Diff-HARD-FAIL, nicht vacuous — Story-3.3-U9-Muster); **N1**-Stimulus-Kommentar korrigiert (alpha-v1 = Baseline-Evidenzbasis, nicht Zuwachs); **N2 Disagreement** (AD-16-Default, beide Behauptungen + je Beleg, kein Falsch-Multi-Beleg, `Disagreement:`-log-Eintrag) + **N3 AD-4c-Übernahme-Marker** (Kontext-Marker-Muster, eigenständig belegte Aussagen ohne Marker, übernommene Quelle nicht in `sources`) als neue Szenarien (schließen die Verification-Gap-Kernbefunde „AD-16-Pfad untested"/„AD-4c-Marker untested"); S1/S2-log.md-Assertionen um die **vollständige Multi-Source-Liste** erweitert. (3) `wiki/log.md`: Audit/Sandbox-Zählung auf 10 korrigiert, Scenario-Typo, „zum Audit-Zeitpunkt"-Qualifikation. (4) `sprint-status.yaml last_updated`-Präzision auf `08-19-2026 16:40` fortgeschrieben (HEAD-Format `HH:MM`, siehe Story-3.3-Präzedenzleistung 13:21). (5) `deferred-work.md` — 4 Spec-3.4-Einträge append-only. **Nach-Review-Abschluss (dieser Flip):** Spec `status: 'in-review' → 'done'`; `sprint-status.yaml` Key `3-4-…` `in-progress → done`. + +## Design Notes + +**Warum §5.10, nicht §5.9-erweiterung:** Synthese ist die **Erzeugungs-/Zusammenführungs-Dimension** (mehrere Quellen → eine Repräsentation) — keine der in §5.9 definierten Einzel-Update-Formen. §5.9 bleibt der Update-Pfad für einzelne bestehende Concepts; §5.10 erweitert die Ausführung um gemischte Provenienz + Konsolidierung (Querschnitt) und die Neu-Anlage mit Multi-Source-`sources`. Das spiegelt den §7-Vorbehalt (`:343`) als eigenständiges Thema. + +**Multi-Beleg-Konsolidierung (das Kernstück):** Eine Aussage, die aus mehreren Quellen redundanz-belegt ist, wird zu EINER Aussage konsolidiert, die §5.5-Multi-Beleg trägt (`(raw/a.md#X; raw/b.md#Y)` — Semikolon-Form, voller Pfad je Beleg). Keine Beleg-Tilgung (AD-4). Widersprüche (diskrepanter Inhalt) bleiben gemäß AD-16 erhalten — kein stilles Zusammenführen zu scheinbar eindeutigen Aussagen (NFR-7, FR-8; Epic-4-Interface: Disagreement in `log.md`). + +**Reflektiertheits-Selbsttest (FR-7 AC-4):** textuell prüfbar — der Body enthält keine per-Source-Zusammenfassungs-Sektionen (keine Struktur „Quelle A: … / Quelle B: …"); jede Aussage trägt ihren Provenienz-Tag. Der Selbsttest grep-basiert: keine Zeile, die nur einen Quell-Label abschnittsstrukturiert. + +**`sources`-Reihenfolge:** deterministisch lexikografisch nach `resource` (LC_ALL=C) — unabhängig von Verarbeitungs- oder Datei-Reihenfolge (AD-17h; konsistent zur §3.2-Pkt.-3b-Lexikografie-Ordnung und zur §5.9-Tie-Break-Logik). + +## Verification + +**Commands (re-executierbar, ab Workspace-Root):** +1. `bash _bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh` — expected: alle Szenarien S1–S6 + N1 + Form-Wahl-Probe mit harten Pass/Fail-Assertionen, Erhaltungs-Invariante erzwungen, Exit 0. +2. `grep -n "Synthese aus mehreren Sources\|Revision 2.9" schema/compiler.md` — liefert die Synthese-Sektion + Revisionslog-Eintrag. +3. Read-only (AD-3): `git status --porcelain` zeigt keinen Change an `schema/validator.md`/`schema/wiki-compiler.md`/`raw/`. +4. Validator-Lauf: alle `wiki/`-Dateien SUCCESS (unverändert, keine Inhalts-Mutation). + +**Manual checks:** +- §5.10 trägt Stimulus, ein-Ziel-Regel, `sources`-Liste, gemischte Provenienz, Multi-Beleg-Konsolidierung, Reflektiertheits-Kriterium, AD-4c-Marker, §5.6-Pin, `log.md`-Regel, Erhaltungs-Invariante, Determinismus; §7-Vorbehalt `:343` auf §5.10 aufgelöst; §8-Rev-2.9 mit Abschlussklausel; kein `validator.md`/`wiki-compiler.md`/`raw/`-Diff; kein neuer Standalone (D-3) / keine neue §7-Klasse; §5.9-Abgrenzungs-Reihenfolge unverändert (Synthese = Querschnitt, keine fünfte Form); `wiki/log.md`-Eintrag datiert mit Story-3.4-Semantik + Sandbox-Nachweis + Statuswechsel + Verdikt; `sprint-status.yaml` konsistent. + +## Suggested Review Order + +*(Befüllt nach Review-Abschluss durch step-04. Review-Loop 1 abgeschlossen: kein Loopback, 4 Defers; Status → `done`.)* + +**Synthese-Mechanik (compiler.md §5.10)** + +- Verankerung der Synthese-Dimension — Stimulus, ein-Ziel-Regel, gemischte Provenienz, Reflektiertheit, Erhaltungs-Invariante. + [`compiler.md:290`](../../schema/compiler.md#L290) + +- Pkt. 8 — Determinismus-Vertrag: `??`-Duplikat-Kontrolle, Orphan-Fall, `generated.at`-Gap (Home 3.8). + [`compiler.md:301`](../../schema/compiler.md#L301) + +**§7/§8-Auflösung** + +- Pkt. 3/4 — AD-16-Disagreement (N2) + AD-4c-Übernahme-Marker (N3) als Sandbox-Nachweise verankert. + [`compiler.md:296`](../../schema/compiler.md#L296) + +- Revisionslog 2.9 — Abschlussklausel (AD-3, keine neue §7-Klasse, keine fünfte Update-Form) + Review-Loop-1-Notiz. + [`compiler.md:396`](../../schema/compiler.md#L396) + +**Sandbox-Nachweis (re-executierbar)** + +- 10 Szenarien S1–S6 + N1–N3 + FW, harte Erhaltungs-Invariante je Probe; Export & Pass-Statistik. + [`run-sandbox.sh:226`](sandbox-3-4/run-sandbox.sh#L226) + +- N2 — AD-16-Disagreement (beide Behauptungen + Disagreement-Eintrag); N3 — AD-4c-Marker. + [`run-sandbox.sh:562`](sandbox-3-4/run-sandbox.sh#L562) + +- FW — Form-Wahl-Klassifikationsprobe (Story-3.3-Defer U2/U7) + Zwei-Run-Identität (S6). + [`run-sandbox.sh:740`](sandbox-3-4/run-sandbox.sh#L740) + +**Provenienz & Status** + +- Story-Abschluss + Review-Loop-1-Audit — `done`-Flip, 10/10 PASS, 4 Defers. + [`log.md:4`](../../wiki/log.md#L4) + +- Implementierungs-Nachweis — Revision 2.9-Eintrag, Validator-Verdikt 7/7 SUCCESS. + [`log.md:6`](../../wiki/log.md#L6) + +- Statuskette `in-progress → done` + `last_updated`-Präzision. + [`sprint-status.yaml:57`](sprint-status.yaml#L57) diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 48d72da..65b1710 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -29,7 +29,7 @@ # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) # - Retrospective appends its action items to action_items; the status view surfaces open ones generated: 08-14-2026 00:00 -last_updated: 08-19-2026 13:21 +last_updated: 08-19-2026 16:40 project: wow20 project_key: NOKEY tracking_system: file-system @@ -54,7 +54,7 @@ development_status: 3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: done 3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip: done 3-3-bestehende-concepts-erweitern-präzisieren-korrigieren: done - 3-4-wissen-aus-mehreren-sources-synthetisieren: backlog + 3-4-wissen-aus-mehreren-sources-synthetisieren: done 3-5-leasing-dirty-tree-schutz-für-konkurrierende-producer-umsetz: backlog 3-6-lease-staleness-recovery-basis-absichern: backlog 3-7-reason-mutate-trennung-und-konsistenz-endzustand-sicherstell: backlog diff --git a/schema/compiler.md b/schema/compiler.md index a9d4557..55bb777 100644 --- a/schema/compiler.md +++ b/schema/compiler.md @@ -287,6 +287,19 @@ Diese Sektion ist der **einzige Instruktions-Ort** der Update-Mutationsmechanik - **Pre-Run-Reconcile-Check-Block (Defer P2):** Vor jeder Mutation durchläuft der Producer den gebündelten Vorprüf-Block und hält ihn textuell fest: (1) **Input-Zustand** (AD-17a, I/O-Matrix `INPUT_UNCOMMITTED`; Review-Loop-2-D-3): Working-Copy von `raw/` und `wiki/` gegen HEAD prüfen — bei Abweichung (uncommitteder Zustand) bricht der Run mit dem **textuell benannten Abbruch „published/committed Input erforderlich"** ab, **vor** Interpretation und vor jeder Mutation (keine Mutation gegen Zwischenstände); (2) Ziel-Pfade (Ausgangs-Kandidatenliste, §3 Pkt. 2); (3) Quellen-Existenz (EC-1 via Validator-Punkt: jede referenzierte `raw/`-Datei existiert als Datei); (4) Betroffenheits-Kandidatenliste (§3 Pkt. 2, textuell-deterministisch); (5) `wiki/index.md`-V-1-Vorbedingung (fehlende Bundleroot → Run-FAIL, §3 Pkt. 3, Vertrag §2); (6) **Struktur-Erhaltungs-Check (Story-3.3-Ergänzung als zusätzliches textuelles Element):** vor dem Commit prüft der Producer an den betroffenen Concept-Pfaden, dass keinerlei unbefugte Keys im Frontmatter entstanden sind (Vertrag §3.3/§3.4-Subset, §6.5-Kriterium-1), **keine stille Löschung** bestehender belegter Aussagen/Provenienz erfolgt ist (AD-16, Pkt. 2 „Korrigieren"-Form) und **keine Links** verändert oder ohne echte Beziehung neu gesetzt wurden (§5.6-Pin, Pkt. 3); Verstöße sind textuell benannt (NFR-4) und vor dem Commit zu beheben; die Kandidatenliste bleibt **die** Liste gegen die der Diff-Selbsttest (Pkt. 5) prüft (keine zweite Erhebung nach der Mutation). Dieser Block ist der in `deferred-work.md` als P2 notierte Pre-Plan-Schritt und wird durch Story 3.1 als Teil des inkrementellen Runs ausgeführt. **Zeitpunkt (Review-Loop-2-Präzisierung):** der Block wird **nach Reconcile (2) und vor Mutieren (4)**, am **Anfang der Mutationsphase**, einmal pro Run durchgeführt — die Kandidatenliste (Elemente 2/4) existiert zu diesem Zeitpunkt bereits; die **Diff-Probe (Pkt. 5) läuft am Ende desselben Blocks, nach den Mutationen, vor dem Commit**. 7. **Worked Example (an die reale Ist-Lage gebunden, re-executiert; Review-Loop-2-Korrektur):** Ein Run mit neuer committeter Evidenz `raw/epics/epics-2026-08-14.md#FR-12` (Zuwachs über die bisher verarbeitete Stelle hinaus; die Kennung FR-12 existiert real in der Datei) trifft über `rg -l 'FR-12' -g '!log.md' wiki/` das bestehende Root-Concept `wiki/knowledge-kompilation-inkrementell.md` (Term-/Konzept-Überschneidung — re-executierter Befund: der Grep-Ausgabe-Pfad ist `knowledge-kompilation-inkrementell`, `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a; das Rev-2.4.1-Beispiel `wissensarchitektur/source-material.md` enthielt den Term **nicht** und ist damit korrigiert). Der Run aktualisiert diesen Pfad (Body-Erweiterung mit neuem §5.5-Inline-Beleg `(raw/epics/epics-2026-08-14.md#FR-12)`, `sources`-Ergänzung um diesen `resource` — sofern nicht bereits deklariert, sonst No-Op gemäß Pkt. 2, `generated.at` = aktueller Run-Zeitstempel, `log.md`-Eintrag „Story 3.1-Update"). Die Diff-Probe (Pkt. 5, ``-Form) zeigt ausschließlich `log` und `knowledge-kompilation-inkrementell` (betroffen, normalisiert) — kein Ghost-Diff, keine `index.md` im Diff (der Index-Link bleibt unverändert). +## 5.10 Synthese aus mehreren Sources (Story 3.4) + +Diese Sektion ist der **Instruktions-Ort der Synthese-Dimension** (AD-4, FR-7): wie der Producer mehrere `raw/`-Quellen desselben Themas zu **einer** gemeinsamen Wissensrepräsentation mit **gemischter, claim-granularer Provenienz** zusammenführt — statt getrennter Zusammenfassungen je Quelle (FR-7). Sie ist eine weitere Spezifikations-Ebene der Mutationsphase §5 (nach §5.9, vor §6), geschlossen auf dem §7-Vorbehalt (Story 3.4). Sie fügt **kein** Prädikat, **keine** neue §7-Invaliditätsklasse, **keinen** `schema/wiki-compiler.md`-/`schema/validator.md`-/`raw/`-Change hinzu (AD-3) und **keinen** Standalone (D-3). Synthese ist eine **Querschnitt-Dimension, keine fünfte Update-Form**: die §5.9-Abgrenzungs-Reihenfolge `Korrigieren → Präzisieren → Erweitern → No-Op` bleibt die **einzige** Form-Wahl (§5.9 Pkt. 2); Synthese erweitert die Ausführung um gemischte Provenienz + Konsolidierung (bei Update auf ein bestehendes Concept) bzw. um die Neu-Anlage mit Multi-Source-`sources` (bei neuer Einheit). Eine Synthese ist ein Compilation-Vorgang wie die Anlage/das Update: sie unterliegt denselben Phasen (§0: Interpretieren → Reconcile → Synthetisieren → Mutieren → Validieren), derselben Commit-Boundary = Mutations-Boundary (AD-17f, §0/§5.3) und derselben Validator-Erfolgsbedingung (§6). + +1. **Synthese-Stimulus (Input der Synthese-Dimension):** Der Stimulus ist eine **Synthese-Einheit**: mindestens **zwei belegende `raw/`-Quellen** (§2-Interpretation) zum **selben Thema** (dieselbe erkannte Wissenseinheit, dieselbe Semantik — gemessen über Term-/Konzept-Überschneidung nach §3.2 bzw. die §2-Pkt.-2-Mehrquellen-Regel: eine Wissenseinheit kann aus mehreren Abschnitten/Dokumenten stammen). Deterministische Erkennung: die neue committete Evidenz (§1 Pkt. 1, AD-17a) enthält ≥ 2 `raw/`-Dateien, deren abgegrenzte Einheiten auf **dieselbe** Zielrepräsentation auflösen. Eine einzelne Quelle bleibt auf dem §5.9-/§3.2-Pfad (Anlage mit `sources`-Zuwachs bzw. Update) — **keine** Synthese-Dimension. Der Stimulus verarbeitet ausschließlich **published/committed** Input (R-1-Change-Detection, §5.9 Pkt. 6). +2. **Ein-Ziel-Repräsentation (gemeinsame Wissensrepräsentation, FR-7 AC-1):** Mehrere Quellen zum selben Thema erzeugen **ein einziges** Synthese-Concept über **einen** Ziel-Pfad (§5.7-Routing; bei neuem Thema über §5.1/§5.7-Neu-Anlage, bei bestehendem Pfad über das §5.9-Update). **Getrennte Zusammenfassungs-Concepts je Quelle sind verboten** (FR-7) — es entsteht nie eine per-Source-Concept-Menge. Die `sources`-Liste des Synthese-Concepts trägt **≥ 2 Einträge** (je belegende Quelle ein Eintrag), **deterministisch lexikografisch nach `resource` sortiert (LC_ALL=C)** — unabhängig von Verarbeitungs- oder Datei-Reihenfolge (AD-17h/A0-19; konsistent zur §3.2-Pkt.-3b-Lexikografie-Ordnung und zur §5.9-Tie-Break-Logik). Bei Update auf ein bestehendes Concept wächst `sources` um die zweite/weitere Quelle (Frontmatter-Regel §5.9 Pkt. 2 „`sources` nur um echte neue Belege ergänzen"; bestehende Einträge bleiben unverändert). +3. **Gemischte claim-granulare Provenienz (AD-4a/4b, A0-3):** Jede belegte Aussage des Synthese-Concepts bleibt auf `raw/` zurückführbar — der Body trägt **je Aussage einen Inline-`raw/`-Verweis in §5.5-Form** (`(raw/#)` bzw. Komma-Form; voller Pfad je Beleg). **Konsolidierung ohne Provenienz-Verlust (FR-7 AC-3, AD-4):** redundante Informationen aus mehreren Quellen — dieselbe Aussage, von mehreren Quellen unabhängig belegt — werden zu **einer** Aussage konsolidiert, die **alle** betroffenen Belege trägt (**Multi-Beleg**, §5.5-Pkt.-1-Semikolon-Form: `(raw/a.md#X; raw/b.md#Y)` — voller Pfad je Beleg). **Keine stille Beleg-Tilgung** (AD-4): eine konsolidierte Aussage listet jeden ursprünglichen Beleg. **AD-16-Default:** widersprüchliche Aussagen (diskrepanter Inhalt) werden **nicht** still zu scheinbar eindeutigen Aussagen zusammengeführt, sondern bleiben Bestand und werden als Disagreement in `log.md` explizit abgelegt (Pkt. 7; Epic-4-Interface, Story 4.1 — keine Korrektur-Klassifikation hier vorweggenommen; Sandbox-Szenario N2 demonstriert beide Behauptungen + Disagreement-Eintrag). **Body-Reihenfolge deterministisch (AD-17h/A0-19):** die Positionierung der konsolidierten Aussagen im Body folgt der **lexikografischen Ordnung (LC_ALL=C) ihrer Beleg-Anker** (`raw/#`, voller Pfad), nicht einer Verarbeitungs- oder Datei-Reihenfolge — gleicher Git-State + gleiche Eingabemenge ⇒ identische Aussagen-Reihenfolge. Das Konsolidierungs-Erkennungs-Kriterium („dieselbe Aussage") ist die sachlich äquivalente inhaltliche Formulierung über **dieselbe erkannte Wissenseinheit** (Befund-Äquivalenz, nicht Wort-Identität; abgegrenzt über §2-Interpretation/dieselbe Semantik) — sie ist pro Befund eindeutig aus dem Quell-Text der Einheit begründbar. +4. **Übernahme aus bestehenden Concepts (AD-4c — nie alleinige Provenienz):** Übernimmt das Synthese-Concept Formulierungen aus bestehenden Concepts (Kontext-/Synthese-Umformulierung, nicht eigenständig gegen `raw/` belegt), trägt die übernommene Aussage den **§5.5-Kontext-Marker** (Pkt. 2, Muster „übernommen aus `` auf Basis von ``, nicht eigenständig belegt") — **kein bestehendes Concept ist alleinige Provenienz eines anderen**. Die Quelle des übernommenen Concepts bleibt damit textuell rückverfolgbar; die Direktübernahme aus `raw/` (ohne Zwischen-Concept) verwendet das Muster „übernommen aus `` (rohe Quelle), nicht eigenständig belegt". **Sandbox-Szenario N3** demonstriert den Kontext-Marker („übernommen aus `gamma` auf Basis von `raw/gamma-v1.md#S-1`, nicht eigenständig belegt") und prüft, dass die Quelle des übernommenen Concepts **nicht** als eigene `sources`-Quelle eingetragen wird (AD-4c). +5. **Reflektierter Wissensstand (FR-7 AC-4, NFR-7):** Der Body trägt **integrierte, je Aussage provenance-tags versehene Aussagen** — **keine per-Source-Zusammenfassungs-Struktur** (keine Blöcke „Quelle A: … / Quelle B: …"). **Reflektiertheits-Selbsttest (textuell deterministisch, grepbasiert):** es existiert **keine** Zeile, die einen Quell-Label abschnittsstrukturiert — das Muster ist ein Zeilenanfangs-Label „`Quelle