{
  "$comment": [
    "lab 的项目级 hook 挂载点。owner 2026-09-10 拍定接线（此前 09-10 上午拒过一次 —— 当时 harness 契约还没实测）。",
    "接线前实测的两条契约（probes/consumer-task-boundary/harness-contract-probe.sh，读数 runs/consumer-task-boundary/harness-contract.json，9/9 控制通过）：",
    "  · exit 2 真的挡住 prompt —— 阻塞臂 num_turns=0 / input_tokens=0，模型零调用；",
    "  · hook 的 stderr 真的到达用户，且 result 里逐字回显 `Original prompt: <原文>` ⇒ prompt ⛔ 未被擦掉。",
    "⚠️ 该读数的环境名：Claude Code 2.1.251（nvm）· `claude -p` 无头模式。⛔ 交互 TUI 模式未测。",
    "⚠️ 三臂进程退出码实测全 0 ⇒ ⛔ 别拿 exit code 当验收，判别力在 num_turns / result 上。"
  ],
  "$comment2": [
    "SessionStart 那条 = AGENTS §0.2.1 标准 ① 的【起手侧】挂点（owner 2026-09-14 拍定「补上」）。",
    "另一半在 .githooks/pre-commit（收尾侧）；两处合起来兑现 §0.2.1 那句「起手跑一次、收尾再跑一次」。",
    "⛔ 它永远 exit 0、绝不阻塞 —— 那些红多半不是 lab 的账，一个会挡我又无权修的闸只会被绕过",
    "   ⇒ 退化成恒红 = 零信息（lab:N58）。判据与上限逐字写在 .githooks/ratchet-watch.sh 头注释。",
    "⚠️ 实测耗时 ~550ms（N=3：545/566/532）⇒ 不拖慢起手。",
    "⚠️ 上限（⛔ 别读成「已经有人盯着了」）：它只让 lab 侧看见；改了 DS 规则真源的那个人看不到。"
  ],
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/reject-consumer-design-task.sh"
          }
        ]
      }
    ],
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "$CLAUDE_PROJECT_DIR/.githooks/ratchet-watch.sh"
          }
        ]
      }
    ]
  }
}
