fix: Story 3.13 Re-Run-#6-Auflösung (E.6-Over-Pin) — Gate-Härtung: Receipt-Abgleich
auf die drei deterministischen Felder (baseline/candidates/sources_added byte-identisch A==B + decision-Vorhandensein); decision-Prosa = Befund-Äquivalenz (Nicht-Wort-Identität) Befund Re-Run #6 (grün bis E.6): E.4 GRÜN (NON_AT=0 AT=2 — Rev-3.8-Remediation wirkt: Bundle-State byte-identisch bis at), D/D-NEG/C/E.5/E.7/E.8/E.9 grün; HARD-FAIL an E.6: Run-Receipt decision:-Zeile (freie LLM-Prosa) wurde byte- vergleicht und divergierte A/B (identischer Befund, freie Wortung), während baseline/candidates/sources_added byte-identisch A==B waren. 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; der alte E.6-Byte- Vergleich widersprach damit dem eigenen Prompt (selbe Over-Pin-Klasse wie Re-Run #5 log.md, auf der Gate-Assertion-Seite). Semantische Entscheidung bereits am Bundle-State bewiesen (E.4 + E.5/E.7/E.8). Änderung (Gate-only, bash -n clean; kein compiler.md-/frozen-Block-Change; D-2/D-1-konsistent, D-3.13-2-Option-1-Prinzip): - E.6: receipt_field-Helfer (Präfix-Strip, WT-Pfad-Normalisierung, Trailing- Whitespace/CRLF-robust); nur deterministische Felder byte-identisch A==B, decision-Zeile auf Vorhandensein (nicht leer); Prosa = Befund-Äquivalenz. - Header-D-2-Bullet: Härtung + Defer-Verweis dokumentiert. Dokumentation: - Spec Change Log: Re-Run-#6-Befund + Härtung + Defer (frozen Block L12-51 und GENERATED_AT_AUSNAHME unangetastet, diff-geprüft). - deferred-work.md: neuer Abschnitt "Deferred from: Re-Run #6" (D-3.13-R6-1): byte-deterministischer Receipt = offener Defer/Ask-First-Kandidat (spätere compiler.md-Revision Rev 3.9 oder Epic-4), kein stiller Semantik-Change. Entscheidungshinweis: Gate-Härtung + Defer-Notiz ausgeführt (kleinste, ehrliche, vertragskonforme Variante, konsistent mit dem autorisierten Muster Rev 3.8 / D-3.13-6 Option 2); Nutzer-Away — zur Bestätigung im Review-Loop-2. Nächster Schritt: Re-Run #7 (Erwartung: E.6 grün, F G-1..G-8 + G Porcelain erstmals erreichbar). Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -654,3 +654,12 @@ Der Epic-3-Abnahmegate-Lauf (`_bmad-output/implementation-artifacts/sandbox-3-13
|
||||
|
||||
- W-1 — Timeout-Budgets (2700 s pro Agent-Lauf) an der Grenze zu beobachteten Agent-Laufzeiten (Skript-Kommentar dokumentiert empirisch A:~30 min, B: >35 min): Laufzeit-Variation ist Modell-/Token-Latenz, kein deterministischer Defekt; kein A0-20-Verstoß (Timeout ist Laufzeit-Schutz, keine Wanduhr-Steuerung). Home: Sandbox-Härtung (Budget-Observation bei Folge-Läufen).
|
||||
- W-2 — `PASS_COUNT`-Beleg-Zahl ist loop-basiert (12 Referenz-Sandbox-Existenz-PASS + 7 wiki-Datei-Verdikt-PASS + fix) und driftet design-immanent bei Bundle-/Referenzwachstum: Beleg-Zahl in log.md/sprint-status/epic-3-context ist Lauf-Momentaufnahme, keine stabile Invariante; Beleg-Formulierung (kumulative vs. pro-Sektion-Zählung) wird im Review-Patch P-12 geklärt; keine Gate-Semantik-Folge. Home: Sandbox-Kosmetik (nächste Sandbox-Härtung).
|
||||
|
||||
## Deferred from: Re-Run #6 (Story 3.13 Gate) — E.6 Receipt-Over-Pin (2026-08-24)
|
||||
|
||||
- **D-3.13-R6-1: byte-deterministischer Run-Receipt (Vertrags-Vollständigkeit)** (Story 3.13, Re-Run #6, 2026-08-24) — **status: offener Defer / Ask-First-Kandidat (Gate-Härtung ausgeführt, Vertrags-Lücke benannt).**
|
||||
**Befund:** Re-Run #6 (grün bis E.6; E.4 GRÜN `NON_AT=0 AT=2` — die Rev-3.8-Remediation wirkt) bricht an **E.6 (Run-Receipt A-vs-B)**: die `decision:`-Zeile divergiert A/B (A „`alpha: UPDATE (…)`" vs B „`wiki/alpha.md = UPDATE (…); wiki/log.md = …; wiki/gamma.md = NO_OP; wiki/index.md = NO_OP`"), während die drei **deterministischen strukturierten Felder** `baseline`/`candidates`/`sources_added` **byte-identisch A==B** sind. Die divergierende Zeile ist **freie LLM-Prosa** (identischer Befund, freie Wortung).
|
||||
**Klassifikation:** **Gate-Over-Pin (kein compiler.md-Defizit, kein AC-4-Fall).** `schema/compiler.md` definiert den Run-Receipt **überhaupt nicht** (0 Treffer „receipt" — grep-verifiziert); der Receipt ist ein **Gate-Artefakt**. Der Gate-Prompt (E.3, D-1) deklariert `decision: <Entscheidung je Mutation>` selbst als **frei** („Werte aus deinem Lauf", „keine vorgegebenen Werte"). Der alte E.6-Byte-Vergleich des kompletten Receipt **widersprach damit dem eigenen Prompt** und überpinsste die freie Prosa — dieselbe Over-Pin-Klasse wie das `log.md`-Problem in Re-Run #5, hier aber auf der Gate-Assertion-Seite. Die **semantische** Entscheidung ist bereits am Bundle-State bewiesen (E.4 byte-identisch bis `at` + E.5/E.7/E.8 Witness).
|
||||
**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).
|
||||
**Home:** Story 3.13 (Gate-Härtung) / spätere compiler.md-Revision oder Epic-4 (Vertrags-Vollständigkeit).
|
||||
|
||||
@@ -38,6 +38,13 @@
|
||||
# KEINE erwarteten Plan-/Entscheidungs-/Receipt-/Log-Literale.
|
||||
# - D-2: E.6 = Run-Receipt-A-vs-B-Abgleich (ohne erwartete Literale;
|
||||
# Modell: sandbox-3-8 DET-2, at/tree-Cellen gefiltert).
|
||||
# Re-Run-#6-Härtung: NUR die drei deterministischen Felder
|
||||
# baseline/candidates/sources_added werden A==B byte-identisch
|
||||
# verglichen + decision-Zeile auf Vorhandensein; die decision-PROSA
|
||||
# gilt als Befund-Äquivalenz (Nicht-Wort-Identität) — der Receipt ist
|
||||
# ein Gate-Artefakt, das compiler.md nicht definiert und dessen
|
||||
# decision-Feld der Prompt selbst als frei deklariert (Over-Pin-Befund
|
||||
# Re-Run #6; Defer D-3.13-R6-1 in deferred-work.md).
|
||||
# - D-3: G-6 = echter perturbed committed Tree (wt-c) durch denselben
|
||||
# E.4-Classifier: MUSS NON_AT≠0 flaggen; at-only-Kontrolle wt-c2
|
||||
# MUSS NON_AT=0 liefern (deterministisch, kein dritter Agent).
|
||||
@@ -647,25 +654,58 @@ done
|
||||
pass "E.5 Witness: alpha UPDATE (Multi-Beleg raw/alpha-v2.md#S-3 + sources-Konsolidierung) in A und B"
|
||||
|
||||
# --- E.6 Run-Receipt A-vs-B (D-2: Modell sandbox-3-8 DET-2, keine erwarteten Literale) ---
|
||||
# Re-Run-#6-Befund (E.6-Over-Pin): der Receipt ist ein GATE-Artefakt, das
|
||||
# schema/compiler.md NICHT definiert (0 Treffer); der Gate-Prompt deklariert die
|
||||
# decision:-Zeile als frei ("Werte aus deinem Lauf", "keine vorgegebenen Werte").
|
||||
# Der alte E.6-Byte-Vergleich des KOMPLETTEN Receipt überpinsste damit die freie
|
||||
# decision-PROSA (Re-Run #6: A "alpha: UPDATE (...)" vs B "wiki/alpha.md = UPDATE
|
||||
# (...)" — identischer Befund, freie Wortung) = dieselbe Over-Pin-Klasse wie das
|
||||
# log.md-Problem in Re-Run #5, nur dass diesmal die Gate-Assertion den eigenen
|
||||
# Prompt widerspricht. HÄRTUNG (Gate-Defekt, kein compiler.md-Defizit, kein
|
||||
# AC-4-Fall; konsistent mit D-3.13-2-Option-1 + D-1): die drei DETERMINISTISCHEN
|
||||
# strukturierten Felder (baseline/candidates/sources_added) werden A==B
|
||||
# byte-identisch geprüft; die decision-PROSA wird als Befund-Äquivalenz behandelt
|
||||
# (Nicht-Wort-Identität, §5.10-Pkt-3-Prinzip) — die SEMANTISCHE Entscheidung ist
|
||||
# bereits am Bundle-State bewiesen (E.4 byte-identisch bis at + E.5/E.7/E.8
|
||||
# Witness). Vertrags-Vollständigkeit (byte-deterministischer Receipt) = benannter
|
||||
# Defer (Spec Change Log + deferred-work), Ask-First-Kandidat.
|
||||
RA="$ROOT/wt-a/run-receipt.txt"
|
||||
RB="$ROOT/wt-b/run-receipt.txt"
|
||||
[ -s "$RA" ] || { echo "HARD-FAIL (E.6): run-receipt.txt A fehlt/leer" >&2; exit 1; }
|
||||
[ -s "$RB" ] || { echo "HARD-FAIL (E.6): run-receipt.txt B fehlt/leer" >&2; exit 1; }
|
||||
# Normalisierung: at-Cellen = Zeilen mit ISO-8601-Timestamp (Filter), Worktree-
|
||||
# spezifische Pfade auf WT normalisiert. Danach MUSS der Rest byte-identisch sein.
|
||||
receipt_norm() {
|
||||
sed -E "/[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|\+00:00)/d" "$1" \
|
||||
| sed "s|$ROOT/wt-a|WT|g; s|$ROOT/wt-b|WT|g"
|
||||
# receipt_field: $1=Receipt-Datei, $2=Feldname -> Wert (erster Treffer,
|
||||
# "Feld: "-Präfix gestrippt, Worktree-absolute Pfade auf WT normalisiert,
|
||||
# Trailing-Whitespace/CRLF gestrippt — beiderseits, damit einseitiges
|
||||
# CRLF/LF oder Trailing-Spaces kein false-fail im A==B-Byte-Vergleich ist).
|
||||
receipt_field() {
|
||||
sed -n "s/^$2:[[:space:]]*//p" "$1" | head -1 \
|
||||
| sed "s|$ROOT/wt-a|WT|g; s|$ROOT/wt-b|WT|g" \
|
||||
| sed -E 's/[[:space:]]+$//; s/\r$//'
|
||||
}
|
||||
receipt_norm "$RA" > "$ROOT/receipt-a.norm"
|
||||
receipt_norm "$RB" > "$ROOT/receipt-b.norm"
|
||||
echo " --- run-receipt.txt A (normalisiert) ---"
|
||||
cat "$ROOT/receipt-a.norm"
|
||||
if cmp -s "$ROOT/receipt-a.norm" "$ROOT/receipt-b.norm"; then
|
||||
pass "E.6 Run-Receipt A==B byte-identisch (nach at-/Pfad-Filter, D-2)"
|
||||
# Deterministische strukturierte Felder: A==B byte-identisch (Muss-Kern).
|
||||
E6_FAIL=0
|
||||
for fld in baseline candidates sources_added; do
|
||||
va=$(receipt_field "$RA" "$fld")
|
||||
vb=$(receipt_field "$RB" "$fld")
|
||||
if [ "$va" != "$vb" ]; then
|
||||
echo "HARD-FAIL (E.6): Receipt-Feld '$fld' divergiert A/B (deterministisches Feld, §5.14):" >&2
|
||||
echo " A: $va" >&2
|
||||
echo " B: $vb" >&2
|
||||
E6_FAIL=1
|
||||
fi
|
||||
done
|
||||
# decision: Struktur-Vorhandensein (nicht leer) — PROSA = Befund-Äquivalenz (kein Byte-Vergleich).
|
||||
da=$(receipt_field "$RA" "decision")
|
||||
db=$(receipt_field "$RB" "decision")
|
||||
[ -n "$da" ] || { echo "HARD-FAIL (E.6): Receipt-Feld 'decision' A fehlt/leer" >&2; E6_FAIL=1; }
|
||||
[ -n "$db" ] || { echo "HARD-FAIL (E.6): Receipt-Feld 'decision' B fehlt/leer" >&2; E6_FAIL=1; }
|
||||
echo " --- run-receipt.txt A (deterministische Felder + decision-Befund) ---"
|
||||
cat "$RA"
|
||||
echo " --- run-receipt.txt B (deterministische Felder + decision-Befund) ---"
|
||||
cat "$RB"
|
||||
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)"
|
||||
else
|
||||
echo "HARD-FAIL (E.6): Run-Receipts A/B divergieren (Determinismus-Vertrag §5.14):" >&2
|
||||
diff "$ROOT/receipt-a.norm" "$ROOT/receipt-b.norm" >&2 || true
|
||||
exit 1
|
||||
fi
|
||||
AT_A=$(git -C "$ROOT/wt-a" show 'HEAD:wiki/alpha.md' | sed -n 's/^ at: //p' | head -1)
|
||||
|
||||
+2
@@ -127,6 +127,8 @@ _Dismissed (6): G-6-„Hash-Primitive"-Beobachtung (Duplikat von D-3.13-3/P-2);
|
||||
|
||||
## Spec Change Log
|
||||
|
||||
**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):
|
||||
|
||||
1. **A/B-Vergleichsumfang = Empfehlung (b) der E.4-Befund-Raffinierung (D-3.13-6 Option 1 → Option 2):** der CREATE-/beta-Fall wird aus der A/B-Fixture **entnommen** — die A/B-Prüfung (E.4) deckt damit den **Update-/Erhaltungs-Kern** (`alpha` CONFIRMING-UPDATE + `gamma` Erhaltung), der **nachweislich byte-deterministisch** ist (Re-Run #5: `wiki/alpha.md` byte-identisch bis auf `at:`). CREATE + Multi-Source-Synthese gelten über die **12 Sandbox-Sub-Runs (insb. 3-3/3-4, mechanisch gepinnt, eigene Isolation)** als demostriert — AC-6 „Anlage einer neuen Wissenseinheit" gilt über diese. **Gate-Änderung** (`sandbox-3-13/run-sandbox.sh`, `bash -n` clean): E.1-Fixture (keine `beta`-Quellen mehr; keine Term-Isolation nötig), `AGENT_PROMPT` (beta-Fakt entfernt), E.5 (CREATE-Witness entfernt, UPDATE-`alpha`-Witness + Multi-Beleg bleibt), E.8 (`index.md` **unverändert** — IDX_ADDED=0/IDX_DELETED=0 — statt „+1 CREATE-Link"), Header-Kommentare; kein `sed -i` (AC-2). **Keine** `NEW_CONCEPT`/`NEW_LEAF`-Referenzen mehr; G-6 (perturbed-`alpha.md`-Tree + at-only-Kontrolle) bleibt gültig.
|
||||
|
||||
Reference in New Issue
Block a user