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:
Michael Tamse
2026-08-24 07:19:14 +02:00
co-authored by Claude
parent 2a9fa89f8a
commit 77fd460ec3
3 changed files with 64 additions and 13 deletions
@@ -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)