context architecture study

Multica 的 Context
是怎么做的

按 Slock artifact 的方式拆:先看系统边界,再追 issue、subscriber、prompt 和 runtime 拉起链路,最后落到 agent 到底用哪些 CLI 工具取回上下文。

Source: multica-ai/multica main · commit fd0fe1d · snapshot 2026-05-24 · focus: issue/comment/subscriber/task/daemon/realtime
Issue / Chat / Autopilot server 只分发任务,不一次性塞满上下文 Claim 元数据 + 指针 Workdir brief + context files Agent CLI 用 multica CLI 按需取 issue / comment / repo 核心:context 是可恢复的工作环境,不只是 prompt 文本
1

一句话模型

Multica 的 context 设计不是“把所有信息预先打包成一个巨大 prompt”,而是 薄启动 prompt + 本地 brief/context 文件 + CLI 按需取回 + session/workdir 复用。 服务器负责把任务、安全边界和高信号指针给 daemon;真正的 issue 详情、评论历史、repo 内容由 agent 在运行中用 multica CLI 读取。

关键认知:Multica 更像 Linear/Jira + agent runtime 的调度层。它把 context 切成“稳定背景、任务入口、可分页历史、项目资源、执行现场”几块,避免每次唤醒都把整个 workspace 聊天记录塞进模型。
Mental model: context is a recoverable execution envelope Server Ledger issue / comment / task workspace / project / skill session_id / work_dir pointer 事实和指针,不是大 prompt dump Daemon Envelope claim response brief + workdir + env provider-native files 把平台状态翻译成 agent 可读环境 Agent Retrieval Loop issue get comment list / metadata repo checkout / attachment download 运行时按需把上下文拉进模型窗口 agent 写评论、改状态、写 metadata,平台再成为下一轮 context 的来源
server side

只存任务事实和指针

Issue、comment、workspace、project、skill、prior session/workdir 都在 DB 里。任务入队时通常不做大 context snapshot。

daemon side

启动前注入 brief

Daemon claim 到任务后,创建或复用隔离 workdir,写入 CLAUDE.md / AGENTS.md / .agent_context/issue_context.md 等文件。

agent side

运行中主动读取

Prompt 明确要求先跑 multica issue getmultica issue comment listmultica repo checkout,把上下文从平台拉到本轮模型里。

2

从 issue 到 agent 的启动链路

真正重要的是 claim 阶段。入队时 Multica 只创建 queue row;daemon claim 时才把 agent instructions、skills、workspace context、project resources、trigger comment、prior session/workdir 拼进响应。

Startup chain: queue first, context at claim time 1 enqueue task row only 2 claim fresh DB context 3 prepare workdir / skills 4 inject brief + prompt 5 run provider CLI no snapshot agent, issue, trigger reuse if possible provider-native CLI pulls data
1. enqueue
Issue 被分配给 agent 后创建 agent_task_queue 源码注释直说:issue task 不存 context snapshot,agent 运行时用 CLI 拉取所需数据。
2. claim
Daemon 调 /api/daemon/runtimes/:id/tasks/claim claim response 里带 agent identity、skills、workspace_id、repos、project resources、trigger comment、chat message、autopilot payload、quick-create prompt。
3. prepare/reuse
Daemon 创建或复用 workdir。 同一个 (agent, issue) 的后续任务会复用 prior workdir;assignment 任务还可 resume prior session,comment-triggered follow-up 通常只复用 workdir,不 resume 旧对话,避免回答新评论时继承旧的“Done”。
4. inject
写 runtime-native brief 和 context files。 Claude 写 CLAUDE.md,Codex/OpenCode/Cursor/Kimi/Kiro 等写 AGENTS.md,Gemini 写 GEMINI.md。同时写 .agent_context/issue_context.md 和 provider-native skills 目录。
5. run
启动 Claude/Codex/OpenCode 等 CLI。 环境变量里注入 MULTICA_TOKENMULTICA_WORKSPACE_IDMULTICA_AGENT_IDMULTICA_TASK_ID。Agent 通过本地 multica CLI 读写平台。
3

Issue 数据流:你提出一个 issue 后发生什么

最常见路径是:用户创建 issue 并分配给 agent;server 写 issue、广播事件、判断 agent 是否可运行;如果可运行,就写入 agent_task_queue 并唤醒对应 runtime 的 daemon。Daemon claim 成功后才真正启动本地 agent。

