scripts/butler-coding-strict-pilot-smoke.sh
Rama main · réplica de lectura del repositorio original.
#!/usr/bin/env bash
# G2-08 Task 3: Phase A 控型 smoke — 直接调 apply_coding_strict_pilot_gate,
# 不走真实 delegate 链。验 gate 机制在 4 组合下行为。
set -uo pipefail
WFXM_HOME="${WFXM_HOME:-/home/ailearn/projects/WFXM}"
PASS=0
FAIL=0
run_gate() {
local desc="$1"
local strict_env="$2"
local role="$3"
local category="$4"
local violated_json="$5"
local expect_ok="$6"
local expect_gate="$7"
set +e
out=$(cd "$WFXM_HOME" && BUTLER_CODING_STRICT="$strict_env" \
/home/ailearn/miniconda3/bin/python3 -c "
from butler.dev_engine.b9_delegate_gate import apply_coding_strict_pilot_gate
import json, sys
ck = {'violated': $violated_json}
ok, issues = apply_coding_strict_pilot_gate(
category='$category', role='$role',
dev_engine={'coding_knowledge': ck},
base_success=True,
)
print(json.dumps({'ok': ok, 'issues': issues}))
" 2>&1)
rc=$?
set -e
got_ok=$(echo "$out" | python3 -c "import sys,json; d=json.loads(sys.stdin.read().strip().splitlines()[-1]); print(d['ok'])" 2>/dev/null || echo "")
got_gate=$(echo "$out" | grep -c "CODING_STRICT_GATE" || true)
if [ "$got_ok" = "$expect_ok" ] && [ "$got_gate" -eq "$expect_gate" ]; then
echo "PASS: $desc (ok=$got_ok gate=$got_gate)"
PASS=$((PASS + 1))
else
echo "FAIL: $desc (got ok=$got_ok gate=$got_gate, expected ok=$expect_ok gate=$expect_gate)"
echo " output: $out"
FAIL=$((FAIL + 1))
fi
}
# Case 1: strict=1 + dev + deep + violated 非空 → 阻断
run_gate "strict=1_dev_deep_violated_blocks" "1" "dev" "deep" "[\"CA4\",\"T8\"]" "False" "1"
# Case 2: strict=0 → 放行
run_gate "strict=0_advisory_passes" "0" "dev" "deep" "[\"CA4\",\"T8\"]" "True" "0"
# Case 3: role=content → 放行
run_gate "role_content_passes" "1" "content" "deep" "[\"CA4\",\"T8\"]" "True" "0"
# Case 4: category=other(不在 pilot set)→ 放行
run_gate "category_other_passes" "1" "dev" "other" "[\"CA4\",\"T8\"]" "True" "0"
echo "Result: $PASS pass / $FAIL fail"
[ "$FAIL" -eq 0 ]