mirror of
https://github.com/shareAI-lab/analysis_claude_code.git
synced 2026-03-22 02:15:42 +08:00
Comprehensive rewrite establishing the harness engineering narrative across the entire repository. README (EN/ZH/JA): added "The Model IS the Agent" manifesto with historical proof (DQN, OpenAI Five, AlphaStar, Tencent Jueyu), "What an Agent Is NOT" critique, harness engineer role definition, "Why Claude Code" as masterclass in harness design, and universe vision. Consistent framing: model = driver, harness = vehicle. docs (36 files, 3 languages): injected one-line "Harness layer" callout after the motto in every session document (s01-s12). agents (13 Python files): added harness framing comment before each module docstring. skills/agent-philosophy.md: full rewrite aligned with harness narrative.
130 lines
4.8 KiB
Markdown
130 lines
4.8 KiB
Markdown
# s07: Task System (任务系统)
|
|
|
|
`s01 > s02 > s03 > s04 > s05 > s06 | [ s07 ] s08 > s09 > s10 > s11 > s12`
|
|
|
|
> *"大目标要拆成小任务, 排好序, 记在磁盘上"* -- 文件持久化的任务图, 为多 agent 协作打基础。
|
|
>
|
|
> **Harness 层**: 持久化任务 -- 比任何一次对话都长命的目标。
|
|
|
|
## 问题
|
|
|
|
s03 的 TodoManager 只是内存中的扁平清单: 没有顺序、没有依赖、状态只有做完没做完。真实目标是有结构的 -- 任务 B 依赖任务 A, 任务 C 和 D 可以并行, 任务 E 要等 C 和 D 都完成。
|
|
|
|
没有显式的关系, 智能体分不清什么能做、什么被卡住、什么能同时跑。而且清单只活在内存里, 上下文压缩 (s06) 一跑就没了。
|
|
|
|
## 解决方案
|
|
|
|
把扁平清单升级为持久化到磁盘的**任务图**。每个任务是一个 JSON 文件, 有状态、前置依赖 (`blockedBy`) 和后置依赖 (`blocks`)。任务图随时回答三个问题:
|
|
|
|
- **什么可以做?** -- 状态为 `pending` 且 `blockedBy` 为空的任务。
|
|
- **什么被卡住?** -- 等待前置任务完成的任务。
|
|
- **什么做完了?** -- 状态为 `completed` 的任务, 完成时自动解锁后续任务。
|
|
|
|
```
|
|
.tasks/
|
|
task_1.json {"id":1, "status":"completed"}
|
|
task_2.json {"id":2, "blockedBy":[1], "status":"pending"}
|
|
task_3.json {"id":3, "blockedBy":[1], "status":"pending"}
|
|
task_4.json {"id":4, "blockedBy":[2,3], "status":"pending"}
|
|
|
|
任务图 (DAG):
|
|
+----------+
|
|
+--> | task 2 | --+
|
|
| | pending | |
|
|
+----------+ +----------+ +--> +----------+
|
|
| task 1 | | task 4 |
|
|
| completed| --> +----------+ +--> | blocked |
|
|
+----------+ | task 3 | --+ +----------+
|
|
| pending |
|
|
+----------+
|
|
|
|
顺序: task 1 必须先完成, 才能开始 2 和 3
|
|
并行: task 2 和 3 可以同时执行
|
|
依赖: task 4 要等 2 和 3 都完成
|
|
状态: pending -> in_progress -> completed
|
|
```
|
|
|
|
这个任务图是 s07 之后所有机制的协调骨架: 后台执行 (s08)、多 agent 团队 (s09+)、worktree 隔离 (s12) 都读写这同一个结构。
|
|
|
|
## 工作原理
|
|
|
|
1. **TaskManager**: 每个任务一个 JSON 文件, CRUD + 依赖图。
|
|
|
|
```python
|
|
class TaskManager:
|
|
def __init__(self, tasks_dir: Path):
|
|
self.dir = tasks_dir
|
|
self.dir.mkdir(exist_ok=True)
|
|
self._next_id = self._max_id() + 1
|
|
|
|
def create(self, subject, description=""):
|
|
task = {"id": self._next_id, "subject": subject,
|
|
"status": "pending", "blockedBy": [],
|
|
"blocks": [], "owner": ""}
|
|
self._save(task)
|
|
self._next_id += 1
|
|
return json.dumps(task, indent=2)
|
|
```
|
|
|
|
2. **依赖解除**: 完成任务时, 自动将其 ID 从其他任务的 `blockedBy` 中移除, 解锁后续任务。
|
|
|
|
```python
|
|
def _clear_dependency(self, completed_id):
|
|
for f in self.dir.glob("task_*.json"):
|
|
task = json.loads(f.read_text())
|
|
if completed_id in task.get("blockedBy", []):
|
|
task["blockedBy"].remove(completed_id)
|
|
self._save(task)
|
|
```
|
|
|
|
3. **状态变更 + 依赖关联**: `update` 处理状态转换和依赖边。
|
|
|
|
```python
|
|
def update(self, task_id, status=None,
|
|
add_blocked_by=None, add_blocks=None):
|
|
task = self._load(task_id)
|
|
if status:
|
|
task["status"] = status
|
|
if status == "completed":
|
|
self._clear_dependency(task_id)
|
|
self._save(task)
|
|
```
|
|
|
|
4. 四个任务工具加入 dispatch map。
|
|
|
|
```python
|
|
TOOL_HANDLERS = {
|
|
# ...base tools...
|
|
"task_create": lambda **kw: TASKS.create(kw["subject"]),
|
|
"task_update": lambda **kw: TASKS.update(kw["task_id"], kw.get("status")),
|
|
"task_list": lambda **kw: TASKS.list_all(),
|
|
"task_get": lambda **kw: TASKS.get(kw["task_id"]),
|
|
}
|
|
```
|
|
|
|
从 s07 起, 任务图是多步工作的默认选择。s03 的 Todo 仍可用于单次会话内的快速清单。
|
|
|
|
## 相对 s06 的变更
|
|
|
|
| 组件 | 之前 (s06) | 之后 (s07) |
|
|
|---|---|---|
|
|
| Tools | 5 | 8 (`task_create/update/list/get`) |
|
|
| 规划模型 | 扁平清单 (仅内存) | 带依赖关系的任务图 (磁盘) |
|
|
| 关系 | 无 | `blockedBy` + `blocks` 边 |
|
|
| 状态追踪 | 做完没做完 | `pending` -> `in_progress` -> `completed` |
|
|
| 持久化 | 压缩后丢失 | 压缩和重启后存活 |
|
|
|
|
## 试一试
|
|
|
|
```sh
|
|
cd learn-claude-code
|
|
python agents/s07_task_system.py
|
|
```
|
|
|
|
试试这些 prompt (英文 prompt 对 LLM 效果更好, 也可以用中文):
|
|
|
|
1. `Create 3 tasks: "Setup project", "Write code", "Write tests". Make them depend on each other in order.`
|
|
2. `List all tasks and show the dependency graph`
|
|
3. `Complete task 1 and then list tasks to see task 2 unblocked`
|
|
4. `Create a task board for refactoring: parse -> transform -> emit -> test, where transform and emit can run in parallel after parse`
|