跳转至

SOP — 补 A/B/C 收尾自查的跨轮样本闭环(selfcheck-abc-loop-20261002)

本轮是只读盘点转 C 类变更:用户在追问"效率与成本的自我迭代是否已闭环"后确认执行三项收口动作。 变更对象只有一处代码(cost_audit/step_profile.py),其余为文档。

1. 背景

用户问"当前的自我迭代落地是否都已闭环"。核查后确认:识别 / 落地 / 留痕三环已通, 但量化收益 / 跨轮对照 / 触发与验收三环只在 D 组(MB §二十六)一处接通。

具体缺口两条可在本会话直接处理:

  1. 挂账 #23:cost_audit/step_profile.py 的 --date 只作用于 --conv 分支, --top 排名分支忽略它——而文件头用法示例正是 --top 5 --date 2026-10-02, 照抄会取到全库数据而非当日数据。取数工具的口径缺陷会污染 D 组判定。
  2. A/B/C 三组无跨轮可比样本:MB 有 §二十六 承接 D 组指标,却无对应节承接 A 效率 / B 成本 判定,导致"失败请求 / 零输出步 / 长空档 / 成本 / 四段占比 是否随轮次下降"无从对照。

2. 目标

变更完成后应达到的可验证状态:

  • step_profile.py --top N --date <YYYY-MM-DD> 只统计该日期的会话;给定无数据日期时给出提示并以非 0 退出; --conv 分支行为不变。
  • measured-baselines.md 新增 §二十七「收尾自查 A/B/C 指标样本」,含表头口径与已回填样本行。
  • optimization-backlog.md:挂账 #23 移入第二节「已做」(编号 #20),第四节过账记录追加一行, 挂账数由 20 降至 19。
  • docs/HANDOFF.md 更新为本轮状态。

