SOP:条款验收方补强(rule-acceptance-20261008)
- 主题目录:
rule-acceptance-20261008/|实施日期:2026-10-08|实施人:Agent(用户授权)
- 变更体:
~/.trae-cn/user_rules/rule-agent-efficiency.md(4b 与项 4 两处)、sessionstart-hook/session-start-inject.py、posttooluse-guard/skill-edit-guard.py、~/.trae-cn/hooks.json;新增 script-safety-guard/script-safety-guard.py、sched-guard/sched-guard.py
- 关联:2026-10-08 全量审计(5 份规则 + 11 个 skill + 7 条 Hook 挂载);配套
batch-workflow-20261008/(批量项工作流)
1. 背景
2026-10-08 全量盘点结论:没有第二个「完全裸」的条款(此前逐条补过的都已挂 Hook 或硬门禁),
但存在大面积【半】:触发点有、验收方无——「条款只写在正文里,靠自觉必然退化」。
按其代价排序,本批处理其中 5 条:
| 序 |
缺口 |
为何贵 |
| 1 |
技能加载索引整表无验收 |
它是所有规则的分发入口,「该加载没加载」永久不可见 |
| 2 |
脚本绝对禁止 5 条无验收 |
安全红线,全靠人工 review |
| 3 |
Slurm/LSF 有作业不得动节点无验收 |
误动节点不可逆 |
| 4 |
条件触发项(任务侧效率 / 遮蔽自检)靠自判 |
「触发与否」由模型说了算 |
| 4b / 5 |
收尾五项「表格形态」无验收 / Hook 层级自身无存活验收 |
后者是所有「代码级验收方」的地基 |
2. 目标
给缺验收方的条款补可见事件(注入一行 / 落盘留痕 / 硬门禁),或如实登记上限;
不改动任何既有判据的口径,不给已有强制项加码。
3. 前置条件
- 逐项先备份(见 §7);
py_compile 通过;
- 离线验证 4 套全绿(见 §6);
- 改 Hook 脚本与
hooks.json 须重启 Trae 才生效。
4. 影响范围
| 项 |
内容 |
| 主机 |
本机 |
| 组件 |
user_rules/rule-agent-efficiency.md、2 个既有 Hook 脚本、2 个新 Hook 脚本、hooks.json |
| 服务 |
无(不碰 proxy / systemd) |
| 是否停服 |
否 |
| 生效时点 |
改 user_rules 同会话下一次请求即生效;Hook 与 hooks.json 须重启 Trae |
| 影响面 |
所有会话(Hook 为全局配置) |
5. 分步操作
| 步 |
动作 |
落点 |
| 4b |
收尾自查「输出形态」补形态硬约束(不得包代码块 / 不得省略分隔行)+ 上限须知(形态无机检、唯一验收方是用户目视) |
规则「收尾自查」节 |
| 5 |
session-start-inject.py 加 Hook 存活自检:解析 hooks.json 取脚本路径 → 查「脚本存在 / 必备日志存在 / tool_timing 近期 miss_pre」→ 仅异常注入一行,正常静默,异常留痕 state/hook-selfcheck.log |
既有 Hook 脚本 |
| 1 |
skill-edit-guard.py 加技能加载提示:写 docs/HANDOFF.md/PROJECT-MAP.md → 提示 writing-handoff;写 SOP.md/RUNBOOK.md/INCIDENT-*.md → 提示 writing-ops-change-sop;去重键 =(session, agent, 类别) |
既有 Hook 脚本 |
| 4 |
条件触发项如实标注上限:写明二者无客观判据、只有「出现即人可核对」一层,升级须先在 proxy.py 埋点 |
规则「遮蔽自检」节 |
| 2 |
新增 script-safety-guard.py(PostToolUse):扫本次写入文本、仅脚本后缀,命中 5 条红线之一即注入一行;每会话一次 |
新脚本 + hooks.json(PostToolUse *) |
| 3 |
新增 sched-guard.py(PreToolUse / RunCommand):命中调度动词(scontrol/srun/sbatch/scancel/squeue/sinfo/bsub/bkill/bjobs/bqueues/bhosts)即提醒先确认节点无作业;只提醒不拦截 |
新脚本 + hooks.json(PreToolUse RunCommand) |
6. 验证
| 验证 |
结果 |
py_compile(3 个脚本) |
通过 |
offline_verify_hook_selfcheck.py |
8/8(真实环境静默 / 报脚本缺失 / 报日志缺失 / miss_pre 计数 / 缺+畸形 hooks.json 静默 / 挂载去重与脚本齐) |
offline_verify_skill_hint.py |
13/13(5 类路径真阳性 + 3 类备份/普通文件真阴性 + 去重语义 + 3 条端到端) |
offline_verify_script_safety.py |
20/20(6 真阳性 + 7 真阴性 + 后缀判据 + 5 条端到端) |
offline_verify_sched_guard.py |
14/14(5 真阳性 + 4 真阴性 + 5 条端到端) |
hooks.json 校验 |
JSON 合法;12 条挂载 / 9 个脚本(原 10 / 7) |
| 真机冒烟(session-start) |
exit=0、正常静默、HANDOFF 照常注入、stderr 0 字节 |
| 实机命中 |
改 docs/HANDOFF.md 时当场收到 [技能加载] 注入 → 项 1 线上生效已证 |
回归口径:本批任何一项改动后,须重跑上述 4 套离线用例(项 5 的 U6 曾因挂载数变化需同步断言)。
7. 回滚
备份位置:rule-acceptance-20261008/backup/,逐条登记见 backup/README.md。
cd /home/rain/Documents/services/token_proxy
cp -p rule-acceptance-20261008/backup/rule-agent-efficiency.md.bak.20261008-022055 ~/.trae-cn/user_rules/rule-agent-efficiency.md
cp -p rule-acceptance-20261008/backup/sessionstart-hook/session-start-inject.py.bak.20261008-021541 sessionstart-hook/session-start-inject.py
cp -p rule-acceptance-20261008/backup/posttooluse-guard/skill-edit-guard.py.bak.20261008-022005.reconstructed posttooluse-guard/skill-edit-guard.py
cp -p rule-acceptance-20261008/backup/hooks.json.bak.20261008-022221 ~/.trae-cn/hooks.json
- 两项新 Hook 的回滚 = 删
hooks.json 里对应两处挂载(脚本可留);改回后须重启 Trae。
skill-edit-guard.py 的备份是重建件(改前未先备份,见 backup/README.md 疏漏登记)。
8. 风险说明
| 风险 |
缓解 |
| 脚本红线 D1(硬编码凭据)误报(文档 / 测试里的示例串) |
只扫脚本后缀的本次写入文本;右侧为 os.environ/getpass/短串不命中;每会话至多一次 |
调度提醒覆盖 squeue 等只读命令(会提醒但无害) |
判据文本写明"动节点或作业前";若证明无用 → 删该 Hook;若确有误动 → 升强制 |
| Hook 存活自检自身盲区(本脚本挂了没人查) |
但它挂了 HANDOFF 也不再注入 → 用户立刻可察(天然验收方,已写入文件头) |
| 挂载 10 → 12,每次工具调用多 2 次子进程 |
均为纯 Python 短脚本、无常驻;实测增量 < 50 ms/次 |
| 规则「上限须知」暴露短板被误读为"已解决" |
文本明写「未埋点前不要假装它们有验收方」 |
9. 第四批(2026-10-08 下午):遮蔽自检升 A 级 + miss 段压缩 + 落点补登记
背景:§5 项 4 曾把「遮蔽自检」与「任务侧效率」一起如实标注为「无机检、无外部验收方」。
本批把其中可机检的那一条(遮蔽自检)真正装上验收方:触发点由「自判」改为写入工程内 .py 之后,
判据由代码给出。任务侧效率仍如实保留上限须知(代理侧无命令文本,埋点前无法机检)。
9.1 分步操作
| 步 |
动作 |
落点 |
| 6 |
新增 shadow-check-guard/shadow-check-guard.py(PostToolUse *):写类工具 + .py → project_root() 取最近含 .venv/docs 等标志的祖先 → 跑 shared_lib_divergence_check.py --root <root> --json → 有同名副本即注入一行;同 (session, root) 去重一次;异常恒静默 |
新脚本 + hooks.json(PostToolUse *,挂载 12 → 13) |
| 6 |
规则「遮蔽自检」节:B 级(自判)→ A 级(已接 Hook);删掉手工命令块与空表 |
规则「收尾自查」节 |
| 7 |
规则「miss 检测」节:压成两行(口径与阈值已固化在 wrapup.py,规则不再复述) |
同上 |
| 7 |
规则「上限须知」:覆盖范围由「任务侧效率 + 遮蔽自检」收窄为仅任务侧效率 |
同上 |
| 8 |
HANDOFF 补登记三个此前未入本文件的档案 + §3.1 增「遮蔽副本待处置」 |
docs/HANDOFF.md §2 / §3.1 / §5 |
9.2 验证
| 验证 |
结果 |
offline_verify_shadow_guard.py |
6/6 × 2 遍(U1 正例;U2 非 .py / U3 无副本工程 / U4 检测脚本缺失 = 3 反例;U5 去重;U6 project_root 单元) |
hooks.json 校验 |
JSON 合法;13 条挂载 / 10 个脚本,缺失 0 |
| 规则旧口径词 |
16,063 → 0(新句保留 P99 作阈值依据) |
| 三档案入 HANDOFF |
rule-slim / state-persist / permission-grant 各命中 2 处 |
| 实测遮蔽(顺带,外部工程) |
slurm/eda_storage_standardization/deploy/utils/ 下 3 处「双向分叉」同名副本——仅作 Hook 有效性的证据;该工程不属本项目,问题本体归它自己的 docs/HANDOFF.md(曾误登进本工程 HANDOFF,已移出) |
9.3 回滚
cd /home/rain/Documents/services/token_proxy
cp -p rule-acceptance-20261008/backup/hooks.json.bak.20261008-134205 ~/.trae-cn/hooks.json
cp -p rule-acceptance-20261008/backup/rule-agent-efficiency.md.bak.20261008-134205 ~/.trae-cn/user_rules/rule-agent-efficiency.md
cp -p rule-acceptance-20261008/backup/HANDOFF.md.bak.20261008-134205 docs/HANDOFF.md
- 新 Hook 回滚 = 删
hooks.json 里对应那一处挂载(脚本可留);改回后须重启 Trae。
- 本次三项改动均先备份再改(本批第一步即备份,未再犯前三批的「改前未备份」)。
9.4 风险与上限
| 风险 / 上限 |
说明 |
project_root() 取最近标志目录 → 副本在更外层分支时会漏报 |
按「宁漏不误报」选择;若实测漏报,改取「最高」标志目录(一处函数改动) |
| 每次工具调用多 1 个子进程(PostToolUse 共 3 → 4 条) |
脚本先判 tool_name ∈ 写类工具 且目标 .py;非写类调用只付 python 启动开销(≈30 ms) |
检测会读共享库目录(~/py_public_modules) |
只读、不写;子进程超时 7 s(Hook 上限 10 s) |
| 仍未闭环:生产上是否误报 / 漏报 |
须等重启 Trae 后在真实改动中观察;新挂载本会话不生效 |
来源:/home/rain/Documents/services/token_proxy/rule-acceptance-20261008/SOP.md | 最后更新:2026-10-08 13:57(由 build/sync.py 同步,请勿在站点侧修改)