feat: 任务完成送回闭环(issue #56) #60
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/56-task-completion-loop"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #56
这个 PR 做了什么
实现 issue #56「任务完成送回闭环:Callback 落库 + 取消竞态 + 崩溃语义 + 端到端验收」——打通深挖任务委托的完整用户可见路径。这是 Phase 5(issue #52 PRD)最后一片:子智能体(#54)产出结果 → 写入 Callback(#53 的存储切片)→ 既有到期扫描管线无门控送回,语气经模型平时的人设正常组织。完成后 #52 描述的端到端用户故事(问深挖问题→应声→干等不阻塞对话→之后用平时语气收到分析结论)第一次可以被真实观察到。
Callback 写入(
runtime_loop.py::_run_delegated_task)trigger_source="task_completion"的 Callback(fire_at留空即"立即到期",交由 issue #53 既有的_callback_scan送回,不新建任何送回机制)cancel_delegate_task真中断时不写——CancelledError会在finally跑完登记表清理后继续向外传播,不会执行到写 Callback 的代码(ADR-0020"取消是真中断,不是等跑完再丢结果")DelegatedTaskResult.failed=True,issue #54 review 加的 fail-closed 分支)仍写一条固定失败提示——与用户核实的设计决定:已经应了一声"我看看啊",履约语义要求给一个结果而不是永远沉默取消竞态窗口(
_handle_cancel_delegate_task)task_completion来源的待送回记录,不连带撤掉同 chat 其它来源(如未来register_callback)的 Callbacklist_callbacks/delete_callback之间没有加锁,理论上可能与_callback_scan的送回 tick 交织;后果是措辞尴尬(模型报告"已取消"但消息已送达)而非数据错误(不重复送达、不崩溃),暂不引入跨请求锁测试
_callback_scan无门控送回 → 验证正确路由到发起请求的那个 chat全部 887 个测试通过,
ruff check/ruff format干净。Code review
跑过
/code-review(Standards + Spec 两轴并行子智能体):register_callback等 Out of Scope 条目均未触碰),发现两处测试薄弱点CancelledError会跳过try/finally之后代码这一关键论断(手动 repro 确认),发现窄竞态窗口 + 两处测试没有真正验证其声称的路径 + 字面量重复TASK_COMPLETION_TRIGGER_SOURCE共享常量;竞态窗口文档如实说明残余风险(不过度声称"完全关闭");重写取消测试让任务真正进入工具调用后再取消;重写崩溃恢复测试验证"登记表不持久化/Callback 持久化"这一实际不变量(原测试只断言recover()不报错,接近重言式)至此 Phase 5「深挖任务委托」(issue #52 PRD,#53-#56)全部实现完毕。