Files
Genarrative/docs/technical
lhk229 7ca82ba7aa 修复M1D审查发现的锁错误脱敏与澄清轮次口径
审批卡链路的三处项目锁错误改为脱敏后再进typed错误

阶段进度按等待状态显示真实轮次,不再透传0-indexed值

去掉reconcile错误的重复code拼接

补一条Rust脱敏回归与两条前端轮次回归

锁错误脱敏(方案 §18.3「返回值不包含绝对路径……或内部诊断」):
acquire_project_write_lock 的 Err 内嵌 .agent/project.lock 真实绝对路径。补
redact_agent_runtime_project_paths 的三处是前端审批卡真正会显示的那条链——
reconcile_plan_gdd_approval_projections_at(hydrate 在取自己的锁之前调它)、
hydrate 自己的锁、decide_plan_gdd_at(其错误与 hydrate 的错误渲染在同一个
错误区)。planning 另有 14 个取锁点沿用未脱敏写法,属 M1B/M1C 既有模式,
本次不扩面。脱敏不破坏「项目正在被其他写操作占用:」前缀,project_gates.rs
与 provider_recovery.rs 两处按前缀分类的判据不受影响。

澄清轮次口径:clarificationRound 与 awaitingAnswerFor.round 都由
static_delegate_lineage_counters 派生,该函数排除目标自身,是 0-indexed 的
「已答轮数」;后端判上限用的是 current_round + 1。原样渲染成「轮次 X/3」
整体差一格——问最后一轮时显示「轮次 2/3」,字面暗示还剩一轮。只改前端
文案、不动 DTO 语义:等待回答时显示「第 N+1 轮 / 共 3 轮」(此时
latestDelegationId 就是当前 delivery,+1 恰好等于后端校验用的轮次),
其余状态退回「已完成 N/3 轮澄清」,不猜当前轮。

顺带:planning_hydrate.rs 里 reconcile 的错误原本用同一 code 把 to_string()
当 detail 重包一层,而 PlanningStorageError 的 Display 已是「{code}: {detail}」,
渲染出 CODE: CODE: detail;code 与 detail 均无变化,改为直接 ? 传播,并把
「不重复拼 code」钉进回归。

测试陷阱:写「占住项目锁」的 fixture 必须给锁 JSON 填真实 createdAt。失效锁
回收的年龄判定读的是该 JSON 字段而不是文件 mtime,填 0 会让锁显得约 1.7e9 秒
老、越过 600 秒阈值被当场回收删除,hydrate 反而成功。第一版 fixture 正是这样
自证失败的,注释已写明。

验证:Rust planning_ 组 155 passed / 0 failed(原 154 + 本次 1 条);
appSurface.test.ts 383 passed / 0 failed(378 原有 + 5 条新增);三条新回归均经
变异验证,逆转对应修复即变红。cargo fmt --check、agc:typecheck、ESLint
--max-warnings 0、check:encoding、git diff --check 通过。

撤回一条此前的审查发现:曾判定 hydrate 读 manifest 缺符号链接判定。复核后不
成立——read_manifest 自身在 is_symlink 处即拒,防护在另一层;.agent 目录本身
为符号链接的残差也无窗口,紧随其后的 resolve_planning_path 同样逐段判定。
未据此改动代码。

新记一条既有问题(非 M1D 引入):seedManifest.projectId 是常量
local-project-draft,App 的 5 个 init/import 调用点全传它,因此本机所有项目
projectId 相同。§18.3 第 1 步依赖的 projectId 校验因此分辨不出任意两个项目,
该门当前近乎恒真,须单独立项。

仍未修:hydrate 身份校验排在落盘投影修复之后(修它须注意 reconcile 自取项目
锁、.agent/project.lock 不可重入,不能把检查直接挪到 hydrate 取锁之后);
design 组展示名剩两处硬编码,且与 taskGroupLabels 命名体系不同,需先定口径。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 11:50:43 +00:00
..