Repository navigation
Agent Workflow v0.18.19
Agent Workflow v0.18.19
本版本是 v0.18.18 之后的 patch 版本,主线是修复 Windows 上「杀进程 → 重试建不起来 → 任务停摆」的死链(RFC-356,issue #13)、让意图构建(Intent Builder)看得见完整的工作流图校验(RFC-358),以及任务列表页在两个数据库 provider 上收敛为同一份查询(RFC-357)。同时 PostgreSQL provider 的统一抽象(RFC-359)持续推进,本版本修掉了一批只在 PostgreSQL 上出现的功能缺陷。
本版本不含新的 SQLite 数据库迁移(迁移端点仍为 0223)。PostgreSQL 基线(0000_rfc349_baseline)重采,已经完成 RFC-349 cutover 的 PostgreSQL 部署需要重做 cutover,详见文末「升级说明」。
主要更新
Windows:杀进程后重试建不起来、任务停摆(RFC-356 / issue #13)
用户在 Windows + v0.18.14 上报的三行现场——「超时杀进程 → iso worktree 删除失败(Invalid argument,留待 GC)→ 重试重建 iso worktree 报 already exists」——经源码对账确认是一条必然复现的死链,不是偶发。本版本从三处同时堵上:
- 残留工作树回收阶梯:iso 工作树的丢弃改为「
git worktree remove --force→ 退避重试的目录删除 +git worktree prune→ 报告blocked」三档阶梯,不再是一发git worktree remove失败就只 warn 一句「留待 GC」(而 iso GC 明确跳过活跃 / 非终态任务,那句承诺对活着的任务从不成立)。「丢了注册项的残留目录」(git worktree remove报is not a working tree)现在也能被清掉——这是此前平台完全无法自愈的形态。 - iso 键代际自愈:旧 iso 确实清不掉时,重试自动改用新一代 iso 键(
{原键}-2、-3…)建树并继续,不再以iso-recreate-failed把节点和整条工作流永久钉死。wrapper iso 的 resume 路径同样自愈——此前 Windows 上每次 resume 都撞同一堵墙、永久 wedge,也就是 issue 标题里的「循环调度停摆」。 - Windows 进程树归属真正接线:RFC-254 早已写好的 Job Object 归属代码在生产路径上一次都没有被调用,于是杀树一直落在
taskkill /pid <pid> /T /F这个快照枚举降级档(新 fork 的后代直接逃逸),而isProcessTreeAlive在 Windows 上恒返回null(平台无从知道树是否死透)。本版本把 Job Object 接到 spawn 上:杀树走TerminateJobObject的内核级原子终止,杀树之后仍能查内核确认存活数,并在回收工作树之前于预算内等待树静默。没有 FFI 的 Windows ARM64 保持taskkill降级,降级事实在 daemon 启动时 warn 一次,也会出现在失败诊断里。 - 失败信息会自证:真的清不掉时,
iso-recreate-failed的消息会带上残留路径、最后一次错误与本机 Job Object 可用性,而不是一行光秃秃的错误码。 - 连带修复:
handleTaskIdOf此前用split('/')解析由join()生成的路径,在 Windows 上恒返回'unknown',导致带子模块的仓库其 worktree-scoped 池锚点全部串台、按 taskId 的清理永远匹配不上。
意图构建看得见工作流图校验(RFC-358)
起于用户实证「意图创建的东西过不了校验」。此前意图链路只跑第一层校验(句柄 / 挂载 / 模板语法 / tempRef 环),真正的工作流图校验(端口存在性、wrapper 边界、fanout 结构、clarify 多重性、call 闭环与自调用、模板变量来源、agent 的 skill / MCP / plugin 闭包,共 108 个错误码)从生成到落库一次都不跑——于是意图侧全绿落库,坏在编辑器或启动时才暴露,agent 全程看不见、也无法自愈。
- 变更集里的工作流 op 现在会被解析成可校验候选并跑完整图校验:agent 以变更后形态参与,同批新建的 skill / MCP / plugin 注入闭包,同批新建的被调工作流按名字 + id 双键注入 call 闭包,
currentWorkflow补齐自调用与环判据。 - error 以
<opId>:前缀汇入既有 blocking 列表,draft 期就看得见并禁止提交;warning 单独成段呈现,超出上限时显式标注截断。 - 图修复轮:图校验报 error 时自动接一轮让模型自修(预约与 settle 同事务,无 in-flight 空窗);只有图校验的 error 会触发,第一层报错不再自动重跑。
- copy 操作不再丢 sidecar;提交期补一道二次硬拦。
- 改动 agent 时,其下游影响面会在确认页列出(知情不拦截)。
任务列表页:一份查询,两个 provider(RFC-357)
起于用户反馈「切了 PostgreSQL,任务列表还是卡」。对账结论不是「PostgreSQL 慢」,而是这一页在两个 provider 上是两份实现,PostgreSQL 那份从来没有过 RFC-311 的任何一项优化:三个数据源各发一次 limit: 10_000 的裸查询、把 workflow_snapshot(整份工作流定义 JSON,每行上百 KB)等大列一起搬过来、失败任务再逐行 N+1,然后过滤 / 搜索 / 排序 / 分页 / facets 全在 JS 里做。
- 抽出一份 dialect 参数化的页查询给两个 provider 共用;
services/taskOperations.ts(1,196 行 SQLite 专属裸 SQL)整文件删除并归位。 - 分叉带来的用户可见缺陷一并修掉:页签计数不再随选中的页签变(facets 数改在 view 之前算,前端飞行期沿用旧值);启动来源筛选在 PostgreSQL 上「事件」/「API」不再 400、「定时」不再漏子任务;层级与排序不再写死。
- 前端 WebSocket 失效改为按帧增量:
task.status/task.deleted就地 patch,其余仍走失效 + 30s 低频对账。 - CI 新增一条真 PostgreSQL 窄 lane(假 pool 只断言 SQL 文本,证明不了它在真库上跑不跑得动)。
PostgreSQL provider 统一抽象持续推进(RFC-359,进行中)
RFC-359 的目标是「provider 是一个抽象,而不是一个 if」——不再允许出现两种数据库一好一坏的分支。本版本落地的部分已经修掉一批只在 PostgreSQL 上出现的功能缺陷:
- 评审与澄清可用:评审决定 / 评论增改删 / 文档选择、快速澄清决定、反问下发、延迟提问自动派发全部收敛为一份实现跑在统一事务原语上,PostgreSQL 上「评审无法通过 / 驳回、澄清无法回答」以及路由 500 的问题消失。
- 任务能跑起来:八处 owner 围栏此前把「未显式传执行上下文」当作无主,节点的第一次写就被自己 claimed 的 owner 拒掉(每个任务在铸出 node_run 前必死);effect 账本对冻结 token 做等值判定导致首次心跳后所有 effect 写入被拒。两条都已改成与 SQLite 同规则。
- 启动与恢复对齐:boot 恢复四步(撤销旧 owner / 收割孤儿 run / 修 runtime session lease / 清算 effect)、删除认领崩溃恢复、归档与工作区维护恢复、技能启动屏障、定时载荷治愈、webhook 投递恢复等,PostgreSQL daemon 现在与 SQLite 入口同序执行同一份实现。
- 其他 PostgreSQL 专属修复:坏定义的工作流在 PostgreSQL 上也能删除(并补齐两道此前缺失的删除守卫);
count/sum相关计数、NULL 排序、用户搜索召回等差异随合一消除;PostgreSQL daemon 的系统身份改为正式 admit,四条 daemon 自用路径不再抛foreign-legacy-actor-projection;数据库迁移会话不再继承在线请求超时,验证查询失败不再被记成不变量违规。 - 一份实现:约 150 对孪生适配器已合掉大半(task-execution / resource-catalog / collaboration / identity-access / memory / integration / source-control / event-center / code-capability / digital-employee / development-automation 各批),数千行 PostgreSQL 副本退役;双引擎测试 harness 让每个合一批次在两种数据库上各跑一遍,四个 CI 分片各带真 PostgreSQL。
其他修复
- 数字员工 / 开发任务(mission)停在 working 不动:根因是事实写回被并发挤掉后没有重试,以及悬挂在
prepared的自治 effect 被决策去重吞掉;reconcile 路径上同族的无校验 OCC 写回一次扫干净。 - 终态维护的水位覆盖判据只对最高代际比 digest,冲突归类为 busy(不再误判)。
- 修复重启会杀掉「已回答澄清」续跑的问题(补回 RFC-187 T13 的复活路径)、收尾轮丢派单、系统消息分类判据丢失、流中断的重跑不进账本等一批合一过程中暴露的回归。
- 意图链路:apply 层 changeset 校验收成一份(SQLite 不再裸
JSON.parse);services/intent/5,136 行整目录删除、路由迁入模块并收成 decode-call-map(RFC-355)。
升级说明
- 无新增 SQLite 迁移:迁移端点仍为
0223。仍建议升级前备份数据库。 - PostgreSQL 基线重采(重要):
webhook_deliveries的两条部分唯一索引与user_identities的 provider+subject 唯一索引此前只存在于 SQLite 迁移、没有进入 drizzle 声明,PostgreSQL 侧因此没有去重键。本版本补上声明并重采了 PostgreSQL 基线(contractDigest变更)。已经完成 RFC-349 cutover 的 PostgreSQL 部署需要重做 cutover;PostgreSQL 增量迁移能力仍在 RFC-359 W5 中,尚未提供。 - Windows 行为变更(RFC-356,均为有意变更):
- daemon 进程退出(含崩溃 / 被强杀 / 优雅停机的超预算幸存者)时,在跑的 runtime 子进程会随 Job Object 关闭被内核一并终止——此前它们会留成孤儿、等下次启动收割。
- 正常成功退出的运行,其幸存后代也会在收尾时被终止(它们正是持有工作树句柄的那一批)。
- 被杀掉的运行,其结束时间会晚最多 2s(等待进程树静默);正常退出的运行时序逐字不变。
- 磁盘上可能多出一个暂时清不掉的残留 iso 目录(自愈换新路径的代价),它会在任务终态时由既有 iso GC 一并删除。
- Windows ARM64(无 FFI)保持
taskkill /T /F降级,不新增平台专属杀树路径。
- POSIX 平台行为不变:macOS / Linux 上杀树仍走进程组,时序逐字不变。
- 不要在升级后的数据库上直接回退旧二进制:需要降级时,请停机、换回旧 binary,并恢复升级前备份。
完整变更记录:v0.18.18...v0.18.19