fix(core): 重启成功后恢复 worker 就绪状态 - #1032
Conversation
|
感谢这个修复 🙏 方向和病理分析都准确,我核实后确认问题真实存在,且守卫的设计比表面看起来更细致。以下是初步评审意见,供参考。 ✅ 已核实成立的部分病理链条:我确认 worker 侧 守卫形状值得肯定:接
🟠 建议修改:新测试目前无法证明这个修复
我做了一次反向变异来量化:在
也就是说 bug 完全回归了但测试察觉不到,PR 描述里的 415 个测试对这次修复没有约束力(全仓只有 3 个测试文件提到 建议改成行为化测试,至少覆盖「succeeded 释放栅栏」+「failed / stale 不释放」。harness 是现成的,可以直接照 🟡 仅供参考(master 既有问题,不必在本 PR 处理)in-worker restart IPC 全仓有 4 个生产者,只有
后三条清了栅栏但永远收不到匹配收据(worker 侧 不过这三条在 master 上就已如此,本 PR 没有引入也没有加重,所以只是提一下,是否要一起收敛完全由维护者决定。缓解事实:用户之后手动 其它
以上是自动评审的初步意见,可能有误判,最终以维护者审阅结论为准。核心只有一条建议:把 source-pin 测试换成行为化测试,其余都是可选项。再次感谢你定位到这个问题 🙏 |
|
补充与更正(第二轮交叉评审后)——两条实证结论,一条是对我上一条评论的更正。
|
问题
存量会话执行
/restart时,daemon 会先把workerReady设为false,以阻止 fork、relay 等生命周期操作与 CLI 重启并发。CLI 在同一个 worker 进程内恢复后只发送
prompt_ready和restart_result,不会再次发送进程级ready。原逻辑虽然结算了 restart coordinator,却没有恢复workerReady。因此终端和卡片已经显示 idle,fork/relay 仍会永久返回worker_busy。复现顺序:
/restart。/fork --create ...。修复
处理当前 worker 的
restart_result时:succeeded时恢复ds.workerReady = true;影响面
改动位于
core/worker-pool的公共生命周期状态处理,覆盖所有采用 in-worker restart 的本地 CLI 和普通群/话题会话。不改变 transcript、消息路由、fork 数据复制方式或远端 backend 的失败策略。失败重启不会被误标为 ready。
验证
/restart命令与 transfer/fork 组合回归:2 个测试文件,359 个测试通过。pnpm build通过:TypeScript、脚本类型检查、Dashboard bundle、dist audit 全部完成。git diff --check通过。