
wuguanganandClaude Opus 5
78d24c934f
fix: 加字段会把用户已有的验收清单整个抹掉
给 AcceptanceLedger 加了非可选的 authorizedCommands 之后,所有已存在的
清单文件当场解码失败 —— Swift 合成的 Codable 要求非可选字段必须存在。
而读取是 try? 静默吞错误的,于是下一次写入从空清单开始,把内容整个覆盖掉,
全程无声无息。
真丢了数据:本机 9 个项目里,claude-hub 的 13 条和 storefront-a 的 1 条没了,
另有 demo-release 的 7 条正等着被同样地清空(赶在它之前修好了,
实测那 7 条经历一次真实写入后完整存活)。
我在 HookEvent 那边特意把新字段都设成可选并写了兼容性测试,却没对持久化的
ledger 做同样的事。而 ledger 的后果严重得多:hook 事件丢一条无所谓,
用户攒几周的清单没了是真损失。
三层修复:
1. 手写 init(from:),每个字段 decodeIfPresent —— 加字段不再让老数据全废。
2. 逐条解码要点,坏的跳过。原来一条坏的会让整个数组抛错,整份清单报废。
同 TaskStateReader 的处理:边跑边写的数据撞上半条是正常情况。
3. **解不出来的文件先改名保住,绝不静默覆盖。** 丢数据和读不出来是两个
量级的事故 —— 后者还能捞回来。
391 个测试,三条都有对应的回归测试。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 20:33:55 +08:00
..
2026-08-07 20:33:55 +08:00
2026-08-07 20:33:55 +08:00
2026-07-29 19:20:12 +08:00
2026-07-29 19:20:12 +08:00