3. 前置条件

  • 主机 192.168.31.250,工程根 ~/Documents/services/token_proxy,python3 可用(仅标准库)。
  • 数据源 logs/req_shape.jsonl 可读(不可再生数据,全程只读)。
  • 无需 sudo、无需停服、无需重启代理。
  • 已知:logs/usage.jsonl 写入有滞后,取数样本须标注窗口起止时刻(同族挂账 #18)。

4. 影响范围

项 内容
涉及主机 单机(192.168.31.250)
涉及组件 cost_audit/step_profile.py(只读分析工具);measured-baselines.md / optimization-backlog.md(skill 参考文档);docs/HANDOFF.md
是否停服 否。不触碰 proxy.py / config.yaml / systemd 服务
窗口期 无窗口要求,随时可执行
在跑业务 代理三条路由 ds / glm / mi 不受影响
影响面 仅影响"会话步序列画像"这一只读取数工具的输出口径;不改变任何采集与记账行为

5. 分步操作

步骤 1:备份改动前的脚本

改动前留底,满足"失败能回原点"。备份放本主题 backup/(台账见 backup/README.md)。

cd ~/Documents/services/token_proxy
mkdir -p selfcheck-abc-loop-20261002/backup/cost_audit
cp cost_audit/step_profile.py \
   selfcheck-abc-loop-20261002/backup/cost_audit/step_profile.py.bak.20261002-202909
ls -l selfcheck-abc-loop-20261002/backup/cost_audit/

预期:备份文件存在且与源文件字节数一致(13566 字节)。 失败判断:路径或权限错误 → 停止,不进行后续编辑。

步骤 2:修 main() — 让 --date 对 --top 分支生效

坑:--date 的过滤此前只在 --conv 分支通过 group_by_conv(rows, day=args.date) 生效; --top 分支走 print_rank(),其内部调用的 group_by_conv(rows) 不带 day。 因此修法不是改 print_rank 的签名,而是在 main() 里先把 rows 按日期前缀收窄—— 一处收窄、两个分支同时受益,改动面最小;--conv 分支的原有 day 过滤保留(冗余但无害)。

注意:日期比较用字符串前缀 startswith,与 group_by_conv 内部判据同源,不引入新的日期解析路径。

在 rows = load(args.log) 的"无数据"判断之后、if args.conv: 之前插入:

cd ~/Documents/services/token_proxy
patch cost_audit/step_profile.py <<'PATCH'
--- cost_audit/step_profile.py
+++ cost_audit/step_profile.py
@@ -313,6 +313,12 @@ def main():
     rows = load(args.log)
     if not rows:
         print("无数据:%s" % args.log)
         return 1
+    if args.date:
+        # --date 对两个分支都生效;此前只在 --conv 分支过滤,--top 排名会取到全库(挂账 #23)
+        rows = [r for r in rows if str(r.get("ts") or "").startswith(args.date)]
+        if not rows:
+            print("该日期无数据:%s" % args.date)
+            return 1

     if args.conv:
         prefix = args.conv
PATCH

预期:patch 报 succeeded,rc=0。 失败判断:patch 报 hunk FAILED(行号漂移)→ 按上下文手工插入同 6 行,不要用 --fuzz 硬打。

步骤 3:measured-baselines.md 新增 §二十七

文件位于 ~/.trae-cn/skills/ops-execution-efficiency/references/measured-baselines.md(项目外)。 在文末 §二十六 表格之后追加新节,不改动既有节。

核对追加是否到位:

grep -n "^## 二十七" ~/.trae-cn/skills/ops-execution-efficiency/references/measured-baselines.md

预期:输出一节标题行号(当前为 1668)。

步骤 4:optimization-backlog.md 过账

同目录下 optimization-backlog.md,三处定点编辑:

  1. 第一节「挂账」删除 #23 一行(该行唯一,含 --date 关键字);
  2. 第二节「已做」追加 #20 一行,写明验证结果;
  3. 第四节「过账记录」追加一行,记录挂账 20 → 19、已做 19 → 20。

坑:该文件的章节标题与表格首列格式被 session-start-inject.py 的过账判据解析—— 只删/加表格行,不得改动章节标题与首列格式,否则过账提醒静默失效(见 HANDOFF 红线)。

核对:

grep -c "^| " ~/.trae-cn/skills/ops-execution-efficiency/references/optimization-backlog.md
grep -n "step_profile.py" ~/.trae-cn/skills/ops-execution-efficiency/references/optimization-backlog.md

预期:step_profile.py 只出现在第二节「已做」行,第一节挂账中不再出现。

步骤 5:更新 docs/HANDOFF.md

按 writing-handoff 的增量判据执行:本轮为状态推进 + 新产物,定点修订第 2 / 3 / 5 节, 不整体重写。

6. 验证

四项离线验证,全部在改后的脚本上实跑(数据源为真实 logs/req_shape.jsonl,只读):

cd ~/Documents/services/token_proxy
echo "== [1] 无 --date(全库) =="
python3 cost_audit/step_profile.py --top 2 2>&1 | tail -3
echo "== [2] --date 2026-10-02 =="
python3 cost_audit/step_profile.py --top 2 --date 2026-10-02 2>&1 | tail -3
echo "== [3] --date 2026-10-01 =="
python3 cost_audit/step_profile.py --top 2 --date 2026-10-01 2>&1 | tail -3
echo "== [4] 无数据日期(应 exit 1) =="
python3 cost_audit/step_profile.py --date 2020-01-01 >/dev/null 2>&1; echo "exit=$?"

实测结果:

# 命令 结果 判定
1 无 --date 全部会话 162 个 / 11929 步 基线
2 --date 2026-10-02 全部会话 17 个 / 1178 步 ✅ 已收窄
3 --date 2026-10-01 全部会话 17 个 / 1543 步 ✅ 与 10-02 独立
4 --date 2020-01-01 提示「该日期无数据」+ exit=1 ✅ 边界正确
5 --conv <id> 正常输出逐步明细 ✅ 原行为不变

另有总账结构核对:删行后第一节表格仍为合法 Markdown,标题未动。

7. 回滚

  • 备份位置:selfcheck-abc-loop-20261002/backup/cost_audit/step_profile.py.bak.20261002-202909 (登记见 selfcheck-abc-loop-20261002/backup/README.md)。
  • 回滚触发条件(任一即回滚,不临场判断):
  • 上述验证任一项不符预期(如 --top 仍取到全库、或 --conv 分支报错);
  • --top 输出在无 --date 时与改动前不一致(改动本应零影响)。
  • 回滚步骤:
cd ~/Documents/services/token_proxy
cp selfcheck-abc-loop-20261002/backup/cost_audit/step_profile.py.bak.20261002-202909 \
   cost_audit/step_profile.py
python3 cost_audit/step_profile.py --top 2 2>&1 | tail -3   # 预期回到 162 会话
  • 文档回滚:MB / 总账 / HANDOFF 为追加与定点编辑,按本 SOP 第 5 章所述位置反向删除即可; 总账回滚须同步恢复 #23 挂账行,否则挂账数不自洽。

8. 风险说明

风险 等级 缓解
patch 因行号漂移打偏 低 已给上下文式 diff;失败即手工插入,禁用 --fuzz
误改总账章节标题/首列,导致过账提醒静默失效 中 第 5 章明确"只动表格行";HANDOFF 红线已列该依赖;改后用 8 项用例回归(本次未动标题,未跑)
--date 过滤把跨零点的会话切断 低 沿用 group_by_conv 的既有前缀判据,不新增日期语义
取数样本受 usage.jsonl 滞后影响而低报 中 样本行标注窗口起止时刻(同族挂账 #18)
文档与代码漂移 低 本 SOP 第 5 章与实现体同源;step-profile-20261002/SOP.md 未提 --date,无需回改

附录:交付物清单

交付物 路径
本 SOP selfcheck-abc-loop-20261002/SOP.md
备份台账 selfcheck-abc-loop-20261002/backup/README.md
脚本备份 selfcheck-abc-loop-20261002/backup/cost_audit/step_profile.py.bak.20261002-202909
变更的实现体 cost_audit/step_profile.py
新节 ~/.trae-cn/skills/ops-execution-efficiency/references/measured-baselines.md §二十七
过账 ~/.trae-cn/skills/ops-execution-efficiency/references/optimization-backlog.md(已做 #20 / 过账记录)
交接 docs/HANDOFF.md

来源:/home/rain/Documents/services/token_proxy/selfcheck-abc-loop-20261002/SOP.md | 最后更新:2026-10-02 20:30(由 build/sync.py 同步,请勿在站点侧修改)