Multica 代码库与 Linear AIG 的对照分析

结论:Multica 的代码实现与 Linear AIG 高度同构——解决的是同一组问题,用的是几乎相同的抽象。但 Linear 在协议层的设计更优雅(delegate/assignee 分离、Activity 不可变、Signal 双向通信)。Multica 的独特价值仅剩 Daemon 本地执行和 Skill 复用系统。

逐条对照

原则 1:Agent 必须表明身份

Linear AIGMultica 实现
Agent 有独立视觉标记(badge)issue.assignee_type = 'agent' + 前端紫色背景 + 机器人图标
Agent 在 user dropdown 中独立分区Agent 和 Member 在 assignee picker 中分开展示
Agent 操作在 activity feed 中有标记comment.author_type = 'agent'activity_log.actor_type = 'agent'

判定:✅ 功能等价。Multica 用 *_type 多态字段区分人和 Agent,Linear 用 OAuth actor=app 区分。底层设计几乎一致。


原则 2:Agent 应原生融入平台

Linear AIGMultica 实现
Agent 用和人类相同的操作(创建 issue、评论、改状态)Agent 通过 daemon → API 创建 comment(type=‘progress_update’)、修改 issue status
不需要特殊界面Agent 的操作出现在统一的 timeline view

判定:✅ 功能等价。两者都让 Agent 通过标准 API 操作平台实体,不需要专门的 Agent 界面。


原则 3:Agent 必须即时反馈

Linear AIGMultica 实现
10 秒内必须回应 thought,否则标记 unresponsive无超时机制
Ephemeral activity(临时状态,被下一条覆盖)无等价概念
AgentSession 自动从 pending → activeagent.status 手动更新为 ‘working’
Plan API(多步骤进度清单)无等价概念

判定:⚠️ Multica 缺失。没有即时反馈的强制约束,没有 ephemeral activity,没有 Plan API。用户看到的是 agent.status = 'working' 这个粗粒度状态,看不到 Agent 在想什么、做到哪一步。

代码证据

  • server/pkg/db/generated/models.go:30Agent.Status 只有 idle/working/blocked/offline 四种状态
  • server/internal/service/task.goEnqueueTaskForIssue 创建任务后无 10 秒超时检查
  • server/pkg/protocol/events.gotask:progress 事件存在但只是通用进度推送,无 thought/action 语义

原则 4:Agent 必须透明内部状态

Linear AIGMultica 实现
5 种语义化 Activity 类型:thought / action / elicitation / response / errorTaskMessage.type:text / tool-use / tool-result(3 种,偏底层)
Activity 不可变(时间冻结快照)ActivityLog 不可变 ✅,但 Comment 可编辑
用户可检查 reasoning、tool calls、promptsTaskMessage 流式记录了 Agent 执行步骤
Session 状态可见:thinking / waiting / executing / finishedAgent 只有 idle/working/blocked/offline

判定:🟡 Multica 有基础但缺乏语义化

Multica 的 TaskMessage 实际上记录了 Agent 的所有执行步骤(tool-use/tool-result),数据比 Linear 更丰富。但问题是:

  1. 缺乏语义分层text 不区分 thought vs response vs error
  2. 面向调试而非面向用户 — TaskMessage 是 raw agent output,没有为人类阅读优化
  3. 没有 elicitation — Agent 无法主动向人类提问或请求选择

代码证据

  • server/pkg/db/generated/models.goTaskMessageType(text/tool-use/tool-result)、ToolContentInput(JSONB)、Output
  • Linear 的 AgentActivity 有 thought/action/elicitation/response/error + body/signal/signalMetadata

原则 5:Agent 必须尊重停止请求

Linear AIGMultica 实现
stop signal → 立即停止,不做任何额外操作CancelTask(taskID) → daemon 收到取消信号
Agent 必须发出最终 response/error 确认已停止任务标记为 ‘cancelled’,无强制确认机制

判定:✅ 功能等价,但 Linear 的 Signal 机制更优雅。

Multica 的 daemon 每 5 秒轮询服务器检查任务是否被取消(handleTask 中的 cancellation polling),收到后通过 context cancellation 终止 Agent 进程。这是可工作的,但粗糙——不是即时停止,有最多 5 秒延迟。

代码证据

  • server/internal/daemon/daemon.gohandleTask() 中有 cancellation polling loop
  • server/internal/service/task.goCancelTask() 修改任务状态,daemon 下次轮询时发现

原则 6:Agent 不可被问责(delegate ≠ assignee)

Linear AIGMultica 实现
Agent 设为 delegate,人类保持 assigneeAgent 直接设为 assigneeissue.assignee_type = 'agent'
责任归属从协议层保证无 delegate 概念,Agent 就是 assignee
清晰的委派模型owner_id 只在 Agent 实体上,不在 Issue 上

