#!/bin/bash
# 两臂自测：`reject-consumer-design-task.sh` 是**判别器**还是**恒红 / 恒绿**。
#
# ⛔ 只跑故障臂不算验证（`AGENTS §25`：只在故障臂红的才是判别器；两臂都红是恒红、
#    信息量 0，且恒红长得像 fail-closed）。本文件因此必跑两臂。
# 对照臂的用例**逐字取自 lab 自己的真实 prompt**（250 份 transcript / 452 条人写 prompt
# 那个语料，量具 `probes/consumer-task-boundary/measure-classifier-fp.mjs`），
# ⛔ 不用我编的「像审查」的句子 —— 编的句子测不出真语料里的形态。
#
# 用法：bash .claude/hooks/reject-consumer-design-task.selftest.sh
set -u
HOOK="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/reject-consumer-design-task.sh"
[ -x "$HOOK" ] || chmod +x "$HOOK"

pass=0
fail=0

run_case() {
  local label="$1" want="$2" prompt="$3"
  local out rc
  # ⛔ 不带管道读退出码（`AGENTS §2.12` 推论三：管道会吞掉退出码）。
  out=$(printf '%s' "$prompt" | python3 -c 'import json,sys; print(json.dumps({"session_id":"selftest","prompt":sys.stdin.read()}))' | "$HOOK" 2>/tmp/tvu-hook-selftest.err)
  rc=$?
  if [ "$rc" = "$want" ]; then
    pass=$((pass + 1))
    printf '  ✓ %-46s exit=%s\n' "$label" "$rc"
  else
    fail=$((fail + 1))
    printf '  ✗ %-46s exit=%s (期望 %s)\n' "$label" "$rc" "$want"
    printf '      stderr: %s\n' "$(head -2 /tmp/tvu-hook-selftest.err | tr '\n' ' ')"
  fi
}

echo "── 故障臂（必须 exit 2 = 退回）─────────────────────────────"
# F1/F2 逐字取自语料里那三条真阳
# ⚠️ 语料里那三条真阳**都同时含** TVU 前缀形态与裸形态（逐条验过）；
#    F1 用它们的**截断摘录**（只剩裸形态）⇒ 落**弱档**、按设计 exit 0 + 注入告警。
#    ⇒ 这一格测的是「弱档没被误接成阻塞」，⛔ 不是「真阳漏了」。
run_case "F1' 截断摘录（只剩裸串）⇒ 弱档放行" 0 \
  '接 V4-1646 LCD WiFi「Other」/隐藏 SSID 的设计全流程。前置 upstream-gate 已完成，⛔ 别重跑。'
run_case "F1 语料真阳全文形态（含 TVU 前缀）" 2 \
  '接 V4-1646 LCD WiFi 的设计全流程。走 @TVU 设计全流程 的 Stage 0。'
run_case "F2 语料真阳 · 入口 @TVU 设计全流程" 2 \
  '拿一个真需求跑一次优化后的流水线。入口 `@TVU 设计全流程`，从流水线表新加的「前置 · upstream-gate」那一行起步'
run_case "F3 臂A · Figma URL + 写动词" 2 \
  '帮我改一下 https://www.figma.com/design/ABC123xyz/Product 里那个弹窗的设计稿，加两个按钮'
run_case "F4 skill 名 · design-qa-loop" 2 \
  '在这个项目里跑一次 design-qa-loop 走查'

echo "── 对照臂（必须 exit 0 = 放行）─────────────────────────────"
# C1/C2 逐字取自本轮与上一轮的真实 lab prompt 开头
run_case "C1 语料 · DS 瘦身+优化续跑" 0 \
  '接上一轮「DS 瘦身 + 优化」（2026-09-09 收尾，全部落地）。先读两份：docs/2026-09-09-ds-slim-optimize-review.md'
