目标:Manager.ResolveHITL 先向 hitlCh 投递答案、再无条件 UpdateRun(running),会在 runner 已把 run 写成 completed/ended_at 之后被覆盖回 running/ended_at=NULL,导致 run 永久卡在 running(无执行者)、会话永不释放、后续每次提交都是 409。修复为先以条件更新 WHERE status='waiting_hitl' 把 run 推进到 running(由 store 报告是否命中),再交答案给 runner;交答案后该 run 行此后唯一写者是 runner,不会被反向覆盖。
非目标:不改 HTTP/server 层、不改其它 store 表的写入语义、不放宽任何断言、不引入新依赖、不改 schema。
验收条件:(1) 新回归测试在修复前红(runner 抢先结算后 DB 仍为 completed/ended_at)、修复后绿;(2) go test ./internal/runmgr ./internal/store 全绿;(3) 独立 Review 无阻塞项。
Why: the card must record the scope, the (r1 scope-expansion -> granted
expansion -> r2 success) trajectory, and the rebase onto 241e1b3 before delivery.
Evidence: /tmp/be-runhitl-impl-r2-20261021.json (pi, success, transport 789f67f);
no PR/merge facts yet.
Impact: card metadata only; no behaviour change.
Refs: fix/resolve-hitl-run-status-ordering
weichen
merged commit f084d10aa5 into main2026-10-21 07:38:22 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
fix/resolve-hitl-run-status-ordering 任务卡
任务主记录:<Issue/PR 链接,或注明"本文件随 PR 描述维护">。
状态:进行中;owner:weichen
基线与授权
目标与非目标
目标:Manager.ResolveHITL 先向
hitlCh投递答案、再无条件UpdateRun(running),会在 runner 已把 run 写成completed/ended_at之后被覆盖回running/ended_at=NULL,导致 run 永久卡在 running(无执行者)、会话永不释放、后续每次提交都是 409。修复为先以条件更新WHERE status='waiting_hitl'把 run 推进到 running(由 store 报告是否命中),再交答案给 runner;交答案后该 run 行此后唯一写者是 runner,不会被反向覆盖。非目标:不改 HTTP/server 层、不改其它 store 表的写入语义、不放宽任何断言、不引入新依赖、不改 schema。
验收条件:(1) 新回归测试在修复前红(runner 抢先结算后 DB 仍为
completed/ended_at)、修复后绿;(2)go test ./internal/runmgr ./internal/store全绿;(3) 独立 Review 无阻塞项。Agent 实施收据
按根目录 AGENT-EXECUTION.md 路由;外部 Agent 一单元一新进程/会话/隔离工作区。实施、修复与测试必须通过登记的候选执行;未配置或候选安全耗尽停在 unavailable/blocked,禁止 host 隐式代写。
复用材料(task-start 自动检索结果摘录)
同步记录
字段没有发生的写"无",不省略。本卡与 PR 描述同源:开 PR 时将"目标与非目标、结果与验证、影响与剩余项"复制进 PR 描述,不另写第二份。
交付调度(有多个就绪任务时)
定义见 合入调度与 CI 分配。本段在候选固定前整理;固定后先使用源码之外的记录保存运行结果,再按项目闭合流程回填。
结果与验证(完成后填写)
回收(task-finish)