fix: Story 3.13 Re-Run-#3-Auflösung (P-16/P-17): CLAUDE_CODE_MAX_OUTPUT_TOKENS=32000 (16000-Default bricht E.3 ab, A/B-geprüft: 1698 vs 5002 Zeilen) + D.4/D-NEG Pfad-Normalisierung (Agent schrie 'wiki.alpha.md' via alter Prompt-Wortung; 21/21-Test grün) + Prompt-Pfad-Wortung präzisiert; Gate 906 Z., bash -n clean

This commit is contained in:
Michael Tamse
2026-08-23 12:45:16 +02:00
parent 35b5939df6
commit 90a01fed37
@@ -88,6 +88,12 @@ echo "REPO-HEAD (real): $BASE_REAL"
CLAUDE_BIN="${CLAUDE_BIN:-$(command -v claude 2>/dev/null || true)}" CLAUDE_BIN="${CLAUDE_BIN:-$(command -v claude 2>/dev/null || true)}"
[ -n "$CLAUDE_BIN" ] && [ -x "$CLAUDE_BIN" ] || hardfail "CLAUDE_BIN nicht auflösbar (PATH: 'claude' nicht gefunden; CLAUDE_BIN-Env setzen)" [ -n "$CLAUDE_BIN" ] && [ -x "$CLAUDE_BIN" ] || hardfail "CLAUDE_BIN nicht auflösbar (PATH: 'claude' nicht gefunden; CLAUDE_BIN-Env setzen)"
echo "CLAUDE_BIN: $CLAUDE_BIN" echo "CLAUDE_BIN: $CLAUDE_BIN"
# P-16 (Re-Run-#3-Befund): CLI-Per-Response-Output-Limit (Default 16000 Token)
# reicht für E.3-Compiler-Läufe nicht — "API Error: Claude's response exceeded
# the 16000 output token maximum" (mehrere Write-Tool-Calls + Text in einer
# Response). Override auf 32000; bleibt per Env überschreibbar.
export CLAUDE_CODE_MAX_OUTPUT_TOKENS="${CLAUDE_CODE_MAX_OUTPUT_TOKENS:-32000}"
echo "CLAUDE_CODE_MAX_OUTPUT_TOKENS: $CLAUDE_CODE_MAX_OUTPUT_TOKENS"
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)"
command -v sha256sum >/dev/null || hardfail "sha256sum fehlt (git-for-win/coreutils erwartet)" command -v sha256sum >/dev/null || hardfail "sha256sum fehlt (git-for-win/coreutils erwartet)"
command -v tar >/dev/null || hardfail "tar fehlt" command -v tar >/dev/null || hardfail "tar fehlt"
@@ -221,7 +227,8 @@ WICHTIG: Dein OUTPUT ist KEINE Prosa, sondern NUR eine Liste von Zeilen in der
Validator-Grammatik (validator.md): Validator-Grammatik (validator.md):
- für JEDE validierte wiki/-Datei EXAKT EINE Verdict-Zeile: - für JEDE validierte wiki/-Datei EXAKT EINE Verdict-Zeile:
SUCCESS <pfad> <begründung> ODER FAIL <pfad> <Punkt-Nr.+Grund> SUCCESS <pfad> <begründung> ODER FAIL <pfad> <Punkt-Nr.+Grund>
- <pfad> ist der relativ zum Käfig-Root gepunktete Pfad (z.B. 'wiki/index.md'). - <pfad> ist der RELATIVE PFAD zum Käfig-Root mit Schrägstrichen
(z.B. 'wiki/index.md' — NICHT 'wiki.index.md', NICHT absolut).
- Keine weiteren Ausgabezeilen, keine Erklärungen, keine Markdown-Listen-Sterne." \ - Keine weiteren Ausgabezeilen, keine Erklärungen, keine Markdown-Listen-Sterne." \
> "$out" 2>&1 > "$out" 2>&1
echo "VALIDATOR_DONE $cdir" >> "$out" echo "VALIDATOR_DONE $cdir" >> "$out"
@@ -236,12 +243,42 @@ WIKI_MD_COUNT=$(printf '%s\n' "$WIKI_MD_LIST" | grep -c '^')
echo "--- wiki/-Dateiliste ($WIKI_MD_COUNT Dateien) ---" echo "--- wiki/-Dateiliste ($WIKI_MD_COUNT Dateien) ---"
echo "$WIKI_MD_LIST" echo "$WIKI_MD_LIST"
VERDICTS=$(grep -E '^(SUCCESS|FAIL) [^ ]+' "$VAL_A" | head -50) VERDICTS=$(grep -E '^(SUCCESS|FAIL) [^ ]+' "$VAL_A" | head -50)
# P-6: exakt EIN Verdict pro Datei (Pfad-Vorkommen zählen; Toleranz wiki/-Präfix) echo "--- Verdict-Zeilen (Validator-Ausgabe, Diagnose) ---"
printf '%s\n' "$VERDICTS"
# P-17 (Re-Run-#3-Befund): Pfad-Token-Normalisierung — der Agent schrieb
# 'wiki.alpha.md' (alte Prompt-Wortung „gepunktete Pfad") und kann absolute
# oder backslash-Pfade liefern. Normalisiert auf Käfig-relativ ohne wiki/:
# 'wiki/alpha.md', 'alpha.md', '/…/cage/wiki/alpha.md', 'wiki\.alpha.md'
# -> 'alpha.md'. D.5 (Zählung) bleibt unverändert; D.4 matcht normalisiert.
norm_verdict_path() {
local p
p="${1//\\//}" # Backslash -> Slash (bash-nativ, kein tr/Transport-Problem)
p="${p#\"}"; p="${p%\"}"
p="${p#\'}"; p="${p%\'}"
p="${p#./}"
# Absolute/relative Vorpfad bis 'wiki/' abschneiden (auch führende 'wiki/').
case "$p" in */wiki/*) p="${p##*/wiki/}" ;; esac
case "$p" in wiki/*) p="${p#wiki/}" ;; esac
case "$p" in wiki.*) p="${p#wiki.}" ;; esac
# Dotted-Form der alten Prompt-Wortung ('gepunktete Pfad'): 'concepts.neg-1.md'
# / 'alpha.md' -> alle Punkte zu '/', dann das LETZTE '/' (die .md-Extension)
# wiederherstellen. Nur ohne bereits vorhandenes '/' (sonst wäre es schon Slash-Form).
if [[ "$p" == *.* && "$p" != */* ]]; then
p="${p//./\/}"
p="${p%/*}.${p##*/}"
fi
printf '%s' "$p"
}
# P-6: exakt EIN Verdict pro Datei (normalisierte Pfad-Vorkommen zählen)
DUP_FAIL=0 DUP_FAIL=0
while IFS= read -r wmd; do while IFS= read -r wmd; do
[ -z "$wmd" ] && continue [ -z "$wmd" ] && continue
rel="${wmd#wiki/}" rel="${wmd#wiki/}"
n=$(printf '%s\n' "$VERDICTS" | grep -cE "^(SUCCESS|FAIL) (wiki/)?$rel " || true) n=$(printf '%s\n' "$VERDICTS" | while IFS= read -r v; do
[ -z "$v" ] && continue
vp=$(printf '%s\n' "$v" | awk '{print $2}')
[ "$(norm_verdict_path "$vp")" = "$rel" ] && echo X
done | grep -c '^X$' || true)
if [ "$n" -eq 0 ]; then if [ "$n" -eq 0 ]; then
fail "D.4 Exhaustivität: KEIN Verdict für $wmd (Defizit-Route, P-7)" fail "D.4 Exhaustivität: KEIN Verdict für $wmd (Defizit-Route, P-7)"
DUP_FAIL=1 DUP_FAIL=1
@@ -252,7 +289,7 @@ while IFS= read -r wmd; do
done <<EOF_LIST done <<EOF_LIST
$WIKI_MD_LIST $WIKI_MD_LIST
EOF_LIST EOF_LIST
[ "$DUP_FAIL" -eq 0 ] && pass "D.4 exakt ein Verdict pro wiki/-Datei (P-6)" [ "$DUP_FAIL" -eq 0 ] && pass "D.4 exakt ein Verdict pro wiki/-Datei (P-6/P-17)"
V_COUNT=$(printf '%s\n' "$VERDICTS" | grep -c '^' || true) V_COUNT=$(printf '%s\n' "$VERDICTS" | grep -c '^' || true)
expect_gte "D.5 Verdict-Zeilen vorhanden" "$WIKI_MD_COUNT" "$V_COUNT" expect_gte "D.5 Verdict-Zeilen vorhanden" "$WIKI_MD_COUNT" "$V_COUNT"
# P-7: Defizit-Route — FAIL-Verdikt = Bedarf einer separat autorisierten # P-7: Defizit-Route — FAIL-Verdikt = Bedarf einer separat autorisierten
@@ -345,8 +382,24 @@ run_validator_agent "$NEGDIR" "$NEGVAL_OUT"
grep -q '^VALIDATOR_DONE ' "$NEGVAL_OUT" || hardfail "D-NEG: Validator-Run fehlgeschlagen (kein VALIDATOR_DONE)" grep -q '^VALIDATOR_DONE ' "$NEGVAL_OUT" || hardfail "D-NEG: Validator-Run fehlgeschlagen (kein VALIDATOR_DONE)"
pass "D-NEG.1 Negativ-Validator-Run abgeschlossen" pass "D-NEG.1 Negativ-Validator-Run abgeschlossen"
NEG_VERDICTS=$(grep -E '^(SUCCESS|FAIL) [^ ]+' "$NEGVAL_OUT" | head -50) NEG_VERDICTS=$(grep -E '^(SUCCESS|FAIL) [^ ]+' "$NEGVAL_OUT" | head -50)
neg_count() { printf '%s\n' "$NEG_VERDICTS" | grep -cE "^FAIL (wiki/)?concepts/$1 " || true; } # P-17: Pfad-Normalisierung auch hier (gleicher Mechanismus wie D.4) —
pos_count() { printf '%s\n' "$NEG_VERDICTS" | grep -cE "^SUCCESS (wiki/)?concepts/$1 " || true; } # normalisiertes Käfig-relativ 'concepts/<datei>' wird matcht.
neg_count() {
printf '%s\n' "$NEG_VERDICTS" | while IFS= read -r v; do
[ -z "$v" ] && continue
case "$v" in FAIL\ *) : ;; *) continue ;; esac
vp=$(printf '%s\n' "$v" | awk '{print $2}')
[ "$(norm_verdict_path "$vp")" = "concepts/$1" ] && echo X
done | grep -c '^X$' || true
}
pos_count() {
printf '%s\n' "$NEG_VERDICTS" | while IFS= read -r v; do
[ -z "$v" ] && continue
case "$v" in SUCCESS\ *) : ;; *) continue ;; esac
vp=$(printf '%s\n' "$v" | awk '{print $2}')
[ "$(norm_verdict_path "$vp")" = "concepts/$1" ] && echo X
done | grep -c '^X$' || true
}
neg1=$(neg_count neg-1.md); neg2=$(neg_count neg-2.md); neg3=$(neg_count neg-3.md) neg1=$(neg_count neg-1.md); neg2=$(neg_count neg-2.md); neg3=$(neg_count neg-3.md)
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" \