SOP — 补 A/B/C 收尾自查的跨轮样本闭环(selfcheck-abc-loop-20261002)¶
本轮是只读盘点转 C 类变更:用户在追问"效率与成本的自我迭代是否已闭环"后确认执行三项收口动作。 变更对象只有一处代码(
cost_audit/step_profile.py),其余为文档。
1. 背景¶
用户问"当前的自我迭代落地是否都已闭环"。核查后确认:识别 / 落地 / 留痕三环已通, 但量化收益 / 跨轮对照 / 触发与验收三环只在 D 组(MB §二十六)一处接通。
具体缺口两条可在本会话直接处理:
- 挂账 #23:
cost_audit/step_profile.py的--date只作用于--conv分支,--top排名分支忽略它——而文件头用法示例正是--top 5 --date 2026-10-02, 照抄会取到全库数据而非当日数据。取数工具的口径缺陷会污染 D 组判定。 - 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,三处定点编辑:
- 第一节「挂账」删除
#23一行(该行唯一,含--date关键字); - 第二节「已做」追加
#20一行,写明验证结果; - 第四节「过账记录」追加一行,记录挂账 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同步,请勿在站点侧修改)