fix: Story 3.13 Review-Loop-2-Auflösung (bmad-code-review 4 Layer, Diff 50f3628..HEAD + working tree): 38 rohe → 4 decision-needed / 11 patch / 2 defer / 4 dismissed; alle Entscheidungen mit ProMods geschlossen (D-3.13-L2-1 B2-Reihenfolge-Pin+§8-Überreich = Defer+Bearer-Fix, D-3.13-L2-2 Datumsgruppen-Wanduhr = Defer+Gate-Dokumentation, D-3.13-L2-3 AC-6-CREATE-Residual = Defer+Substitutions-Notiz, D-3.13-L2-4 frozen-L24-Wortung = dokumentierte Abweichung annotiert); Patches P-L2-1..P-L2-11: E.6 Known-Value-Witness (baseline==$BASE + sources_added==raw/alpha-v2.md) + Feldsatz-exakt-Check (4 Felder, keine Fremdzeilen), AGENT_PROMPT-Receipt-Form präzisiert (GATE-spezifisch vs. compiler.md-Konzept §5.14 Pkt. 2, kommagetrennt oh. Leerzeichen, lex LC_ALL=C), E.9 kanonische 'Baseline $BASE'-Form hart (Rev 3.8), P-16 Floor auf Dezimalzwang (10#), A.2-Meldung 5 Referenzen, D-NEG.3-Punktbezeichnung, Spec-Doku-Sync (Review-Loop-2-Sektion, Change-Log, #6/#7-Teilkorrektur); Status: in-progress (grüner Re-Run #10 + Step-05-Status-Sync ausstehend), bash -n clean (1005 Z.)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: "Arbeitsauftrag — compiler.md Rev 3.7 → 3.8 (Epic-1-Remediation, Story 3.13): CREATE-Slug + log-Determinismus-Patch"
|
title: "Arbeitsauftrag — compiler.md Rev 3.7 → 3.8 (Epic-1-Remediation, Story 3.13): CREATE-Slug + log-Determinismus-Patch"
|
||||||
status: AUSGEFÜHRT (Teilumsetzung) — B2 (log-Pin) + A/B-Umfang (b) angewendet, Rev 3.8 committet; B1 (Slug) = offener Defer; C (Body-Byte) = zurückgewiesen (FR-2). Siehe §0.1 Ausführungsstatus.
|
status: AUSGEFÜHRT (Teilumsetzung) — B2 (log-Form-/Wanduhr-Pin) + A/B-Umfang (b) angewendet, Rev 3.8 committet; B2-Reihenfolge-Hälfte + B1 (Slug) = offene Defers; C (Body-Byte) = zurückgewiesen (FR-2). Siehe §0.1 Ausführungsstatus.
|
||||||
date: 2026-08-23
|
date: 2026-08-23
|
||||||
owner: ProMods
|
owner: ProMods
|
||||||
related: spec-3-13-epic-3-verifikations-und-abnahmegate.md, spec-3-8-determinismus-vertrag-ad-17h-als-agent-instruktions-validato.md, deferred-work.md
|
related: spec-3-13-epic-3-verifikations-und-abnahmegate.md, spec-3-8-determinismus-vertrag-ad-17h-als-agent-instruktions-validato.md, deferred-work.md
|
||||||
@@ -16,14 +16,14 @@ Dieser Entwurf legte drei Bausteine fest: **B1** (CREATE-Slug-Signal), **B2** (l
|
|||||||
|
|
||||||
| Baustein | Status | Umsetzung |
|
| Baustein | Status | Umsetzung |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| **B2** — kanonische, byte-deterministische `log.md`-Eintragsform | ✅ **ANGEWENDET** (Rev 3.8) | §5.9 Pkt. 4 (Update), §5.1 Pkt. 4 (Anlage), §5.10 Pkt. 7 (Synthese-Anlage) + §8 Revisionslog. Form = `- <Operation>: <concept> (<quellen>; Baseline <SHA>)`, lex (LC_ALL=C) sortiert, ` + ` getrennt, voller SHA, **kein** freier Zusatztext, **kein** Wanduhr-at im Body (Wanduhr ausschließlich im Frontmatter-`generated.at`, §5.14 Pkt. 3). = genau die Form, die Sub-Runs 3-3/3-4 mechanisch bereits demonstrieren. |
|
| **B2** — kanonische, byte-deterministische `log.md`-Eintragsform + Reihenfolge-Pin | 🟡 **TEILANGEWENDET** (Rev 3.8; Reihenfolge-Hälfte = offener Defer, D-3.13-L2-1) | **Angewendet (Rev 3.8):** die kanonische Eintragsform + kein Wanduhr-at im Body — §5.9 Pkt. 4 (Update), §5.1 Pkt. 4 (Anlage), §5.10 Pkt. 7 (Synthese-Anlage) + §8 Revisionslog. Form = `- <Operation>: <concept> (<quellen>; Baseline <SHA>)`, lex (LC_ALL=C) sortiert, ` + ` getrennt, voller SHA, **kein** freier Zusatztext, **kein** Wanduhr-at im Body (Wanduhr ausschließlich im Frontmatter-`generated.at`, §5.14 Pkt. 3). **Nicht angewendet (offener Defer, Review-Loop-2 D-3.13-L2-1):** der Entwurf-B2-Hälfte „**Reihenfolge pinnen**" (Reihenfolge der Log-Einträge *innerhalb* einer `## YYYY-MM-DD`-Datumsgruppe) ist **nicht** in compiler.md gelandet (grep 0 Treffer „Innerhalb einer Datumsgruppe"/Tie-Break) — nur die Form-/Wanduhr-Hälfte wurde umgesetzt. Latent (3× A/B-`log.md` byte-identisch, noch nie rot); Defer in deferred-work.md. |
|
||||||
| **A/B-Umfang (b)** — CREATE aus der A/B-Fixture nehmen (D-3.13-6 Option 1 → Option 2) | ✅ **ANGEWENDET** (Gate) | `run-sandbox.sh` E-Sektion: E.1 (keine beta-Quellen), AGENT_PROMPT (beta-Fakt entfernt), E.5 (CREATE-Witness entfernt, UPDATE-`alpha` bleibt), E.8 (index.md unverändert, IDX_ADDED=0), Header. A/B prüft den Update-/Erhaltungs-Kern; CREATE/Synthese gelten über Sub-Runs 3-3/3-4. |
|
| **A/B-Umfang (b)** — CREATE aus der A/B-Fixture nehmen (D-3.13-6 Option 1 → Option 2) | ✅ **ANGEWENDET** (Gate) | `run-sandbox.sh` E-Sektion: E.1 (keine beta-Quellen), AGENT_PROMPT (beta-Fakt entfernt), E.5 (CREATE-Witness entfernt, UPDATE-`alpha` bleibt), E.8 (index.md unverändert, IDX_ADDED=0), Header. A/B prüft den Update-/Erhaltungs-Kern; CREATE/Synthese gelten über Sub-Runs 3-3/3-4. |
|
||||||
| **B1** — CREATE-Slug-Signal (Inhalts-Term maßgeblich) | ⏸️ **DEFER** (offen) | **Nicht** in Rev 3.8 — der CREATE-Fall steht nicht mehr in der A/B-Fixture, daher ist der Slug-Pin für den grünen Re-Run #6 **nicht** erforderlich. Als **benannter Defer / Ask-First-Kandidat** dokumentiert (in compiler.md Rev 3.8 + Spec Change Log); §5.15 Pkt. 1 (Dateiname→Term) / §5.7 bleiben wie ist. |
|
| **B1** — CREATE-Slug-Signal (Inhalts-Term maßgeblich) | ⏸️ **DEFER** (offen) | **Nicht** in Rev 3.8 — der CREATE-Fall steht nicht mehr in der A/B-Fixture, daher ist der Slug-Pin für den grünen Re-Run #6 **nicht** erforderlich. Als **benannter Defer / Ask-First-Kandidat** dokumentiert (in compiler.md Rev 3.8 + Spec Change Log); §5.15 Pkt. 1 (Dateiname→Term) / §5.7 bleiben wie ist. |
|
||||||
| **C** — CREATE-Body byte-deterministisch | ❌ **ZURÜCKGEWIESEN** (FR-2) | Q1-Item (2) = Option (c): ein Byte-Pin des CREATE-Body widerspricht §5.1/FR-2/§5.10 Pkt. 3 („Befund-Äquivalenz, **nicht** Wort-Identität") direkt — Semantik-Change, kein Bugfix. Bewusst **nicht** ausgeführt. |
|
| **C** — CREATE-Body byte-deterministisch | ❌ **ZURÜCKGEWIESEN** (FR-2) | Q1-Item (2) = Option (c): ein Byte-Pin des CREATE-Body widerspricht §5.1/FR-2/§5.10 Pkt. 3 („Befund-Äquivalenz, **nicht** Wort-Identität") direkt — Semantik-Change, kein Bugfix. Bewusst **nicht** ausgeführt. |
|
||||||
|
|
||||||
**Konsequenz für Re-Run #6:** erwartetes E.4-Ergebnis `NON_AT=0 AT=2` (`alpha.md` at-only; `log.md` byte-identisch via gepinnter Form; `gamma.md`/`index.md` unverändert). **Nicht berührt:** frozen I/O-Matrix-Block (inkl. `GENERATED_AT_AUSNAHME`), §5.14 Pkt. 3 (at-Ausnahme = Feldwerte), §5.10 Pkt. 3 (Body-Wortlaut), §5.1 Pkt. 2 (FR-2). **Commit:** `7c3c19b` (compiler.md Rev 3.8 + Gate + dieser Autorisierungs-Träger). **Ausstehend:** 12-Sandbox-Re-Execution, Re-Run #6 (grüner Voll-Lauf), Review-Loop-2 + finaler `done`-Flip (Step-05-Status-Sync nach grünem Re-Run #6).
|
**Konsequenz für Re-Run #6:** erwartetes E.4-Ergebnis `NON_AT=0 AT=2` (`alpha.md` at-only; `log.md` byte-identisch via gepinnter Form; `gamma.md`/`index.md` unverändert). **Nicht berührt:** frozen I/O-Matrix-Block (inkl. `GENERATED_AT_AUSNAHME`), §5.14 Pkt. 3 (at-Ausnahme = Feldwerte), §5.10 Pkt. 3 (Body-Wortlaut), §5.1 Pkt. 2 (FR-2). **Commit:** `7c3c19b` (compiler.md Rev 3.8 + Gate + dieser Autorisierungs-Träger). **Ausstehend:** 12-Sandbox-Re-Execution, Re-Run #6 (grüner Voll-Lauf), Review-Loop-2 + finaler `done`-Flip (Step-05-Status-Sync nach grünem Re-Run #6).
|
||||||
|
|
||||||
**Unten:** der ursprüngliche Entwurfstext (B1 §1, B2 §2, C §3) bleibt als **historische Entscheidungsgrundlage** erhalten — die ausgeführte Form steht in §0.1; wo B1/B2 im Folgenden als „ready-to-apply" beschrieben sind, gilt: B2 angewendet (genau so wie im Entwurf), B1 nicht angewendet (Defer).
|
**Unten:** der ursprüngliche Entwurfstext (B1 §1, B2 §2, C §3) bleibt als **historische Entscheidungsgrundlage** erhalten — die ausgeführte Form steht in §0.1; wo B1/B2 im Folgenden als „ready-to-apply" beschrieben sind, gilt: B2 **teil**angewendet (Form-/Wanduhr-Hälfte ja; **Reihenfolge-Hälfte nicht** — offener Defer D-3.13-L2-1, Review-Loop-2), B1 nicht angewendet (Defer).
|
||||||
|
|
||||||
## 0. Prämisse-Korrektur (warum dieser Entwurf anders aussieht als die Q1-Prämisse)
|
## 0. Prämisse-Korrektur (warum dieser Entwurf anders aussieht als die Q1-Prämisse)
|
||||||
|
|
||||||
|
|||||||
@@ -663,3 +663,11 @@ Der Epic-3-Abnahmegate-Lauf (`_bmad-output/implementation-artifacts/sandbox-3-13
|
|||||||
**Ausgeführte Gate-Härtung (Re-Run #6-Auflösung, Re-Run #7-Pfand):** E.6 vergleicht nun **nur die drei deterministischen Felder byte-identisch A==B** + prüft die `decision`-Zeile auf **Vorhandensein** (nicht leer); die `decision`-Prosa gilt als **Befund-Äquivalenz** (Nicht-Wort-Identität, §5.10-Pkt-3-Prinzip; D-2/D-1-konsistent). Keine compiler.md-/frozen-Block-Änderung.
|
**Ausgeführte Gate-Härtung (Re-Run #6-Auflösung, Re-Run #7-Pfand):** E.6 vergleicht nun **nur die drei deterministischen Felder byte-identisch A==B** + prüft die `decision`-Zeile auf **Vorhandensein** (nicht leer); die `decision`-Prosa gilt als **Befund-Äquivalenz** (Nicht-Wort-Identität, §5.10-Pkt-3-Prinzip; D-2/D-1-konsistent). Keine compiler.md-/frozen-Block-Änderung.
|
||||||
**Offener Vertrags-Defer (Ask-First):** die **Vertrags-Vollständigkeit** — ein **byte-deterministischer Receipt** mit kanonisch gepinnter `decision`-Feldform — ist **nicht** Teil des gültigen Vertrags und wird als **separater Kandidat** für eine spätere compiler.md-Revision (Rev 3.9) oder Epic-4-Determinismus-Überarbeitung übergeben. Bis dahin gilt: deterministische Felder A==B (hart), decision-Prosa = Befund-Äquivalenz (kein Byte-Abgleich). Kein stiller Semantik-Change durch das Gate (AC-4/AD-3-konform).
|
**Offener Vertrags-Defer (Ask-First):** die **Vertrags-Vollständigkeit** — ein **byte-deterministischer Receipt** mit kanonisch gepinnter `decision`-Feldform — ist **nicht** Teil des gültigen Vertrags und wird als **separater Kandidat** für eine spätere compiler.md-Revision (Rev 3.9) oder Epic-4-Determinismus-Überarbeitung übergeben. Bis dahin gilt: deterministische Felder A==B (hart), decision-Prosa = Befund-Äquivalenz (kein Byte-Abgleich). Kein stiller Semantik-Change durch das Gate (AC-4/AD-3-konform).
|
||||||
**Home:** Story 3.13 (Gate-Härtung) / spätere compiler.md-Revision oder Epic-4 (Vertrags-Vollständigkeit).
|
**Home:** Story 3.13 (Gate-Härtung) / spätere compiler.md-Revision oder Epic-4 (Vertrags-Vollständigkeit).
|
||||||
|
|
||||||
|
## Deferred from: code review of spec-3-13-epic-3-verifikations-und-abnahmegate (Story 3.13, Review-Loop-2, 2026-08-24)
|
||||||
|
|
||||||
|
- **W-L2-1: D-NEG-FAIL-Wurzel nicht gegen beabsichtigten Punkt verifiziert** (Story 3.13, Review-Loop-2, 2026-08-24) — D-NEG.2/.3/.4 asserten nur „mindestens 1 FAIL-Verdikt pro Neg-Fixtur" (neg_count `-ge 1`), nicht dass die FAIL-Wurzel die beabsichtigte Invaliditäts-Stelle (Punkt 1/9/14-EC-3) ist. Der FAIL-Grund ist freier Validator-Prosa-Text → Punkt-Exakt-Match wäre fragil (falsch-rot-Risiko bei gültiger Prosa-Variation); der Differenz-Nachweis (pos-SUCCESS vs. je neg-FAIL, Positiv-Kontrolle im selben Käfig) + AC-3-„verhindern SUCCESS" genügt für die Abnahme. Härtungs-Kandidat für spätere Sandbox-Härtung (z. B. Punkt-Keyword-Toleranz-Grep statt Exakt-Match).
|
||||||
|
- **W-L2-2: E.6 `decision`-Präsenz-Check (nicht-leer) = beabsichtigtes Scope** (Story 3.13, Review-Loop-2, 2026-08-24) — E.6 prüft `decision:` nur auf Nicht-Leerheit (kein Format-/Längen-Minimum, keine Concept-Pfad-Referenz-Pflicht). Das ist **beabsichtigt**: `decision` ist freie LLM-Prosa (Befund-Äquivalenz, Loop-1 D-2 / Re-Run-#6-Klassifizierung); ein Stärker-Check wäre Over-Pin (dieselbe Klasse wie das Re-Run-#6-E.6-Problem) und riskiert falsch-rot. Kein Defekt.
|
||||||
|
- **D-3.13-L2-1: compiler.md Rev-3.8-Unterpinnung — B2-Reihenfolge-Pin fehlt + §8-Überreich** (Story 3.13, Review-Loop-2, 2026-08-24) — **status: offener Defer (Nutzer-Entscheidung D-3.13-L2-1 = „Defer + Bearer-Fix"; Bearer-Doc-Fix ausgeführt).** compiler.md §5.9 pinnt die Log-Eintragsform, aber **nicht** die Reihenfolge der Einträge *innerhalb* einer `## YYYY-MM-DD`-Datumsgruppe (B2-Hälfte „Reihenfolge-pinnen" von Rev 3.8 nie in compiler.md gelandet; grep 0 Treffer „Innerhalb einer Datumsgruppe"/Tie-Break); §8-Rev-3.8-Claim „jeder Eintrag byte-deterministisch ableitbar" ist überreich (Disagreement-Form §5.9 Pkt. 4 unpinnt; bare `- Anlage:`-Form nach CREATE-Entfernung ohne Live-Demo). **Klassifikation: latent (3× A/B-`log.md` byte-identisch in #7/#8/#9, noch nie rot).** Bearer-Doc (compiler-revision-3-8-…) §0.1-Zeile B2 + L26-Claim „= genau so wie im Entwurf" korrigiert auf „TEILANGEWENDET" (nur Form-/Wanduhr-Hälfte). Kandidat für spätere compiler.md-Revision (Rev 3.9) zusammen mit W-L2-2 und dem CREATE-Residual (D-3.13-L2-3). **Home:** Story 3.13 / spätere compiler.md-Revision.
|
||||||
|
- **D-3.13-L2-2: log.md `## YYYY-MM-DD`-Datumsgruppen-Header = Wanduhr außerhalb der §5.14-Pkt.-3-`at`-Ausnahme** (Story 3.13, Review-Loop-2, 2026-08-24) — **status: offener Defer (Nutzer-Entscheidung D-3.13-L2-2 = „Defer + Gate-Seite dokumentieren").** Die Datumsgruppen-Header sind Wanduhr-Werte; §5.14 Pkt. 3 nennt nur `generated.at`/`verified[].at` als Ausnahmefelder. Ein A/B-Paar, das **Mitternacht überschneidet**, erzeugt deterministisch E.4-`NON_AT`-rot (falsch-rot; der geankerte Classifier maskiert den Header korrekt NICHT). **Klassifikation: latent, nicht beobachtet (alle Läufe same-day).** Gate-Seite: der Gate-Kern (E.4-Classifier) behandelt den Header korrekt als Nicht-`at`-Zelle; same-day-Läufe sind byte-deterministisch. Kandidat für spätere compiler.md-Revision (Rev 3.9: Header an Baseline-Commit-Date koppeln ODER als benannte Ausnahmeklasse aufnehmen), gebündelt mit D-3.13-L2-1. **Home:** Story 3.13 / spätere compiler.md-Revision.
|
||||||
|
- **D-3.13-L2-3: AC-6 CREATE/Synthese — Substitutions-Notiz + frischer-LLM-CREATE-Residual** (Story 3.13, Review-Loop-2, 2026-08-24) — **status: offener Defer (Nutzer-Entscheidung D-3.13-L2-3 = „Defer + Substitution-Notiz").** AC-6 verlangt „Anlage einer neuen Wissenseinheit" + „kohärente Multi-Source-Synthese"; die A/B-Fixture (E) ist UPDATE-only. **Substitutions-Notiz (ausgeführt, Doku):** die CREATE-/Synthese-*Mechanik* (neues Concept + Index-Link Punkt 11 + Slug-Ableitung §5.15/§5.7 + Multi-Source-Synthese + log.md-Anlage) wird über die Sandbox-Sub-Runs **3-3/3-4** (mechanisch gepinnt, eigene Isolation) **strukturell** als demostriert betrachtet — die Substitution „mechanisch gepinnt ≙ frischer LLM" gilt für die *Mechanik-Struktur*, nicht für den freien LLM-Wortlaut. **Residual (offen):** der **frische-LLM-CREATE-Unterpfad** ist nicht-deterministisch (Re-Run-#5-Befund: 24/26 NON_AT CREATE-/Slug-getrieben; ohne compiler.md-CREATE-Pinning = deterministisch rot) und steht damit als **benanntes, nicht-deterministisches Residual** hier — kein Gate-Defekt, sondern eine bekannte Vertrags-/Instruktions-Grenze (CREATE-Body bleibt FR-2 „Befund-Äquivalenz, nicht Wort-Identität"). Kandidat für spätere Vertrags-Revision/Epic-4-Determinismus-Überarbeitung. **Home:** Story 3.13 / spätere compiler.md-Revision oder Epic-4.
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
# Exit: 0 = ALLE harten Checks grün (Szenarien + Gate + Nachweise);
|
# Exit: 0 = ALLE harten Checks grün (Szenarien + Gate + Nachweise);
|
||||||
# ≠0 = irgendein harter Check rot (fail-fast, FAILED>0 → exit 1).
|
# ≠0 = irgendein harter Check rot (fail-fast, FAILED>0 → exit 1).
|
||||||
#
|
#
|
||||||
# Review-Loop-2-Härtung (Story 3.13, D-3.13-1..6 + P-2..P-15):
|
# Review-Loop-1- + Re-Run-Härtung (Story 3.13, D-3.13-1..7 + P-1..P-19):
|
||||||
# - D-1: AGENT_PROMPT = nur compiler.md-Anweisung + Fixture-Fakten;
|
# - D-1: AGENT_PROMPT = nur compiler.md-Anweisung + Fixture-Fakten;
|
||||||
# KEINE erwarteten Plan-/Entscheidungs-/Receipt-/Log-Literale.
|
# KEINE erwarteten Plan-/Entscheidungs-/Receipt-/Log-Literale.
|
||||||
# - D-2: E.6 = Run-Receipt-A-vs-B-Abgleich (ohne erwartete Literale;
|
# - D-2: E.6 = Run-Receipt-A-vs-B-Abgleich (ohne erwartete Literale;
|
||||||
@@ -79,6 +79,21 @@
|
|||||||
# statt dem Worktree-Vor-Mutation-HEAD (zwei Commits mit "Baseline" in der
|
# statt dem Worktree-Vor-Mutation-HEAD (zwei Commits mit "Baseline" in der
|
||||||
# Betreffzeile). E.6-Assertions UNVERÄNDERT (A==B byte-identisch) —
|
# Betreffzeile). E.6-Assertions UNVERÄNDERT (A==B byte-identisch) —
|
||||||
# geändert ist die wohldefinierte Feld-Semantik, nicht der Check.
|
# geändert ist die wohldefinierte Feld-Semantik, nicht der Check.
|
||||||
|
# - Review-Loop-2 (2026-08-24, D-3.13-L2-1..4 entschieden, P-L2-1..8 Gate-Anteil):
|
||||||
|
# P-L2-1 E.6-Known-Value-Witness gegen $BASE (baseline == $BASE;
|
||||||
|
# sources_added == raw/alpha-v2.md — der einzige neue Zuwachs der
|
||||||
|
# UPDATE-only-Fixture) — A==B allein lässt einen KONSISTENT-FALSCHEN Wert
|
||||||
|
# passieren (Re-Run-#8-Klasse); P-L2-2 E.6-Feldsatz (jedes Receipt trägt
|
||||||
|
# exakt die 4 Feldzeilen) — ein fehlender/falscher Feldname würde sonst
|
||||||
|
# "beide leer" A==B still passieren; P-L2-3 candidates-Serialisierung
|
||||||
|
# gepinnt (lexikografisch, kommagetrennt OHNE Leerzeichen, oder leer);
|
||||||
|
# P-L2-4 Prompt-Wortung korrigiert (compiler.md definiert den Run-Receipt-
|
||||||
|
# KONZEPT, §5.14 Pkt. 2, aber nicht die konkrete 4-Felder-Dateiform;
|
||||||
|
# "0 Treffer receipt" war ein Case-Sensitivity-Artefakt: 15 "Run-Receipt"
|
||||||
|
# vs. 0 lowercase); P-L2-5 P-16-Floor dezimal ($((10#…)) — führende Nullen
|
||||||
|
# wären oktal interpretiert); P-L2-6 E.9 greift die Kanon-Form "Baseline
|
||||||
|
# $BASE" (Rev-3.8-Eintragsform) statt des nackten SHA-Substrings;
|
||||||
|
# P-L2-7/-8: Meldewortung A.2 (5 Referenzen) + D-NEG.3-Label (Punkt 9).
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
@@ -133,7 +148,7 @@ TOKEN_FLOOR=32000
|
|||||||
_cur_tokens="${CLAUDE_CODE_MAX_OUTPUT_TOKENS:-}"
|
_cur_tokens="${CLAUDE_CODE_MAX_OUTPUT_TOKENS:-}"
|
||||||
case "$_cur_tokens" in
|
case "$_cur_tokens" in
|
||||||
''|*[!0-9]*) export CLAUDE_CODE_MAX_OUTPUT_TOKENS="$TOKEN_FLOOR" ;;
|
''|*[!0-9]*) export CLAUDE_CODE_MAX_OUTPUT_TOKENS="$TOKEN_FLOOR" ;;
|
||||||
*) if [ "$_cur_tokens" -lt "$TOKEN_FLOOR" ]; then export CLAUDE_CODE_MAX_OUTPUT_TOKENS="$TOKEN_FLOOR"; fi ;;
|
*) if [ "$((10#$_cur_tokens))" -lt "$TOKEN_FLOOR" ]; then export CLAUDE_CODE_MAX_OUTPUT_TOKENS="$TOKEN_FLOOR"; fi ;;
|
||||||
esac
|
esac
|
||||||
echo "CLAUDE_CODE_MAX_OUTPUT_TOKENS: $CLAUDE_CODE_MAX_OUTPUT_TOKENS (Floor $TOKEN_FLOOR, P-16)"
|
echo "CLAUDE_CODE_MAX_OUTPUT_TOKENS: $CLAUDE_CODE_MAX_OUTPUT_TOKENS (Floor $TOKEN_FLOOR, P-16)"
|
||||||
command -v timeout >/dev/null || hardfail "timeout fehlt (git-for-win/coreutils erwartet)"
|
command -v timeout >/dev/null || hardfail "timeout fehlt (git-for-win/coreutils erwartet)"
|
||||||
@@ -145,7 +160,7 @@ command -v bash >/dev/null || hardfail "bash fehlt"
|
|||||||
for ref in schema/compiler.md schema/validator.md schema/wiki-compiler.md schema/canonical-terms.md adapters/README.md; do
|
for ref in schema/compiler.md schema/validator.md schema/wiki-compiler.md schema/canonical-terms.md adapters/README.md; do
|
||||||
[ -f "$ref" ] || hardfail "Referenz-Schema fehlt: $ref"
|
[ -f "$ref" ] || hardfail "Referenz-Schema fehlt: $ref"
|
||||||
done
|
done
|
||||||
pass "A.2 Referenz-Schemata vorhanden (compiler/validator/adapters)"
|
pass "A.2 Referenz-Schemata vorhanden (compiler/validator/wiki-compiler/canonical-terms/adapters)"
|
||||||
# A.3: Bundle-Vorbedingungen im Ist-Repo — nur vertraglich definierte Prämissen:
|
# A.3: Bundle-Vorbedingungen im Ist-Repo — nur vertraglich definierte Prämissen:
|
||||||
# V-1 Bundleroot (Vertrag §2/Validator §3.2), log.md (Vertrag §5, reserviert),
|
# V-1 Bundleroot (Vertrag §2/Validator §3.2), log.md (Vertrag §5, reserviert),
|
||||||
# raw/ = Evidenzverzeichnis. KEINE fixe Area-Menge im Vertrag (V-5/V-6 existieren
|
# raw/ = Evidenzverzeichnis. KEINE fixe Area-Menge im Vertrag (V-5/V-6 existieren
|
||||||
@@ -446,7 +461,7 @@ neg1=$(neg_count neg-1.md); neg2=$(neg_count neg-2.md); neg3=$(neg_count neg-3.m
|
|||||||
pos1=$(pos_count pos.md)
|
pos1=$(pos_count pos.md)
|
||||||
[ "$neg1" -ge 1 ] && pass "D-NEG.2 neg-1 (ohne type): FAIL-Verdikt erhalten" \
|
[ "$neg1" -ge 1 ] && pass "D-NEG.2 neg-1 (ohne type): FAIL-Verdikt erhalten" \
|
||||||
|| fail "D-NEG.2 neg-1: kein FAIL-Verdikt (AC-3-Hälfte verletzt)"
|
|| fail "D-NEG.2 neg-1: kein FAIL-Verdikt (AC-3-Hälfte verletzt)"
|
||||||
[ "$neg2" -ge 1 ] && pass "D-NEG.3 neg-2 (ohne okf_version): FAIL-Verdikt erhalten" \
|
[ "$neg2" -ge 1 ] && pass "D-NEG.3 neg-2 (okf_version außerhalb Bundleroot, Punkt 9): FAIL-Verdikt erhalten" \
|
||||||
|| fail "D-NEG.3 neg-2: kein FAIL-Verdikt (AC-3-Hälfte verletzt)"
|
|| fail "D-NEG.3 neg-2: kein FAIL-Verdikt (AC-3-Hälfte verletzt)"
|
||||||
[ "$neg3" -ge 1 ] && pass "D-NEG.4 neg-3 (at: 2026-02-31): FAIL-Verdikt erhalten" \
|
[ "$neg3" -ge 1 ] && pass "D-NEG.4 neg-3 (at: 2026-02-31): FAIL-Verdikt erhalten" \
|
||||||
|| fail "D-NEG.4 neg-3: kein FAIL-Verdikt (AC-3-Hälfte verletzt)"
|
|| fail "D-NEG.4 neg-3: kein FAIL-Verdikt (AC-3-Hälfte verletzt)"
|
||||||
@@ -558,9 +573,9 @@ Fakten zur committeten Fixture in diesem Worktree (ausschließlich Fakten, keine
|
|||||||
|
|
||||||
Zwei LIEFERUNGEN sind PFLICHT (ein Lauf ohne beide ist NICHT abgeschlossen):
|
Zwei LIEFERUNGEN sind PFLICHT (ein Lauf ohne beide ist NICHT abgeschlossen):
|
||||||
1. Die Mutationen in wiki/ (Concepts, index.md, log.md) — EXAKT nach den Konventionen von schema/compiler.md, keine vorgegebenen Werte.
|
1. Die Mutationen in wiki/ (Concepts, index.md, log.md) — EXAKT nach den Konventionen von schema/compiler.md, keine vorgegebenen Werte.
|
||||||
2. Die Datei run-receipt.txt im Worktree-Root (AUSSERHALB von wiki/ und raw/). Dies ist eine GATE-spezifische Berichtsdatei, die schema/compiler.md NICHT definiert — du ERSTELLST sie selbst nach dem Lauf, in EXAKT dieser Form (4 Zeilen, Feldnamen exakt wie unten; Werte aus deinem Lauf, keine vorgegebenen Werte; je Feld genau die DEFINIERTE Ableitung — ein Lauf mit einer anderen Ableitung ist fehlerhaft):
|
2. Die Datei run-receipt.txt im Worktree-Root (AUSSERHALB von wiki/ und raw/). Dies ist eine GATE-spezifische Berichtsdatei in einer konkreten Form, die schema/compiler.md nicht so definiert (compiler.md benennt den Run-Receipt als Konzept mit "Entscheidungen" in §5.14 Pkt. 2, aber diese 4-Felder-Dateiform ist GATE-spezifisch) — du ERSTELLST sie selbst nach dem Lauf, in EXAKT dieser Form (4 Zeilen, Feldnamen exakt wie unten, keine weiteren Zeilen; Werte aus deinem Lauf, keine vorgegebenen Werte; je Feld genau die DEFINIERTE Ableitung — ein Lauf mit einer anderen Ableitung ist fehlerhaft):
|
||||||
baseline: <volles SHA des Commits, den dein Worktree als HEAD trug VOR deiner ersten Mutation (git rev-parse HEAD in deinem Arbeitsverzeichnis, bevor du wiki/ änderst)>
|
baseline: <volles SHA des Commits, den dein Worktree als HEAD trug VOR deiner ersten Mutation (git rev-parse HEAD in deinem Arbeitsverzeichnis, bevor du wiki/ änderst)>
|
||||||
candidates: <deine Candidate-Liste aus der Relevanzbestimmung, kommagetrennt, oder leer>
|
candidates: <deine Candidate-Liste aus der Relevanzbestimmung: kommagetrennt OHNE Leerzeichen nach Komma, lexikografisch sortiert (LC_ALL=C), oder leer>
|
||||||
decision: <deine Form-Entscheidung je Mutation>
|
decision: <deine Form-Entscheidung je Mutation>
|
||||||
sources_added: <die resource:-Werte (Pfad) der raw/-Ressourcen, die dein Lauf der Frontmatter-sources:-Liste der mutierten Concepts NEU gegenüber dem Vor-Mutation-Zustand hinzufügt; mehrere Werte kommagetrennt und lexikografisch sortiert; leer, falls keine>
|
sources_added: <die resource:-Werte (Pfad) der raw/-Ressourcen, die dein Lauf der Frontmatter-sources:-Liste der mutierten Concepts NEU gegenüber dem Vor-Mutation-Zustand hinzufügt; mehrere Werte kommagetrennt und lexikografisch sortiert; leer, falls keine>
|
||||||
|
|
||||||
@@ -711,8 +726,21 @@ receipt_field() {
|
|||||||
| sed "s|$ROOT/wt-a|WT|g; s|$ROOT/wt-b|WT|g" \
|
| sed "s|$ROOT/wt-a|WT|g; s|$ROOT/wt-b|WT|g" \
|
||||||
| sed -E 's/[[:space:]]+$//; s/\r$//'
|
| sed -E 's/[[:space:]]+$//; s/\r$//'
|
||||||
}
|
}
|
||||||
# Deterministische strukturierte Felder: A==B byte-identisch (Muss-Kern).
|
|
||||||
E6_FAIL=0
|
E6_FAIL=0
|
||||||
|
# P-L2-2 (Review-Loop-2): Feldsatz-Prüfung — jedes Receipt trägt EXAKT die vier
|
||||||
|
# Feldzeilen (baseline/candidates/decision/sources_added), jede genau einmal;
|
||||||
|
# ein fehlender/falscher Feldname würde sonst "beide leer" A==B still passieren.
|
||||||
|
for wt in a b; do
|
||||||
|
ffile="$ROOT/wt-$wt/run-receipt.txt"
|
||||||
|
for fld in baseline candidates decision sources_added; do
|
||||||
|
[ "$(grep -c "^$fld:" "$ffile")" -eq 1 ] \
|
||||||
|
|| { echo "HARD-FAIL (E.6): run-receipt.txt $wt: Feldzeile '$fld:' fehlt oder kommt mehrfach vor" >&2; E6_FAIL=1; }
|
||||||
|
done
|
||||||
|
foreign=$(grep -cv '^\(baseline\|candidates\|decision\|sources_added\):' "$ffile" || true)
|
||||||
|
[ "$foreign" -eq 0 ] \
|
||||||
|
|| { echo "HARD-FAIL (E.6): run-receipt.txt $wt: $foreign unzulässige Zeile(n) (Feldsatz = exakt die 4 Felder)" >&2; E6_FAIL=1; }
|
||||||
|
done
|
||||||
|
# Deterministische strukturierte Felder: A==B byte-identisch (Muss-Kern).
|
||||||
for fld in baseline candidates sources_added; do
|
for fld in baseline candidates sources_added; do
|
||||||
va=$(receipt_field "$RA" "$fld")
|
va=$(receipt_field "$RA" "$fld")
|
||||||
vb=$(receipt_field "$RB" "$fld")
|
vb=$(receipt_field "$RB" "$fld")
|
||||||
@@ -723,6 +751,19 @@ for fld in baseline candidates sources_added; do
|
|||||||
E6_FAIL=1
|
E6_FAIL=1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
# P-L2-1 (Review-Loop-2): Known-Value-Witness gegen $BASE (Loop-1-D-2-Prinzip
|
||||||
|
# "Nicht-Vakuum-Witness gegen Baseline") — A==B allein fängt keinen
|
||||||
|
# KONSISTENT-FALSCHEN Wert (Re-Run-#8-Klasse). Beide Läufe stehen auf dem
|
||||||
|
# selben $BASE; die erwarteten Werte sind REINE FUNKTIONEN der Fixture:
|
||||||
|
# baseline == $BASE (Worktree trug $BASE als HEAD VOR der Mutation)
|
||||||
|
# sources_added == raw/alpha-v2.md (einziger neuer Zuwachs; ein korrekter
|
||||||
|
# CONFIRMING-Update-Lauf MUSS ihn in alpha.sources aufnehmen)
|
||||||
|
bva=$(receipt_field "$RA" "baseline"); bvb=$(receipt_field "$RB" "baseline")
|
||||||
|
[ "$bva" = "$BASE" ] || { echo "HARD-FAIL (E.6): baseline A='$bva' != \$BASE='$BASE' (Known-Value-Witness)" >&2; E6_FAIL=1; }
|
||||||
|
[ "$bvb" = "$BASE" ] || { echo "HARD-FAIL (E.6): baseline B='$bvb' != \$BASE='$BASE' (Known-Value-Witness)" >&2; E6_FAIL=1; }
|
||||||
|
sva=$(receipt_field "$RA" "sources_added"); svb=$(receipt_field "$RB" "sources_added")
|
||||||
|
[ "$sva" = "raw/alpha-v2.md" ] || { echo "HARD-FAIL (E.6): sources_added A='$sva' != 'raw/alpha-v2.md' (Known-Value-Witness)" >&2; E6_FAIL=1; }
|
||||||
|
[ "$svb" = "raw/alpha-v2.md" ] || { echo "HARD-FAIL (E.6): sources_added B='$svb' != 'raw/alpha-v2.md' (Known-Value-Witness)" >&2; E6_FAIL=1; }
|
||||||
# decision: Struktur-Vorhandensein (nicht leer) — PROSA = Befund-Äquivalenz (kein Byte-Vergleich).
|
# decision: Struktur-Vorhandensein (nicht leer) — PROSA = Befund-Äquivalenz (kein Byte-Vergleich).
|
||||||
da=$(receipt_field "$RA" "decision")
|
da=$(receipt_field "$RA" "decision")
|
||||||
db=$(receipt_field "$RB" "decision")
|
db=$(receipt_field "$RB" "decision")
|
||||||
@@ -733,7 +774,7 @@ cat "$RA"
|
|||||||
echo " --- run-receipt.txt B (deterministische Felder + decision-Befund) ---"
|
echo " --- run-receipt.txt B (deterministische Felder + decision-Befund) ---"
|
||||||
cat "$RB"
|
cat "$RB"
|
||||||
if [ "$E6_FAIL" -eq 0 ]; then
|
if [ "$E6_FAIL" -eq 0 ]; then
|
||||||
pass "E.6 Run-Receipt A==B: deterministische Felder (baseline/candidates/sources_added) byte-identisch; decision-Befund anwesend (Prosa = Befund-Äquivalenz, D-2/D-1)"
|
pass "E.6 Run-Receipt: Feldsatz exakt (P-L2-2) + A==B byte-identisch + Known-Value-Witness gegen \$BASE (P-L2-1); decision-Befund anwesend (Prosa = Befund-Äquivalenz, D-2/D-1)"
|
||||||
else
|
else
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -780,8 +821,11 @@ for wt in a b; do
|
|||||||
LOG_HEAD=$(git -C "$ROOT/wt-$wt" show 'HEAD:wiki/log.md' | sha256sum | cut -d' ' -f1)
|
LOG_HEAD=$(git -C "$ROOT/wt-$wt" show 'HEAD:wiki/log.md' | sha256sum | cut -d' ' -f1)
|
||||||
[ "$LOG_BASE" != "$LOG_HEAD" ] \
|
[ "$LOG_BASE" != "$LOG_HEAD" ] \
|
||||||
|| { echo "HARD-FAIL (E.9): log.md in $wt == Baseline (kein Lauf-Eintrag)" >&2; exit 1; }
|
|| { echo "HARD-FAIL (E.9): log.md in $wt == Baseline (kein Lauf-Eintrag)" >&2; exit 1; }
|
||||||
git -C "$ROOT/wt-$wt" show 'HEAD:wiki/log.md' | grep -q "$BASE" \
|
# P-L2-6 (Review-Loop-2): Kanon-Form "Baseline <volles-SHA>" (Rev 3.8, §5.9
|
||||||
|| { echo "HARD-FAIL (E.9): log.md-Eintrag in $wt ohne volles Baseline-SHA (R-1)" >&2; exit 1; }
|
# Pkt. 4) statt nackten SHA-Substrings — der Substring greift auch außerhalb
|
||||||
|
# der kanonischen Eintragsform.
|
||||||
|
git -C "$ROOT/wt-$wt" show 'HEAD:wiki/log.md' | grep -q "Baseline $BASE" \
|
||||||
|
|| { echo "HARD-FAIL (E.9): log.md-Eintrag in $wt ohne kanonische 'Baseline $BASE'-Form (R-1/P-L2-6)" >&2; exit 1; }
|
||||||
done
|
done
|
||||||
pass "E.9 log.md (A und B): Lauf-Eintrag vorhanden und trägt volles Baseline-SHA (R-1)"
|
pass "E.9 log.md (A und B): Lauf-Eintrag vorhanden und trägt volles Baseline-SHA (R-1)"
|
||||||
|
|
||||||
|
|||||||
+38
-7
@@ -67,7 +67,7 @@ context:
|
|||||||
|
|
||||||
**Execution:**
|
**Execution:**
|
||||||
- [x] `_bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh` — Gate-Skript bauen (Setup → Käfig-Bau → 12-Sandbox-Fail-Fast → Validator-Agent → Zwei-frische-Agenten-A/B → G-1..G-8 → Porcelain-Check), harte PASS/FAIL, Exit 0, `/tmp`-Kopie nie Ist-Baum
|
- [x] `_bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh` — Gate-Skript bauen (Setup → Käfig-Bau → 12-Sandbox-Fail-Fast → Validator-Agent → Zwei-frische-Agenten-A/B → G-1..G-8 → Porcelain-Check), harte PASS/FAIL, Exit 0, `/tmp`-Kopie nie Ist-Baum
|
||||||
- [x] `schema/compiler.md`/`schema/validator.md`/`adapters/`/`raw/` — read-only verifizieren (kein Diff), `schema/canonical-terms.md` unangetastet (AD-3)
|
- [x] `schema/compiler.md`/`schema/validator.md`/`adapters/`/`raw/` — durch das **Gate** read-only verifiziert (kein Gate-Diff; AD-3); `schema/compiler.md`-Diff = separat **autorisierte** Rev 3.8 (nicht durch das Gate), `schema/canonical-terms.md` unangetastet
|
||||||
- [ ] Gate real ausführen (mehrere Läufe, inkl. skript-seitiger Zwei-/Mehr-Lauf-Stabilität) bis Exit 0; Negativ-Kontrollen ausführen
|
- [ ] Gate real ausführen (mehrere Läufe, inkl. skript-seitiger Zwei-/Mehr-Lauf-Stabilität) bis Exit 0; Negativ-Kontrollen ausführen
|
||||||
- [ ] `_bmad-output/implementation-artifacts/sprint-status.yaml` — Key 3-13 → `done`, `epic-3` Status-Kette prüfen, `last_updated` aktualisieren (Step-05 nach Review)
|
- [ ] `_bmad-output/implementation-artifacts/sprint-status.yaml` — Key 3-13 → `done`, `epic-3` Status-Kette prüfen, `last_updated` aktualisieren (Step-05 nach Review)
|
||||||
- [x] `_bmad-output/implementation-artifacts/epic-3-context.md` — Abnahme-Zeile auf Ist-Zustand nachführen
|
- [x] `_bmad-output/implementation-artifacts/epic-3-context.md` — Abnahme-Zeile auf Ist-Zustand nachführen
|
||||||
@@ -125,14 +125,45 @@ _Review-Loop 1 (bmad-code-review, 4 Layer — blind-hunter / edge-case-hunter /
|
|||||||
|
|
||||||
_Dismissed (6): G-6-„Hash-Primitive"-Beobachtung (Duplikat von D-3.13-3/P-2); „E.5/E.7-Witness stärker als reiner A/B-Vergleich" (unter D-3.13-1 subsumiert); „Status-Dokumente stützen sich auf geschwächte Assertions" (Konsequenz, kein eigener Befund); „$BASE-SHA nicht reproduzierbar / PASS_COUNT-Drift" (Duplikat von P-12/W-2, Reconciliation: 70 stimmt exakt mit dem aktuellen Skript); „review_loop_iteration: 0" (unter D-3.13-7 subsumiert); „12 Suiten alle hart"-Claim (Duplikat von P-1)._
|
_Dismissed (6): G-6-„Hash-Primitive"-Beobachtung (Duplikat von D-3.13-3/P-2); „E.5/E.7-Witness stärker als reiner A/B-Vergleich" (unter D-3.13-1 subsumiert); „Status-Dokumente stützen sich auf geschwächte Assertions" (Konsequenz, kein eigener Befund); „$BASE-SHA nicht reproduzierbar / PASS_COUNT-Drift" (Duplikat von P-12/W-2, Reconciliation: 70 stimmt exakt mit dem aktuellen Skript); „review_loop_iteration: 0" (unter D-3.13-7 subsumiert); „12 Suiten alle hart"-Claim (Duplikat von P-1)._
|
||||||
|
|
||||||
|
### Review Findings — Review-Loop 2 (2026-08-24)
|
||||||
|
|
||||||
|
_Review-Loop 2 (bmad-code-review, 4 Layer — blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor, 2026-08-24; Diff `50f3628..HEAD` + working tree: E.6-Härtung 77fd460, P-18 65dfc26, P-19 cccc0a3, Status-Sync-Docs; 38 rohe Befunde → nach Dedup (gleicher Claim + gleiche Aktion) und Code-Verifikation: **4 decision-needed / 11 patch / 2 defer / 4 dismissed**.)_
|
||||||
|
|
||||||
|
**Decision-Needed (4):**
|
||||||
|
|
||||||
|
- [x] [Review][Decision] **D-3.13-L2-1 (RESOLVED — Defer + Bearer-Fix, Nutzer-Option 1): compiler.md Rev-3.8-Unterpinnung — B2-Reihenfolge-Pin fehlt, §8-Überreich, Bearer-Claim falsch** [schema/compiler.md §5.9/§8 + compiler-revision-3-8-bearer] — (a) §5.9 pinnt die Log-Eintragsform, aber **nicht** die Reihenfolge *innerhalb* einer `## YYYY-MM-DD`-Datumsgruppe (B2-Hälfte „Reihenfolge-pinnen" von Rev 3.8 nie in compiler.md gelandet; grep 0 Treffer „Innerhalb einer Datumsgruppe"/Tie-Break); (b) §8-Rev-3.8-Claim „jeder Eintrag byte-deterministisch ableitbar" + „Sub-Runs 3-3/3-4 demonstrieren" ist **überreich** (Disagreement-Form unpinnt; nur 2/3 Formen live demonstriert, bare `- Anlage:` nach CREATE-Entfernung ohne Live-Beleg); (c) Bearer-Doc §0.1 „B2 ✅ ANGEWENDET … = genau so wie im Entwurf" ist für die **Reihenfolge-Hälfte falsch** (nur Form-/Wanduhr-Hälfte angewendet). Latent (3× grün bis E.6, noch nie rot); Bearer-Falschheit = echter Doku-Defekt. compiler.md ist READ-ONLY (AC-4). Options: (1) autorisierte **Rev 3.9** (Reihenfolge-Pin + §8-Korrektur + Bearer-Fix); (2) **deferen** (Lücke benennen) + Bearer-Doc-Claim als Doku-Korrektur richten (erlaubt, kein compiler.md-Change).
|
||||||
|
- [x] [Review][Decision] **D-3.13-L2-2 (RESOLVED — Defer + Gate-Seite dokumentiert, Nutzer-Option 1): log.md `## YYYY-MM-DD`-Datumsgruppen-Header = Wanduhr, außerhalb der at-Ausnahme** [schema/compiler.md §5.9/§5.14 Pkt. 3 + run-sandbox.sh E.4] — Die Datumsgruppen-Header sind Wanduhr-Werte, aber §5.14 Pkt. 3 nennt **nur** `generated.at`/`verified[].at` als Ausnahmefelder. Ein A/B-Paar, das Mitternacht überschneidet, erzeugt deterministisch einen **NON_AT-rot** an E.4 (falsch-rot; der geankerte Classifier maskiert den Header korrekt NICHT). Noch nicht beobachtet (Läufe same-day). Options: (1) Header an **Baseline-Commit-Date** koppeln (compiler.md-Change); (2) als **benannte Ausnahmeklasse** zu §5.14 Pkt. 3 aufnehmen (compiler.md-Change); (3) deferen + Gate-Seite dokumentiert behandeln.
|
||||||
|
- [x] [Review][Decision] **D-3.13-L2-3 (RESOLVED — Defer + Substitutions-Notiz, Nutzer-Option 1): AC-6 CREATE/Synthese — kein frischer-LLM-Lauf, Substitution unbewiesen, Residual nie deferred** [run-sandbox.sh E.1 + AC-6] — AC-6 verlangt „Anlage einer neuen Wissenseinheit" + „kohärente Multi-Source-Synthese". Die A/B-Fixture ist **UPDATE-only** (keine CREATE); CREATE/Synthese gilt „über Sub-Runs 3-3/3-4 als demostriert" (Loop-1 D-3.13-6 Option 2) — aber 3-3/3-4 sind **mechanisch gepinnte Subshells ohne frischen LLM**, und diese Substitution (mechanisch ≙ frischer-LLM) wird selbst **nie behauptet/geprüft**; das CREATE-Residual steht **nicht** in deferred-work.md. Re-Run #5 belegte: frischer-LLM-CREATE ist **nicht-deterministisch** (24/26 NON_AT) → ein frischer-LLM-CREATE-Run würde das Gate **rot** machen (ohne compiler.md-CREATE-Pinning). Options: (1) frischer-LLM-CREATE-Residual **deferen** + Substitutions-Validität als Doku-Notiz **asserten** (empfohlen); (2) dedizierten frischer-LLM-Struktur-CREATE-Run ins Gate (würde ohne Rev rot).
|
||||||
|
- [x] [Review][Decision] **D-3.13-L2-4 (RESOLVED — dokumentierte Abweichung annotiert, Nutzer-Option 1): frozen Approach-Zeile „greift nie auf den Ist-Baum zu" (spec L24) vs. G-7/P-13 Ist-Baum-Read** [spec-3-13 L24, frozen-Block L12-51] — G-7 liest **relativ `$REPO_ROOT`** den realen Ist-Baum (read-only, AC-8-Consumer-Smoke; P-13) → die frozen-Zeile ist **literal falsch**. Intent: „nie mutiert/schreibt in den Ist-Baum" (G-8-Porcelain). frozen-Block ändert nur mit Bestätigung. Options: (1) als **dokumentierte Abweichung annotieren** (frozen-Zeile unangetastet, Change-Log-Notiz: G-7-Read ist die intendierte AC-8-Smoke, read-only) — empfohlen; (2) frozen-Zeile **renegotieren** (menschliche Bestätigung).
|
||||||
|
|
||||||
|
**Patch (11):**
|
||||||
|
|
||||||
|
- [x] [Review][Patch] **P-L2-1 (HIGH, ANGEWENDET): E.6 kennt den korrekten Wert nie — nur A==B** [run-sandbox.sh:715-735] — E.6 prüft `baseline`/`candidates`/`sources_added` nur auf **A==B**. Ein **konsistent-falscher** Wert (beide Läufe liefern dasselbe Falsche) — exakt die **Re-Run-#8-Klasse** — passiert. Known-Value-Witness fehlt (widerspricht dem Loop-1-D-2-„Nicht-Vakuum-Witness gegen Baseline"). Fix: `baseline == $BASE` (E.2-bekannt, reine Funktion — bulletproof) + `sources_added ==` der Fixture-ableitbarer erwarteter Wert (UPDATE-only-Fixture: `raw/alpha-v2.md`, der einzige neue Zuwachs, den ein korrekter CONFIRMING-Run in `alpha.sources` aufnehmen MUSS). **Verhaltensändernd → Gate-Re-Run nötig.**
|
||||||
|
- [x] [Review][Patch] **P-L2-2 (MED, ANGEWENDET): E.6 validiert weder Feldsatz noch Zeilenzahl** [run-sandbox.sh:709-713] — `receipt_field` (sed `^$2:`) liefert bei **falschem Feldnamen/fehlendem Feld** leer → A==B beide leer → **passt still**. Eine fehlgeformte Receipt (falsche Feldnamen) passiert als „beide leer". Fix: prüfen, dass die Receipt **exakt** die 4 erwarteten Feldzeilen (baseline/candidates/decision/sources_added) trägt, keine Unexpected-Felder. **Verhaltensändernd → Gate-Re-Run nötig.**
|
||||||
|
- [x] [Review][Patch] **P-L2-3 (ANGEWENDET): `candidates`-Serialisierung unpinnt** [run-sandbox.sh:563] — Prompt sagt „kommagetrennt, oder leer" aber pinnt weder Sortierung noch Trenn-Format (`alpha,gamma` vs `alpha, gamma` vs Reihenfolge) → latent flaky (A==B fängt nur Divergenz). Fix: Serialisierung pinnen (lexikografisch, kein Leerzeichen nach Komma, oder leer) — konsistent mit `sources_added`. **Verhaltensändernd (Prompt) → Gate-Re-Run nötig.**
|
||||||
|
- [x] [Review][Patch] **P-L2-4 (ANGEWENDET): AGENT_PROMPT „compiler.md NICHT definiert" faktisch untergraben** [run-sandbox.sh:561] — compiler.md §5.14 Pkt. 2 definiert den **Run-Receipt-KONZEPT** (15 Treffer „Run-Receipt" inkl. „Entscheidungen"); nur lowercase `receipt` = 0. Die Aussage „die schema/compiler.md NICHT definiert" ist in ihrer starken Form unzutreffend. Fix: „definiert den Run-Receipt-Konzept (§5.14 Pkt. 2) aber nicht die konkrete `run-receipt.txt`-Datei/4-Felder-Form". **Verhaltensändernd (Prompt-Text) → Gate-Re-Run nötig.** (Parallel: Doku-Korrektur in deferred-work D-3.13-R6-1 + Spec-Change-Log #6/#7/#8, s. P-L2-10.)
|
||||||
|
- [x] [Review][Patch] **P-L2-5 (ANGEWENDET): P-16-Floor-Vergleich oktaler bei führenden Nullen** [run-sandbox.sh:136] — `[ "$_cur_tokens" -lt "$TOKEN_FLOOR" ]` interpretiert führende Nullen **oktal** (`016000` → 14336) → falsche Floor-Entscheidung. Fix: dezimal erzwungen (`$((10#$_cur_tokens))`). **Nicht verhaltensändernd im Normalfall (Env-Werte ohne führende Null); `bash -n` + Logik-Check genügt.**
|
||||||
|
- [x] [Review][Patch] **P-L2-6 (ANGEWENDET): E.9 greift nacktes `$BASE`-Substring statt Kanon-Form** [run-sandbox.sh:783] — `grep -q "$BASE"` matcht das SHA auch außerhalb der kanonischen `Baseline <volles-SHA>`-Form. Fix: `grep -q "Baseline $BASE"` (Rev-3.8-Kanon-Form). **Verhaltensändernd (Assertion) → Gate-Re-Run nötig.**
|
||||||
|
- [x] [Review][Patch] **P-L2-7 (ANGEWENDET): A.2-Pass-Meldung ungenau** [run-sandbox.sh:148] — Loop prüft **5** Referenzen (compiler/validator/wiki-compiler/canonical-terms/adapters-README), Meldung sagt „(compiler/validator/adapters)". Fix: Meldung an die 5 ausrichten. **Kosmetisch; `bash -n` genügt.**
|
||||||
|
- [x] [Review][Patch] **P-L2-8 (ANGEWENDET): D-NEG.3-Label stale** [run-sandbox.sh:449-450] — „neg-2 (ohne okf_version)" — die Fixtur trägt `okf_version` **in einer Concept-Datei** (= außerhalb Bundleroot, Punkt 9), nicht „ohne". Fix: Label auf „okf_version außerhalb Bundleroot (Punkt 9)" korrigieren. **Kosmetisch; `bash -n` genügt.**
|
||||||
|
- [x] [Review][Patch] **P-L2-9 (ANGEWENDET): Spec-Change-Log #6 überzeichnet E.7–E.9 „grün"** [spec-3-13 Change-Log] — Re-Run #6 brach an **E.6** ab → E.7/E.8/E.9 wurden **nicht** erreicht; der #6-Eintrag behauptet sie „grün". Fix: Wortung korrigieren (E.7–E.9 „nicht erreicht" wegen E.6-Abbruch).
|
||||||
|
- [x] [Review][Patch] **P-L2-10 (ANGEWENDET): Spec-Change-Log #7/#8 + deferred-work: Heading-/Wortungs-Fehler + „0 Treffer receipt"-Case-Artefakt** [spec-3-13 Change-Log #7/#8 + deferred-work D-3.13-R6-1] — (a) #8 „Erstmals erreicht und grün" unzutreffend (C 12/12, D, E.1–E.5 waren in #5/#6/#7 schon grün); (b) #8 „5/5 Receipts" Arithmetik ungenau (5 von 6 Läufen, die E.6 erreichten, lieferten Receipts; #7 B fehlte); (c) #7/#8 doppelte/falsche Headings; (d) der „0 Treffer 'receipt'"-Beleg in deferred-work D-3.13-R6-1 + #6/#7/#8 ist ein **Case-Sensitivity-Artefakt** (15 „Run-Receipt" vs 0 lowercase). Fix: alle Wortungen korrigieren.
|
||||||
|
- [x] [Review][Patch] **P-L2-11 (ANGEWENDET): Spec-Verification „kein Source-/Schema-Diff" + geticktes „compiler.md read-only (kein Diff)" post-Rev-3.8 falsch** [spec-3-13 Verification + Task] — Rev 3.8 **wurde** autorisiert und angewendet (compiler.md geändert) → „kein Schema-Diff" und der getickte read-only-Task-Claim sind **literal falsch**. Fix: an die autorisierte Rev 3.8 ausrichten (Doku; frozen-Block unangetastet).
|
||||||
|
|
||||||
|
**Defer (2):**
|
||||||
|
|
||||||
|
- [x] [Review][Defer] **W-L2-1: D-NEG-FAIL-Wurzel nicht gegen beabsichtigten Punkt verifiziert** [run-sandbox.sh:445-452] — deferred: AC-3-Negativ-Hälfte ist demonstrated (3×FAIL je Neg-Fixtur + 1×SUCCESS Positiv-Kontrolle); die exakte **Punkt-Root** des FAIL ist **freier Validator-Text** — eine Punkt-Exakt-Match-Assertion wäre **fragil** (falsch-rot-Risiko); der Differenz-Nachweis (pos-SUCCESS vs neg-FAIL) + Validator-Determinismus genügt für die Abnahme. Hartungs-Kandidat für spätere Sandbox-Härtung.
|
||||||
|
- [x] [Review][Defer] **W-L2-2: E.6 `decision`-Präsenz-Check (nicht-leer) = beabsichtigtes Scope** [run-sandbox.sh:727-731] — deferred: `decision` ist **freie Prosa** (Befund-Äquivalenz, Loop-1 D-2 / Re-Run-#6-Klassifizierung) — ein Stärker-Check (min. Länge / Concept-Referenz) wäre **Over-Pin** (Re-Run-#6-Klasse) und riskiert falsch-rot; „nicht-leer" ist das beabsichtigte Scope. Kein Defekt.
|
||||||
|
|
||||||
|
_Dismissed (4): „Porcelain-Task-Tick stale" (BH-13) — **stale/falsch**: das gehärtete Gate erreichte in Re-Run #9 G-8 grün, der getickte Nachweis-Tick ist korrekt; „frozen VALIDATOR_DEFIZIT-Zeile = autorisierte Renegotiation" (AA-1) — Compliance-Notiz, die Zeile war der autorisierte Renegotiation-Kandidat, kein Defekt; „Validator-Scope-Verengung" (AA-7) — **bewusst** (P-4 isolierte Mini-Fixture), Intent; „kanonische Null-Quellen-Form undefined" (EC-3) + „Ist-Behaviour deckt nur 2/3 Formen" (BH-16) — unter D-3.13-L2-1 subsumiert._
|
||||||
|
|
||||||
## Spec Change Log
|
## Spec Change Log
|
||||||
|
|
||||||
- **Re-Run #8-Befund: E.6-Feld-Dreideutigkeit (P-19) + P-18 bestätigt; C 12/12, D/D-NEG/E.1–E.5 grün, A==B bis at** (2026-08-24): Vierter Voll-Lauf des gehärteten Gates (ausschließlich /tmp-Käfig, fail-fast). **Erstmals erreicht und grün:** C **12/12** Sub-Runs (3.1–3.12, je `exit 0`), **D 4/4 SUCCESS** (frischer Validator: D.4 exakt-ein-Verdikt, D.6 0 FAIL über Käfig-Bundle), **D-NEG 3×FAIL + 1×SUCCESS** (neg-1 fehlendes `type`, neg-2 `okf_version` außerhalb Bundleroot, neg-3 `at: 2026-02-31`; Positiv-Kontrolle SUCCESS), **E.1–E.5** (Fixture `$BASE=f396f8f5…`, Worktrees, beide Agent-Läufe `RUN_DONE`; **E.4 `NON_AT=0 AT=2`** — Rev 3.8 zum **dritten Mal** unter echten frischen LLMs bestätigt; E.5 Multi-Beleg-Witness `raw/alpha-v2.md#S-3` in A und B; E.7/E.8/E.9 nicht erreicht). **P-18 bestätigt:** beide Agent-Läufe lieferten den Run-Receipt (5/5 Receipts über 4 Läufe — die #7-„fehlt"-Klasse ist adhärent aufgelöst). **Rot an E.6 (dritte Befund-Klasse im selben Abschnitt):** (1) `sources_added` divergiert A/B (A leer, B `raw/alpha-v2.md`) — die Prompt-Wortung „neue raw/-Ressourcen oder leer" ist **dreideutig** (neue raw/-*Dateien* / neu *verbrauchte* Evidenz / neue Frontmatter-`sources:`-Listeneinträge); die drei Lesarten liefern unterschiedliche Werte → echte **Prompt-Definitionslücke** in einem Gate-als-deterministisch-erklärten Feld (kein Flake: A und B haben beide *einer* Lesart konsistent gefolgt); (2) `baseline` zeigt A==B `143f7faf…` (Phase-B-Käfig-Baseline „Käfig-Baseline") statt `f396f8f5…` (Worktree-Vor-Mutation-HEAD „Käfig-Fixture: Baseline inkl. Zuwachs") — der Prompt-Wortlaut „SHA des Baseline-Commits" ist objektiv mehrdeutig (zwei Commits mit „Baseline" in der Betreffzeile im Worktree-Log) und benennt nicht den Commit, auf dem der Run läuft. **P-19 (Gate-Prompt-Präzisierung, A-B-Optionen wie P-17/P-18):** `baseline` = `git rev-parse HEAD` des Worktree **vor der ersten Mutation**; `sources_added` = `resource:`-Werte (Pfad) der raw/-Ressourcen, die der Lauf der Frontmatter-`sources:`-Liste der mutierten Concepts **neu** gegenüber dem Vor-Mutation-Zustand hinzufügt, lexikografisch sortiert (beide Felder damit REINE FUNKTIONEN der Lauf-Eingaben — für die UPDATE-only-Fixture ergibt A und B jeweils `raw/alpha-v2.md`; die A==B-Identität ist über E.4 beweisbar, da die `sources:`-Liste Teil des byte-identischen Bundle-State ist); `decision` bleibt freie Prosa (Befund-Äquivalenz, Re-Run-#6-Klassifizierung). **E.6-Assertion UNVERÄNDERT** (A==B byte-identisch über die drei Felder + `decision` nicht-leer) — geändert ist die Feld-Semantik im Prompt, nicht der Check; kein AC-4-Fall (compiler.md definiert den Receipt nicht — 0 Treffer; keine Schema-Semantik geändert), kein frozen-Block-Change, D-1/D-2/D-3.13-2-Option-1 respektiert. **Nächster Schritt:** Re-Run #9 (Erwartung: E.6 grün + F (G-1..G-8) + G (Porcelain) erstmals erreicht). **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag); AD-3 read-only (`schema/validator.md`/`schema/wiki-compiler.md`/`schema/compiler.md`/`adapters/`/`raw/`/`schema/canonical-terms.md` unverändert); kein Standalone (D-3), keine neue §7-Invaliditätsklasse, keine Vertragsänderung; Epic-3-Abnahme (Story 3.13) bleibt offen (epic-3 in-progress).
|
- **Review-Loop-2 (bmad-code-review, 4 Layer, 2026-08-24; Diff `50f3628..HEAD` + working tree) — 38 rohe → 4 decision-needed / 11 patch / 2 defer / 4 dismissed; alle Patches angewendet, alle Entscheidungen mit ProMods geschlossen:** **Entscheidungen (alle empfohlene Option):** D-3.13-L2-1 = **Defer + Bearer-Fix** (B2-Reihenfolge-Pin „Reihenfolge der Log-Einträge innerHALB einer Datumsgruppe" nie in compiler.md gelandet — Bearer-Doc-Claim „= genau so wie im Entwurf" war für die Reihenfolge-Hälfte falsch; Lücke = offener Defer, Bearer-Doc korrigiert; latent, noch nie rot); D-3.13-L2-2 = **Defer** (log.md `## YYYY-MM-DD`-Datumsgruppen-Header = Wanduhr außerhalb der §5.14-Pkt.-3-`at`-Ausnahme; Mitternachts-überschneidender A/B-Lauf wäre deterministisch falsch-rot an E.4 — bekannt latente Risiko-Klasse, same-day-Läufe deterministisch, Gate-Seite dokumentiert); D-3.13-L2-3 = **Defer + Substitutions-Notiz** (AC-6 CREATE/Synthese: A/B-Fixture UPDATE-only; 3-3/3-4 sind mechanisch gepinnte Subshells **ohne frischen LLM** — die Substitution „mechanisch ≙ frischer LLM" wird hiermit explizit als **strukturelle Deckung** notiert (CREATE-/Synthese-*Mechanik* strukturell belegt), der frische-LLM-CREATE-Unterpfad bleibt **benanntes nicht-deterministisches Residual** (Re-Run-#5-Befund 24/26 NON_AT); Residual in deferred-work.md); D-3.13-L2-4 = **dokumentierte Abweichung annotieren** (frozen Approach-Zeile „greift nie auf den Ist-Baum zu" ist literal ungenau: G-7/P-13 liest den Ist-Baum **read-only** relativ `$REPO_ROOT` (AC-8-Consumer-Smoke); Intent = „nie mutiert/schreibt" (G-8-Porcelain); frozen-Block unangetastet, dies ist die annotierende Notiz). **Patches (alle 11 angewendet):** P-L2-1 (E.6 **Known-Value-Witness** gegen `$BASE`: `baseline == $BASE` + `sources_added == raw/alpha-v2.md` — A==B allein ließ einen konsistent-falschen Wert passieren, Re-Run-#8-Klasse), P-L2-2 (E.6 **Feldsatz-Prüfung**: exakt die 4 Feldzeilen, jede genau einmal, keine unzulässigen Zeilen — ein fehlender/falscher Feldname würde sonst „beide leer" A==B still passieren), P-L2-3 (`candidates`-Serialisierung gepinnt: kommagetrennt OHNE Leerzeichen, lexikografisch LC_ALL=C, oder leer), P-L2-4 (Prompt-Wortung: compiler.md definiert den Run-Receipt-**Konzepts** (§5.14 Pkt. 2, 15 Treffer „Run-Receipt" vs. 0 lowercase — „0 Treffer receipt" war Case-Sensitivity-Artefakt), nicht die 4-Felder-Dateiform; „keine weiteren Zeilen" hinzugefügt), P-L2-5 (P-16-Floor dezimal `$((10#…))` — führende Nullen wären oktal), P-L2-6 (E.9 greift Kanon-Form `Baseline $BASE` statt nacktem SHA-Substring), P-L2-7 (A.2-Meldung: 5 Referenzen), P-L2-8 (D-NEG.3-Label: „okf_version außerhalb Bundleroot (Punkt 9)"), P-L2-9 (#6-Eintrag: E.7–E.9 „grün" → „nicht erreicht" (fail-fast an E.6)), P-L2-10 (#7/#8-Einträge: doppeltes/falsches Heading, „5/5 Receipts" → 5/6, „Erstmals erreicht und grün" → in #5/#6/#7 bereits grün, Case-Artefakt-Wortung), P-L2-11 (Verification „kein Schema-Diff" + geticktes read-only-Task: an autorisierte Rev 3.8 ausgerichtet). **Gate-Re-Run nötig** (P-L2-1/2/3/4/6 ändern E.6/E.9/Prompt) — finaler Bestätigungs-Re-Run nach diesem Eintrag. **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md`; AD-3 read-only (compiler.md unverändert — L2-1..L2-3 sind **Defer**, keine compiler.md-Änderung); kein frozen-Block-Change; Story 3.13 bleibt **`in-progress`** bis Re-Run grün + Step-05-Status-Sync.
|
||||||
- **Re-Run #7-Befund: fehlender Agent-B-Receipt (P-18)** (2026-08-24):
|
- **Re-Run #8-Befund: E.6-Feld-Dreideutigkeit (P-19) + P-18 bestätigt; C 12/12, D/D-NEG/E.1–E.5 grün, A==B bis at** (2026-08-24): Vierter Voll-Lauf des gehärteten Gates (ausschließlich /tmp-Käfig, fail-fast). **Erreicht und grün (bereits in #5/#6/#7 grün; hier fortgeführt):** C **12/12** Sub-Runs (3.1–3.12, je `exit 0`), **D 4/4 SUCCESS** (frischer Validator: D.4 exakt-ein-Verdikt, D.6 0 FAIL über Käfig-Bundle), **D-NEG 3×FAIL + 1×SUCCESS** (neg-1 fehlendes `type`, neg-2 `okf_version` außerhalb Bundleroot, neg-3 `at: 2026-02-31`; Positiv-Kontrolle SUCCESS), **E.1–E.5** (Fixture `$BASE=f396f8f5…`, Worktrees, beide Agent-Läufe `RUN_DONE`; **E.4 `NON_AT=0 AT=2`** — Rev 3.8 zum **dritten Mal** unter echten frischen LLMs bestätigt; E.5 Multi-Beleg-Witness `raw/alpha-v2.md#S-3` in A und B; E.7/E.8/E.9 nicht erreicht). **P-18 bestätigt:** beide Agent-Läufe lieferten den Run-Receipt (5/6 Agent-Läufe über #6–#8 lieferten den Receipt — #7-B fehlte; die #7-„fehlt"-Klasse ist nach P-18 adhärent aufgelöst). **Rot an E.6 (dritte Befund-Klasse im selben Abschnitt):** (1) `sources_added` divergiert A/B (A leer, B `raw/alpha-v2.md`) — die Prompt-Wortung „neue raw/-Ressourcen oder leer" ist **dreideutig** (neue raw/-*Dateien* / neu *verbrauchte* Evidenz / neue Frontmatter-`sources:`-Listeneinträge); die drei Lesarten liefern unterschiedliche Werte → echte **Prompt-Definitionslücke** in einem Gate-als-deterministisch-erklärten Feld (kein Flake: A und B haben beide *einer* Lesart konsistent gefolgt); (2) `baseline` zeigt A==B `143f7faf…` (Phase-B-Käfig-Baseline „Käfig-Baseline") statt `f396f8f5…` (Worktree-Vor-Mutation-HEAD „Käfig-Fixture: Baseline inkl. Zuwachs") — der Prompt-Wortlaut „SHA des Baseline-Commits" ist objektiv mehrdeutig (zwei Commits mit „Baseline" in der Betreffzeile im Worktree-Log) und benennt nicht den Commit, auf dem der Run läuft. **P-19 (Gate-Prompt-Präzisierung, A-B-Optionen wie P-17/P-18):** `baseline` = `git rev-parse HEAD` des Worktree **vor der ersten Mutation**; `sources_added` = `resource:`-Werte (Pfad) der raw/-Ressourcen, die der Lauf der Frontmatter-`sources:`-Liste der mutierten Concepts **neu** gegenüber dem Vor-Mutation-Zustand hinzufügt, lexikografisch sortiert (beide Felder damit REINE FUNKTIONEN der Lauf-Eingaben — für die UPDATE-only-Fixture ergibt A und B jeweils `raw/alpha-v2.md`; die A==B-Identität ist über E.4 beweisbar, da die `sources:`-Liste Teil des byte-identischen Bundle-State ist); `decision` bleibt freie Prosa (Befund-Äquivalenz, Re-Run-#6-Klassifizierung). **E.6-Assertion UNVERÄNDERT** (A==B byte-identisch über die drei Felder + `decision` nicht-leer) — geändert ist die Feld-Semantik im Prompt, nicht der Check; kein AC-4-Fall (compiler.md definiert den Run-Receipt-Konzept, §5.14 Pkt. 2, aber nicht die konkrete 4-Felder-Dateiform; keine Schema-Semantik geändert), kein frozen-Block-Change, D-1/D-2/D-3.13-2-Option-1 respektiert. **Nächster Schritt:** Re-Run #9 (Erwartung: E.6 grün + F (G-1..G-8) + G (Porcelain) erstmals erreicht). **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag); AD-3 read-only (`schema/validator.md`/`schema/wiki-compiler.md`/`schema/compiler.md`/`adapters/`/`raw/`/`schema/canonical-terms.md` unverändert); kein Standalone (D-3), keine neue §7-Invaliditätsklasse, keine Vertragsänderung; Epic-3-Abnahme (Story 3.13) bleibt offen (epic-3 in-progress).
|
||||||
|
- **Re-Run #7-Befund: fehlender Agent-B-Receipt (P-18: Prompt-Adhärenz-Härtung)** (2026-08-24): Re-Run #7 (Hintergrund, ~2,5 h) lief **grün bis E.6** — E.4 **erneut** GRÜN (`NON_AT=0 AT=2`, doppelte Bestätigung der Rev-3.8-Remediation unter echten frischen LLMs), C/D/D-NEG/E.5/E.7-Vorgaben grün — und brach an E.6 mit **neuer** Ursache: **`run-receipt.txt` B fehlt/leer** (Agent A lieferte den Receipt, Agent B nicht — B's wiki/-Mutationen waren vollständig, E.5-Witness grün, `RUN_DONE b` vorhanden → Agent B behandelte den Receipt als optional). **Gate-Verhalten korrekt** (fehlender Nachweis = kein stilles Grün, HARD-FAIL — die E.6-Härtung aus Re-Run #6 hat ihre Eigenschaft bewahrt: sie prüft nur, wenn der Receipt existiert). **Klassifikation: LLM-Prompt-Adhärenz-Flake, kein Gate-Logik-Fehler, kein Schema-Defizit** (3/4 Receipts in #6/#7 geschrieben). **Wurzelursache:** der Prompt hatte den Receipt „EXAKT nach den Konventionen von schema/compiler.md" zugeordnet — compiler.md definiert ihn aber **nicht** (0 Treffer „receipt") und der Prompt erklärt compiler.md zur **einzigen** normativen Instruktion → der Agent kann den Receipt als außerhalb-des-Vertrags/optional deuten (gleiche Klasse wie P-17 Prompt-Wortungs-Präzisierung). **Ausgeführte P-18-Härtung** (`run-sandbox.sh` AGENT_PROMPT, `bash -n` clean; **kein** compiler.md-/frozen-Block-Change; D-1-konform — exakte Feldstruktur ≠ erwartete Werte): der Receipt wird im Prompt als **expliziter, verpflichtender Gate-Reporting-Lieferant** von compiler.md **entkoppelt** („GATE-spezifische Berichtsdatei, die schema/compiler.md NICHT definiert"), beide Lieferungen (wiki/-Mutationen + run-receipt.txt) sind **PFLICHT**, `RUN_DONE` ist **erst nach** Vorliegen beider Lieferungen erlaubt; exakte 4-Feld-Form bleibt (Feldnamen exakt, Werte frei). **Nicht erreicht in #7** (fail-fast an E.6): F (G-1..G-8) + G (Porcelain). **Status:** Story 3.13 bleibt **`in-progress`**; Re-Run #8 (Erwartung: E.6 grün + F/G erstmals) vor dem finalen `done`-Flip + Review-Loop-2. **Stabilitäts-Beobachtung für #8:** falls Agent B erneut keinen Receipt liefert, ist das ein **systematischer** Prompt-Adhärenz-Defekt (kein Flake) und erfordert eine breitere Instruktion (z. B. Receipt-Generierung als nummerierte Pflicht-Schritt-Liste); ein einzelner Fehl-Lauf bleibt im Flake-Korridor (empirisch 75 % Adhärenz in 4 LLM-Runs).
|
||||||
|
|
||||||
**Re-Run #7-Befund: fehlender Agent-B-Receipt (P-18: Prompt-Adhärenz-Härtung) (2026-08-24):** Re-Run #7 (Hintergrund, ~2,5 h) lief **grün bis E.6** — E.4 **erneut** GRÜN (`NON_AT=0 AT=2`, doppelte Bestätigung der Rev-3.8-Remediation unter echten frischen LLMs), C/D/D-NEG/E.5/E.7-Vorgaben grün — und brach an E.6 mit **neuer** Ursache: **`run-receipt.txt` B fehlt/leer** (Agent A lieferte den Receipt, Agent B nicht — B's wiki/-Mutationen waren vollständig, E.5-Witness grün, `RUN_DONE b` vorhanden → Agent B behandelte den Receipt als optional). **Gate-Verhalten korrekt** (fehlender Nachweis = kein stilles Grün, HARD-FAIL — die E.6-Härtung aus Re-Run #6 hat ihre Eigenschaft bewahrt: sie prüft nur, wenn der Receipt existiert). **Klassifikation: LLM-Prompt-Adhärenz-Flake, kein Gate-Logik-Fehler, kein Schema-Defizit** (3/4 Receipts in #6/#7 geschrieben). **Wurzelursache:** der Prompt hatte den Receipt „EXAKT nach den Konventionen von schema/compiler.md" zugeordnet — compiler.md definiert ihn aber **nicht** (0 Treffer „receipt") und der Prompt erklärt compiler.md zur **einzigen** normativen Instruktion → der Agent kann den Receipt als außerhalb-des-Vertrags/optional deuten (gleiche Klasse wie P-17 Prompt-Wortungs-Präzisierung). **Ausgeführte P-18-Härtung** (`run-sandbox.sh` AGENT_PROMPT, `bash -n` clean; **kein** compiler.md-/frozen-Block-Change; D-1-konform — exakte Feldstruktur ≠ erwartete Werte): der Receipt wird im Prompt als **expliziter, verpflichtender Gate-Reporting-Lieferant** von compiler.md **entkoppelt** („GATE-spezifische Berichtsdatei, die schema/compiler.md NICHT definiert"), beide Lieferungen (wiki/-Mutationen + run-receipt.txt) sind **PFLICHT**, `RUN_DONE` ist **erst nach** Vorliegen beider Lieferungen erlaubt; exakte 4-Feld-Form bleibt (Feldnamen exakt, Werte frei). **Nicht erreicht in #7** (fail-fast an E.6): F (G-1..G-8) + G (Porcelain). **Status:** Story 3.13 bleibt **`in-progress`**; Re-Run #8 (Erwartung: E.6 grün + F/G erstmals) vor dem finalen `done`-Flip + Review-Loop-2. **Stabilitäts-Beobachtung für #8:** falls Agent B erneut keinen Receipt liefert, ist das ein **systematischer** Prompt-Adhärenz-Defekt (kein Flake) und erfordert eine breitere Instruktion (z. B. Receipt-Generierung als nummerierte Pflicht-Schritt-Liste); ein einzelner Fehl-Lauf bleibt im Flake-Korridor (empirisch 75 % Adhärenz in 4 LLM-Runs).
|
**Re-Run #6-Befund: E.6-Over-Pin (Gate-Artefakt) + Gate-Härtung + benannter Receipt-Defer (2026-08-24):** Re-Run #6 (Hintergrund-Lauf, ~2,5 h; A/B = echtes winpty-freies `claude.exe`, P-16-Floor 32000) lief **grün bis E.6** — und bestätigt die Rev-3.8-Remediation: **E.4 A/B-Bundle-Vergleich GRÜN `NON_AT=0 AT=2`** (`alpha.md` at-only; `log.md`/`gamma.md`/`index.md` byte-identisch), dazu D (4/4 SUCCESS), D-NEG (3×FAIL + 1×SUCCESS), C (12/12 Sub-Runs), E.5/E.7/E.8/E.9-Witness-Vorgaben grün. **Abbruch an E.6 (Run-Receipt A-vs-B; E.7/E.8/E.9 selbst sowie F (G-1..G-8) und G (Porcelain) nicht erreicht — fail-fast):** nur die `decision:`-Zeile divergierte (A „`alpha: UPDATE (…)`" vs B „`wiki/alpha.md = UPDATE (…); … NO_OP; …`"), während `baseline`/`candidates`/`sources_added` **byte-identisch A==B** waren — identischer Befund, freie Wortung. **Klassifikation: Gate-Over-Pin, kein compiler.md-Defizit, kein AC-4-Fall** — `schema/compiler.md` definiert den Run-Receipt-**Konzepts** (§5.14 Pkt. 2; 15 Treffer „Run-Receipt" vs. 0 lowercase — „0 Treffer receipt" war ein Case-Sensitivity-Artefakt), aber **nicht** die konkrete 4-Felder-Dateiform, der Gate-Prompt (D-1) deklariert `decision` selbst als frei („keine vorgegebenen Werte"); der alte E.6-Byte-Vergleich des kompletten Receipt widersprach damit dem eigenen Prompt (selbe Over-Pin-Klasse wie Re-Run #5 `log.md`, hier auf der Gate-Assertion-Seite). Die **semantische** Entscheidung ist bereits am Bundle-State bewiesen (E.4 + E.5/E.7/E.8). **Ausgeführte Gate-Härtung** (`run-sandbox.sh` E.6, `bash -n` clean; **kein** compiler.md-/frozen-Block-Change; D-2/D-1-konsistent, D-3.13-2-Option-1-Prinzip „Receipt-Vergleich, keine erwarteten Literale"): E.6 vergleicht nun **nur die drei deterministischen Felder `baseline`/`candidates`/`sources_added` byte-identisch A==B** + `decision`-Zeile auf **Vorhandensein** (nicht leer); die `decision`-Prosa gilt als **Befund-Äquivalenz** (Nicht-Wort-Identität, §5.10-Pkt-3-Prinzip). **Benannter Defer (Ask-First-Kandidat, in `deferred-work.md` „Deferred from: Re-Run #6" D-3.13-R6-1):** die **Vertrags-Vollständigkeit** eines byte-deterministischen Receipts (kanonische `decision`-Feldform) ist **nicht** Teil des gültigen Vertrags — übergeben an eine spätere compiler.md-Revision (Rev 3.9) oder Epic-4-Determinismus-Überarbeitung. **Nicht erreicht in #6** (fail-fast an E.6): F (G-1..G-8) + G (Porcelain) — sie laufen in Re-Run #7. **Status:** Story 3.13 bleibt **`in-progress`**; Re-Run #7 (erwartet: E.6 grün + F/G erstmals) vor dem finalen `done`-Flip + Review-Loop-2. **Hinweis zur Entscheidung:** die E.6-Härtung (Gate-Änderungsfläche, „was gilt als bestanden") wurde nach der E.4-Grünmeldung als **Gate-Härtung + Defer-Notiz** ausgeführt — die kleinste, ehrliche, vertragskonforme Variante, konsistent mit dem bereits autorisierten Muster (D-3.13-6 Option 2, Rev-3.8-Präzedenz); eine breitere `compiler.md`-Rev-3.9-Pinning-Alternative wurde als Defer dokumentiert, nicht als stille Gate-Semantik.
|
||||||
|
|
||||||
**Re-Run #6-Befund: E.6-Over-Pin (Gate-Artefakt) + Gate-Härtung + benannter Receipt-Defer (2026-08-24):** Re-Run #6 (Hintergrund-Lauf, ~2,5 h; A/B = echtes winpty-freies `claude.exe`, P-16-Floor 32000) lief **grün bis E.6** — und bestätigt die Rev-3.8-Remediation: **E.4 A/B-Bundle-Vergleich GRÜN `NON_AT=0 AT=2`** (`alpha.md` at-only; `log.md`/`gamma.md`/`index.md` byte-identisch), dazu D (4/4 SUCCESS), D-NEG (3×FAIL + 1×SUCCESS), C (12/12 Sub-Runs), E.5/E.7/E.8/E.9 Witness grün. **Abbruch an E.6 (Run-Receipt A-vs-B):** nur die `decision:`-Zeile divergierte (A „`alpha: UPDATE (…)`" vs B „`wiki/alpha.md = UPDATE (…); … NO_OP; …`"), während `baseline`/`candidates`/`sources_added` **byte-identisch A==B** waren — identischer Befund, freie Wortung. **Klassifikation: Gate-Over-Pin, kein compiler.md-Defizit, kein AC-4-Fall** — `schema/compiler.md` definiert den Receipt **nicht** (0 Treffer „receipt"), der Gate-Prompt (D-1) deklariert `decision` selbst als frei („keine vorgegebenen Werte"); der alte E.6-Byte-Vergleich des kompletten Receipt widersprach damit dem eigenen Prompt (selbe Over-Pin-Klasse wie Re-Run #5 `log.md`, hier auf der Gate-Assertion-Seite). Die **semantische** Entscheidung ist bereits am Bundle-State bewiesen (E.4 + E.5/E.7/E.8). **Ausgeführte Gate-Härtung** (`run-sandbox.sh` E.6, `bash -n` clean; **kein** compiler.md-/frozen-Block-Change; D-2/D-1-konsistent, D-3.13-2-Option-1-Prinzip „Receipt-Vergleich, keine erwarteten Literale"): E.6 vergleicht nun **nur die drei deterministischen Felder `baseline`/`candidates`/`sources_added` byte-identisch A==B** + `decision`-Zeile auf **Vorhandensein** (nicht leer); die `decision`-Prosa gilt als **Befund-Äquivalenz** (Nicht-Wort-Identität, §5.10-Pkt-3-Prinzip). **Benannter Defer (Ask-First-Kandidat, in `deferred-work.md` „Deferred from: Re-Run #6" D-3.13-R6-1):** die **Vertrags-Vollständigkeit** eines byte-deterministischen Receipts (kanonische `decision`-Feldform) ist **nicht** Teil des gültigen Vertrags — übergeben an eine spätere compiler.md-Revision (Rev 3.9) oder Epic-4-Determinismus-Überarbeitung. **Nicht erreicht in #6** (fail-fast an E.6): F (G-1..G-8) + G (Porcelain) — sie laufen in Re-Run #7. **Status:** Story 3.13 bleibt **`in-progress`**; Re-Run #7 (erwartet: E.6 grün + F/G erstmals) vor dem finalen `done`-Flip + Review-Loop-2. **Hinweis zur Entscheidung:** die E.6-Härtung (Gate-Änderungsfläche, „was gilt als bestanden") wurde nach der E.4-Grünmeldung als **Gate-Härtung + Defer-Notiz** ausgeführt — die kleinste, ehrliche, vertragskonforme Variante, konsistent mit dem bereits autorisierten Muster (D-3.13-6 Option 2, Rev-3.8-Präzedenz); eine breitere `compiler.md`-Rev-3.9-Pinning-Alternative wurde als Defer dokumentiert, nicht als stille Gate-Semantik.
|
|
||||||
|
|
||||||
**Epic-1-Remediation (Rev 3.8) + A/B-Umfangs-Entscheidung (b) ausgeführt (2026-08-23, Nutzer-Autorisierung „continue" — superset des „Empfehlung (b)"-Vorschlags aus der E.4-Befund-Raffinierung; die „keine der Optionen wurde gewählt"-Zustandsmeldung dieses Logs ist damit obsolet):** Nach exakter Zeilen-Nachzähl des Re-Run-#5-Befunds (NON_AT=26 AT=4) bestätigt: **24/26 (92%) der NON_AT-Abweichungen sind CREATE-/Slug-getrieben** (`wiki/beta.md` 11 + `wiki/quanten-observatorium-kanal.md` 11 + `wiki/index.md` 2 — Git-Rename-Semantik zählt die content-identischen Frontmatter-Zeilen doppelt, weil die Dateinamen divergieren), die verbleibenden **4 `wiki/log.md`-Zeilen** = 2 CREATE-Einträge (Slug-Divergenz) + 2 freie UPDATE-Wortungen (+ Wanduhr-`generated.at` im Body). Daraus folgt der **ausgeführte, autorisierte Minimal-Änderungssatz** (beide Hälften vermeiden den frozen Block + den §5.14-Pkt-3-Vertrag):
|
**Epic-1-Remediation (Rev 3.8) + A/B-Umfangs-Entscheidung (b) ausgeführt (2026-08-23, Nutzer-Autorisierung „continue" — superset des „Empfehlung (b)"-Vorschlags aus der E.4-Befund-Raffinierung; die „keine der Optionen wurde gewählt"-Zustandsmeldung dieses Logs ist damit obsolet):** Nach exakter Zeilen-Nachzähl des Re-Run-#5-Befunds (NON_AT=26 AT=4) bestätigt: **24/26 (92%) der NON_AT-Abweichungen sind CREATE-/Slug-getrieben** (`wiki/beta.md` 11 + `wiki/quanten-observatorium-kanal.md` 11 + `wiki/index.md` 2 — Git-Rename-Semantik zählt die content-identischen Frontmatter-Zeilen doppelt, weil die Dateinamen divergieren), die verbleibenden **4 `wiki/log.md`-Zeilen** = 2 CREATE-Einträge (Slug-Divergenz) + 2 freie UPDATE-Wortungen (+ Wanduhr-`generated.at` im Body). Daraus folgt der **ausgeführte, autorisierte Minimal-Änderungssatz** (beide Hälften vermeiden den frozen Block + den §5.14-Pkt-3-Vertrag):
|
||||||
|
|
||||||
@@ -170,7 +201,7 @@ Die repräsentative A/B-Fixture nimmt das 3-12-Sandbox-Muster (Mini-Bundle `wiki
|
|||||||
**Commands:**
|
**Commands:**
|
||||||
- `bash _bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh` -- expected: 12 Sandbox-Sub-Runs (jede `exit 0`), Validator-Integration, Zwei-frische-Agenten A/B-Identität (nur `at`-Zellen abweichend), G-1..G-8 harte PASS, finaler Porcelain-Check, Exit 0; kein Zugriff auf den realen Ist-Baum.
|
- `bash _bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh` -- expected: 12 Sandbox-Sub-Runs (jede `exit 0`), Validator-Integration, Zwei-frische-Agenten A/B-Identität (nur `at`-Zellen abweichend), G-1..G-8 harte PASS, finaler Porcelain-Check, Exit 0; kein Zugriff auf den realen Ist-Baum.
|
||||||
- `git status --porcelain` (Repo-Root) -- expected: leer/nur Story-3.13-Artefakte; `schema/compiler.md`, `schema/validator.md`, `schema/wiki-compiler.md`, `adapters/`, `raw/` ohne Diff (AD-3); `sandbox-3-13/` als einziger neuer Verzeichnis-Inhalt.
|
- `git status --porcelain` (Repo-Root) -- expected: leer/nur Story-3.13-Artefakte; `schema/compiler.md`, `schema/validator.md`, `schema/wiki-compiler.md`, `adapters/`, `raw/` ohne Diff (AD-3); `sandbox-3-13/` als einziger neuer Verzeichnis-Inhalt.
|
||||||
- `git diff --stat` (Repo-Root) -- expected: nur Story-3.13-Touched-Files (run-sandbox.sh, spec, log.md, sprint-status.yaml, epic-3-context.md, deferred-work.md), kein Source-/Schema-Diff (AC-4: keine stille Schema-Änderung).
|
- `git diff --stat` (Repo-Root) -- expected: nur Story-3.13-Touched-Files (run-sandbox.sh, spec, log.md, sprint-status.yaml, epic-3-context.md, deferred-work.md); `schema/compiler.md`-Diff = **autorisierte** Rev 3.8 (separat autorisierte Epic-1-Remediation, Präzedenz Validator-Rev-8/9) — AC-4-Claim gilt als „keine **stille** Schema-Änderung **durch das Gate**"; das Gate selbst verändert schema/adapters/raw/ nie (AD-3).
|
||||||
- optional: Deb-Run des Gate-Skripts mit `bash -x` -- expected: keine `sed -i`-Aufrufe (AC-2).
|
- optional: Deb-Run des Gate-Skripts mit `bash -x` -- expected: keine `sed -i`-Aufrufe (AC-2).
|
||||||
|
|
||||||
**Manual checks (if no CLI):**
|
**Manual checks (if no CLI):**
|
||||||
|
|||||||
Reference in New Issue
Block a user