Files
wow20/_bmad-output/implementation-artifacts/spec-3-8-determinismus-vertrag-ad-17h-als-agent-instruktions-validato.md
T
Michael TamseandClaude 2f079ee3c8 feat: Story 3.8 Review-Loop-3-Abschluss (bmad-code-review Re-Run, 4 Layer; kein Loopback)
Triage: 4 decision-needed / 13 patch / 6 defer / 7 dismissed (u. a. Blind-Hunter
"alle Sandbox-SRO-Anker stale" widerlegt — alle 6 exakt vor den Loop-3-Edits).
Entscheidungen D-1..D-4 (alle Option 1): D-1 Schliessungs-Bullet macht den
"Bekannte Determinismus-Luecke"-Alt-Bullet superseded (append-only-Hinweis,
kein Umbruch); D-2 Story-Status-Flip auf done (Change-Proposal-Sequenzierung
betrafft das Epic-3-Abnahmegate 3.13, nicht die 3.8-Verankerung); D-3
autorisierte Neu-Verhandlung in geringfuegischem Umfang (Typo
"documenthuman" -> "document-human", Spec Re-Open-Delta-Zeile); D-4
Hold-Home = Story 3.10 (Epic 3), Korrektur-/Erweiterungs-Klassifikation =
Epic-4-Interface/Story 4.1 (S5.10 Pkt. 8 praezisiert).
Patches P-1..P-13: SRO-/Code-Map-Anker auf IST-Zeilen (compiler.md
375/376/377/477, Code Map 365-377/424ff/445/477, Sandbox 245/265/442/275/447/531);
symmetrische Term-/Body-Normalisierung (S3.2 Pkt. 2a + match_stufe_a, kein
host-abhaengiges -i); Receipt-Hashvergleich als re-executierbare
Zwei-Run-Formel (S5.14 Pkt. 2); Sandbox-Fresh-Kontext-Restluecke benannt
(mechanisch simuliert; Nachweis = 3.13-Abnahmegate); Manifest generated_by
wird konsumiert; at-Ausnahme hart assertiert (Wiederholungs-Schleife bei
Sekundenkollision, HARD-FAIL statt stiller PASS); "voellig pinbar"/"keine
offene Frage" ge scopet (Umlaut-Defer + 3.9-ACs bewusst offen); epics.md
AC-2 AD-16-Kopplung nachgefuehrt; review_loop_iteration 0 -> 2;
epic-3-context.md 3.9/3.11/3.12-Entscheidungen als Zielzustand markiert;
AD-17-Enum verifiziert (kein Edit noetig); Review-Loop-3-Change-Log-Eintrag.
Sandbox re-executiert: DET-1..DET-8 harte PASS, Exit 0; at-Ausnahme aktiv
(assertiert, real unterschiedliche Wanduhr-at-Werte); Witness nicht-vakuum.
Spec status: done, review_loop_iteration: 2; sprint-status 3-8 -> done
(Sequenzierungs-Hinweis: 3.9-3.12-Verankerungen + 3.13-Abnahme bleiben offen);
wiki/log.md Loop-3-Abschluss-Bullet; deferred-work.md 6 neue Defers.
AD-3 gewahrt: validator.md/wiki-compiler.md/adapters/raw/ unveraendert.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-20 19:12:40 +02:00

55 KiB
Raw Blame History

title, type, created, status, baseline_commit, review_loop_iteration, course_correction, context
title type created status baseline_commit review_loop_iteration course_correction context
Story 3.8 — Determinismus-Vertrag (AD-17h) als Agent-Instruktions-Validator umsetzen feature 2026-08-20 done c4cdf4b93e 2 _bmad-output/planning-artifacts/sprint-change-proposal-2026-08-20.md
_bmad-output/implementation-artifacts/epic-3-context.md

Re-Open-Delta (Story-3.8-Neu-Verhandlung, 2026-08-20)

Neu verhandelt durch genehmigtes Sprint-Change-Proposal_bmad-output/planning-artifacts/sprint-change-proposal-2026-08-20.md (Status: approved; approved_by: ProMods; explizite Chat-Freigabe). Der Plan korrigiert die zyklische Behauptung, Story 3.8 sei abgeschlossen, während Epic 3 seine zugesagten Verträge noch nicht als kohärentes System-Inkrement belegt. Story 3.8 wurde daher aus review nach in-progress zurückgenommen und mit erweitertem Scope wieder eröffnet (Epics-Datei ACs Z. 357370):

  1. Getrennte Worktrees + frische Agent-Kontexte (Q-6/A0-19): „zwei frische Agent-Kontexte in getrennt aufgebauten Worktrees; eine zweite Ausführung in derselben Session genügt nicht".
  2. Kanonisches Eingabemanifest: hält Baseline-Commit, geordnete Source-Eingaben und jeden im Bundle sichtbaren Run-/Zeit-/Identitätswert explizit fest.
  3. Run-Receipt außerhalb des Knowledge Bundle: Candidate-Liste, Reihenfolge, Plan, Entscheidungen und Output-Hashes.
  4. Keine Hartcodes, kein pauschales Maskieren: weder erwartete Pläne noch Concept-Bodies werden im Test hart codiert; verified-Ereignisse werden niemals pauschal aus dem Vergleich maskiert.

