Skip to content

v0.3.7 — 第二轮技能化审计:15 处隐形 bug 修复(红灯先行)

Choose a tag to compare

@G57651 G57651 released this 06 Oct 10:37
· 12 commits to main since this release

🛡 v0.3.7:第二轮技能化审计 —— 15 处隐形 bug 修复(全部红灯先行)

第二轮审计(code-review 双轴隔离法 + diagnosing-bugs 红灯纪律)换了四个视角:修复回归验证 / 未覆盖角落与并发 / 安全与隐私 / 测试有效性。每个修复都先写出能红的回归用例,再修,再验证转绿;并发去重与 env 解析用例做了红检确认。

HIGH

  1. 会话新建的目录从来清理不掉:rm(recursive:false) 对任何目录恒抛 EISDIR,"非空保守跳过"分支是死代码。改用 rmdir(真正的空目录契约)。
  2. 显式 resume 跳过回滚直接销毁 Journal:cleanup RPC 的 resume 对 delete_requested/rolling_back(崩溃残局)状态直接拆除——现在这三态一律先回滚、失败即止。
  3. Journal 并发序号全为 0:seq 分配是读-改-写且无串行化;env/进程记录与各类 diff 并发时全部拿到 seq 0(回放顺序失去意义)。append 改为单链串行;撕裂尾行也不再吞掉下一条记录(写前补换行修复)。
  4. 密钥泄漏面(三处一起堵):下载 URL 的 user:pass@ 与 token=/X-Amz-Signature= 等签名参数会原文进入 Journal 与 RPC → 落盘前脱敏;后台命令里的 Authorization: Bearer … 与 TOKEN=… 赋值 → 遮蔽;环境变量值一律只存指纹(不再依赖"名字像不像密钥"的启发式,DATABASE_URL=postgres://user:pw@… 不再明文)。
  5. 快照库路径逃逸:Journal 里被伪造的 sha256(如 ../x)能读到快照目录之外的文件 → 只接受 64 位十六进制。
  6. 符号链接越出工作区:词法包含性检查挡不住符号链接父目录 → 写入/删除前追加 realpath 复核。
  7. 权限变更不被恢复:仅 chmod 的既有文件命中 already-restored,权限原样保留 → mode 不一致同样执行恢复。

MEDIUM

  1. 显式 cleanup 被 autoCleanup 门控;且清理被跳过时 delete/purge 现在保留 tracking 目录(原会销毁显式清理的唯一依据)。
  2. 并发 diff 重复记账:防抖 diff + 显式 track + 列表自愈 + 删除前最终 diff 并发时同一修改被记录 2–3 次(红检确认)→ 按会话共享在途 diff。
  3. 卸载后仍在写入:HMR 重挂载后旧实例继续追加 → disposed 守卫;同会话 prepareRemoval 在途锁。
  4. 归档失败留下假墓碑:会话被隐藏却未删除 → 失败即回滚回收站条目。
  5. 进程误判/漏判:URL 查询里的 &、make && 被当作后台启动;cmd1 &\ncmd2 漏判 → 按行单 & 判定。
  6. 下载归因错配:一条下载意图贴到第一个创建的文件 → 按 -o/--output 与 URL 文件名提示优先匹配。
  7. pnpm 符号链接依赖不被跟踪 → 适配器接受符号链接(卸载只删链接、不动 store,真机用例验证目标目录完好)。
  8. 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)。