Issue create / assign path CreateIssue 写 DB,事件和 task queue 才把它接到 realtime 与 daemon User / UI / CLI POST /api/issues CreateIssue validate assignee duplicate guard insert issue row DB + Event Bus issue row issue:created subscriber listeners notifications TaskService CreateAgentTask task:queued wake runtime Daemon Claim ClaimTaskByRuntime task:dispatch claim response Prepare Runtime reuse/prepare workdir write AGENTS.md BuildPrompt StartTask -> task:running Agent Acts issue get / metadata comment list repo checkout comment / status Platform Updates comment:created issue:updated task:completed/failed Gate: status=backlog 不触发;agent 必须未归档且有 runtime_id;assignee 改变会先 cancel 旧任务,再按新 assignee 重建任务。
create / assign

创建时触发

CreateIssue 成功后发布 issue:created。如果 assignee 是 ready agent 且不是 backlog,调用 EnqueueTaskForIssue

status change

从 backlog 拉出来

用户把已分配 agent 的 issue 从 backlog 改到活动状态时,也会入队。donecancelled 不会触发新工作。

comment / mention

评论触发

成员评论会按 shouldEnqueueOnComment 判断是否触发 assignee agent;@agentEnqueueTaskForMention,使用触发 comment id 作为本轮入口。

所以你提出 issue 后,agent 为什么会动:不是因为前端直接启动 agent,而是后端在 issue 写入后检查 assignee/runtime/status,创建 queue row,广播 task:queued,再通过 runtime wakeup 让 daemon 来 claim。
4

Subscribe 数据流:谁会收到后续变化

Subscriber 是 notification 和 issue 关注状态的核心表。它既有手动订阅,也有事件驱动的自动订阅。Multica 在 server 启动时先注册 subscriber listeners,再注册 notification listeners,确保同一次事件里先写订阅关系,再基于订阅表发 inbox。

Subscriber and realtime path Subscription Sources issue:created issue:updated comment:created manual API / CLI issue_subscriber issue_id user_type: member/agent user_id reason Event Bus subscriber:added subscriber:removed inbox:new workspace fanout Frontend Cache useRealtimeSync issueKeys.subscribers timeline / inbox refresh optimistic mutation settle Notification listener reads subscriber table member subscribers get inbox; actor / muted / excluded users are skipped Manual path: GET/POST/DELETE /api/issues/:id/subscribers, CLI path: multica issue subscriber list/add/remove.
来源 写入 reason 作用
issue:created creator / assignee / mentioned 创建者、被分配者、description 中的 mention 成为 subscriber。随后 notification listener 可以直接基于表发 inbox。
issue:updated assignee / mentioned 新 assignee 和新增 mention 被自动订阅;assignee change 还会触发相关通知。
comment:created commenter 评论者进入 subscriber 表。system comment 被跳过,避免平台系统评论制造无意义订阅和通知。
Quick-create completion creator quick-create issue 由 agent 创建,但 task service 会把发起 quick-create 的 human requester 订阅进去。
Manual subscribe manual SubscribeToIssue / CLI multica issue subscriber add 写表并发布 subscriber:added
5

Prompt 与 runtime 拉起流程图

Agent 真正开始行动前,会先经历 claim response、workdir 准备、brief 写入、per-turn prompt 生成、环境变量注入、provider CLI 启动。它受到的约束分布在 runtime brief、per-turn prompt、skills、env 和 server-side guard 里。

Daemon runTask pipeline Claim response agent + skills workspace/project TaskContextForEnv normalize fields agent / issue / project Prepare / Reuse workdir prior work_dir Inject Runtime Brief AGENTS/CLAUDE/GEMINI skills + resources BuildPrompt assignment/comment chat/autopilot quick-create Env + ExecOptions MULTICA_TOKEN workspace/agent/task model/mcp/thinking Provider CLI claude / codex opencode / cursor executeAndDrain Complete / Fail session_id work_dir usage + events Guards workspace isolation comment parent_id blocked env keys no_action comment ban The agent sees two prompt surfaces: runtime brief on disk or inline system prompt, plus the per-turn user prompt from BuildPrompt. The durable execution memory is saved after completion/failure as session_id and work_dir; future claim can reuse them.

提示词约束从哪里来

A

Runtime brief

AGENTS.md / CLAUDE.md / GEMINI.md 写入 agent identity、workspace context、可用命令、workflow、metadata 规则、mentions 规则和输出规则。

B

Per-turn prompt

BuildPrompt 根据 assignment、comment、quick-create、chat、autopilot 切模板。新评论会直接嵌入 trigger comment 并要求先读 thread。

