diff --git a/_bmad-output/implementation-artifacts/spec-3-13-epic-3-verifikations-und-abnahmegate.md b/_bmad-output/implementation-artifacts/spec-3-13-epic-3-verifikations-und-abnahmegate.md index 6db5b11..039519e 100644 --- a/_bmad-output/implementation-artifacts/spec-3-13-epic-3-verifikations-und-abnahmegate.md +++ b/_bmad-output/implementation-artifacts/spec-3-13-epic-3-verifikations-und-abnahmegate.md @@ -127,6 +127,8 @@ _Dismissed (6): G-6-„Hash-Primitive"-Beobachtung (Duplikat von D-3.13-3/P-2); ## Spec Change Log +**E.4-Befund-Raffinierung (2026-08-23, vor Remediations-Start — Prämisse-Korrektur, Entscheidung offen):** Vor dem Start der autorisierten Epic-1-Remediation (Q1, „compiler.md-Patch → Re-Run #6 grün") gegen den compiler.md-Quelltext verifiziert — **die Remediation allein erreicht kein Exit 0 des Gates**; die Q1-Prämisse bedarf Nachverhandlung, **keine der Optionen wurde gewählt, nichts wurde geändert**. **Quelltext-Verankerungen (Zeilen):** (1) `§5.14 Pkt. 3` (L375): der Zwei-Run-Vergleich lässt *genau eine* benannte Differenz zu (den `generated.at`-Wanduhr-Gap); **alle übrigen** Bundle-State-Bestandteile sind zwischen zwei Runs desselben Git-States **byte-identisch**. (2) `§5.10 Pkt. 3` (L297): die CREATE-/Synthese-Body-*Reihenfolge* ist deterministisch gepinnt (lexikografisch nach Beleg-Anker, LC_ALL=C) — der *Wortlaut* ist es **nicht**; das Äquivalenzkriterium ist dort explizit „Befund-Äquivalenz, **nicht** Wort-Identität". (3) `§5.1 Pkt. 2` (L84) + `§5 Pkt. 3` (L34, FR-2): der Body ist „eigenständig formuliert"; „Bloße Kopie, das Einfügen großer Quellblöcke … DÜRFEN nicht erzeugt werden"; „Der Body darf keine großen Quell-Exzerpte enthalten". (4) `§5.14 Pkt. 2` (L374) + spec-3-8 P-5 (L150): die 3.8-Determinismus-Bestätigung wurde **mechanisch simuliert** (zwei Subshell-Läufe in getrennten Worktrees desselben Skripts), **nie** mit echten frischen LLMs; „der Nachweis echter frischer Kontexte erfolgt im Story-3.13-Abnahmegate über reale Agent-Läufe". **Konsequenz:** die 3.8-Basis validiert nur den **UPDATE**-Pfad (nachweislich A/B-byte-identisch bis auf `at:` — Run A `wiki/alpha.md`, Re-Run #5) — und zwar per Simulation, wo der „Producer" deterministische Skriptlogik ist und Byte-Identität trivial gilt. Der **CREATE**-Pfad ist erstmals unter *echten* frischen LLMs (E.4) ausgesetzt: dort verlangt FR-2 freien, eigenständig formulierten Wortlaut, während §5.14 Pkt. 3 Byte-Identität fordert — eine **latente Vertrags-Spannung** (in 3.8 durch die Simulation verdeckt, in 3.13/E.4 aufgedeckt), **kein** bloßes Instruktions-Defizit und **kein** Validator-Defizit in der engen AC-4-Lesart. **Zweiteilung des Befunds:** der **Slug-Teil** (raw-Dateinamen-Stamm „beta" vs. Inhalts-Term „quanten-observatorium-kanal"; `§5.15 Pkt. 1` L383 „dieser kollabierte, lowercasene Dateiname ist der primäre Term") ist **legitim per compiler.md-Patch auflösbar** (Inhalts-Term maßgeblich — Design-Notes-L150-Intention, kein FR-2-Verstoß); der **Body-Byte-Teil** ist es **nicht** innerhalb des gültigen Vertrags — ein Byte-Pin des CREATE-Body widerspricht FR-2/NFR-2/`§5.10 Pkt. 3` („nicht Wort-Identität") direkt und wäre ein Semantik-Change, kein Bugfix. **Status:** Remediation (compiler.md), 12-Sandbox-Re-Execution und Re-Run #6 **gehalten** — alle drei hängen an der A/B-Vergleichsumfangs-Entscheidung (frozen I/O-Matrix-Zeile `GENERATED_AT_AUSNAHME`, L49; frozen-Block nur mit menschlicher Bestätigung änderbar, Ask-First). **Offene Entscheidung (Prämisse-Korrektur zu Q1), drei Wege zu einem grünen, ehrlichen Re-Run #6:** **(a)** A/B-Vergleich auf freier CREATE-Synthese auf die **Wissens-Ebene** nachverhandeln (Zielpfad/Slug, Frontmatter, `sources`, Index-Link, Provenanz-Anker, Claim-Abdeckung byte-identisch; freier Body-Wortlaut als **zweite benannte Ausnahme-Klasse** neben `at` per Claim-/Provenienz-Abdeckung, nicht byte-weise) + Slug-Patch — frozen-Block-Änderung (Ask-First), vertragskonsistent mit der „Wissen ist deterministisch, LLM-Oberfläche nicht"-Prämisse. **(b)** **CREATE aus der A/B-Fixture nehmen** (D-3.13-6 Option 1 → Option 2; A/B prüft nur den nachweislich byte-deterministischen UPDATE-Pfad; CREATE + Multi-Source-Synthese bleiben über Sandbox-Sub-Runs 3-3/3-4 in eigener Isolation belegt, AC-6 „Anlage neuer Wissenseinheit" gilt über diese) — vertragskonform, frozen-Block unangetastet, kleinster ehrlicher Pfad. **(c)** substanzieller compiler.md-Change (CREATE-Body auf kanonische, aus `raw/` mechanisch abgeleitete Form pinnen) — erreicht Byte-Determinismus, aber bricht vmtl. FR-2; eigener, breiterer Autorisations-Runde würdig. **Empfehlung:** **(b)** — kleinster, vertragskonformer, ehrlicher Pfad zu grünem Re-Run #6 ohne frozen-Block-Verletzung und ohne stille FR-2-Verletzung; der CREATE-Byte-Identitäts-Fall (mit den obigen Verankerungen) wird als **benannter Defer** an eine spätere Vertrags-Revision/Epic-4-Determinismus-Überarbeitung übergeben. **Keine** Schema-/Gate-/Fixture-/frozen-Block-Änderung durch diese Notiz — sie dokumentiert nur den Befund, die Verankerungen und die Entscheidungsbasis. + **Nutzer-Entscheidungen Re-Run-#5-Nachbearbeitung (2026-08-23, ProMods-Response auf den E.4-Befund):** (1) **AC-4-Auflösung = autorisierte Epic-1-Remediation** — `schema/compiler.md`-Patch (Rev 3.7 → 3.8) mit drei Bestandsregeln: CREATE-Slug-Signal pinning (Inhalts-Term maßgeblich — Design-Notes-L146-Intention), CREATE-Body-kanonische Form (byte-deterministisch), log.md-Regel (Wortlaut/Reihenfolge + kein Wanduhr-at im Body); danach 12-Sandbox-Re-Execution + Re-Run #6 (grüner Voll-Lauf). Die Remediation ist eine **separat autorisierte** Instruktions-Änderung im Präzedenz-Stil der autorisierten Validator-Revisionen 8/9 (AD-3-Compliance: keine stille Schema-Semantik-Änderung durch das Gate). (2) **Frozen-I/O-Matrix-Zeile `VALIDATOR_DEFIZIT` korrigiert** (Ask-First-Erfüllung durch die Nutzer-Bestätigung): „G-5 PASS" → „G-5 FAIL (Non-Zero)" — entspricht der implementierten Boundary/AC-4-Semantik (Non-Zero-Exit + Remediation-Text); der Renegotiation-Kandidat (Review-Loop-1, P-7) ist damit geschlossen. (3) **Tasks & Acceptance:** erledigte Tasks getickt (Gate-Skript gebaut, read-only-Verifizierung, epic-3-context, log.md, Porcelain-Nachweis); offene Tasks (Gate-bis-Exit-0, sprint-status done-Flip, deferred-work-Defers) bleiben offen bis Re-Run #6 grün. **Re-Run-#5-Ausführung (Voll-Lauf des gehärteten Gates 915 Z., 2026-08-23; Gate **ROT** an E.4 — korrekt erkannter echter AD-16-A/B-Divergenz-Befund, kein false-PASS; **keine Patches, keine Gate-/Schema-/Fixture-Änderung** — Befund nur dokumentiert, AC-4-Defizit-Roadmap):** A/B-Voll-Lauf mit echten frischen Agent-Kontexten (`CLAUDE_BIN` = winpty-freie `claude.exe` per P-3-Override, P-16-Floor 32000 aktiv). **Grün:** A (Setup + Porcelain-Pre-Check), B (Käfig + `git init` + Baseline), **C 12/12** Sandbox-Sub-Runs (fail-fast, je `exit 0`), **D 4/4 SUCCESS** (frischer Validator-Agent: D.1 `VALIDATOR_DONE`, D.4 exakt-ein-Verdikt-pro-Datei, D.5/D.6 0 FAIL — über die P-4-isolierte Mini-Fixture `index/alpha/gamma/log`; bewusste Verengung ggü. dem 08-22-Erst-Lauf „7/7" über die damals nicht-isolierte Fixture, kein Regression), **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** (Term-Isolation), **E.2** (`$BASE=ad8179d6f36dc98511f38948f21353ac1f12648d`), **E.3** (Worktrees wt-a/wt-b), **Lauf A + Lauf B** mit `RUN_DONE`-Markern (echte frische Kontexte). **Rot an E.4:** `A/B-Classifier: NON_AT=26 AT=4` → `HARD-FAIL (E.4)` → `exit 1`. **Divergenz-Klassifikation (alle 26 NON_AT-Zeilen im CREATE-Pfad, d. h. in freier Form-Synthese):** (a) **Slug-/Datei-Identität** — Lauf A `wiki/beta.md` (Slug aus dem raw-Dateinamen-Stamm „beta") vs. Lauf B `wiki/quanten-observatorium-kanal.md` (Slug aus dem Inhalts-Term); die Fixture bietet zwei konkurrierende Slug-Signale (Dateinamen-Stamm „beta" + „Beta:"-Inhaltslabel vs. Inhalts-Term); die Design Notes (L146) intendieren das Ergebnis als „term-geleitet" (Lauf B), aber compiler.md §5.1 Pkt. 1 („kebab-case-Slug aus der Concept-Identität; der Dateiname definiert die Concept-Identität") / §5.15 Pkt. 1 (Dateiname→primärer Term — für `beta-v1` wäre „beta" der primäre Dateiname-Term) / §5.7 lassen offen, welches Signal bei einem CREATE-Slug maßgeblich ist, wenn Dateinamen-Stamm und Inhalts-Term divergieren → **Instruktionslücke (AD-16)**; (b) **freier Form-Body-Wortlaut** — zwei frische LLMs schreiben nie byte-identische CREATE-Bodies (§5.9 Pkt. 2 „eigenständig formuliert"); compiler.md enthält **keinen** Wortlaut-Pinning-Mechanismus (§5.10 Pkt. 3 pinnt nur die *Reihenfolge*, nicht den *Wortlaut*) → Byte-Identität einer freien CREATE-Synthese ist unter der aktuellen Instruktion **nicht erfüllbar**; (c) **log.md** — freier Form-Wortlaut + ungepinnte Eintrags-Reihenfolge an einem Datum + Lauf B bettet eine Wanduhr-`generated.at` in den log-Body ein (außerhalb der benannten at-Ausnahme; der geankerte E.4-Classifier maskiert sie korrekt nicht; compiler.md regelt nicht, ob Log-Einträge at-Werte tragen dürfen). **Entscheidender Befund:** der **UPDATE-Pfad** (`wiki/alpha.md`, CONFIRMING-Konsolidierung §5.16 Pkt. 4) ist **byte-identisch bis auf `at:`** konvergiert (sie fügt nur einen deterministischen Provenienz-Anker, keinen freien Wortlaut hinzu) — der Defekt ist damit exakt auf die **freie CREATE-Synthese** isoliert; der Vertrag ist dort erfüllbar. **Konsequenz (AC-4 / §5.14 Pkt. 4):** ein `Exit 0` des Gates ist **nicht innerhalb der aktuellen Autorität** erreichbar — eine Behebung läge in compiler.md (AD-3 read-only), oder in einer Änderung des Gate-A/B-Vergleichsverhaltens (A0-20 Ask-First), oder in der Design-Notes-vorgeschriebenen Fixture (L146, außerhalb der Autorität); die korrekte Route ist der **AC-4-Defizit-Pfad**: Story 3.13 bleibt **offen** und benennt den Bedarf für eine **separat autorisierte Epic-1-Remediation** (compiler.md-Determinismus-Coverage für CREATE-Body-/Log-Wortlaut, z. B. Wortlaut-Pin oder Normalisierte-Vergleichsreichweite — menschliche Entscheidung) bzw. eine menschliche A/B-Vergleichsumfangs-Entscheidung; das Gate ändert die Schema-Semantik **nicht still** und verantwortet die vollständige Ausführung des bestehenden Vertrags. **Bewusste Nicht-Änderung (kein P-18):** **kein Fixture-Rename** — die Design Notes (L146) schreiben diese konkrete Fixture vor (`raw/beta-v1.md`+`beta-v2.md`, Term `quanten-observatorium-kanal`); ein Rename würde das Gate gegen die Spec (Sole-Source-of-Truth) stellen und die AD-16-Signal-Ambiguität verschleiern, statt sie zu benennen; die Befund-Isolation liegt in der obigen Klassifikation, nicht in einem Fixture-Edit. Gate 915 Z. unverändert, `bash -n` clean. **Nicht demonstriert im Voll-Lauf:** F (G-1..G-8 inkl. G-6 perturbed-Tree + wt-c2-at-only-Kontrolle) und G (Porcelain-Endinvariante) liefen **nicht** (fail-fast an E.4). **Re-Run-Status:** #2 rot (winpty, E.3 `rc=1`), #3 rot (D.4-falsch-rot + E.3-Token-Cap), #4 vor D gestoppt (Env 16000 → P-16-Floor), **#5 rot (E.4 — echter AD-16-A/B-Defekt in freier CREATE-Synthese; Gate korrekt, kein false-PASS); finaler `done`-Flip + Review-Loop-2 ausstehend, abhängig von separat autorisierter Epic-1-Remediation bzw. menschlicher A/B-Umfangs-Entscheidung (AC-4/AC-9)**.