#!/usr/bin/env bash
# Rule 2.5 purposeful red — doyle W0 gate, pre-registered in GATE-W0-272-CHECKLIST.md §1.
# Runs AFTER battery #3 in this same gate pool (never beside it). Exit = number of arm failures.
set -u
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
F="$ROOT/crates/spt-daemon/src/webserve.rs"
OUT="$ROOT/.spt/mutate-rule25"; mkdir -p "$OUT"
OLD='        if bare_node && docs_root.join(first).is_file() {'
NEW='        if false && bare_node && docs_root.join(first).is_file() {'
CELL='subnet_node_labels_shadow_only_the_docs_compat_alias_while_members'
unset OWL_SESSION_ID SPT_AGENT_ID SPT_ENDPOINT_ID SPT_SESSION_NAME SPT_ADAPTER SPT_HOST_PID SPT_INJECT_VERIFY_ECHO
fails=0
cd "$ROOT" || exit 9

n=$(grep -cF "$OLD" "$F"); echo "MATCH_COUNT=$n"
[ "$n" = "1" ] || { echo "REFUSE: expected exactly one anchor"; exit 9; }
git -C "$ROOT" diff --quiet -- "$F" || { echo "REFUSE: $F already dirty"; exit 9; }

python - "$F" "$OLD" "$NEW" <<'EOF'
import sys, io
p, old, new = sys.argv[1:4]
s = io.open(p, encoding="utf-8", newline="").read()
assert s.count(old) == 1
io.open(p, "w", encoding="utf-8", newline="").write(s.replace(old, new))
EOF
echo "MUTATED LINE:"; grep -nF "$NEW" "$F" || { echo "REFUSE: mutation did not land"; exit 9; }

cargo nextest run --no-fail-fast -p spt-daemon --test webserve_e2e -E "test($CELL)" > "$OUT/mutated.raw" 2>&1
echo "$?" > "$OUT/mutated.exit"; echo "mutated nextest exit=$(cat "$OUT/mutated.exit")"
grep -c 'Summary' "$OUT/mutated.raw" | sed 's/^/mutated Summary lines=/'
grep -nE 'panicked at|left:|right:|FAIL|PASS' "$OUT/mutated.raw" | head -8

git -C "$ROOT" checkout -- "$F"; echo "REVERTED: $(git -C "$ROOT" diff --stat -- "$F" | wc -l | tr -d ' ') dirty lines"
cargo nextest run --no-fail-fast -p spt-daemon --test webserve_e2e -E "test($CELL)" > "$OUT/reverted.raw" 2>&1
echo "$?" > "$OUT/reverted.exit"; echo "reverted nextest exit=$(cat "$OUT/reverted.exit")"

# Verdict arms: mutated MUST fail at webserve_e2e.rs:256 (200 vs 302); reverted MUST pass.
grep -qE 'webserve_e2e\.rs:256' "$OUT/mutated.raw" && echo "ARM red-at-256: PASS" || { echo "ARM red-at-256: FAIL"; fails=$((fails+1)); }
grep -qE 'webserve_e2e\.rs:259' "$OUT/mutated.raw" && { echo "ARM 259-intact: FAIL (sibling reddened)"; fails=$((fails+1)); } || echo "ARM 259-intact: PASS"
[ "$(cat "$OUT/mutated.exit")" != "0" ] && echo "ARM mutated-nonzero: PASS" || { echo "ARM mutated-nonzero: FAIL"; fails=$((fails+1)); }
[ "$(cat "$OUT/reverted.exit")" = "0" ] && echo "ARM reverted-green: PASS" || { echo "ARM reverted-green: FAIL"; fails=$((fails+1)); }
echo "MUTATION_FAILS=$fails"; exit $fails