Dieser Frozen-Intent wurde nur in dem Umfang geändert, den dieses Re-Open-Delta verlangt (document-human respektierend [Tippfehler-Korrektur Review-Loop-3, D-3 — autorisierte Neu-Verhandlung, dokumentiert im Spec Change Log]; Appendix: fehlendes </frozen-after-approval>-Schließtag nach dem Spec Change Log ergänzt). Die ACs in _bmad-output/planning-artifacts/epics.md (Z. 357370) sind die verbindliche Neu-Verhandlung; abweichende Alt-Formulierungen (namentlich „in einer Session") sind auf den Re-Open-Stand korrigiert.

Intent

Problem: AD-17h/FT-10/A0-19 verlangen: Über denselben Git-State + dasselbe Eingabeset erzeugen zwei unabhängige Runs denselben Bundle-State; eine Abweichung ist ein Fehler der AD-16-Klassifikation, kein Rauschen. Das Enforcement lebt im MVP (D-3, Q-6) als Agent-Instruktions-Validator und muss mechanisch bestätigt sein, bevor es tragend wird. Der Ist-Zustand der Instruktion verankert den Vertrag zwar an vielen Stellen (AD-17h-Rückverweise in §3.2/§5.9/§5.10/§5.11/§5.12/§5.13), aber es fehlt die geschlossene, aus dem committeten Git-State ableitbare Bestätigungs-Mechanik: Es gibt keinen normativen Ort, der definiert, (a) was genau der „Bundle-State" ist, (b) wie die Zwei-Run-Bestätigung mechanisch abläuft, (c) welche Ausnahmen vom byte-identischen Vergleich gelten (namentlich der dokumentierte generated.at-Wanduhr-Gap, A0-20) und (d) wie eine festgestellte Abweichung klassifiziert wird (AD-16-Klassifikationsfehler). Mehrere bekannte Lücken sind hierher gewandert (Em-Dash-Normalisierung, Kollaps-Reichweite, Match-Scope, at-Gap, Orphan-Politik, Misch-Run-Coverage).

Approach: Neue Sektion §5.14 „Determinismus-Vertrag & Agent-Instruktions-Validator (Story 3.8)" (nach §5.13, vor §6): definiert (1) den Bundle-State als deterministische Projektion des committeten Git-States (vergleichbare Zustandsmenge, at-Feld als benannte Ausnahme), (2) die Zwei-Run-Bestätigungs-Mechanik als textuell festgehaltenes, re-executierbares Prüfverfahren — im Re-Open-Stand in zwei getrennten, sauberen Worktrees mit frischen Agent-Kontexten (Q-6/A0-19; eine zweite Ausführung in derselben Session genügt nicht); Vergleichs-Operandum = committeter Baum; identische Plan-/Kandidaten-/Reihenfolge-Outputs; kein neuer Prozess/Server/MCP, D-3 — unter einem kanonischen Eingabemanifest (Baseline-Commit, geordnete Source-Eingaben, output-sichtbare Run-/Zeit-/Identitätswerte) und mit einem Run-Receipt (Candidate-Liste, Reihenfolge, Plan, Entscheidungen, Output-Hashes) außerhalb des Knowledge Bundle; (3) die Ausnahme-Menge des Bundle-State-Vergleichs (der generated.at-Wanduhr-Gap als dokumentierte A0-20-Konvention; sonst byte-identisch) und (4) die Abweichungs-Klassifikation (jede Abweichung außerhalb der Ausnahme = AD-16-Klassifikationsdefekt, textuell benannt, NFR-4). Die Zwei-Run-Bestätigung wird als Sandbox-Szenario mechanisch demonstriert (zwei Worktrees, zwei unabhängige Läufe); weder Pläne noch Concept-Bodies werden im Test hart codiert, verified-Ereignisse werden niemals pauschal aus dem Vergleich maskiert (nur die benannte at-Ausnahme). Die bekannten Lücken (Em-Dash, Kollaps-Reichweite, Match-Scope, Orphan) werden als geschlossene, deterministische Regeln in die Instruktion gehoben — keine offenen Fragen verbleiben, die die Zwei-Run-Identität gefährden.

Boundaries & Constraints

Always:

  • Nur schema/compiler.md (neue §5.14 + §7-Auflösung des Determinismus-Vorbehalts + §8 Revisionslog Revision 3.3 + gegebenenfalls Kollaps-/Match-Scope-/Orphan-Präzisierungen in §3.2/§5.10) mutiert (D-3). schema/validator.md, schema/wiki-compiler.md, adapters/, raw/ read-only (AD-3). Kein Standalone (D-3), keine eigene Workflow-Engine/kein neuer Prozess/Server/MCP (AD-6, AD-11). Keine neue §7-Invaliditätsklasse, kein Vertrags-Change, kein neuer Prädikat-/Format-/Frontmatter-Key.
  • Deterministisch aus dem committeten Git-State ableitbar (AD-17h/A0-19): Bundle-State-Vergleich, Zwei-Run-Bestätigungs-Mechanik, Ausnahme-Menge, Abweichungs-Klassifikation. Keine Wanduhr/now-Steuerung der Bestätigungs-Mechanik.
  • Der generated.at-Wanduhr-Gap bleibt als dokumentierte Ausnahme bestehen (A0-20-Konvention, §5.9 Pkt. 2, §5.10 Pkt. 8, unverändert bindend bis Ask-First-Wechsel). §5.14 definiert die Behandlung von at im Bundle-State-Vergleich (Ausnahmemenge), ändert aber nicht das generated.at-Verhalten selbst.
  • Bei einer Abweichung zweier Runs: die Abweichung ist ein AD-16-Klassifikationsfehler (kein akzeptables Rauschen, FT-10/AD-17h-AC); die textuelle Benennung (NFR-4) ist verpflichtend.
  • Die normalisierenden Lücken-Schließungen (Em-Dash in der Kollaps-Klasse, Kollaps-Reichweite bei Läufen/führenden/trailenden Separatoren, Wortgrenzen-/Frontmatter-Scope der Stufe-a-Erhebung) werden als deterministische Regel-Ergänzungen in §3.2 umgesetzt — append-only/kein Umbruch des bestehenden §3.2-Wortlauts; die Orphan-Politik (§5.10 Pkt. 8) wird zu einer deterministischen Reconcile-Orphan-Regel präzisiert.
  • Die Bestätigung ist agent-instruction-basiert (D-3, Q-6): zwei frische Agent-Kontexte in getrennt aufgebauten (sauberen) Worktrees führen die Instruktion jeweils einmal aus und belegen die Zwei-Run-Identität (Q-6, A0-19) — eine zweite Ausführung in derselben Session genügt nicht; kein dedizierter Validator-Prozess, keine extra Runtime.

Ask First:

  • Änderung des generated.at-Verhaltens selbst (z. B. Ableitung at aus dem Git-State statt Wanduhr) — §5.14 definiert nur seine Behandlung im Vergleich, der Konventionswechsel wäre Ask-First.
  • Einführung einer eigenständigen, ausführbaren Validator-Datei (separates Skript/Programm außerhalb der Instruktion als Enforcer) statt der textuellen Agent-Instruktions-Disziplin — wäre ein Realisierungswechsel weg vom D-3/Q-6-Modell.
  • Kollaps-Reichweite bei Läufen/führenden/trailenden Separatoren anders zu definieren als „Kollaps auf genau ein - + Trim" (z. B. Doppel-Bindestrich-Erhaltung) — jede andere Wahl bricht bestehende Sandbox-Erwartungen.
  • Umbenennung/Neudefinition der vorhandenen §3.2-Erhebungsstufen (a/b/c) oder deren Reihenfolge.

Never:

  • raw/-Inhalte verändern (AD-3); uncommittete fremde wiki/-Änderungen löschen (AD-17e); textueller Auto-Merge bei Branch-Konvergenz (AD-17c); Wanduhr/now-Zeitstempel als Bestätigungs-Steuergröße; eigener # Log-Stand in der Registry; Standalone-Compiler/eigene LLM-Runtime (D-3, AD-11); Änderung an schema/validator.md/schema/wiki-compiler.md/adapters/; neuer Frontmatter-Key; neue §7-Invaliditätsklasse; neuer Prädikat-/Format-Key; eigene Workflow-Engine; neuer dedizierter Prozess/Server/MCP als Enforcer.

I/O & Edge-Case Matrix

Scenario Input / State Expected Output / Behavior Error Handling
BUNDLE_STATE_DEFINITION gleicher committeter Git-State + gleiche Eingabemenge Bundle-State definiert als deterministische Projektion: Datei-Gesamtheit unter wiki//raw/ gg. Baseline, Plan-/Kandidaten-/Reihenfolge-Outputs; generated.at als benannte Ausnahme textuell begründet (NFR-4), keine Lücke
ZWEI_RUN_IDENTISCH zwei unabhängige Runs, gleicher Git-State + Eingabeset identische Bundle-States bis auf benannte at-Ausnahme; Sandbox-Assertion nicht-vakuum (echte Content-Identität) PASS; bei Abweichung außerhalb Ausnahme: AD-16-Klassifikationsdefekt
ZWEI_RUN_ABWEICHUNG zwei Runs, gleicher State, verschiedene Ausgabe Abweichung = Fehler der AD-16-Klassifikation (kein Rauschen); textuell benannt, Run korrigiert/rollt zurück NFR-4-Benennung; AD-17h-AC
AT_GAP_AUSNAHME zwei unabhängige Runs, gleicher Input generated.at darf abweichen (A0-20-Konvention, §5.9 Pkt. 2) — einzige benannte Ausnahme im Bundle-State-Vergleich; übrige Teile byte-identisch dokumentiert (kein stiller Ausschluss)
NORMALISIERUNG_EM_DASH Term mit Em-Dash Em-Dash in die Kollaps-Klasse aufgenommen ([-–— _]-); identische canonische Form wie En-Dash/Bindestrich/Unterstrich/Leerzeichen deterministisch, kein stiller Ausschluss
NORMALISIERUNG_KOLLAPS Term mit Läufen/führenden/trailenden Separatoren Kollaps-Reichweite definiert: Kollaps auf genau ein - + Trim (führende/trailende entfernt), Läufe auf ein - deterministisch, glaubhaft re-executierbar
MATCH_SCOPE_STUFE_A Stufe-a-grep-Treffer mit/ohne Wortgrenze, Frontmatter-Treffer Match-Semantik fixiert: ganzes Wort (Wortgrenzen), Frontmatter exkludiert (nur Body) deterministisch, keine falschen Kandidaten
ORPHAN_POLITIK neu committete raw/-Evidenz ohne Ziel-Pfad-Treffer Orphan bleibt unzugeordnet, wird in log.md als verwaist protokolliert, kein Banner, keine stille Vorbearbeitung deterministische Reconcile-Orphan-Regel (AD-16-Default)

Code Map

  • schema/compiler.mdprimär mutiert (D-3): neue Sektion §5.14 „Determinismus-Vertrag & Agent-Instruktions-Validator (Story 3.8)" (nach §5.13, vor §6; Fixierung: §5.13-Ende Z. 362, §6-Start Z. 364 — neue Sektion zwischen beide, §5.14 Z. 365377); §0-Phasen-Listentext unverändert; §5.13 Pkt. 7 „Home Story 3.8" — wird auf §5.14-Anker umgehängt (die generated.at-Gap-Ausnahme ist jetzt in §5.14 definiert statt nur deklariert; Home-Verweis bleibt, wird aber auf die §5.14-Definition verlagert); §3.2 Normalisierungs-Lücken (Em-Dash in Kollaps-Klasse Z. 51; Kollaps-Reichweite; Match-Scope Z. 55) — als Regel-Ergänzungen aufgelöst; §5.10 Pkt. 8 Orphan-Politik Z. 301 — zur deterministischen Reconcile-Orphan-Regel präzisiert; §7 (Z. 424ff.) Determinismus-Vorbehalt „Em-Dash-Lücke an Story 3.8 übergeben" — aufgelöst, Verankerung in §5.14 benannt; §8-Normreferenz AD-17h (Z. 445) auf §5.14-Anker angehoben (mit der at-Ausnahme-Nennung); Revisionslog-Eintrag Revision 3.3 nach Z. 477. Anker (IST-Zeilen nach Review-Loop-3, 2026-08-20; P-1): §5.14-Sektion Z. 365 (Pkt. 15 = 369/370/375/376/377); §7-Determinismus-Bullet Z. 434; §8-AD-17h Z. 445; Revisionslog Revision 3.3 Z. 477.
  • wiki/log.mdappend (append-only, Vertrag §5): Story-3.8-Eintrag (Verankerung, Sandbox-Nachweis, Statuswechsel, Validator-Verdikt); bestehende Bullets unverändert.
  • _bmad-output/implementation-artifacts/sandbox-3-8/run-sandbox.shneu (re-executierbar, Muster sandbox-3-7, Exit 0): Szenarien DET-1..DET-8 (s. Design Notes), harte Pass/Fail-Assertionen, Zwei-Run-Identität nicht-vakuum, keine Berührung des realen Ist-Baums.
  • _bmad-output/implementation-artifacts/sprint-status.yamlmutiert: 3-8-determinismus-vertrag-ad-17h-als-agent-instruktions-validato backlogin-progress (Implementierungs-Flip) → review (Review-Start-Flip, Step-04; finaler done-Flip im Step-05); last_updated (Format MM-DD-YYYY HH:MM, HEAD-Präzision).
  • _bmad-output/implementation-artifacts/deferred-work.mdappend (append-only): ggf. Story-3.8-Defers; die bestehenden „Home: Story 3.8"-Einträge werden aufgegriffen/geschlossen — nicht als Nur-Read-markiert, sondern als aufgehobene Homes gekennzeichnet (Status-Eintragung). Stand: mehrere determinismus-bezogene Defer-Homes (Em-Dash, Kollaps, Match-Scope, Orphan, at-Gap, Misch-Run-Coverage) werden in §5.14/§3.2/§5.10 geschlossen; verbleibende Homes (falls nicht schließbar) bleiben offen mit verbleibendem Ziel.
  • _bmad-output/implementation-artifacts/epic-3-context.md, spec-3-7-…mdread-only (continue-context; Kette unverändert).

Read-only evidence (AD-3): schema/validator.md, schema/wiki-compiler.md, adapters/, raw/ (inkl. raw/architecture-spine/…md AD-17h/Q-6/FT-10/D-3, raw/epics/epics-2026-08-14.md A0-19/A0-20 — normativer Rückbezug, keine Mutation). schema/canonical-terms.md bleibt append-only-Registry (keine Änderung an Bestandseinträgen; die Em-Dash-/Kollaps-Schließung lebt als Regel in compiler.md §3.2, nicht als Registry-Edits — §3.2-Pkt.-1b-Kollaps-Klasse ist die zentrale Normalisierungsregel).

Tasks & Acceptance

Execution:

  • schema/compiler.md — §5.14 einfügen (nach §5.13, vor §6): Bundle-State-Definition, Zwei-Run-Bestätigungs-Mechanik (agent-Instruktions-basiert, D-3/Q-6, re-executierbare Formeln), at-Ausnahme-Menge, Abweichungs-Klassifikation als AD-16-Klassifikationsdefekt; §0/§5.13/§6 Wortlaut-unverändert referenzieren; kein neuer Prädikat-/Format-/Frontmatter-Key
  • schema/compiler.md — §3.2-Normalisierungs-Lücken schließen (Em-Dash-Klasse, Kollaps-Reichweite, Match-Scope der Stufe a) — als deterministische Regel-Ergänzungen ohne Umbruch des bestehenden §3.2-Wortlauts; Orphan-Politik §5.10 Pkt. 8 zur deterministischen Reconcile-Orphan-Regel präzisieren
  • schema/compiler.md — Revision 3.3 in §8 belegen (AD-17h auf §5.14-Anker, at-Ausnahme-Nennung, Abschlussklausel); §7-Determinismus-Vorbehalt auflösen (Verankerung in §5.14)
  • _bmad-output/implementation-artifacts/sandbox-3-8/run-sandbox.sh — Szenarien DET-1..DET-8 (Bundle-State-Definition, Zwei-Run-identisch nicht-vakuum, Zwei-Run-Abweichung klassifiziert, at-Gap-Ausnahme, Em-Dash-, Kollaps-, Match-Scope-, Orphan-Szenario), Exit 0
  • _bmad-output/implementation-artifacts/sprint-status.yaml — Key 3-8-…in-progress (Implementierung) → review (Review-Start); _bmad-output/implementation-artifacts/deferred-work.md — Story-3.8-Defers bzw. aufgegriffene/geschlossene „Home: Story 3.8"-Einträge kennzeichnen
  • wiki/log.md — (Implementierung) Story-3.8-Eintrag, sprint-status.yaml → in-progress (Implementierung) bzw. review (Review-Start, Step-04); Review-Abschluss done im Review-Schritt (Workflow-Konvention)
  • schema/compiler.md §5.14 — Re-Open-Delta: Zwei-Run-Bestätigung auf zwei getrennte saubere Worktrees + frische Agent-Kontexte umgestellt (Q-6/A0-19; „in einer Session" ersetzt); kanonisches Eingabemanifest (Baseline-Commit, geordnete Sources, output-sichtbare Run-/Zeit-/Identitätswerte) und Run-Receipt (Candidates, Reihenfolge, Plan, Entscheidungen, Output-Hashes) außerhalb des Bundles eingefordert; Verbot von hart codierten erwarteten Plänen/Concept-Bodies und pauschaler verified-Maskierung (nur benannte at-Ausnahme)
  • _bmad-output/implementation-artifacts/sandbox-3-8/run-sandbox.shRe-Open-Delta: DET-2 auf zwei getrennte Worktrees/independ. Läufe umgestellt (Manifest + Receipt-Szenario, keine hart codierten erwarteten Bundle-Outputs, verified nicht pauschal maskiert) — Exit 0

Acceptance Criteria:

  • Given einen Fixieren Git-State + feste Eingabemenge, when zwei unabhängige Runs ausgeführt werden, then produziert §5.14-Wortlaut identische Bundle-States bis auf die benannte at-Ausnahme (FT-10, AD-17h, AC-1).
  • Given eine Abweichung bei zwei solchen Runs, when sie festgestellt wird, then wird sie als Fehler im AD-16-Klassifikations-Mechanismus behandelt und textuell benannt (nicht als akzeptables Rauschen) (AD-17h, AC-2).
  • Given der MVP (D-3), when der Agent-Instruktions-Validator ausgeführt wird, then laufen die beiden Ausführungen in getrennten sauberen Worktrees und frischen Agent-Kontexten; eine zweite Ausführung in derselben Session genügt nicht (Q-6, A0-19; AC-3).
  • Given das kanonische Eingabemanifest, when ein Run geplant wird, then hält es Baseline-Commit, geordnete Source-Eingaben und jeden im Bundle sichtbaren Run-/Zeit-/Identitätswert explizit fest; der Run-Receipt enthält Candidate-Liste, Reihenfolge, Plan, Entscheidungen und Output-Hashes außerhalb des Knowledge Bundle (AC-4).
  • Given der Zwei-Run-Nachweis, when Pläne und Bundle-State verglichen werden, then dürfen weder erwartete Pläne noch Concept-Bodies hart codiert werden; verified-Ereignisse werden niemals pauschal aus dem Vergleich maskiert (AC-5).
  • Given der Validator, when umgesetzt, then hält er keine Embedding-/Vector-Infrastruktur vor (AD-13; FT-3, FT-4; AC-4) und erzeugt keine eigene Runtime/kein neues Werkzeug (D-3, AD-11).

Spec Change Log

Review-Loop-1 (2026-08-20, Step-04)

Ergebnis: keine intent_gap / kein bad_spec; 0 Loopback. Review-Schicht 3 Subagenten (blind-hunter / edge-case-hunter / verification-gap, synchron); Triage: 14 Patch / 0 defer / Rest Reject (ausführliche Reject-Begründung im Story-Protokoll wiki/log.md). Alle Patches rein dokumentarischer Natur (Klarstellung/Verweis/Status); Semantik unverändert, keine neue Vertragsentscheidung.

Patch-Stapel (in dieser Runde angewandt):

  • §3.2-Pkt.-1b (b): paketierte Kollaps-Klasse in der Operativ-Klausel auf die geschlossene [-–— _]-Klasse angehoben; Verweis auf den Append-Block als maßgeblich (KEEP: die append-only-Schließung bleibt unverändert; der Operativ-Satz ist jetzt konsistent).
  • §3.2-Pkt.-2a: Match-Scope (ganze Wörter über den Body, exklusiv Frontmatter) in die operative Stufe-a-Formel gewirkt — Einzel-Term-Klausel + Mehrfach-Term-Vereinigung (Pkt. 1c) verdeutlicht; Body-Abgrenzung (nach der zweiten ----Zeile) bestimmt.
  • §3-Pkt.-2-Kandidatenliste (und damit §5.9-Worked Example): Stufe-a-Scope-Verweis ergänzt.
  • §5.14-Pkt.-2: Zwei-Run-Abgleich als Vergleich der beiden Run-Ausgänge gegeneinander (nicht nur je Lauf gg. Baseline) verdeutlicht — Beispiel git diff <Run-A> <Run-B> ergänzt.
  • §5.14-Pkt.-1-Intro: AD-3-Schutzliste um adapters/ ergänzt.
  • §5.10-Pkt.-8: die pre-existing-Orphan-Obligationsformulierung als vorbestehend markiert (Verweis auf die neue deterministische Regel unten; keine Staffelung an Story 3.8/Epi-4 mehr).
  • deferred-work.md: Bezugs-Eintrag-Nummern der Story-3.2-review-Defers korrigiert (Kollaps Eintrag 3 → 2; Match-Scope Eintrag 2 → 1).
  • wiki/log.md: „8 ### Aufgegriffen-Blöcke" → „7 ### Aufgegriffen-Blöcke + 1 ### Aufgegriffen (teilweise)".
  • sandbox-3-8/run-sandbox.sh: DET-2-at-Maskierungszweck als Kommentar klargestellt (belegt die Nicht-at-Bestandteile; at-Varianz demonstriert DET-4); DET-1-Demo-Kommentar (Kandidaten-/Form-Outputs als redaktionell verdichtete Run-Feststellungen).
  • sprint-status.yaml: Key 3-8-…review (Review-Start-Flip; finaler done-Flip im Step-05).
  • spec-Frontmatter: status: 'in-review' (Review-Start per Step-04), review_loop_iteration: 0 unverändert; SRO-Review-Loop-1-Hinweis ergänzt.

Rejected-Findings (Kurznotation, nicht Teil der Patches): Stufe-a-Formel-Änderung nicht nötig (die Formel rg -l/grep -rl + Scope-Klausel bleibt die Instruktionsform; die Wortgrenzen-/Frontmatter-Semantik reist über die Pkt.-2a-Klausel, nicht über ein Flag); DET-2-Plan-Literal (dev-demo, echte Content-Hashes decken; Kandidaten-Ableitung über DET-1/DET-8); DET-8-hardcodierter Verwaist-Befund (Mechanik textuell, Existenz-negativ-Kontrolle hart); §5.14-raw/-Input-Verdacht (Pkt.-1a nennt raw/-Zuwächse bereits explizit „als Input"); §5.14-„kommt erstellt der Diff" — keine Formel-Verschmelzung; DET-2-maskierte-at (Display-Maske, DET-4 behandelt Varianz); Log-Overcount (Patch 9, siehe oben); Umlaut-Aufschlag (behandelt als Patch-7-Fundament); Sprint-Last-Updated-Timing (Konvention); §3.2-„keine offene Frage"(Umlaut bleibt dokumentiert offen, Wortlaut angepasst).

Re-Open-Implementierung (2026-08-20, Step-03; genehmigtes Sprint-Change-Proposal 2026-08-20)

Neu-Verhandlung: _bmad-output/planning-artifacts/sprint-change-proposal-2026-08-20.md (approved, ProMods, explizite Chat-Freigabe) nimmt Story 3.8 aus review nach in-progress zurück und erweitert den Scope (Epics-Datei ACs Z. 357370): getrennte saubere Worktrees + frische Agent-Kontexte (Q-6/A0-19), kanonisches Eingabemanifest, Run-Receipt außerhalb des Bundles, keine hart codierten erwarteten Pläne/Concept-Bodies, keine pauschale verified-Maskierung. Dieser Change-Log-Eintrag dokumentiert die Implementierung des Deltas: §5.14-Wortlaut (Zwei-Run-Mechanik auf Worktrees/Manifest/Receipt, Verbot von Hartcodes/pauschaler Maskierung), Sandbox DET-2 auf zwei Worktrees umgestellt. <frozen-after-approval>-Intent ausschließlich im Re-Open-Delta-Umfang angepasst; fehlendes Schließtag nach diesem Change Log ergänzt.

Review-Loop-2 (2026-08-20, Step-04)

Ergebnis: keine intent_gap / kein bad_spec; 0 Loopback. Review-Schicht erneut 3 Subagenten (blind-hunter, edge-case-hunter-Retry, verification-gap, synchron). Diesmal ist die Sandbox-DET-2-Mechanik der Review-Objekte — die Befunde betreffen die Re-Open-Implementierung selbst (nicht nur Doku). Triage: 10 Patch (Sandbox-Härtung) / 0 defer / Rest Reject. Kern-Veranlassung: die drei Re-Open-ACs (Worktrees, Manifest-Verwendung, at-Ausnahme als dokumentierte Ausnahme statt stillem Ausschluss) wurden von den Subagenten als nicht wirklich ausgeübt erkannt — das Manifest war dekorativ (nie konsumiert), die at-Maskierung erfolgte vor dem Commit (stiller Ausschluss statt dokumentierter Ausnahme), ein verified[]-Feld existiert nicht, der Receipt hatte kein Reihenfolge-/Entscheidungs-Feld, und die Subshell ohne set -e riskierte false-PASS.

Patch-Stapel (in dieser Runde angewandt, ausschließlich sandbox-3-8/run-sandbox.sh):

  • DET-2 ganzheitlich gehärtet: at wird jetzt als reale Wanduhr-Ausgabe committet (date -u) und als eigener at_cell-Wert im Receipt festgehalten; die Normalisierung auf AT erfolgt erst beim Vergleich (Hash-Bildung über die at-normalisierte Content-Projektion, §5.14 Pkt. 2 „ohne die maskierte at-Zeile") — kein Maskieren vor Commit, kein stiller Ausschluss. Nach-Commit-Attestierung: committed_at == at_now wird verifiziert. Der Zwei-Run-Abgleich vergleicht alle deterministischen Receipt-Bestandteile byte-identisch und nur die zwei Ausnahme-Cells at_cell/tree dürfen differieren; die at-Varianz wird in den Läufen real demonstriert (zwei getrennte Worktree-Läufe → unterschiedliche Wanduhr-at).
  • Kanonisches Eingabemanifest wird konsumiert/validiert (nicht dekorativ): Baseline-Commit und geordnete Source-Eingaben werden abschnittsbewusst aus manifest.yaml extrahiert und vor jedem Lauf gegen den Worktree-Zustand geprüft („Manifest ohne baseline / Quellen / Identitätswerte" → HARD-FAIL); die Quell-Eingaben-Existenz wird nach dem Increment-Input-Commit geprüft (EC-1-Semantik: Quelle zum Verarbeitungszeitpunkt vorliegend).
  • Receipt erweitert um order: (Reihenfolge) und decisions: (Ausführungs-Entscheidung) gemäß §5.14 Pkt. 2; Receipt-Gerüst-Nicht-Vakuum (beide Dateien non-empty) vor dem Vergleich.
  • Subshell set -e in run2_worktree aktiviert (jeder fehlende git/sed-Schritt bricht als rc≠0 ab → HARD-FAIL statt false-PASS); Witness-/sha-Leer-Prüfung blieb.
  • match_stufe_a literal-sicher: Term wird regex-escaped (sed 's|[][\\.*^$+?(){}|]|\\&|g') — ein Term wie a+b/x.y darf nie als Muster umgedeutet werden (§3.2-Pkt.-2a/§5.14 Pkt. 5); Body-Extraktion CRLF-tolerant (tr -d '\r').
  • cand-Newline-Normalisierung (tr '\n' ',') — mehrzeilige Candidate-Liste bricht den Receipt-Zeilenblock nicht mehr.
  • log_bullet fail-hard: mktemp/mv-Fehler werden nicht mehr geschluckt (ein verlorener log.md-Eintrag hätte beide Runs identisch=Baseline gelassen → Vakuum-Gleichheit; jetzt HARD-FAIL).
  • git worktree prune vor dem Add — Re-Run-Sicherheit (keine verwaisten worktree-Registrierungen blockieren/nachtragen).
  • git clean fail-hard unter set -e (kein || true-Schlucken von Rest-Unternehmungsdateien).
  • Manifest-output_visible_run_identity-Klarstellung: das Manifest führt konkrete Feldnamen-Werte (generated.by, generated.at — die benannte A0-20-Ausnahme), nicht einen Feldnamen-Platzhalter; die Manifest-Validierung verlangt generated.at explizit.

Kein defer: die Befunde waren sämtlich durch die Re-Open-Implementierung verursacht und hier (auto-)fixierbar; keine pre-existing Lücke wurde dabei neu aufgedeckt. Reject: einige Findings (z. B. „Teil-Zeitstimmen"/„literal") waren bereits durch die Hash-basierte Abwichen-Erkennung abgedeckt oder überreich.

*Verifikation dieser Runde: bash run-sandbox.sh → 8/8 PASS (DET-1..DET-8), Exit 0, zwei Läufe mit real unterschiedlichen at_cell-Wanduhrwerten (Ausnahme aktiv), Witness nicht-vakuum (Baseline-SHA ≠ Run-SHA); die Befunde „Manifest wird nie konsumiert", „at-Maske vor Commit", „kein Reihenfolge-/Entscheidungsfeld" sind damit direkt behoben.

Review-Loop-3 (2026-08-20, Step-04)

Ergebnis: keine intent_gap / kein bad_spec; 0 Loopback. Review-Schicht 4 Subagenten (blind-hunter, edge-case-hunter, verification-gap, acceptance-auditor, synchron). Triage: 4 decision-needed / 13 patch / 6 defer / 7 dismissed. Nutzer-Entscheidungen (alle empfohlene Option 1): D-1 §5.14-Schließungs-Bullet macht den §7 „Bekannte Determinismus-Lücke"-Alt-Bullet superseded (append-only-Superseded-Hinweis am Alt-Bullet, kein Umbruch — §3.2-„kein Umbruch" gewahrt); D-2 Story-Status-Flip auf done nach Loop-3-Abschluss — die Change-Proposal-Sequenzierung „3.9 → 3.10 / 3.11 → 3.12 → 3.8 Abschluss → 3.13 Abnahme" (Sprint-Change-Proposal 2026-08-20) betrifft das Epic-3-Abnahmegate (Story 3.13), nicht die Story-3.8-Instruktionsverankerung (die ist mit diesem Loop abgeschlossen; 3.93.12-Verankerungen und die 3.13-Abnahme bleiben offen, epic-3 remains in-progress — als Key-Kommentar in sprint-status.yaml festgehalten); D-3 autorisierte Neu-Verhandlung des Frozen-Intents in geringfügigem Umfang: Typo „documenthuman" → „document-human" (dieses File, Re-Open-Delta-Zeile; nur der Rechtschreibfehler, kein Intent-Wechsel) — diese Change-Log-Zeile ist ihre Doku; D-4 Hold-Home = Story 3.10 (Epic 3) (Hold-Mechanik: Erhaltung unzugeordneter raw/-Evidenz im benannten Hold ohne Wissensmutation, NFR-7), Korrektur-/Erweiterungs-Klassifikation = Epic-4-Interface/Story 4.1 — §5.10 Pkt. 8 entsprechend präzisiert.

Patch-Stapel (in dieser Runde angewandt):

  • P-1 SRO-/Code-Map-Anker auf IST-Zeilen: schema/compiler.md SRO 374→375 (Pkt. 3), 375→376 (Pkt. 4), 376→377 (Pkt. 5), 476→477 (Rev 3.3); Code Map „§5.14 Z. 364381 ca." → 365377, „§7 (Z. 409ff.)" → 424ff, „§8-AD-17h (Z. 430)" → 445, „Revision 3.3 nach Z. 461" → 477; alle 6 Sandbox-SRO-Anker neu berechnet (vorher exakt, durch die Loop-3-Sandbox-Edits verschoben): 238→245, 257→265, 409→442, 267→275, 414→447, 498→531.
  • P-2/P-4 symmetrische Normalisierung: §3.2 Pkt. 2a-Klausel + match_stufe_a — Term und Body werden identisch normalisiert (Lowercasing + Kollaps-Klasse Pkt. 1b) vor dem Vergleich; kein host-abhängiges -i-Flag (wurde entfernt); Wortgrenze folgt der Tool-Wortdefinition (rg -w / GNU grep -w/\b); ASCII-Boundary [^A-Za-z0-9] im Skript trägt die Tool-Semantik portabel.
  • P-3 §5.14 Pkt. 2: der Receipt-basierte Hash-/Textvergleich ist die re-executierbare Formel des Zwei-Run-Abgleichs; die git diff <Run-A> <Run-B>-Formel ist deren Austauschbar-Form auf demselben committeten Baum (Sandbox belegt über Receipt-Hashvergleich).
  • P-5 §5.14 Pkt. 2: Sandbox-Fresh-Kontext-Restlücke textuell benannt — die zwei frischen Agent-Kontexte sind mechanisch simuliert (Subshell-Läufe in getrennten Worktrees desselben Skripts); Nachweis echter frischer Kontexte erfolgt im Story-3.13-Abnahmegate (echte Agent-Läufe).
  • P-6 Manifest-generated_by wird konsumiert: Manifest erhält generated_by: wow-compiler/0.1.0; Verbrauch-Guard (generated.by-Identität + non-empty) + Concept-Frontmatter by: $m_by (statt hart-codiert) — „nicht dekorativ" ist jetzt materiell erfüllt.
  • P-7 at-Ausnahme hart assertiert: bei Wanduhr-Sekundenkollision wird Lauf B im frischen Kontext wiederholt (begrenzt, 5x), bis die at_cell-Werte real differieren; sonst HARD-FAIL — die aktive Ausnahme (Change-Log-Beleg „zwei Läufe mit real unterschiedlichen at_cell-Werten") ist jetzt eine Eigenschaft jeder Re-Execution. Re-executiert: BEFUND: at-Ausnahme aktiv (assertiert) — Lauf A at=2026-08-20T15:05:09Z, Lauf B at=2026-08-20T15:05:12Z.
  • P-8 „vollständig pinbar"/„keine offene Determinismus-Frage" ge scopet (§5.14 Pkt. 5 + §7-Determinismus-Bullet): gelten nur für die mit §5.14 geschlossenen Lücken (Em-Dash-Klasse, Kollaps-Reichweite, Match-Scope, Reconcile-Orphan-Regel, at-Gap-Ausnahme); bewusst nicht damit geschlossen: Umlaut-vs-Transkription-Divergenz (benannter Defer) und Story-3.9-ACs (geplant, noch nicht verankert — §3.2 maßgeblich bis dahin).
  • P-9 epics.md Story-3.8-AC-2: „Determinismusfehler" als Fehler der AD-16-Klassifikation (AD-16-Klassifikationsdefekt) präzisiert — die AD-16-Kopplung war bei Story-Aufnahme nicht ausgeschrieben; AC-Wortlaut erhalten, Nachführung als Präzisierungsklausel.
  • P-10 Frontmatter review_loop_iteration: 0 → 2 (der Counter war in Loop-1/2 nicht gepflegt; ab Loop-3 gepflegt, Wert = Anzahl bereits abgeschlossener Loops).
  • P-11 epic-3-context.md Technical Decisions (Z. 39/41/43): als Zielzustand markiert (Story 3.9/3.11/3.12 — noch nicht in schema/compiler.md verankert; bestehende Verankerungen bleiben maßgeblich) — die Bullets lesen nicht mehr wie Ist-Zustand.
  • P-12 verifiziert, kein Edit nötig: die acceptance-auditor-Finding „epics.md-AD-17-Enum inkonsistent" wurde per Grep widerlegt: epics.md enthält kein Literal „AD-17a..h" als Block; alle Enum-Vorkommen (Z. 6167, 9495, 101, 262263, 321329, 357408) sind mit dem genehmigten Change-Proposal konsistent (AD-17g verbleibt in Epic 4, Z. 101; AD-17d..17f in Story 3.11/3.12-ACs; AD-17h in Story 3.8-ACs).
  • P-13 dieser Change-Log-Eintrag (append-only nach Loop-2-Eintrag, vor </frozen-after-approval> — Loop-1/2-Präzedenz: der Change Log liegt frozen-intern, weil er die Frozen-Änderungsdoku des Re-Opens ist; kein frozen-interner Text wurde hier verändert außer dem D-3-Typo).

Defers (6, → deferred-work.md append-only, Block „Deferred from: code review of spec-3-8… (2026-08-20)"): D-5 Sandbox-Härtungs-Guards (8 Befunde: set -u-Scope, ungeschützte mktemp/git init/Baseline-Commit, isolate(), log_bullet-Temporaries) — Testharness-Robustheit, keine normative Semantik; D-6 DET-1/DET-2-Plan-/Form-Literale vs. AC-5 „nicht hart codiert" (dev-demo-Kommentar + echte Content-Hashes tragen die Nicht-Vakuum-Assertion; Home: Story-3.13-Abnahme mit echten Gate-Runs); D-7 norm()-Locale-Pinning (LC_ALL — C-Locale degradiert [–—] zu Byte-Menge; Home: Sandbox-Härtung mit D-5); D-8 Mehrfach-Term-Vereinigung unübend (Home: Story 3.9); D-9 Orphan-Term hand-pinned + feste 2-Datei-Scan (Home: Story 3.9); D-10 Umlaut-vs-Transkription im Match-Pfad unübend (bereits „Aufgegriffen (teilweise)" offen, kein Instruktions-Defekt).

Dismissed (7): (1) Blind-Hunter „alle Sandbox-SRO-Anker stale" — widerlegt (alle 6 exakt vor den Loop-3-Edits; die Staleness wurde erst durch die eigenen P-6/P-7-Edits erzeugt und per P-1 aufgelöst); (2) Blind-Hunter „§7-Zeilenanker off-by-one (409/430/461)" — bereits im Loop-3-Review-Stand korrekt verortet, Anker waren Implementierungs-Zielwerte (jetzt per P-1 IST); (3) edge-case „Wiederholungs-Schleife unendlicher Loop" — die Schleife ist auf 5 Versuche begrenzt mit HARD-FAIL-Exit; (4) verification-gap „Manifest-generated.by-Guard tautologisch" — Guard prüft Manifest-Inhalt gegen Konzepts-Ausgabe (Konsistenz), nicht gegen sich selbst (P-6); (5) acceptance-auditor „AC-5 verletzt durch plan-Literal im Receipt" — das plan-Feld ist der abgeleitte Plan-State (aus Git-State + Stufe-a-Match), kein vorab hart codierter Erwartungswert (D-6-Präzedenz); (6) acceptance-auditor „epics.md AD-17-Enum inkonsistent" — widerlegt (P-12); (7) verification-gap „last_updated-Formatbruch" — Format MM-DD-YYYY HH:MM beibehalten (Z. 32), Präzedenz-Prüfung bestanden.

Verifikation dieser Runde: bash _bmad-output/implementation-artifacts/sandbox-3-8/run-sandbox.sh8/8 PASS (DET-1..DET-8), Exit 0; at-Ausnahme aktiv (assertiert) mit real unterschiedlichen Wanduhr-at-Werten (Lauf A 15:05:09Z vs. Lauf B 15:05:12Z); Witness nicht-vakuum (Baseline-SHA ≠ Run-SHA); Manifest generated_by konsumiert (Concept-Frontmatter by: trägt Manifest-Wert). AD-3 geprüft (schema/validator.md/schema/wiki-compiler.md/adapters//raw/ unverändert). Status: Spec-Frontmatter status: 'done', review_loop_iteration: 2; sprint-status.yaml-Key 3-8-…done (D-2, mit Sequenzierungs-Hinweis), last_updated → 08-20-2026 17:04. wiki/log.md Loop-3-Abschluss-Bullet ergänzt.

Review Findings (Review-Loop-3, 2026-08-20; bmad-code-review, 4 Layer)

Decision-Needed (4):

  • [Review][Decision] D-1 §3.2-Alt-Bullet-Selbstwiderspruch — der Pre-Existing-Bullet „Bekannte Determinismus-Lücke … deckt den Em-Dash nicht ab … übergeben an Story 3.8" (schema/compiler.md:53) steht wortgleich über dem Schließungs-Bullet (:54) und ist jetzt faktisch falsch; zwei benachbarte, sich widersprechende normative Aussagen über die Kollaps-Klasse. Kollidiert mit dem Spec-Constraint „ohne Umbruch des bestehenden §3.2-Wortlauts" (append-only). — Entscheidung (2026-08-20): Option 1 — neuer append-only-Nachtrags-Bullet unter :54 kennzeichnet den Alt-Bullet ausdrücklich als superseded (Alt-Wortlaut bleibt unverändert; Widerspruch aufgelöst).
  • [Review][Decision] D-2 Status-Trail bruch — Spec-Frontmatter status: 'done' + wiki/log.md:4 „Step-05 done" + Commit-Titel „Step-05 done" vs. sprint-status.yaml:61 review vs. genehmigtes Change-Proposal („Story 3.8 wird nach 3.93.12 … abgeschlossen; 3.8 Abschluss → 3.13 Abnahme"). Welcher Wert ist maßgeblich, und wer flippt wann? — Entscheidung (2026-08-20): Option 1sprint-status.yaml auf done flippen (Loop-3-Abschluss); Change-Proposal-Sequencing betrifft das Epic-3-Abnahmeverfahren (Gate 3.13), nicht den Story-Zustand; Sequencing-Vorbehalt wird im wiki/log.md-Abschluss-Bullet textuell vermerkt.
  • [Review][Decision] D-3 „documenthuman respektierend" im Frozen-Block — mangelhafter Phrase (vermutl. „document-human respektierend") in spec Z. 24, dem menschlich-eigenen Frozen-Block; nur per menschlicher Renegotiation änderbar. — Entscheidung (2026-08-20): Option 1 — menschliche Renegotiation hiermit erteilt: Korrektur auf „document-human respektierend"; die Renegotiation wird im Review-Loop-3-Change-Log-Eintrag dokumentiert (D-3).
  • [Review][Decision] D-4 Orphan-/Hold-Home-Konflikt — §5.10 Pkt. 8 (schema/compiler.md:302) + Log-Einträge benennen „Epic-4-Interface, Story 4.1" als Home der Korrektur-/Erweiterungs-Klassifikation, während die Story-3.10-ACs (epics.md Z. 402) einen Hold „bis Epic 4" in Epic 3 selbst verlangen. Welches Story-AC besitzt die Orphan-/Hold-Klassifikation? — Entscheidung (2026-08-20): Option 1 — Story 3.10 ist Home des Holds (Mechanik in Epic 3); die Korrektur-/Erweiterungs-Klassifikation bleibt Epic-4-Interface (Story 4.1); Pkt.-8-Verweis wird entsprechend präzisert (Patch aus D-4).

Patches (13):

  • [Review][Patch] P-1 SRO-Anker-Drift schema/compiler.md — SRO-Zeilen :374375, :375376, :376377 (Pkt. 3/4/5), :476477 (Revision 3.3); Code-Map „Revision 3.3 nach Z. 461"→477, „§7 nach Z. 420"→434, „§8-AD-17h Z. 430"→Ist, „§5.14 Z. 364381"→365377 (spec Z. 66/182/183/184/194).
  • [Review][Patch] P-2 §3.2-Stufe-a-Boundary-Semantik klären — normative Klausel benennt rg -w/grep -w/\b (ASCII-only Wortklassen), Sandbox nutzt [^A-Za-z0-9]-Boundary + -i; für deutsche Inhalte (Umlaut/ß) divergieren „Wort"-Definitionen; -i nirgends instruiert (spec:79, schema/compiler.md:56, run-sandbox.sh:144).
  • [Review][Patch] P-3 §5.14 Pkt. 2 Run-A↔Run-B-Formel konkretisieren — die benannte git diff <Run-A> <Run-B> -- wiki/-Formel wird von der Sandbox nie ausgeführt (nur Receipt-/Hash-Vergleich; tree-Cells als Ausnahme); entweder Sandbox ergänzt die Formel, oder Pkt. 2 benennt den Hash-Textvergleich ausdrücklich als äquivalente re-executierbare Formel (spec:88, §5.14 Pkt. 2 schema/compiler.md:371).
  • [Review][Patch] P-4 §5.14 Pkt. 2/5 Body-Normalisierung klären — „identisch normalisiert" (§3.2/§5.14) gilt textuell nur für den Term; match_stufe_a normalisiert den Body nicht (nur CRLF-Strip), der Em-Dash-Kollaps fehlt im Match-Pfad vollständig (DET-5 testet norm, nie den Matcher) (run-sandbox.sh:126-142, 555-571).
  • [Review][Patch] P-5 AC-3-Fresh-Kontext-Restlücke dokumentieren — „zwei frische Agent-Kontexte" (Q-6/A0-19) sind in der Sandbox strukturell nur als Subshells simulierbar; die Restlücke soll in spec/Log textuell als „mechanisch simuliert" benannt sein (spec:90, run-sandbox.sh:238-260).
  • [Review][Patch] P-6 Manifest-Verbrauchs-Tautologie — Manifest wird aus $BASE + harter Source-Liste erzeugt und gegen dieselben Variablen validiert; generated.by wird nie konsumiert (hart-codiert wow-compiler/0.1.0); „nicht dekorativ" nur formal erfüllt (spec:91, run-sandbox.sh:248-266, 300).
  • [Review][Patch] P-7 at-Ausnahme-Demo asserten — bei identischen at_cell-Werten (Wanduhr-Sekundenkollision) druckt das Skript nur „BEFUND: at-Grenzfall" und PASST; die aktive Ausnahme wird nicht assertiert; Change-Log-Claim „zwei Läufe mit real unterschiedlichen at_cell-Werten" nicht vom Skript erzwungen (spec Change-Log Z. 127, run-sandbox.sh:394-401).
  • [Review][Patch] P-8 §7-Absoluthheits-Claim eingrenzen — „Keine offene Determinismus-Frage verbleibt" (§7 schema/compiler.md:434) + §5.14 Pkt. 5 „vollständig pinbar … keine offene Frage" (:377) vs. deferred-work.md (Umlaut-vs-Transkription offen) + Story-3.9-ACs (closed term-gewinnung/manifest/Routing-Tabelle existiert noch nicht).
  • [Review][Patch] P-9 Terminologie-Drift AC-2 — epics.md Z. 366 „Determinismusfehler … Run gilt als fehlgeschlagen" vs. §5.14 Pkt. 4 „AD-16-Klassifikationsdefekt … korrigiert bzw. rollt zurück" (:376); AD-16-Kopplung in der Neuformulierung ohne Verweis verloren.
  • [Review][Patch] P-10 review_loop_iteration + Change-Log-Finalität — Counter blieb 0 über zwei Loops (dekorativ); kein Change-Log-Eintrag für den Step-05-Statuswechsel (spec Z. 7, 95-142).
  • [Review][Patch] P-11 epic-3-context.md geplanter Zustand markieren — Technical Decisions beschreiben Story-3.9/3.11/3.12-Entscheidungen als aktuellen Ist-Zustand, die in compiler.md nicht existieren; Ziel-/geplanter-Zustand kennzeichnen.
  • [Review][Patch] P-12 epics.md-Epic-Narrativ-AD-17a..h nachziehen — Summary-Tabelle/Epic-Body zitieren weiterhin „(AD-17a..h)"; AD-17g-Entzug (jetzt „vollständig in Epic 4") nur in der AD/A0-Enum sichtbar, nicht im Narrativ.
  • [Review][Patch] P-13 Review-Loop-3-Change-Log-Eintrag anhängen — Triage-Ergebnis, Patch-Stapel, Defer-Verweise und die 7 Dismissals mit Begründung (darunter Blind-Hunter „alle Sandbox-SRO-Anker stale" — widerlegt, alle 6 exakt).

Defer (6):

  • [Review][Defer] D-5 Sandbox-Härtungs-Guards (8 Befunde) [run-sandbox.sh:37,41,94-96,104-107,136-141,243-244] — deferred, Testharness-Robustheit (keine normative Semantik); Re-Run-Risiko dokumentiert, Home: nächste Sandbox-Revision.
  • [Review][Defer] D-6 DET-1/DET-2-Plan-/Form-Literale vs. AC-5-„nicht hart codiert" [run-sandbox.sh:189,211-221] — deferred, Loop-1-/Loop-2-Präzedenz (dev-demo-Kommentar Z. 211-214; echte Content-Hashes tragen die Nicht-Vakuum-Assertion); Home: Story-3.13-Abnahme (echte Gate-Runs).
  • [Review][Defer] D-7 norm()-Locale-Pinning (LC_ALL) [run-sandbox.sh:115-122] — deferred, Testharness-Host-Locale-Abhängigkeit; C-Locale degradiert [–—] zu Byte-Menge; Home: Sandbox-Härtung (mit D-5).
  • [Review][Defer] D-8 Mehrfach-Term-Vereinigung unübend [run-sandbox.sh:555-660] — deferred, §5.14-Pkt.-5-„pinbar"-Verhalten ohne ausführbare Coverage; Home: Story 3.9 (Routing/Term-Gewinnung).
  • [Review][Defer] D-9 Orphan-Term hand-gesteuert + feste 2-Datei-Scan [run-sandbox.sh:660-693] — deferred, Mechanik textuell korrekt, Determinismus der Orphan-ermittlung (Term-Ableitung aus raw/-Zuwachs, voller Kandidaten-Scan) nicht ausgeübt; Home: Story 3.9.
  • [Review][Defer] D-10 Umlaut-vs-Transkription im Match-Pfad unübend [run-sandbox.sh:555-571] — deferred, bereits als „Aufgegriffen (teilweise)" offen (deferred-work.md Z. 541-546, kein Instruktions-Defekt); Home: Sandbox-Vereinheitlichung/folgende Instruktions-Revision.

Design Notes

Warum §5.14 als eigene Sektion, nicht §6.5-Erweiterung? §6.5 ist die „Determinismus- & Selbsttest-Norm" mit drei Nachprüf-Kriterien (Vollständige §3-Subset-Konformität, at-Normalform, sources-Existenz) — die projektions-seitige Content-Prüfung je erzeugtem Concept. Der Determinismus-Vertrag (AD-17h/FT-10) ist die Cross-Run-Eigenschaft (zwei unabhängige Runs → gleicher Bundle-State), kein Einzel-Concept-Kriterium. §5.14 ist die geschlossene Verankerung dieser Cross-Run-Eigenschaft: (a) Bundle-State-Definition (welche Zustandsmenge ist „der Bundle-State" — die committete Baum-Projektion unter wiki//raw/ zzgl. Plan-/Kandidaten-/Reihenfolge-Outputs; generated.at als benannte Ausnahme), (b) Zwei-Run-Bestätigungs-Mechanik (agent-Instruktions-basiert; Re-Open-Stand: die beiden Ausführungen laufen in getrennten sauberen Worktrees mit frischen Agent-Kontexten über demselben committeten Git-State und vergleichen die Bundle-States; eine zweite Ausführung in derselben Session genügt nicht — Q-6/A0-19; unter kanonischem Eingabemanifest und mit Run-Receipt außerhalb des Bundles), (c) Ausnahme-Menge (allein generated.at-Wanduhr-Gap, dokumentiertes A0-20; Nichts sonst), (d) Abweichungs-Klassifikation (jede Differenz außerhalb der Ausnahme = AD-16-Klassifikationsfehler; textuell benannt NFR-4; kein stiller Vorbeilass). Damit ist die bisher „offen verankerte" AD-17h-Eigenschaft (viele Rückverweise, kein normativer Ort der Bestätigung) zu einem instruierten, mechanisch bestätigbaren Verfahren verdichtet.

Die Normalisierungs- und Match-Lücken werden deterministisch geschlossen, nicht nur notiert. Die Kollaps-Klasse in §3.2 Pkt. 1b ist [-_ ] (En-Dash , Bindestrich -, Unterstrich _, Leerzeichen) — der Em-Dash fehlt (bekannte Story-3.2-Lücke mit Home Story 3.8). Die Schließung ist eine Ergänzung der Kollaps-Klasse um den Em-Dash ([-–— _]-) sowie die Festlegung der Kollaps-Reichweite (jedes Vorkommen → genau ein -; führende/trailende Separatoren werden getrimmt — die bereits in der Sandbox etablierte Semantik) und des Match-Scope der Stufe a (Stufe-a-grep-matcht ganze Wörter über den Body, exklusive YAML-Frontmatter — rg -l '<term>' -g '!log.md' wiki/ erhält einen deterministischen Scope; Substring- und Frontmatter-Treffer werden ausgeschlossen). §5.10 Pkt. 8 (Orphan) erhält eine deterministische Reconcile-Orphan-Regel: neu committete raw/-Evidenz ohne Ziel-Pfad-Treffer bleibt unzugeordnet, wird in log.md als verwaist protokolliert (Datumsgruppe, <Baseline-Commit>), kein Banner/keine stille Vorbearbeitung. Diese Schließungen machen die relevanz-/synthese-seitigen Erhebungen über den committeten Zustand vollständig pinbar.

Die Sandbox (DET-1..DET-8, bash run-sandbox.sh, /tmp-Baum, Exit 0) demonstriert die Bestätigung mechanisch.

  • DET-1 BUNDLE_STATE_DEFINITION: erzeugt ein Mini-Bundle, definiert/extrahiert die Bundle-State-Projektion (wiki/-Dateien + Plan-/Kandidaten-/Reihenfolge-Outputs) deterministisch
  • DET-2 ZWEI_RUN_IDENTISCH (nicht-vakuum): zwei getrennte Worktrees mit frischen Agent-Kontexten (je ein eigener Lauf über demselben committeten Baum) → identische Bundle-States bis auf at; unter kanonischem Eingabemanifest und mit Run-Receipt (Candidates, Reihenfolge, Plan, Entscheidungen, Output-Hashes) außerhalb des Bundles; die Assertion vergleicht echte Content-Hashes (nicht nur Vorhandensein); keine hart codierten erwarteten Bundle-Outputs, verified nicht pauschal maskiert (nur die benannte at-Ausnahme)
  • DET-3 ZWEI_RUN_ABWEICHUNG: künstlich divergenter Lauf → wird als AD-16-Klassifikationsdefekt klassifiziert und textuell benannt (kein Rauschen)
  • DET-4 AT_GAP_AUSNAHME: zeigt, dass generated.at-Wanduhr-Gap die einzige benannte Ausnahme ist (übrige Teile byte-identisch)
  • DET-5 EM_DASH: Term mit Em-Dash normalisiert auf dieselbe canonische Form wie En-Dash/Bindestrich/Unterstrich/Leerzeichen
  • DET-6 KOLLAPS: Läufe (a--b), führende (-x), trailende (x-) → Kollaps auf genau ein - + Trim
  • DET-7 MATCH_SCOPE: Stufe-a-matcht ganze Wörter über Body, exklusive Frontmatter (Substring-/Frontmatter-Treffer ausgeschlossen)
  • DET-8 ORPHAN: neu committete Evidenz ohne Ziel-Pfad-Treffer → unzugeordnet, log.md-verwaist protokolliert, kein Banner/keine Mutation

(Code-/Zahlgenauigkeiten: Szenario-Labels sind Fixierung der I/O-Matrix; die Implementierung trägt die harten Assertionen in der Sandbox.)

Verification

Commands (re-executierbar, ab Workspace-Root):

  1. bash _bmad-output/implementation-artifacts/sandbox-3-8/run-sandbox.sh — expected: DET-1..DET-8 harte PASS/Fail (Re-Open-Stand, gehärtet in Review-Loop-2: DET-2 in zwei getrennten Worktrees mit frischen Kontexten, kanonisches Eingabemanifest konsumiert/validiert vor jedem Lauf, Run-Receipt außerhalb des Bundles mit order:/decisions:/at_cell, keine hart codierten Bundle-Outputs, verified nicht pauschal maskiert — generated.at als reale Wanduhr-Ausgabe committet und erst beim Vergleich normalisiert (dokumentierte Ausnahme, kein stiller Ausschluss), Ausnahme-Cells at_cell/tree dürfen differieren, übrige Bestandteile byte-identisch), Zwei-Run-Identität nicht-vakuum, Exit 0.
  2. grep -n "§5.14\|Revision 3.3" schema/compiler.md — liefert §5.14-Sektion + Revisionslog-Eintrag; grep -n "Determinismus-Vertrag & Agent-Instruktions-Validator" schema/compiler.md — die §5.14-Überschrift wortgleich (inkl. §5.13-Seam-Satz in §5.14-Intro).
  3. Read-only (AD-3): git status --porcelain zeigt keinen Change an schema/validator.md/schema/wiki-compiler.md/adapters//raw/. schema/canonical-terms.md unverändert (append-only-Registry unangetastet).
  4. Validator-Lauf: alle wiki/-Dateien SUCCESS (unverändert, keine Inhalts-Mutation).
  5. Auf den wiki/-Scope begrenzt (git status --porcelain -- wiki/): ausschließlich wiki/log.md (dieser Eintrag) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt; sprint-status.yaml/deferred-work.md/sandbox-3-8/ liegen außerhalb wiki/ und sind nicht Teil der Diff-Probe.

Zu beachten (beim step-04-Review): (a) §0-Phasen-Listentext, §5.13-Phasen-Disziplin und §6/§6.5 müssen textuell unverändert bleiben — §5.14 verweist auf sie (Fugen-Identität); (b) der generated.at-Wanduhr-Gap bleibt verhaltens-seitig unverändert (A0-20-Konvention); §5.14 definiert nur seine Behandlung im Bundle-State-Vergleich (Ausnahmemenge) — ein Wechsel des generated.at-Verhaltens wäre Ask-First; (c) die vorhandene §8-Revisionslog-Nummer ist 3.2 (Story 3.7); Revision 3.3 ist für Story 3.8 frei (grep-verifiziert: keine 3.3 im Revisionslog); (d) kein neuer §7-Bullet ersetzt einen bestehenden — der Determinismus-Bullet wird ergänzt (Verankerungs-Verweis), die bestehenden Story-Bullets bleiben unverändert; (e) Re-Open-Delta (§5.14): die Zwei-Run-Mechanik nutzt getrennte saubere Worktrees + frische Agent-Kontexte (Q-6/A0-19), ein kanonisches Eingabemanifest und einen Run-Receipt außerhalb des Bundles — keine hart codierten erwarteten Bundle-Outputs, keine pauschale verified-Maskierung (nur at-Ausnahme); die alte Formulierung „in einer Session" ist entfernt.

Suggested Review Order

§5.14-Determinismus-Vertrag (Kern, Einstieg)

  • compiler.md:365 — §5.14-Überschrift, Intro mit §5.13-Seam und AD-3-Schutzliste inkl. adapters/.
  • compiler.md:369 — Pkt. 1 Bundle-State-Definition: committete Baum-Projektion, generated.at als benannte Ausnahme (A0-20), FT-10/AD-17h/AC-1.
  • compiler.md:370 — Pkt. 2 Zwei-Run-Bestätigungs-Mechanik: zweimal über denselben committeten Git-State, Run-A↔Run-B-Abgleich (Beispiel git diff), keine Wanduhr-Steuerung.
  • compiler.md:375 — Pkt. 3 Ausnahme-Menge: allein der generated.at-Wanduhr-Gap; alle übrigen Bestandteile byte-identisch (kein stiller Ausschluss).
  • compiler.md:376 — Pkt. 4 Abweichungs-Klassifikation: jede Differenz außerhalb der Ausnahme = AD-16-Klassifikationsdefekt, kein Rauschen (NFR-4, Zustands-Restaurations-Invariante).
  • compiler.md:377 — Pkt. 5 Normalisierungs-/Match-/Orphan-Schließung: Verankerung auf §3.2-Pkt.-1b / §5.10-Pkt.-8, Erhebungen vollständig pinbar.

§3.2/§5.10-Lückenschließung (deterministische Regel-Ergänzungen)

  • compiler.md:54 — §3.2-Pkt.-1b „Geschlossene Determinismus-Lücken": Em-Dash-Kollaps-Klasse [-–— _], Kollaps-Reichweite (ein - + Trim), Match-Scope Stufe a (ganze Wörter, Body-exklusiv).
  • compiler.md:56 — §3.2-Pkt.-2a operative Stufe-a-Mechanik: rg -l/grep -rl-Sweep + deterministischer Scope-Filter (zweistufig, tool-portabel), Mehrfach-Term-Vereinigung.
  • compiler.md:302 — §5.10-Pkt.-8 Erhaltungs-Invariante & Determinismus-Vertrag: Reconcile-Orphan-Regel (Zuwachs gg. Baseline, datumsgruppierter log.md-Eintrag, kein Banner, AD-16-Default).

§7/§8-Nachweis

  • compiler.md:477 — Revisionslog Revision 3.3: §5.14-Verankerung, §7-Determinismus-Vorbehalt aufgelöst, §8-AD-17h-Normreferenz auf §5.14-Anker, Abschlussklausel (AD-3/D-3/keine neue §7-Klasse).

Sandbox-Beweis (mechanische Bestätigung)

  • run-sandbox.sh:245 — DET-2 Szenario-Start: zwei getrennte Worktrees + frische Kontexte über demselben committeten Baum; Einstieg in die gehärtete Determinismus-Mechanik (Review-Loop-2).
  • run-sandbox.sh:265 — Kanonisches Eingabemanifest (manifest_path), das jetzt VOR jedem Lauf konsumiert/validiert wird (nicht dekorativ; Review-Loop-2-Patch; Review-Loop-3 P-6: generated_by wird konsumiert).
  • run-sandbox.sh:442 — DET-2 RESULT: Receipts byte-identisch bis auf at_cell/tree (Ausnahme-Cells); att real committet, erst beim Vergleich normalisiert — dokumentierte Ausnahme statt stiller Ausschluss (Review-Loop-3 P-7: at-Ausnahme hart assertiert, Wiederholungs-Schleife bei Sekundenkollision).
  • run-sandbox.sh:275set -e-Subshell: jeder fehlende Schritt bricht als rc≠0 ab (kein false-PASS; Review-Loop-2-Patch).
  • run-sandbox.sh:447 — DET-3: künstlich divergenter Lauf → AD-16-Klassifikationsdefekt, textuell benannt (NFR-4), korrigierte Wiederholung == Referenz.
  • run-sandbox.sh:531 — DET-4: generated.at-Gap als einzige benannte Ausnahme; at-Maskierung beim Vergleich (byte-identische Restteile) + Negativkontrolle.

Story-Protokoll/Defers (Peripherie, zuletzt)

  • log.md:4 — Story-3.8-Eintrag: Verankerung, Sandbox-Nachweis, Erhaltungs-Invariante, Validator-Verdikt; Revision 3.3.
  • deferred-work.md:492 — aufgegriffene/geschlossene „Home: Story 3.8"-Defers (7 ### Aufgegriffen + 1 ### Aufgegriffen (teilweise), append-only ab Zeile 492).
  • spec:122 — Spec Change Log Review-Loop-2: 10 Patches der Sandbox-Härtung (at-Ausnahme real ausgeübt, Manifest-Validierung, Receipt order/decisions, set -e, literal-sichere Stufe-a).
  • sprint-status.yaml:61 — Key 3-8-determinismus-… auf review (Review-Start-Flip Step-04); done-Transition im Step-05.