#!/usr/bin/env bash # 会话结束收口检查:工作区相对会话开始有改动(status 行或 diff 内容任一变化)、 # 且 active.md 本会话未更新时,以 exit 2 阻止停止并经 stderr 注入登记提醒(每会话至多一次) proj="${ZCODE_PROJECT_DIR:-$PWD}" sid="${CLAUDE_SESSION_ID:-default}" state="/tmp/zcode-active-md-guard" snap="$state/$sid.snap" active_md="$proj/production/session-state/active.md" [ -f "$snap" ] || exit 0 [ -f "$state/$sid.reminded" ] && exit 0 start_status=$(sed -n 2p "$snap") start_diff=$(sed -n 3p "$snap") start_mtime=$(sed -n 4p "$snap") now_status=$(git -C "$proj" status --porcelain 2>/dev/null | sort | sha1sum | cut -d' ' -f1) now_diff=$(git -C "$proj" diff HEAD 2>/dev/null | sha1sum | cut -d' ' -f1) [ "$now_status" = "$start_status" ] && [ "$now_diff" = "$start_diff" ] && exit 0 now_mtime=$(stat -c %Y "$active_md" 2>/dev/null || echo 0) [ "$now_mtime" -gt "$start_mtime" ] && exit 0 touch "$state/$sid.reminded" cat >&2 <<'MSG' [会话收口检查] 本会话产生了工作区改动,但 production/session-state/active.md 未在本会话内更新。若本会话包含实质工作(代码/文档/数值/设计拍板/缺陷修复),请:① 先更新 active.md 顶部「当前状态快照」节(在飞/可做/阻塞/锚点/下一步——先改快照再记账);② 再在 active.md 末尾追加一条编号批次条目(做了什么·拍板了什么·验证结果·遗留与下一步)。完成后结束;若本次确无可登记事项(纯问答、只读核查),忽略本提醒直接结束。另:待办事项登记 design/gdd/06-待办清单.md(裁决后改状态列留痕),不要写进 active.md 条目表。 MSG exit 2