修复策划回答身份绑定与迟到恢复结果覆盖
Project CI / Repository checks (pull_request) Successful in 2m48s
Project CI / Backend tests (pull_request) Successful in 6m28s
Project CI / Native shell tests (pull_request) Failing after 13m45s
Project CI / Frontend tests (pull_request) Successful in 44m47s

在既有回合锁内核对问题与会话身份,保留已完成回合重放。
前端回答携带卡片问题标识,hydrate 写回前检查请求序列和项目路径。
补充后端与界面回归测试,同步技术合同与项目决策。
This commit is contained in:
2026-09-08 13:25:24 +00:00
parent 8d03b73582
commit 14d76419b8
5 changed files with 298 additions and 25 deletions
@@ -8170,3 +8170,8 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
- 恢复只利用已经落盘的合法 question、GDD 和 approval receipt;不调用 Provider、不要求模型额外输出恢复字段、不设置复杂状态机或自动重试。
- 正常 run 进行时不读取或写入其 Planning V2 文件,也不增加文件锁或等待;无活跃 run 时恢复只做一次非阻塞锁尝试,竞争即退出,交给既有轮询。
- question 恢复为成功结果,approval 重放复用 receipt 原始 decisionId。
## 2026-09-08 Planning V2 用户输入与异步投影身份
- 问题回答携带被回答卡片的 questionId,在已有回合锁内核对 Session 和当前问题;自由文本回答同样绑定问题,已完成回合保留幂等重放。此身份匹配服务于用户提交,不增加恢复门禁或模型输出要求。
- hydrate 结果(包括空结果)写入前端状态前同时核对请求序列和当前项目路径;过期结果直接丢弃,不重试、不阻塞正常 run。
@@ -324,6 +324,10 @@ V2 决定状态使用 `confirmed | assumption_pending | prototype_pending`:`as
`input` 冻结为 `option`、`freeform`、`direct_draft`、`revision` 四种用户意图:
回答当前问题时,客户端必须携带被回答卡片的 `questionId`(自由文本回答同样携带),后端保留该身份,在既有回合项目锁内比较 Session ID 和当前 question ID,再开始新回合。过期或缺失的问题身份不推进回合;已完成的 `clientTurnId` 仍可重放,失败回合沿用原输入重试,修订等非问答意图不要求问题身份。此处只核对用户提交的目标,不增加恢复门禁、Provider 调用或模型输出字段。
前端 hydrate 返回后,必须在任何成功或空结果状态写回前同时比较请求序列和当前项目路径;迟到结果直接丢弃,不等待或重试。历史对话探测沿用自己的加载版本与项目路径检查。
```json
{
"kind": "option",