目标对齐的层级任务管理:从公司使命到具体执行
目标对齐的层级任务管理:从公司使命到具体执行
1. 问题定义
在多 Agent 系统中,任务管理面临独特挑战:
- 目标漂移:Agent 执行任务时可能偏离原始目标,因为它不知道”为什么做”
- 双重执行:同一任务可能被两个 Agent 同时执行,产生冲突的工作
- 上下文丢失:Agent 重启后无法恢复之前的任务上下文
- 依赖阻塞:任务 A 依赖任务 B 的结果,但 B 尚未完成
目标对齐的层级任务管理通过目标追溯链、原子 checkout 和执行锁来解决这些问题。
2. 层级任务模型
2.1 目标追溯链
每个任务通过 parent 链路追溯到公司目标:
我在研究竞品 Facebook 广告的投放策略(当前任务) because → 我需要为产品创建 Facebook 广告(父任务) because → 我需要将新注册用户增长 100 人(父任务) because → 我需要将本周收入提升到 $2,000(父任务) because → ... because → 我们要打造 #1 AI 笔记应用,3 个月内达到 $1M MRR2.2 数据模型
2.3 双重链路
任务有两个关键的上游链接:
| 链路 | 作用 |
|---|---|
goal_id | 直接关联到某个公司目标 |
parent_issue_id | 关联到父任务(形成层级树) |
Agent 执行任务时,系统计算完整的 goal ancestry(从当前任务到公司目标的完整路径),注入到 Agent 的上下文中。
3. 原子 Checkout 与执行锁
3.1 原子 Checkout
任务从 todo 转换到 in_progress 需要获取执行锁:
伪代码:async function checkoutIssue(issueId, agentId) { const result = await db.update(issues) .set({ status: "in_progress", assignee_agent_id: agentId, execution_lock: generateLockId(), checked_out_at: now() }) .where(and( eq(issues.id, issueId), isNull(issues.execution_lock), // 锁必须为空 eq(issues.status, "todo") ));
if (result.affected === 0) { throw new ConflictError("Issue already checked out by another agent"); }}关键语义:
- 单分配者(single-assignee):一个任务同时只能被一个 Agent 执行
- 原子性:checkout 是数据库原子操作,不会有两个 Agent 同时获取锁
- 执行锁包含锁 ID 和 checkout 时间,用于后续 liveness 检查
3.2 执行锁的生命周期
4. Blocker 依赖
4.1 依赖关系
任务之间可以设置 blocker 依赖:
issue_relations 表:- issue_id (被阻塞的任务)- blocking_issue_id (阻塞源)- relation_type: "blocks"4.2 依赖检查
Agent 在执行任务前检查 blocker:
伪代码:async function canExecuteIssue(issueId) { const blockers = await db.select() .from(issue_relations) .where(eq(issue_relations.issue_id, issueId));
for (const blocker of blockers) { const blockingIssue = await getIssue(blocker.blocking_issue_id); if (blockingIssue.status !== "done") { return false; // 有 blocker 未完成 } } return true;}5. 任务交互与上下文
5.1 Comments
任务支持评论系统,用于:
- Agent 记录执行进度和决策
- 人类董事会成员提供反馈
- 自动系统消息(心跳执行结果、预算事件)
5.2 Documents 和 Attachments
任务可以关联文档和附件:
- Issue Documents:任务相关的文档(策略文档、设计文档)
- Attachments:文件附件(代码 diff、报告、截图)
- Work Products:任务产出的工作成果
5.3 Thread Interactions
任务的交互历史(评论、文档变更、状态转换)按线程组织:
- 每个交互记录时间戳和操作者
- 支持 Agent 和人类在同一线程中交互
- 心跳执行自动创建评论,记录执行摘要
6. 孤儿恢复
6.1 Liveness 检查
定期检查执行中的任务是否还在产出活动:
| 指标 | 检测方式 |
|---|---|
| 最近日志时间 | 超过 N 分钟无新日志 → 可疑 |
| 进程状态 | 进程已退出但 issue 仍在 in_progress |
| 心跳 run 状态 | run 状态卡 stuck |
6.2 恢复动作
检测到孤儿后,系统创建 recovery action:
issue_recovery_actions 表:- issue_id (需要恢复的任务)- action_type (release_lock / retry / escalate)- reason (孤儿原因)- status (pending / completed / failed)恢复策略:
| 场景 | 动作 |
|---|---|
| 进程退出,任务可重试 | 释放锁,重新入队唤醒 |
| 任务状态不一致 | 创建 recovery action,人工确认 |
| 超过最大重试次数 | 升级为 escalated,通知董事会 |
7. Goal Ancestry 注入
7.1 上下文计算
Agent 执行任务时,系统计算完整的 goal ancestry:
伪代码:async function buildAgentContext(issue) { const goal = await getGoal(issue.goal_id); const ancestry = await getParentIssueChain(issue.id);
return { company_goal: goal.title, goal_description: goal.description, task_ancestry: ancestry.map(p => p.title), current_task: issue.title, task_description: issue.description };}7.2 注入到 Agent
计算结果通过 Adapter 的执行上下文注入到 Agent 的提示词:
伪代码提示词:"你正在为以下目标工作:
公司目标: {company_goal}当前任务所属目标: {goal_title}任务链: {task_ancestry}
你的当前任务: {current_task}任务描述: {task_description}
请确保你的工作服务于上述目标。"8. 陷阱与对策
| 陷阱 | 后果 | 对策 |
|---|---|---|
| 深树递归查询性能差 | 获取 goal ancestry 时查询慢 | 物化路径(materialized path)或缓存 ancestry |
| 执行锁持有者已死但锁未释放 | 任务永久阻塞 | Liveness watchdog 自动释放超时锁 |
| Blocker 形成循环依赖 | 死锁 | 在创建 blocker 关系时检测循环(图遍历) |
| Agent checkout 后不执行 | 锁被占但无活动 | checkout 后设置执行超时,超时自动释放 |
| Goal 被删除后任务悬空 | 任务失去目标对齐 | 外键约束 ON DELETE RESTRICT,禁止删除有关联任务的 goal |
9. 参考来源
- Paperclip PRODUCT.md — “Task Management is hierarchical”
- Paperclip Issues Service —
server/src/services/issues.ts(205KB) - Paperclip Issues Schema —
packages/db/src/schema/issues.ts - Paperclip Issue Tree Control —
server/src/services/issue-tree-control.ts - Paperclip Issue Recovery Actions —
server/src/services/issue-recovery-actions.ts