## 问题 `CoreApp._run_cancel_handler()` 调用 `task.cancel()` 后立即把 `_run_status[run_id]` 写成 `cancelled`。但 `AgentRunner` 捕获取消后仍会执行变更收尾、压缩等待、session 持久化和 `RunFinishedEvent` 发布,最后才向上抛出取消。 因此 `run.cancel` 返回时,`run.get` 可能已经显示 `cancelled`,但磁盘状态、事件流和实际清理仍未完成;取消竞态下还可能出现状态与 `RunFinishedEvent.status` 不一致或重复终态。 相关代码:`src/sztu_code/core/app.py` 的 `_run_cancel_handler()` / `_on_run_finished()`,`src/sztu_code/core/runner.py` 的取消收尾路径。 ## 期望 - `run.cancel` 只表示取消请求已接受,例如返回 `cancelling`; - 由 Runner 在所有清理完成后统一提交最终状态; - `run.get`、`RunStore` 和 `RunFinishedEvent` 共享同一个终态来源; - 重复取消、取消与自然完成竞态、重启恢复都只产生一个终态; - 终态提交后,不再允许工具、压缩或后台任务写入该 run。 ## 验收标准 增加状态机/集成测试,覆盖权限等待、工具执行、压缩收尾和重复取消场景,并验证事件顺序与持久化状态一致。
Activity
fix: cancel subagent tasks before cleanup to avoid state leakage (issue
fix: 为权限管理器添加run和session作用域,防止工具使用ID冲突和Future泄漏
fix(py-runtime): 修复 New-main 合并后的测试套件损坏与 workspace 重命名丢失