run_case "C2 语料 · 核 DS HEAD 漂移" 0 \
  '起手先做两件：1. 核 DS HEAD 漂移 —— lab 上次记的是 tvu-design-system b0a29689。现取后逐个 commit 过一遍，漏登的补进 review'
run_case "C3 审查语料含「设计」二字" 0 \
  '核一下 audit-mockup-variant-axis 这道闸的判据，它对设计系统里 line/filled 混用的覆盖面有多大'
run_case "C4 审查语料含 Figma URL + code 信号" 0 \
  '核 audit:framework-parity 对 https://www.figma.com/design/ABC123xyz/X 的 vue 输出还原得对不对'
run_case "C5 空 prompt" 0 ''

echo
echo "── 逃生口（人设 ⇒ 必须放行；⛔ AI 不得自设）───────────────"
out=$(printf '接 V4-1646 的设计全流程' | python3 -c 'import json,sys; print(json.dumps({"prompt":sys.stdin.read()}))' | LAB_CONSUMER_TASK_ACK=1 "$HOOK" 2>/dev/null)
rc=$?
if [ "$rc" = "0" ]; then pass=$((pass+1)); printf '  ✓ %-46s exit=0\n' "E1 ACK=1 放行"; else fail=$((fail+1)); printf '  ✗ %-46s exit=%s\n' "E1 ACK=1 放行" "$rc"; fi

echo
echo "── 弱档必须真的注入（⛔ 「exit 0」分不清「弱档注入了」与「什么都没做」）──────"
# `AGENTS §2.12` 推论四：0 / 空集本身是有意义的结论时，必须先证判定面非空。
w=$(printf '接 XX 的设计全流程' | python3 -c 'import json,sys; print(json.dumps({"prompt":sys.stdin.read()}))' | "$HOOK" 2>/dev/null)
if printf '%s' "$w" | grep -q 'additionalContext'; then
  pass=$((pass+1)); printf '  ✓ %-46s stdout 含 additionalContext\n' "W1 弱档注入"
else
  fail=$((fail+1)); printf '  ✗ %-46s stdout=%s\n' "W1 弱档注入" "$(printf '%s' "$w" | head -c 80)"
fi
# 对照：纯审查 prompt 必须 **什么都不注入**（否则弱档就是恒响 = 零信息）
q=$(printf '核一下 audit-mockup-variant-axis 的判据覆盖面' | python3 -c 'import json,sys; print(json.dumps({"prompt":sys.stdin.read()}))' | "$HOOK" 2>/dev/null)
if [ -z "$q" ]; then
  pass=$((pass+1)); printf '  ✓ %-46s stdout 为空\n' "W2 审查 prompt 零注入"
else
  fail=$((fail+1)); printf '  ✗ %-46s stdout=%s\n' "W2 审查 prompt 零注入" "$(printf '%s' "$q" | head -c 80)"
fi
# 契约变更探测：prompt 字段不在 ⇒ 必须显式说「没做判定」，⛔ 不许静默 exit 0
p=$(printf '{"session_id":"x"}' | "$HOOK" 2>/dev/null)
if printf '%s' "$p" | grep -q '未做边界判定'; then
  pass=$((pass+1)); printf '  ✓ %-46s 显式声明未判定\n' "W3 契约变更 fail-loud"
else
  fail=$((fail+1)); printf '  ✗ %-46s stdout=%s\n' "W3 契约变更 fail-loud" "$(printf '%s' "$p" | head -c 80)"
fi

echo
echo "── 装置自证（⛔ 全绿不算数：判别力要两侧都动过）───────────"
if [ "$fail" = "0" ]; then
  echo "  ⇒ 强档 4 红 · 弱档 1 注入+1 零注入 · 对照臂 6 绿 · 逃生口 1 · 契约 1"
  echo "  ⇒ 判别器成立：⛔ 不是恒红（对照臂全绿）也⛔ 不是恒绿（强档全红）"
fi
echo
echo "PASS=$pass FAIL=$fail"
[ "$fail" = "0" ] || exit 1
