Repository navigation
v0.3.7 — 第二轮技能化审计:15 处隐形 bug 修复(红灯先行)
🛡 v0.3.7:第二轮技能化审计 —— 15 处隐形 bug 修复(全部红灯先行)
第二轮审计(code-review 双轴隔离法 + diagnosing-bugs 红灯纪律)换了四个视角:修复回归验证 / 未覆盖角落与并发 / 安全与隐私 / 测试有效性。每个修复都先写出能红的回归用例,再修,再验证转绿;并发去重与 env 解析用例做了红检确认。
HIGH
- 会话新建的目录从来清理不掉:
rm(recursive:false)对任何目录恒抛EISDIR,"非空保守跳过"分支是死代码。改用rmdir(真正的空目录契约)。 - 显式 resume 跳过回滚直接销毁 Journal:
cleanupRPC 的resume对delete_requested/rolling_back(崩溃残局)状态直接拆除——现在这三态一律先回滚、失败即止。 - Journal 并发序号全为 0:seq 分配是读-改-写且无串行化;env/进程记录与各类 diff 并发时全部拿到 seq 0(回放顺序失去意义)。append 改为单链串行;撕裂尾行也不再吞掉下一条记录(写前补换行修复)。
- 密钥泄漏面(三处一起堵):下载 URL 的
user:pass@与token=/X-Amz-Signature=等签名参数会原文进入 Journal 与 RPC → 落盘前脱敏;后台命令里的Authorization: Bearer …与TOKEN=…赋值 → 遮蔽;环境变量值一律只存指纹(不再依赖"名字像不像密钥"的启发式,DATABASE_URL=postgres://user:pw@…不再明文)。 - 快照库路径逃逸:Journal 里被伪造的
sha256(如../x)能读到快照目录之外的文件 → 只接受 64 位十六进制。 - 符号链接越出工作区:词法包含性检查挡不住符号链接父目录 → 写入/删除前追加
realpath复核。 - 权限变更不被恢复:仅 chmod 的既有文件命中
already-restored,权限原样保留 → mode 不一致同样执行恢复。
MEDIUM
- 显式 cleanup 被 autoCleanup 门控;且清理被跳过时 delete/purge 现在保留 tracking 目录(原会销毁显式清理的唯一依据)。
- 并发 diff 重复记账:防抖 diff + 显式 track + 列表自愈 + 删除前最终 diff 并发时同一修改被记录 2–3 次(红检确认)→ 按会话共享在途 diff。
- 卸载后仍在写入:HMR 重挂载后旧实例继续追加 →
disposed守卫;同会话 prepareRemoval 在途锁。 - 归档失败留下假墓碑:会话被隐藏却未删除 → 失败即回滚回收站条目。
- 进程误判/漏判:URL 查询里的
&、make &&被当作后台启动;cmd1 &\ncmd2漏判 → 按行单&判定。 - 下载归因错配:一条下载意图贴到第一个创建的文件 → 按
-o/--output与 URL 文件名提示优先匹配。 - pnpm 符号链接依赖不被跟踪 → 适配器接受符号链接(卸载只删链接、不动 store,真机用例验证目标目录完好)。
- env 解析:
FOO=bar cmd前缀被误记(现在只有显式export才算持久变更)、export A=1 B=2漏第二个、"x;y"被错误拆分。
其他
文档漂移全部修正(env 语义、purge 不归档、幽灵行两步失效、activity.json、断言数等);tracking 目录以 0700 创建;build-client 的 useStore 选择器检查加固(支持无空格/任意参数名、只认顶层 init 键)。
测试端同步修复:dispose/flush 路径现在被真实行使;isSessionDir 断言指向真实存在的目录;弱断言文案修正。
验证
| 验证项 | 结果 |
|---|---|
smoke-lifecycle.mjs(284 项断言,第二轮新增 15 组回归用例) |
连跑三轮全绿 |
smoke-host.mjs 66 项 + client 渲染冒烟 |
通过 |
| 真机:驱动 29/29、真实 agent 回合 8/8、kill -9 崩溃恢复、截断场景 5/5 | 全部通过 |
升级
从 0.3.x 直接升级,无迁移。更新后在 Plugins 面板重载插件(或重启 Harness)。