C

Skills

Agent 绑定的 skills 写入 provider-native 目录。它们是团队知识和专门流程,不一定塞进主 prompt。

D

Server guard

server 还会在 API 层强制某些规则,例如 comment-triggered task 回复同一 issue 时 parent_id 必须等于 trigger comment id。

检索上下文会用哪些工具

multica issue get <id> --output json读取 issue 标题、描述、状态、assignee、附件等主上下文。
multica issue metadata list <id> --output json读取 agent 钉住的高信号 KV,如 PR、deploy、blocker。
multica issue comment list ...assignment 读全历史;comment task 先 --thread <comment-id> --tail 30,再按需 --recent 和 cursor 翻页。
multica repo checkout <url> [--ref]按 project/workspace repo 指针 checkout 代码,不在 prompt 里直接塞 repo 内容。
multica attachment download <id>读取 issue、comment、chat 附件,避免直接访问短 TTL URL。
multica workspace member list / agent list / squad listquick-create 解析用户提到的 assignee 时使用。
multica autopilot get <id> --output jsonrun-only autopilot 需要完整配置时使用。
multica issue subscriber list <id> --output json需要确认谁在关注 issue 时使用;默认 workflow 不强制读取。

Context 存储位置速查

Context 类型 持久化位置 进入 agent 的方式
Issue 主体、状态、assignee、project issue rows prompt 只给 issue id,agent 用 multica issue get 拉取完整内容。
评论历史和触发评论 comment rows;触发评论 id 存在 agent_task_queue.trigger_comment_id 触发评论内容会在 claim/prompt 中直注入;历史由 multica issue comment list 分页读取。
任务队列事实 agent_task_queueagent_idruntime_idissue_idcontext JSONB、session_idwork_dir claim response 转成 daemon 的 Task,再生成 prompt、env 和 workdir。
Workspace 背景 workspace.context claim 时加载,写进 runtime brief 的 ## Workspace Context
Project resources project_resource rows brief 里给摘要,同时写入 .multica/project/resources.json;repo 资源用 multica repo checkout 打开。
Agent skills agent_skill / skill_file daemon 写入 .claude/skillsCODEX_HOME.opencode/skills 等 provider-native 目录。
执行现场 本地 workdir;完成或失败后把 session_idwork_dir 回写 task row 未来同一 agent/issue 的任务可以复用 workdir,部分任务可 resume provider session。
订阅关系和通知 issue_subscriberinbox_item subscriber 关系驱动 inbox;前端通过 subscriber:added / subscriber:removed 失效缓存后重新读取。
6

Context 分层表

Context layers: from stable background to live retrieval Workspace Context + Requesting User + Agent Identity Task Entry: issue id / trigger comment / chat message / autopilot payload Pointers: project resources / repos / attachments / skills Live Retrieval: issue get / comment list / metadata list / repo checkout 越往下越具体、越按需;上层稳定背景进 brief,下层大内容由 CLI 拉取。
来源 注入方式 设计意图
Workspace Context workspace.context claim response → brief 中 ## Workspace Context 所有 agent、所有 task kind 都能看到同一份 workspace 级系统背景。
Requesting User runtime owner 的 profile description brief 中 ## Requesting User,用户描述用 blockquote 包起来 让 agent 知道“替谁工作”,但明确低于实际任务指令。
Agent Identity agent name / id / instructions brief 中 ## Agent Identity persona、职责、skill 使用习惯等稳定行为。
Task Entry issue id / chat message / quick-create prompt / autopilot payload per-turn prompt + .agent_context/issue_context.md 告诉 agent 本轮为什么被唤醒,以及第一步该跑什么命令。
Trigger Comment 触发本轮的 comment row 直接嵌入 comment-triggered prompt 防止复用 workdir 时 agent 被旧输出带偏,先盯住这条新评论。
Comment History issue comments agent 运行中用 multica issue comment list 分页读取 长 issue 不一次性塞满,按 thread / recent / cursor 渐进恢复。
Project Resources project_resource table brief 中摘要 + .multica/project/resources.json 项目级 repo / 资源只作为指针,任务相关时再打开。
Skills agent_skill + skill_file 写入 Claude/Codex/OpenCode 等 provider-native skill 目录 复用团队能力,不把所有技能正文都塞进 prompt 主体。
Execution Memory prior session_id + work_dir daemon 复用 workdir;部分任务 resume CLI session 把 repo checkout、临时文件、模型对话连续性留在本地执行现场。
Issue Metadata issue metadata KV brief 要求 entry read / exit write 只钉高信号事实,如 pr_urldeploy_urlwaiting_on,避免评论考古。
7

