Repository navigation
v6.2.2 — 修 peak_rss 断言(内核惰性记账,不是 bug)
替换 v6.2.0 / v6.2.1。两者 CI 均为红(本机 Windows 全绿掩盖了平台相关缺陷)。按
policy.md §5发补丁版,不移动历史 tag。
本次修的是什么
v6.2.1 的 CI 只红 python (3.11)(3.12 绿),失败断言:
assert 84922368 >= 84926464 # 差 4096 字节,正好一页
这不是 bug,是操作系统行为:Linux 的 ru_maxrss 按页记账惰性更新,会短暂滞后于 /proc/self/statm 报的当前 RSS。严格断言 peak >= rss 本身就是错的(3.12 绿、3.11 红也说明它时序敏感)。
两处修:
- 实现改为先读当前 RSS、再读峰值(
ru_maxrss单调,后读让窗口最小化); - 断言改成"两者同一量级"(容差 1MB),注释写明不能要求严格 ≥。
三个 CI 红的共同点(比单条修复更值得记)
| 轮次 | 症状 | 本机为什么绿 |
|---|---|---|
| 1 | monkeypatch.setattr(os, "name", "nt") → Linux 上 Path() 变 WindowsPath → pytest INTERNALERROR |
本机 os.name 本来就是 nt |
| 2 | 服务报告 golden 绑了本机研究产物(last_snapshot_at string vs null) |
本机有快照 |
| 3 | peak_rss >= rss 断言(内核惰性记账差一页) |
本机走 Windows 分支,采样方式不同 |
三次都是"环境相关"。这也是本轮把「确定性报告 golden」做成门禁时必须补的那一课:
shape() 的 volatile 判断要排在类型判断之前,且刻意不收计数器
(它们类型恒定,标 volatile 会连"这里是数字"这条检查一起丢掉)。
v6.2 的主体内容(本版包含,详见 v6.2.0 说明)
四类验收全部脚本化,一个命令就能重来:
| 类型 | 命令 | 实测 |
|---|---|---|
| UI 截图 | python run.py ui |
23/23(真 Chrome × 5 状态 + 按钮交互 + 逐张看片) |
| 真实调用 | python run.py realcalls |
37/37 |
| 真实 E2E | python run.py e2e |
40/40(含真浏览器段) |
| 服务契约 golden | python run.py report |
13 端点形状一致 |
| 真实代码复审 | claude -p 独立进程 |
两轮,问题全部关闭 |
加上:engines.py 覆盖率 57% → 100%(撤销 waiver)、FlareSolverr 会话生命周期、
vendors.py 单一事实源(治"命中某特征 ≠ 有盾"这类反复复发的错误)。
验证
- 本机:Python 905 passed / 7 skipped;
solver/89.4%,23 模块达标;文档 9 处一致;openapi 13 操作一致。 - CI:run
41956389364(commit8214c8e)4 job 全绿。 - Linux(WSL, 3.12):纯函数测试全绿;剩余失败经逐条核实全部源于 WSL 自身 loopback 不可用(连最小
ThreadingHTTPServer都连不上),非代码问题。