跳转到内容

目标对齐的层级任务管理:从公司使命到具体执行

目标对齐的层级任务管理:从公司使命到具体执行

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 MRR

2.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