Prompt 不是一份,而是按任务形态切换

Multica 的 BuildPrompt 会按 task kind 走不同模板。共同点是:prompt 很短,主要告诉 agent 入口、优先读取方式和回复规则。

BuildPrompt router Task shape chat / trigger comment / autopilot / quick-create / assignment Assignment issue get metadata + full comments status + final comment Comment embed new comment read trigger thread first reply with parent id Chat latest user message attachment ids direct response Autopilot run id + payload description as task no issue by default Quick-create single issue create no issue get/comment no retry runtime brief 是共用底座;per-turn prompt 只负责当前入口和当前约束。
assignment

新分配 issue

You are running as a local coding agent...
Your assigned issue ID is: ...
Start by running `multica issue get ... --output json`
For comment history, follow the runtime workflow file...

assignment 任务会强制读 issue、metadata、完整评论历史,然后更新状态、工作、评论汇报。

comment

新评论触发

[NEW COMMENT] A user just left a new comment.
Focus on THIS comment...
Read triggering thread first:
multica issue comment list ... --thread ... --tail 30

新评论内容直接进 prompt;历史读取先 thread 后 cross-thread,避免长 issue 噪声。

quick create

自然语言创建 issue

There is NO existing issue.
Create a well-formed issue with a single
`multica issue create` command.

这里 agent 是“issue 整理器”,把用户一句话变成 title/description/assignee/project,不允许读不存在的 issue。

chat / autopilot

对话或自动化运行

Chat: user message + attachment IDs
Autopilot: run id + title + trigger payload
No assigned issue for run-only autopilot.

chat 使用最新用户消息和附件 ID;autopilot 使用 trigger payload 和 autopilot description,不默认读 issue。

8

本地 workdir 才是 context 的载体

Daemon 准备的目录不只是临时 cwd。它把 platform context、skills、project resources、provider config 都写进去,让不同 CLI 用自己原生的方式发现。

Workdir as the local context carrier task root workdir/ AGENTS.md / CLAUDE.md .agent_context/ issue_context.md skills fallback .multica/project/ resources.json checked-out repos Provider Native Discovery Claude .claude/skills Codex CODEX_HOME / OpenCode / Cursor Durable Execution State build cache / repo state / generated files saved as work_dir on task completion Next Task on Same Issue reuse workdir sometimes resume session fresh trigger comment still wins local continuity without dumping history 这就是 Multica 的“长期上下文”:平台 DB 给事实,本地目录保存执行现场。
{workspacesRoot}/{workspaceID}/{taskShort}/
├── workdir/
│   ├── CLAUDE.md | AGENTS.md | GEMINI.md
│   ├── .agent_context/
│   │   ├── issue_context.md
│   │   └── skills/.../SKILL.md          # fallback / partial providers
│   ├── .multica/project/resources.json  # project resources, when present
│   ├── .claude/skills/.../SKILL.md      # Claude
│   ├── .opencode/skills/.../SKILL.md    # OpenCode
│   ├── .cursor/skills/.../SKILL.md      # Cursor
│   └── checked-out repos via `multica repo checkout`
├── output/
├── logs/
└── codex-home/                          # Codex provider only

为什么要复用 workdir

同一 issue 的后续任务可以继承已经 checkout 的 repo、生成的文件、构建缓存和局部调查结果。它比每次从零拉 repo 更像真实工程师的工作台。

为什么不总是 resume session

comment-triggered follow-up 会跳过旧 session resume,只复用 workdir。原因是旧 session 的最后一句可能是“Done”,会污染对新评论的理解。

9

和 Slock 的核心差异

Different context centers Slock channel / thread / IM message daemon wake + message protocol system prompt + slock CLI reply rules 中心问题:这一条消息应该唤醒谁、怎么回 thread Multica issue / task queue / runtime workdir + session reuse CLI retrieval + status/comment workflow 中心问题:这个 issue 怎样变成可恢复的工程任务 from chat coordination to task execution 两者都需要 context,但 Slock 围绕消息现场,Multica 围绕 issue 执行现场。
Slock 侧重点

消息协作控制面

Slock 更像 Slack 风格的人-AI 协作入口。Context 主要围绕 channel/thread/message、daemon wake、system prompt、slock CLI 通信规则来恢复。

