|
| 1 | +# v0.20.2~0.20.4 全批审查台账(2026-09-06 主批收口) |
| 2 | + |
| 3 | +> 性质:v0.20 系列全批(本线 REQ-268~270/292~302/303~305)七维审查的问题清单与修复留痕(任务①交付物)。 |
| 4 | +> 审查执行:三路只读并行审计(前端契约漂移 · Rust 行动/SOP 域 · Rust ASR/web 域)+ 本线自查即修。 |
| 5 | +> 全部修复已随 `0796f14b..3fee11a9` 提交链落地;遗留未决项见同夹 [tech-debt.md](./tech-debt.md)(TD-2026-09-06-A~H)。 |
| 6 | +
|
| 7 | +## 一、审查面与基线 |
| 8 | + |
| 9 | +- 前端:`152cf564..HEAD`(app/src 18 文件 +2436 行——ASR/后处理/web 三批新组件与页面接线) |
| 10 | +- 后端:`fc8e862b..562ab55b`(REQ-268/269/270)+ `c47e3948..b8c7b764`(REQ-303~305)域文件与接线文件 |
| 11 | +- 维度:接入性 / 逻辑性(边界/竞态/错误处理)/ 牵连性 / 性能流畅度 / 冗余死代码 / 开发提交规范 / 安全性 |
| 12 | + |
| 13 | +## 二、问题清单与处置(按严重度) |
| 14 | + |
| 15 | +### P0/P1(已修复) |
| 16 | +1. **IPC serde 契约系统性漂移**(前端 P1×5 同一根因):Rust 新响应结构 camelCase vs 前端内联接口 snake——SOP 执行器整体不可用、web 文章/采集成功路径误报失败、校对成功抛 TypeError、练习到期失效、行动中心行/史字段空白。→ `cb28f22` 八组件契约对齐(camel)+ tsc/vitest 验证。 |
| 17 | +2. **周回顾批决议失效行静默照记史**(后端高-3):行失效/错位仍计完成并入史。→ 重写单遍校验核心(载荷精确匹配、失效行显式报 failed、计数/史/正文一致推进)`a3a3b48`+回归测试。 |
| 18 | +3. **任务索引元数据被重扫抹除**(后端高-1):改期/纠偏随每次保存丢失。→ 重扫前读旧行、按「载荷优先/行号兜底」回填 plan_date/disposition/created_at `e19984f`+回归。 |
| 19 | +4. **保存收口钩子覆盖不全**(后端高-2):versioned_save(显式保存/AI 采纳/回滚)与 fragments promote 只补 kb 漏 task_index。→ `a3a3b48` 两处补钩子。 |
| 20 | +5. **收件体量上限失效 + 认证后置**(web H1):头部确定后正文无上限可无限读入。→ 声明预检 + 积压统一有界 + 20s 慢速超时 `0796f14b`/`17adf140`。 |
| 21 | +6. **快照安全与功能**(web M1+):CSS 以 data URI 字面量入 `<style>` 全部失效;外链/行内 script、on* 事件属性、javascript:/data:text/html URL 未净化。→ CSS 解码内联 + 全脚本/危险属性剥除 + 离线零执行面测试 `943238f`/`17adf140`。 |
| 22 | +7. **second_pass 生命周期组**(web M4):取消双事件闪烁、panic 残留 running、注册检查-插入非原子、无全局单飞。→ catch_unwind 收尾 + 单锁原子注册 + 会话防重/全局单飞 + 取消单一终态(aborted payload 对象化,前端同步)`c55bdefb`。 |
| 23 | +8. **草稿裁决越权面**(web L4 + 后端中):预校验与写入间 TOCTOU、跨会话 id 直改。→ 会话限定写(WHERE session_id)+ 影响行数双保险 `086ccbfe`/`17adf140`。 |
| 24 | +9. **SSRF-lite 边界**(web M2):URL 采集/快照子资源可拉内网、跳转未逐跳校验、userinfo 入标题。→ 内网/回环/链路本地 host 拦截(含 IPv6/172.16-31/169.254/元数据段)+ host_of 剥 userinfo + 测试 `3fee11a9`。 |
| 25 | +10. **校对链路**(web L3):失败残留 running 行、会话存在/状态无门控、建议无长度护栏、async 内同步阻塞(登记)。→ 失败终态记账 `ef0a1ec7`、会话门控+≤2000 护栏 `3fee11a9`、阻塞模型登记 TD-B。 |
| 26 | +11. **采集/投递孤儿**(web M5):会话建后页面落库失败留孤儿;图先落盘。→ 失败清理会话与本次已落文件 `c55bdefb`。 |
| 27 | +12. **SOP 数据面**(后端中-5/6/7 + 存量中-8):同名覆盖级联销毁 run 档案;≤50 校验被 truncate 架空;finish/step 无幂等守卫;升级存量任务不索引。→ 原地 UPDATE 保链、非截断步数计数、DB 层 active 守卫+重复收尾拒绝、init 回填 `775cf78e`。 |
| 28 | + |
| 29 | +### P2/P3(登记开放或轻修) |
| 30 | +- **已轻修**:编译器警告清零(17 项:死代码登记/未用导入/mut/括号)`a855cbce`;模型卡弹窗定时器清理+成功态(前端修复批);WebArticleView 响应乱序防护;SOP begin 续跑(sop_run_list active 先行);练习/问题/封存轻量面契约对齐。 |
| 31 | +- **登记开放**:见 tech-debt 2026-09-06 节 A~H(窗边裁剪/阻塞模型/保鲜逐步 diff/双模式差异与证据流/SE 覆盖/预览口径与渲染快照/PRNG 与豁免登记/Goals 回顾流与 reverted 事件)。 |
| 32 | + |
| 33 | +## 三、验证记录 |
| 34 | + |
| 35 | +- Rust:全量 `cargo test --test app_lib_tests` 2254 通过 / 0 失败(6 ignored,模型类集成门);clippy/警告清零 |
| 36 | +- 前端:`tsc --noEmit` 0 错;vitest 78 文件 571 用例全绿 |
| 37 | +- 提交链:`0796f14b` `086ccbfe` `ef0a1ec7` `a855cbce` `943238f` `17adf140` `e19984f` `775cf78e` `cb28f22` `a3a3b48` `c55bdefb` `3fee11a9`(本地;origin 推送截至 e19984f,网络恢复后续推) |
0 commit comments