Files
Genarrative/docs/project-memory/shared-memory
lhk229 515682d571 修复账本寿命短于标记寿命导致的成功误判与孤儿失效
阶段 3 引入的判据「布局里有 perfectPixelOperationId、本机没有账本 ⇒ 无效」
按构造就是错的:标记写进布局后寿命无限(服务端完成 completion 只做字段级
改写,从不摘标记),账本寿命却很短(收口即清、75 秒对账窗口、7 天保留期、
换设备即无)。账本消失是正常终态,不是异常。

同一个不对称造成两个缺陷:

一、每一次成功都被判成失败。settle 时先清账本、紧接着用真实 hydrate 重新
套用权威快照,成功结果被判成 failed + perfectPixelOperationInvalid;该状态
还会被下一次自动保存写回服务端,覆盖正确的 idle,且标记一旦落库就能单独
强制 failed,自我固化。历史上早已完成的占位在标记化改写后同样中招。

二、孤儿账本对账在唯一目标场景下失效。它的场景是「关掉浏览器、稍后重开」,
重开必然晚于 75 秒,而分支按 reconcileUntil 短路,等于永不生效,条目还会在
本机躺满保留期反复被跳过。

修复:凡是「缺账本 ⇒ 无效」的判据一律先排除收口态(复用既有的
isUnresolvedCanvasGenerationDialogRecord 取反)。收口态无条件忽略已落库的
无效标记与残留错误文案、强制归位 idle,让被写脏的行自愈;写边界同步收窄,
收口后不再输出标记,让标记寿命与账本对齐。

孤儿不按 reconcileUntil 短路,改走新增的 readPerfectPixelOrphanVerdict——
一次确定性的读,不轮询。dialog-missing 提示结果只进素材库;applied 静默
刷新(本次读到的就是权威状态,结果本就在眼前);未落库完全静默。三者都清
账本,读失败不清。

测试缺口的根因:工作流里所有 applied 用例的 applyProjectSnapshot 都是空桩,
跨 hook 协作从未被跑过;共享 fixture 也没还原服务端真实保留的标记。补了一条
把 verdict.project 真正喂进 splitCanvasLayoutItems 的集成用例,回退修复后它
报 expected 'failed' to be 'idle'。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 07:45:23 +00:00
..
2026-07-20 16:08:24 +08:00
2026-08-04 13:46:03 +00:00