跳转至

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 同步,请勿在站点侧修改)