跳转至

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(sha256 8a4ee2a2...)
  • 无需重启 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):

  1. 删除 _emit_deny() 与 DENY_MAX / DENY_KEEP,改为 REMIND_KEEP;
  2. DENY_TEXT 改为 REMIND_TEXT,文案去掉「已拦截」「原样重发将放行」;
  3. main() 中命中动词后不再 deny:按指纹去重,未提醒过则 _emit_allow(text) 并记 remind 事件,已提醒过则静默返回;
  4. 动词表、词边界匹配、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 同步,请勿在站点侧修改)