734cafd98f
Drei Naechte in Folge bauten Worker git-init-Branches ohne gemeinsamen Ursprung mit main (cleanse-skill-index 12.07., skill-kanten-generator 13.07., blogwatcher-logging ~14.07.) - bei der Annahme technisch tot, Nacht-Arbeit verloren. SOUL-Prosa allein driftet (Meta-Lehre Fallstrick- Audit) -> jetzt mechanisch: tabu-pfade-guard blockt 'git init' im Kanban-Workspace hart; pre-verify-gates prueft VOR dem Fertigmelden merge-base gegen origin/main (Orphan-Gate ROT). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
76 lines
3.4 KiB
Bash
76 lines
3.4 KiB
Bash
#!/usr/bin/env bash
|
||
# pre_verify-Gate (P1-5, 09.07.2026): erinnert den Agenten VOR dem Fertigmelden an
|
||
# die zwei MC2-Pflichten aus AGENTS.md — py_compile-Gate und die dist-Falle.
|
||
# Antwort {"action":"continue","message":...} = Agent arbeitet weiter; {} = durchlassen.
|
||
set -u
|
||
payload="$(cat -)"
|
||
attempt=$(printf %s "$payload" | jq -r '.extra.attempt // 0' 2>/dev/null || echo 0)
|
||
# Ein-Schuss: nach dem ersten Nudge nicht erneut nerven (Docs-Empfehlung).
|
||
if [ "$attempt" != "0" ]; then printf '{}'; exit 0; fi
|
||
mapfile -t paths < <(printf %s "$payload" | jq -r '.extra.changed_paths[]? // empty' 2>/dev/null)
|
||
[ ${#paths[@]} -eq 0 ] && { printf '{}'; exit 0; }
|
||
msgs=()
|
||
|
||
# Gate 1: py_compile fuer alle geaenderten .py, die existieren
|
||
pyfail=""
|
||
for p in "${paths[@]}"; do
|
||
case "$p" in
|
||
*.py)
|
||
if [ -f "$p" ] && ! err=$(python3 -m py_compile "$p" 2>&1); then
|
||
pyfail="${pyfail}${p}: ${err}"$'\n'
|
||
fi
|
||
;;
|
||
esac
|
||
done
|
||
if [ -n "$pyfail" ]; then
|
||
msgs+=("py_compile-Gate ROT:"$'\n'"${pyfail}Erst fixen, dann fertigmelden.")
|
||
fi
|
||
|
||
# Gate 2: dist-Falle — frontend/src geaendert, aber kein frontend/dist angefasst.
|
||
# Feuert NUR in Repos mit der MC2-Konvention (frontend/dist ist git-getrackt) —
|
||
# sonst nudgt es in beliebigen Spielordnern ohne Build (False-Positive, 09.07. beobachtet).
|
||
srcfile=""; dist=0
|
||
for p in "${paths[@]}"; do
|
||
case "$p" in
|
||
*/frontend/src/*|frontend/src/*) srcfile="$p" ;;
|
||
*/frontend/dist/*|frontend/dist/*) dist=1 ;;
|
||
esac
|
||
done
|
||
if [ -n "$srcfile" ] && [ $dist -eq 0 ]; then
|
||
# Repo-Wurzel vom geaenderten File aus hochlaufen (max 8 Ebenen).
|
||
root=$(dirname "$srcfile"); n=0
|
||
while [ $n -lt 8 ] && [ -n "$root" ] && [ "$root" != "/" ] && [ ! -e "$root/.git" ]; do
|
||
root=$(dirname "$root"); n=$((n+1))
|
||
done
|
||
if [ -e "$root/.git" ] && git -C "$root" ls-files frontend/dist 2>/dev/null | head -1 | grep -q .; then
|
||
msgs+=("AGENTS.md-Gate: Du hast frontend/src geaendert, aber frontend/dist nicht. Die Box baut NICHT selbst: cd frontend && npm run build, dann das neue dist im selben Branch mit-committen — sonst zeigt die Box nach Merge+Deploy den alten Stand.")
|
||
fi
|
||
fi
|
||
|
||
# Gate 3 (R5, 15.07.): Orphan-Check — git-init-Repos ohne gemeinsamen Ursprung mit
|
||
# origin/main sind bei der Annahme technisch tot (3 Vorfaelle 12.–14.07., je eine
|
||
# Nacht Arbeit verloren). VOR dem Fertigmelden fangen, nicht erst im Auftragsbuch.
|
||
orphan=""; checked=""
|
||
for p in "${paths[@]}"; do
|
||
root=$(dirname "$p"); n=0
|
||
while [ $n -lt 8 ] && [ -n "$root" ] && [ "$root" != "/" ] && [ ! -e "$root/.git" ]; do
|
||
root=$(dirname "$root"); n=$((n+1))
|
||
done
|
||
[ -e "$root/.git" ] || continue
|
||
case " $checked " in *" $root "*) continue ;; esac
|
||
checked="$checked $root"
|
||
git -C "$root" remote get-url origin >/dev/null 2>&1 || continue
|
||
git -C "$root" fetch -q origin main >/dev/null 2>&1 || true
|
||
if git -C "$root" rev-parse --verify -q origin/main >/dev/null 2>&1 \
|
||
&& ! git -C "$root" merge-base HEAD origin/main >/dev/null 2>&1; then
|
||
orphan="${orphan}${root}"$'\n'
|
||
fi
|
||
done
|
||
if [ -n "$orphan" ]; then
|
||
msgs+=("Orphan-Gate ROT: Dieses Repo hat KEINEN gemeinsamen Ursprung mit origin/main (git init statt Klonen?):"$'\n'"${orphan}So ist der Vorschlag bei der Annahme technisch TOT. Nicht fertigmelden — frisch VOLL klonen, Branch von origin/main abzweigen, Aenderungen ruebertragen.")
|
||
fi
|
||
|
||
if [ ${#msgs[@]} -eq 0 ]; then printf '{}'; exit 0; fi
|
||
joined=$(printf '%s\n\n' "${msgs[@]}")
|
||
jq --null-input --arg m "$joined" '{action:"continue", message:$m}'
|