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:
@@ -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" \
|
||||||
|
|||||||
Reference in New Issue
Block a user