典型问题:收到 IM 消息后,agent 怎么知道该读哪个 thread、怎么避免多 agent 抢答、怎么回到同一上下文。

Multica 侧重点

Issue / runtime / workdir 执行面

Multica 更像 agent-native issue tracker。Context 以 issue/task/project/workdir/session 为主,消息只是触发和汇报的 timeline。

典型问题:一个 issue 分给哪个 agent、在哪个 runtime 执行、如何复用工作目录、如何按需拉 repo 和评论历史。

10

这套 context 设计的收益和风险

Tradeoff map Scalable only pointers in prompt paged comments repo fetched on demand Recoverable workdir reuse session_id pointer local build state Risks agent may skip retrieval local state can go stale workspace context is high-trust 缓解手段:prompt 强制读取、trigger comment 直注入、metadata 高门槛、server-side guard。

收益

scalable

长 issue 不会每次把全量 comment dump 进 prompt;project resources 也只是指针,只有相关时才 checkout / fetch。

recoverable

Workdir 和 session_id 能让 agent 在后续任务里恢复执行现场,尤其适合代码修改和长调查。

provider-neutral

Claude、Codex、OpenCode、Cursor、Gemini 等通过不同文件名和 skills 目录接入,但 platform brief 的语义是一致的。

风险

retrieval discipline

设计依赖 agent 真的按 brief 去读 issue/comment/metadata。漏读时,context 并不会自动出现在模型窗口里。

stale local state

复用 workdir 是优势,也可能保留过期文件、旧分支、旧调查结果。Multica 用 trigger comment 直注入和 metadata 规则缓解,但不能完全消除。

workspace trust

workspace.context 被当作 workspace owner/admin 设定的高权限共享背景,直接进入 brief。用户 profile description 则用 blockquote 包起来并降低优先级。

11

证据路径

下面这些路径是本页结论的主要依据。源码快照来自 GitHub multica-ai/multica main 分支,commit fd0fe1d,抓取时间为 2026-05-24。

Evidence map Issue / Comment handler/issue.go handler/comment.go Task / Daemon service/task.go handler/daemon.go Prompt / Workdir daemon/prompt.go execenv/*.go Realtime events.go use-realtime-sync.ts subscriber listeners auto subscribe before notifications notification listeners subscriber table drives inbox 本页每条流程都对应到源码路径,避免把推断写成事实。
README.md
确认 Multica 的定位、runtime/daemon/agent 概念和支持的 coding CLI。
server/internal/service/task.go
确认 issue task 入队时不保存完整 context snapshot,task queued/dispatch/running/completed/failed 事件,以及 quick-create requester 订阅逻辑。
server/internal/handler/issue.go
确认 issue 创建、更新、assignee/status 变化如何触发 enqueue、cancel 和 issue:created / issue:updated
server/internal/handler/comment.go
确认 member comment、trigger comment、@mention、thread reply guard 和 comment-triggered task 入队条件。
server/internal/handler/subscriber.go
确认手动 subscribe/unsubscribe API、actor resolution、subscriber:added / subscriber:removed 广播。
server/internal/handler/daemon.go
确认 claim response 如何补齐 workspace、agent、skills、project resources、trigger comment、prior session/workdir。
server/internal/daemon/prompt.go
确认不同 task kind 的 per-turn prompt 模板。
server/internal/daemon/execenv/context.go
确认 .agent_context/issue_context.md、skills、.multica/project/resources.json 的写入方式。
server/internal/daemon/execenv/runtime_config.go
确认 CLAUDE.md / AGENTS.md / GEMINI.md 注入内容、workspace context、requesting user、workflow、issue metadata 规则。
server/cmd/server/subscriber_listeners.go
确认 creator、assignee、mention、commenter 的自动订阅逻辑,以及 subscriber listener 先于 notification listener 注册。
server/cmd/server/notification_listeners.go
确认 subscriber 表如何驱动 inbox 通知,member subscriber 才收到 inbox,actor/muted/excluded 会跳过。
packages/core/realtime/use-realtime-sync.ts
确认前端收到 subscriber:added / subscriber:removed 后 invalidates issueKeys.subscribers(issue_id)
server/pkg/protocol/events.go
确认 issue、comment、task、subscriber、daemon 等 websocket/event bus 事件名。
server/pkg/db/queries/comment.sql
确认 comment history 的 thread / recent / cursor 分页模型。
server/pkg/db/queries/project_resource.sql
确认 project resources 作为 project-scoped context 的存取模型。