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:
@@ -33,7 +33,7 @@
|
||||
# Exit: 0 = ALLE harten Checks grün (Szenarien + Gate + Nachweise);
|
||||
# ≠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;
|
||||
# KEINE erwarteten Plan-/Entscheidungs-/Receipt-/Log-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
|
||||
# Betreffzeile). E.6-Assertions UNVERÄNDERT (A==B byte-identisch) —
|
||||
# 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
|
||||
|
||||
@@ -133,7 +148,7 @@ TOKEN_FLOOR=32000
|
||||
_cur_tokens="${CLAUDE_CODE_MAX_OUTPUT_TOKENS:-}"
|
||||
case "$_cur_tokens" in
|
||||
''|*[!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
|
||||
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)"
|
||||
@@ -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
|
||||
[ -f "$ref" ] || hardfail "Referenz-Schema fehlt: $ref"
|
||||
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:
|
||||
# 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
|
||||
@@ -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)
|
||||
[ "$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)"
|
||||
[ "$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)"
|
||||
[ "$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)"
|
||||
@@ -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):
|
||||
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)>
|
||||
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>
|
||||
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 -E 's/[[:space:]]+$//; s/\r$//'
|
||||
}
|
||||
# Deterministische strukturierte Felder: A==B byte-identisch (Muss-Kern).
|
||||
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
|
||||
va=$(receipt_field "$RA" "$fld")
|
||||
vb=$(receipt_field "$RB" "$fld")
|
||||
@@ -723,6 +751,19 @@ for fld in baseline candidates sources_added; do
|
||||
E6_FAIL=1
|
||||
fi
|
||||
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).
|
||||
da=$(receipt_field "$RA" "decision")
|
||||
db=$(receipt_field "$RB" "decision")
|
||||
@@ -733,7 +774,7 @@ 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)"
|
||||
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
|
||||
exit 1
|
||||
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_BASE" != "$LOG_HEAD" ] \
|
||||
|| { 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" \
|
||||
|| { echo "HARD-FAIL (E.9): log.md-Eintrag in $wt ohne volles Baseline-SHA (R-1)" >&2; exit 1; }
|
||||
# P-L2-6 (Review-Loop-2): Kanon-Form "Baseline <volles-SHA>" (Rev 3.8, §5.9
|
||||
# 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
|
||||
pass "E.9 log.md (A und B): Lauf-Eintrag vorhanden und trägt volles Baseline-SHA (R-1)"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user