Claude Code 07:Task System——磁盘持久化任务图

Claude Code 07:Task System——磁盘持久化任务图
Asaakii在第 3 篇中,我们通过内存版的 TodoManager 让模型具备了基本的工作清单意识。但随着任务规模从“修改两个函数”升级到“迁移大型模块与微服务”,内存快照的脆弱性暴露无遗:
- 进程崩溃即前功尽弃:只要终端意外中断或电源故障,整个会话中的任务进度全部归零;
- 缺乏前置依赖拓扑(DAG):无法清晰表达“任务 C(部署)必须严格等待任务 A(构建)和任务 B(单测通过)完成后才能开始”;
- 无法支撑多智能体协同:多个并发的 Agent 无法安全地共享和认领同一个内存对象。
Claude Code 在其进阶架构中建立了一套以磁盘文件为中枢的持久化任务框架(Task System)。所有任务被建模为一个有向无环图(DAG),每个任务对应物理磁盘上的独立实体。
本文将深入 Claude Code 真实的统一任务骨架,并从零实现一个支持依赖阻塞与崩溃恢复的持久化任务引擎。
生产源码探秘:Claude Code 的统一任务体系
在 Claude Code 源码 src/Task.ts 中,任务绝不是普通待办那么简单,它承载着整个系统的异步调度与多智能体分工。
1. 七大任务类型与带前缀的 ID 系统
系统为不同应用场景定义了 7 种专有 TaskType,每种类型分配了一个唯一的英文字符前缀:
1 | // src/Task.ts 生产类型定义 |
系统通过 generateTaskId() 生成由“类型前缀 + 8 位 36 进制随机串”构成的 ID(例如 b3k7f9x2a 或 ahj4m8n1p)。这使得任何组件只需看一眼 ID,就能立即推断出它的执行模型与生命周期。
2. 严格的五态生命周期守卫
所有任务无论类型,统一遵循严谨的 5 态状态机:
stateDiagram-v2
[*] --> pending: 任务创建成功
pending --> running: 前置依赖全部解锁并启动
running --> completed: 正常成功完成
running --> failed: 执行出错抛出异常
running --> killed: 被用户主动取消或超时强杀
completed --> [*]
failed --> [*]
当任务进入 completed、failed 或 killed 终态后,系统实施严格的终态守卫(Terminal Guard):禁止任何针对已死任务的状态覆写,防止异步回调晚到引发状态倒退。
3. TaskStateBase 物理底座
1 | export type TaskStateBase = { |
值得注意的是 outputFile 与 outputOffset 机制:任务产生的持续日志不保存在内存,而是直接追加写入磁盘流。外部观察者只需要记录游标 offset,就能增量读取新增日志,彻底避免把大文件重复加载进内存。
磁盘持久化 DAG 引擎实现
我们用 Python 实现一个具备依赖拓扑阻塞与崩溃恢复能力的持久化任务引擎:
1 | import os |
依赖拓扑执行实战展示
设想一个标准的工程重构任务链条:
- 任务 1:重构鉴权模块代码(
t_1); - 任务 2:重写配套单元测试(
t_2,依赖t_1); - 任务 3:编写使用文档(
t_3,依赖t_1); - 任务 4:打包发布镜像(
t_4,依赖t_2和t_3)。
flowchart TD
T1["任务 1: 重构鉴权模块 (t_1)"]
T2["任务 2: 重写配套单测 (t_2)"]
T3["任务 3: 编写使用文档 (t_3)"]
T4["任务 4: 打包发布镜像 (t_4)"]
T1 -->|blockedBy| T2
T1 -->|blockedBy| T3
T2 -->|blockedBy| T4
T3 -->|blockedBy| T4
在启动执行时:
get_executable_tasks()仅会筛选出t_1。其余任务由于前置未就绪,处于安全阻塞状态;- 任务 1 完毕并标记为
completed后,t_2与t_3同时满足解锁条件,成为并行就绪任务; - 即使系统在此刻意外掉电重启,重新加载目录后,引擎依然能精准辨识出未完成的依赖拓扑,直接实现零损失断点续跑。
总结
持久化任务框架将 Agent 从单会话的内存束缚中彻底解救出来:
- 状态物理落地:以独立 JSON 文件为实体,具备天然的抗崩溃韧性;
- DAG 依赖闭环:通过
blocked_by构建执行图,杜绝任务前后顺序颠倒的工程灾难; - 为多智能体铺路:磁盘上的独立任务文件为后续多个 Agent 协同认领任务(Task Claiming)奠定了物理基础。
有了清晰的依赖调度体系后,另一个瓶颈浮出水面:某些任务(如 npm run build 或大型测试套件)耗时长达数分钟。如果主 Agent 一直同步等待,用户界面与推理循环就会卡死。
下一篇我们将探讨非阻塞调度的核心机制:Background Tasks 后台任务与异步轮询通知。