判定:🔴 Multica 缺失关键设计

这是最大的设计差距。Linear 的 delegate/assignee 分离是 AIG 中最精妙的设计——Agent 做事但人类负责。Multica 让 Agent 直接成为 assignee,意味着:

  1. 从数据模型上,一个 issue 要么归人、要么归 Agent,没有”人负责、Agent 执行”的中间态
  2. 当 Agent 完成/失败时,没有自然的”移交回人类”机制
  3. 审计时无法区分”谁决定让 Agent 做这件事”

代码证据

  • server/pkg/db/generated/models.go:164-165Issue.AssigneeType + Issue.AssigneeID,是直接赋值,不是 delegate
  • 没有 delegate_iddelegated_by 字段

功能对照总表

AIG 设计要素LinearMultica差距
Agent 身份标记✅ badge + actor type✅ type 字段 + UI 标记
原生平台操作✅ 标准 API✅ 标准 API
即时反馈 / 10s 超时✅ 强制❌ 无超时
Ephemeral Activity
Plan API(进度清单)
语义化 Activity 类型✅ 5 种🟡 3 种(偏底层)
Activity 不可变✅ ActivityLog 不可变
Elicitation(Agent 提问)
Signal 双向通信✅ stop/auth/select🟡 仅 cancel(轮询)
delegate ≠ assignee致命
Agent 零成本安装✅ 不计费✅ 自托管免费无(不同模式)
promptContext 自动注入🟡 daemon 运行时拉取
OAuth actor=app❌ PAT/JWT
Repository suggestion✅ LLM 推荐

Multica 独有的价值(Linear AIG 没有的)

1. Daemon 本地执行

Linear 的 Agent 是外部服务通过 API 操作 Linear。Multica 的 Daemon 在用户本地机器上执行 Agent CLI(claude/codex),代码不离开本机。

意义:对于安全敏感的团队,这是硬需求。但也是之前指出的矛盾——笔记本合盖 Daemon 就停了。

代码位置server/internal/daemon/daemon.go — 完整的本地执行运行时,包含 semaphore 并发控制、heartbeat、task polling、execution environment 准备。

2. Skill 复用系统

Linear 没有 Skill 概念。Multica 的 Skill 是可打包、可复用的 Agent 指令集,挂载到 Agent 上在执行时注入。

意义:团队级别的 Agent 能力复用。“Deploy to staging” skill 创建一次,所有 Agent 可用。

代码位置server/internal/handler/skill.go — CRUD;server/internal/daemon/execenv/runtime_config.go — 执行时注入 skill 为 CLAUDE.md。

3. Agent 状态和 Runtime 管理

Linear 不管 Agent 在哪里运行。Multica 有完整的 Runtime 注册、heartbeat 监控、设备信息上报、并发控制。

代码位置server/internal/daemon/daemon.go — heartbeat 15s 间隔,AgentRuntime 表跟踪在线状态。

4. Session Resume(Claude 会话恢复)

Task 完成后存储 session_id + work_dir,下次同 issue 的任务可以恢复上下文。

代码位置server/pkg/db/generated/models.go:77-78AgentTaskQueue.SessionID + AgentTaskQueue.WorkDir


设计哲学差异

维度Linear AIGMultica
Agent 在哪外部服务,通过 API 远程操作本地 Daemon,在用户机器上执行
协议 vs 产品协议提案,任何服务可 follow完整产品,自成一体
抽象层级高层语义(thought/action/elicitation)底层执行(tool-use/tool-result)
责任模型delegate/assignee 分离Agent 直接 assignee
交互方向双向(Agent 可以向人提问)单向(人分配任务,Agent 执行汇报)
扩展模型OAuth + Integration Directory自托管 + 本地 Daemon

一句话:Linear 设计的是”Agent 如何成为平台的合格居民”,Multica 设计的是”如何在本地高效运行 Agent”。


对 Multica 的建议

如果 Multica 想在 Linear AIG 时代存活,需要做的不是和 Linear 竞争项目管理,而是成为 AIG 协议的最佳本地执行引擎

  1. 接入 Linear AIG 协议 — 让 Multica Daemon 可以作为 Linear Agent 的执行后端。用户在 Linear 中 delegate issue 给 Agent,Multica Daemon 在本地执行,通过 AgentSession/AgentActivity API 回报进度
  2. 补齐 delegate/assignee 分离 — 在 Issue 模型上加 delegate_type + delegate_id
  3. 升级 TaskMessage 为语义化 Activity — 把 text/tool-use/tool-result 映射到 thought/action/response/error
  4. 加入 Elicitation 机制 — 让 Agent 可以向人类提问并阻塞等待回答
  5. 保持本地执行 + Skill 系统作为核心差异化 — 这是 Linear 永远不会做的

相关笔记

标签

code-analysis agent-native multica linear protocol