SOP:sched-guard 由强制拦截降为提醒(2026-10-13)¶
1. 背景¶
用户核查 Hook 拦截清单后裁定「我不拦,都改成提醒」,本次只针对 sched-guard 一个脚本。
sched-guard 于 2026-10-08 随「条款验收方补强」新增(当时只提醒),同日 19:28 升为 deny;2026-10-12 收窄动词表(移出只读查询)。它的判据是「动节点或作业前先确认该节点无在跑作业」,属效率与安全建议,与 2026-10-11 merge-guard 全部降为提醒的口径一致。
2. 目标¶
sched-guard 命中调度动词时只注入一行提醒,绝不 deny;同一命令每会话至多提醒一次;脚本恒以退出码 0 结束且不写 stderr。
3. 前置条件¶
- 对
sched-guard/sched-guard.py有写权限 - 已备份原脚本至
backup/sched-guard/sched-guard.py.bak.20261013-014206(sha2568a4ee2a2...) - 无需重启 Trae:Hook 脚本改动即时生效
4. 影响范围¶
- 组件:
sched-guard/sched-guard.py(PreToolUse / RunCommand 挂载) - 影响面:所有会话中
RunCommand的命令文本;涉及主机与队列:无(不接触集群) - 是否停服:否
- 窗口期:无特殊要求
- 在跑业务:不受影响,本次不改变拦截之外的任何行为
5. 分步操作¶
步骤 1:备份原脚本(高危动作:覆盖前必备份)¶
cd ~/Documents/services/token_proxy
ts=$(date +%Y%m%d-%H%M%S)
mkdir -p sched-guard-remind-20261013/backup/sched-guard
cp -p sched-guard/sched-guard.py \
"sched-guard-remind-20261013/backup/sched-guard/sched-guard.py.bak.$ts"
预期:备份目录出现 .bak.<时间戳> 文件;sha256sum sched-guard/sched-guard.py 得 8a4ee2a2da694d3335c81810a581b5909d72b8ab37e2f6c46872cb9ae4db7690。
失败判断:目录或文件未生成,检查路径与权限后重做。
步骤 2:改为提醒形态¶
改动点(均在 sched-guard/sched-guard.py):
- 删除
_emit_deny()与DENY_MAX/DENY_KEEP,改为REMIND_KEEP; DENY_TEXT改为REMIND_TEXT,文案去掉「已拦截」「原样重发将放行」;main()中命中动词后不再 deny:按指纹去重,未提醒过则_emit_allow(text)并记remind事件,已提醒过则静默返回;- 动词表、词边界匹配、state 隔离方式、异常静默与恒
exit 0全部保持原样。
校验语法:
python3 -m py_compile sched-guard/sched-guard.py
预期:无输出,退出码 0。
实现体:sched-guard/sched-guard.py(以文件本体为准,本步骤为等价描述)。
6. 验证¶
python3 sched-guard-remind-20261013/verify_sched_remind.py
预期输出四行「通过」加一行「结论:全部通过」:
[通过] A 正例含 scontrol:输出提醒且不拦
[通过] B 反例纯查询 squeue:无输出
[通过] C 同一会话第二次同命令:静默
[通过] D 空输入:退出码 0 且无输出
结论:全部通过
失败判断:出现「失败」行时按第 7 章回滚。该脚本可重复执行,两遍结果一致(每次用新的 session_id)。
另需人工确认一条:logs/guard_events.jsonl 中新出现的 sched-guard 事件,action 应为 remind,不应再出现 deny。
7. 回滚¶
cd ~/Documents/services/token_proxy
cp -p sched-guard-remind-20261013/backup/sched-guard/sched-guard.py.bak.20261013-014206 \
sched-guard/sched-guard.py
python3 -m py_compile sched-guard/sched-guard.py
回滚后验证:重跑旧用例 rule-acceptance-20261008/offline_verify_sched_guard.py,应重新得到 deny 断言通过;guard_events.jsonl 中出现 action=deny 的新事件。
备份存放位置:sched-guard-remind-20261013/backup/,台账见该目录的 README.md。
8. 风险说明¶
- 风险:降为提醒后,Agent 可能在未确认节点是否空闲的情况下直接执行
scontrol update/srun/scancel等。缓解:提醒文本保留「动节点前先确认」的指引与规则出处;sched-guard之外无重复守卫,故该风险由提醒与规则共同承担。 - 风险:state 文件沿用
sched__前缀与 7 天保留期,旧文件里的denied/denies键不再使用,会被自然覆盖或过期回收,无迁移动作。 - 已失效引用:
rule-acceptance-20261008/offline_verify_sched_guard.py的 deny 断言自本次起作废,由verify_sched_remind.py取代。
来源:
/home/rain/Documents/services/token_proxy/sched-guard-remind-20261013/SOP.md| 最后更新:2026-10-13 01:42(由build/sync.py同步,请勿在站点侧修改)