Mingyu's Library主页

带实测的编排调研 · 2026-07-27

多 Session 还是多 Agent?
我跑了 27 个 agent 来回答这个问题

这不是一篇对比综述。我在真实环境里跑了两组实验:6 个探针测出 subagent 的隔离边界到底在哪, 13 个 agent 用三种编排方式各造了一遍同一个游戏,然后用无头浏览器逐个验证能不能跑。 结论和直觉不太一样——决定成败的既不是 session 也不是 agent。

27实际跑掉的 agent
1.18Msubagent tokens
3对照臂 / 同一份 spec
2/5无契约并行的白屏率
2实测真实并发上限

TL;DR先看结论

一句话

多 agent 解决的是「一次任务内部的宽度」,多 session 解决的是「跨时间的长度 + 人的并行 + 上下文总量」——它们是两个正交的轴,不是替代关系。 而真正决定并行开发成败的,是有没有一份人人遵守的接口契约,不是你用了哪种编排。

  1. 并行本身不产生质量,契约才产生质量。 同样是 5 个 agent 并行写 5 个模块:有契约的那组 6 个文件零接口错误、一次组装成功;没契约的那组 5 套组装方案里 2 个直接白屏,报的是模块加载期的 SyntaxError,不是能慢慢调的运行时 bug。
  2. 没有契约时,agent 会把大量算力花在「猜队友接口」上。 无契约组里最慢的那个 agent 跑了 831 秒、10.4 万 token——它自己造了一套假队友模块和 18 条断言来验证自己的猜测。同组最快的只用了 169 秒。
  3. 命名分歧不是均匀分布的,它集中在语义最复杂的那个接口上。 5 个互不通信的开发者,具名 import 的命中率高达 24/26(92%)——但唯独 physics 的核心步进函数,三个人给了三个名字(stepPlayer / updatePhysics / stepPhysics),而它恰恰是全场最关键的调用。
  4. subagent 拿不到你的对话历史、用户记忆和偏好设置。 实测确认:它只拿到系统提示、任务消息、CLAUDE.md、git status、环境信息和工具/skill 清单。你以为它「知道」的背景,它全不知道。
  5. subagent 无法向你提问。 实测它的工具清单里没有 AskUserQuestion,没有 SendUserMessage。它能单向推文件和通知给你,但不能问一句「这个手感对吗」然后等你回答。对游戏开发这是硬伤。
  6. worktree 隔离不消除冲突,只是把冲突延后。 两个 worktree 各自干干净净地改了同一行,运行期零干扰——合并那一刻立刻 CONFLICT (content)
  7. 「并行」的收益受宿主并发度硬约束。 这个云沙箱只有 2 核,实测 8 个「并行」agent 是 2 个一批、跑了 4 批。写 workflow 时以为的扇出,在这里是排队。

Part 1机制:其实有四种,不是两种

「多 session vs 多 agent」这个问法本身把选项压扁了。翻官方文档会发现现在是四种并行方式,它们在谁协调、worker 之间能不能说话、文件怎么隔离这三个维度上各不相同。

SUBAGENTS 单 session 内扇出 主 session sub 1 sub 2 sub 3 ↑ 只回传结论,互不通信 共享同一份文件系统 AGENT TEAMS 多 session + 互相通信(实验特性) lead mate 1 mate 2 mate 3 ↑ 互发消息 + 共享 task list 不自动隔离,需人工分文件 BACKGROUND / AGENT VIEW 后台独立 session agent view 面板 session session session ↑ 只向你汇报,彼此不通信 每个自动分配独立 worktree 手动多 SESSION 你自己开几个窗口 你(唯一的连线) session session session ↑ 完全互不知情 要么共享磁盘,要么自建 worktree
四种并行方式的结构差异。真正的分野在最后一行:文件怎么隔离。
维度SubagentsAgent teamsBackground / agent view手动多 session
谁协调主 agentlead agent你(面板里看状态)你(全人工)
worker 之间能否通信不能,只回传结论能,直接互发消息不能不能
能否被你直接对话不能(只能通过主 agent)能,可点进任一 teammate能,可 attach
上下文独立,结论汇总回主会话独立,完全不继承 lead 历史完全独立完全独立
文件隔离可选 worktree不自动隔离,须人工分文件自动分配 worktree要么共享磁盘,要么自建
token 成本较低(只回摘要)高(每人一个完整实例)高(各自独立算配额)最高(背景要重复灌)
生命周期任务内,可 resume随 lead session可持久,闲置 1h 停进程可跨天,可 --resume

对 Cowork 用户的现实说明

上面四种里,agent teams 和 background agents 是 Claude Code CLI 的能力(前者还是默认关闭的实验特性,要设 CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1)。 在桌面 app 的 Cowork 里,你手上实际有的是:subagent 扇出dynamic workflow(脚本化的大规模 subagent 编排),以及多开 Cowork 任务——这就是本文说的「多 session」。 另外一条官方事实值得记住:桌面 app 里每个新 session 会自动分到自己的 worktree,所以桌面多 session 并不像终端里那样天然共享磁盘。

Part 2探针实测:隔离边界到底在哪

网上关于 subagent「有独立 context」的说法很多,但「独立」到什么程度没人说清。我起了 6 组探针 agent 直接去问、去做,结果如下。标记为实测的都是这次跑出来的

探针 1 · 并行 subagent 共享文件系统,且实时可见 实测

两个 agent 同时启动,各写一个文件,各 sleep 30 秒后列目录。两边都看到了对方的文件,时间窗口确认重叠(A: 1785147960382→1785148004867,B: 1785147960821→1785148006985)。

这意味着

同一个 session 里并行的 subagent 没有任何文件级隔离。两个 agent 同时写同一个文件就是互相覆盖。要隔离必须显式开 worktree。

探针 2 · subagent 继承了什么,没继承什么 实测

我让一个 agent 在不使用任何工具的前提下,如实报告它启动时收到的全部上下文。

主会话里有的 对话历史(全部往返) 用户记忆 / memory 文件内容 用户偏好 preferences 已经读过的文件内容 已经调用过的 skill 状态 output style / 输出风格 之前所有工具调用的结果 你上传的附件 auto memory 一堵墙 全部不过去 subagent 实际拿到的 它自己的系统提示(不是主会话的) 主 agent 手写的那条任务消息 CLAUDE.md 层级(全部层级) git status 快照 环境信息:cwd / 平台 / 模型 工具清单(只有名字,没有内容) 已安装 skill 的名称与描述 预载 skill 的正文(如指定) 同伴名册(若开了 SendMessage)
实测的上下文继承边界。左边那一整列,subagent 一个字都看不到。

探针 agent 的原话很值得抄下来:

「我完全看不到主会话的任何对话历史——没有一条主会话的用户消息、没有助手回复、没有摘要、没有『前情提要』。我收到的唯一一条任务消息就是你现在问的这 4 个问题本身。」

「记忆工具存在 ≠ 我看得到记忆。」

它唯一能做的是从环境反推:看到工作目录叫 probe-repo、看到已装的 skill 偏向 iOS 游戏开发和中文 HTML 文档,于是猜「这个账号平时关心这些方向」。这是猜,不是知道。

直接后果

你在主会话里说过的每一句关键约束——「这个项目用 SpriteKit 不用 Unity」「颜色要跟上次那版一致」「别动那个文件」——都必须由主 agent 手动复述进 subagent 的 prompt。漏了就是重做。这是所有 fan-out 编排里最常见的返工来源。

可以固化的部分写进 CLAUDE.md:这是唯一会自动进到每个 subagent 上下文里的东西。

探针 3 · subagent 无法向你提问 实测

我让一个 agent 逐条核对自己的工具清单:

能力结果含义
AskUserQuestion没有不能提出选择题并等你回答
SendUserMessage没有不能直接发文字给你
SendUserFile / PushNotification能单向推文件和通知
SendMessage(给别的 agent)能给同伴 agent 发消息
再起 subagentworkflow 内没有官方默认允许嵌套 3 层,但 workflow 派生的 agent 拿不到 Agent 工具

对游戏开发的特殊杀伤力

subagent 与你之间是单向可达、双向不可达。它能把成品推给你看,但不能在半路问「这个跳跃手感偏重还是偏轻?」然后等你拍板。 游戏里大量决策——手感、色调、难度曲线——恰恰只有你能判断。这类决策必须留在 session 层,不能扔进 subagent。

探针 4 · worktree 隔离:运行期完美,合并期爆炸 实测

两个 agent 各建一个 worktree,各自把 config.js 里同一行的 SPEED = 100 改成不同的值并提交,中间 sleep 20 秒制造重叠。

运行期表现完美:主仓库工作区始终干净(SPEED 仍是 100),两条分支从同一 base 各自前进,没有任何 index.lock 争用或 git 报错。A 甚至在自己 sleep 期间观察到 B 的 worktree 凭空出现,但毫无影响。

然后我把两条分支合并:

$ git merge feat-a
Fast-forward

$ git merge feat-b
Auto-merging config.js
CONFLICT (content): Merge conflict in config.js
Automatic merge failed; fix conflicts and then commit the result.
运行期:零干扰 合并期:正面冲突 base worktree A → SPEED = 250 worktree B → SPEED = 700 CONFLICT (content) 同一行两个值,git 不敢替你选 互不可见 · 无 index.lock 争用 · 主仓库干净
worktree 解决的是「同时写」,不是「写了不一样的东西」。后者只能靠契约或人工裁决。

探针 5 · 真实并发度:说好的并行,其实在排队 实测

我起了 8 个 agent,每个只做一件事:打时间戳、sleep 15 秒、再打时间戳。结果时间戳呈现清晰的四批两两配对

批次agent起止(相对秒)
1#0, #10.0 → 19.8
2#2, #329.4 → 50.6
3#4, #558.6 → 79.6
4#6, #788.2 → 109.1

宿主 nproc = 2,实测最大并发就是 2。8 个 agent 跑完花了 109 秒,真并行的话应该是约 20 秒。另外每个 agent 在 15 秒的 sleep 之外还有约 5 秒的启动与模型开销。

别把这条当成通用结论

这是这台机器的数字。官方文档里 subagent 的默认并发上限是 20(CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS),单 session 累计上限 200,嵌套深度默认 3 层。 但 workflow 脚本另有自己的上限,而且实际能同时跑几个,最终取决于跑在什么机器上。你写 parallel([...16 个]) 不等于真有 16 个在跑。

Part 3三臂对照实验

探针回答了「机制是什么」,这一节回答「效果差多少」。

设计

同一份 SPEC.md(一个 640×360 的 canvas 平台跳跃小游戏,硬性拆成 physics / input / level / render / hud / main / index.html 七个文件),三种编排各做一遍:

Arm AArm BArm C
模拟的是单 agent 从头写到尾单 session 多 agent多 session 各自开工
编排1 个 agent 写全部 7 个文件1 个 agent 先写接口契约 → 5 个 agent 并行各写一个模块 → 1 个 agent 读契约组装 main5 个 agent 各在独立目录,只有 spec,没有契约,各写自己的模块 + 自己那版 main.js
能看到队友代码吗不适用不能,只能靠契约对齐不能,且明确禁止跨目录读
集成方式自带专职集成 agent人工合并:5 个模块 + 「第一个 PR 赢」的那版 main.js

变量说明(重要)

严格讲,B 和 C 之间被隔离的变量不是「session vs agent」,而是「有没有共享契约」。这是故意的:因为一个配了契约的多 session 工作流,行为上就等价于 Arm B。
换句话说,这个实验测的是并行开发真正的失败根因,而不是产品形态的差别。这也正是最有用的结论。

量化结果

指标Arm A 串行Arm B 契约并行Arm C 无契约并行
总 agent 工作时长885.6 s849.5 s1721.7 s(2.0×)
理想关键路径
(假设真并行)
885.6 s512.5 s(0.58×)831.4 s
本机实测墙钟
(并发上限=2)
885.6 s1012.7 s1174.0 s
subagent tokens109,822350,465(3.2×)295,101(2.7×)
产物代码行数1,0576571,628
跨模块接口错误00见下
重复实现的函数00drawGameOverisOnGround 各被两个模块重写
无头浏览器验证PASSPASS5 个组装方案里 2 个 FAIL
没人写的文件index.html 五个人都没写
0s 300s 600s 900s ARM A · 串行 单 agent 885.6s ARM B · 契约并行 契约 256.6s 5 模块(并行) 最慢 143.0s 集成 112.9s 关键路径 512.5s —— 比串行快 42% ARM C · 无契约并行 5 个独立开发者 全部并行,无契约 207s 308s 205s 831s ⚑ 169s
Arm C 里那根 831 秒的长条是全场最贵的一次,它做的事情全是「猜队友接口 + 验证猜测」。

Arm C 到底怎么崩的

5 个开发者各写了一版 main.js,我把 5 个模块凑齐后,逐个用它们组装并放进无头 Chromium:

用谁的 main.jsimport 写法结果失败原因
dev0(physics 作者)具名 import ×9PASS他自己就是 physics 作者,天然不会猜错
dev1(input 作者)命名空间 ×4 + 具名 ×2PASS靠候选名解析兜住了
dev2(level 作者)具名 import ×10FAILdoes not provide an export named 'updatePhysics'
dev3(render 作者)命名空间 ×5PASS写了参数顺序嗅探 + 属性别名,代价 831s
dev4(hud 作者)具名 import ×5FAILdoes not provide an export named 'stepPhysics'

失败的性质很关键

这两次失败不是「跑起来有 bug」,是 ES module 链接期的 SyntaxError——整个模块图加载失败,画面全黑,一行代码都没执行。 在真实项目里这对应的就是:几个 session 分头做完,合到一起,编译不过。而且它不会在任何一个 session 内部暴露,因为每个 session 里自己那部分都是好的。

命名收敛度:比想象中高,但错在了最要命的地方

把 5 个人的具名 import 和真实作者的导出做交叉比对:

具名 import 命中率:24 / 26 = 92%

命中的(大家不约而同):
  input.js  : createInput      ✓ 三个人都猜对
  level.js  : getPlatforms     ✓
  render.js : render           ✓
  hud.js    : drawHUD          ✓

没命中的(全部集中在同一个接口):
  physics.js 实际导出 : stepPlayer / stepBody
  dev2 猜的           : updatePhysics   ✗
  dev4 猜的           : stepPhysics     ✗

这条我事先没预料到

同一个模型、同一份 spec,命名收敛度高达 92%——Claude 们的命名品味出奇一致。 但分歧不是随机撒在各处的,它精确地集中在语义最复杂、命名自由度最大的那个接口上:物理步进函数。 而这恰恰是全场最核心的调用。

推论:靠「大家都是同一个模型,应该能对上」来省掉契约,是把项目押在了最不该押的地方。收敛度越高越危险,因为它会让你误以为不需要契约。

三个产物长什么样

三个 PASS 的版本我都截了图(无头 Chromium,跑 2.5 秒后按住右键 + 空格):

Arm A 截图
Arm A · 1,057 行星空、远山、圆角平台、带眼睛的角色、生命格子、操作提示
Arm B 截图
Arm B · 657 行严格按契约,一个像素的自由发挥都没有
Arm C 截图
Arm C · 1,628 行视觉最丰富,也最臃肿,5 个组装方案里 2 个白屏

一个没想到的代价

Arm B 的产物只有 657 行,比串行的 A 少了 38%,画面也最朴素。原因是契约把每个人的边界钉死了,谁也不会顺手加个星空。
契约买来一致性,卖掉的是发挥空间。做工具型模块这是优点,做「手感」和「美术」这可能是缺点——这也解释了为什么创意密集的部分不该丢进无脑并行。

为什么会这样

把 Arm C 那 5 个 agent 的自述读一遍,机制就很清楚了。没有契约时,一个理性的开发者会做三件事,每一件都在烧钱:

  1. 放弃具名 import,改用命名空间 + 候选名表。 dev3 的原话:「用命名导入的话,队友只要名字差一个字母,浏览器就是链接期 SyntaxError 直接白屏。」于是它给每个符号准备了一串候选名,逐个尝试。
  2. 给共享状态做属性别名对冲。 好几个 agent 用 Object.definePropertystate.vystate.player.vy 指向同一份存储,还顺手加了 w↔widthonGround↔grounded——纯粹因为不知道队友会用哪个名字。
  3. 自己造一套假队友来验证猜测。 dev3 在自己目录里建了个 .selftest,写了三套完全不同风格的假模块(一套故意跟自己的猜测对着干),跑了 18 条断言。这一步就是它比同组慢 4 倍的原因。

它甚至在报告里留了这么一句,很能说明问题:

「只兜『名字不一样』,兜不了『参数顺序不一样』(比如 step(state, platforms, dt)),那种只能靠沟通。」

——防御性编程能挡住命名分歧,挡不住语义分歧。而一份 250 秒就能写出来的契约,把这三件事全省了

Part 4七条结论

1 · 契约是并行的前置条件,不是可选项

Arm B 用 256.6 秒写契约,换来的是零接口错误、一次组装成功、代码量最小。Arm C 省掉了这 256.6 秒,代价是总工作时长翻倍、40% 的组装方案白屏、以及两个模块重复实现同一个函数。契约不是开销,是杠杆。

2 · 并行不省总工作量,只压缩关键路径

A 串行 885.6s,B 契约并行总工作量 849.5s——几乎相等。并行没有让活变少,它只是把 512.5 秒的关键路径压出来了(比串行快 42%)。所以:如果你不在乎墙钟时间,并行没有任何好处,还多烧 3 倍 token。

3 · 并行的收益上限由你的机器决定,不由你的脚本决定

本机 2 核,实测并发上限就是 2。Arm B 的理想关键路径是 512.5s,实测墙钟 1012.7s——并行度打了对折还多。写 workflow 前先看 nproc

4 · subagent 是「哑的」:不知道背景,不能提问

它拿不到对话历史、记忆、偏好;它不能问你问题。这两条合起来意味着:凡是需要「你说了算」的决策,都不能下放给 subagent。它只适合做那种「目标明确、判据客观、做完给结论」的活。

5 · worktree 管的是「同时写」,不管「写得不一样」

两个 worktree 并发写零冲突,合并立刻 CONFLICT。隔离手段解决的是物理冲突,语义冲突只能靠契约或人工裁决。

6 · 「同一个模型应该能对上」是危险的直觉

92% 的命名收敛度会让人产生这个错觉。但剩下 8% 精确落在最核心的接口上,而且失败方式是硬失败(白屏),不是软退化。

7 · 契约压制发挥,别拿它去管创意

Arm B 的产物最规整也最朴素。做基础设施这是好事;做「手感」「关卡节奏」「美术风格」这类需要发挥的部分,不该用同一套并行流水线去压。

回到最初的问题

多 session 和多 agent 不是二选一,它们解决不同的问题。

  • 多 agent:压缩一次任务的关键路径。前提是这次任务能被切成互不依赖的块,并且你能先写出契约。
  • 多 session:突破上下文总量、跨越时间、并行你自己的等待、隔离失败、清空成见。这些都是 subagent 结构上做不到的。

所以成熟的做法是两个都用:session 按「产出物 + 时间节奏」切开,每个 session 内部再用多 agent 扇出。

Part 5决策 SOP

决策树

这次要做的事,能切成互不依赖的块吗? 不能 留在主会话串行做并行只会多烧 3 倍 token 需要你中途做主观判断吗(手感/审美/取舍)? 需要 不需要 拆成多个 session,别下放给 subagent subagent 无法向你提问,只能单向汇报 这些块会改到同一批文件吗? 不会 先划文件所有权,一文件一主人 划不清就串行;或每个 agent 一个 worktree 记住:worktree 只推迟冲突,不消除 跨天吗 / 需要长期存在吗? 多 session 按「产出物 + 时间节奏」切,不按模块切 每个 session 一个 CLAUDE.md 承载共识 单 session 多 agent 3–5 个是甜点区 超过 8 个协调开销吃掉收益 ⚑ 无论走到哪个叶子:并行开工前,先写契约 实测:250 秒的契约,换掉 40% 的白屏率和一倍的总工作量
四个问题就能定下编排方式。最后那条横杠是无条件的。

并行开工前 checklist

下面这份直接照着走。前四条是硬门槛,缺一条就不要开并行。

硬门槛

  • 契约已写好并落盘。 精确到:共享状态的每一个字段名 + 类型 + 默认值 + 谁有权写;每个模块的导出函数名 + 参数顺序 + 参数类型 + 返回值;调用顺序。含糊的契约等于没契约。
  • 文件所有权已划清。 一个文件只有一个主人。划不清的那部分,留在串行里做。
  • 「没人认领的活」已经点名。 Arm C 里 index.html 五个人都没写——不在任何人职责里的东西,就是没人做。清单化,指派到人。
  • 验证方式已经能自动跑。 并行的产物必须有一个客观判据(能编译 / 测试通过 / 能启动无报错)。没有自动判据,你会淹死在人工 review 里。

写 prompt 时

  • 把主会话里说过的关键约束手动复述进每个 agent 的 prompt——它们看不到你们的对话。
  • 能固化的规则写进 CLAUDE.md:这是唯一自动进到每个 subagent 上下文的东西。
  • 明确写「你不负责什么」,不只写「你负责什么」。drawGameOver 被两个模块各写一遍,就是因为没人被告知这不归自己。
  • 禁止 agent 越界读别人的目录——否则你测的不是并行,是伪装成并行的串行。

规模与成本

  • 先看 nproc。并发上限约等于机器能给的核数,不是你脚本里写的数字。
  • 3–5 个 worker 是甜点区(官方建议与本次观察一致);超过 8 个,协调开销开始吃掉并行收益。
  • 预算:并行大约 3 倍 token(本次 A→B 是 3.2×)。官方公开数据是多 agent 相对聊天约 15×、单 agent 约 4×。
  • 如果只是想省自己的时间而不是墙钟,别并行。

合并时

  • worktree 分支合并前,先跑一次自动验证,别等冲突解完才发现接口对不上。
  • 接口不一致时,改调用方还是改被调方,按契约裁决,不要「谁先合谁赢」。
  • 合并后重跑一次全量验证——两个模块单独都对,合起来不一定对。

session 该怎么切

切分原则:按「产出物 + 时间节奏」切,不按「代码模块」切

代码模块之间有接口依赖,切开就要付契约税;产出物之间没有。

session产出物节奏会不会撞代码
开发主线代码每天唯一有写码权的
素材线图片 / 音效批量、间歇不碰代码
调研线文档 / 竞品 / ASO周期性不碰代码
监控线报表 / 告警定时任务只读

Part 6iOS / SpriteKit 专章

前面的通用结论在 Xcode 项目上有一个额外的放大器:project.pbxproj

为什么 iOS 项目对并行格外不友好

.pbxproj 是一个单体 plist,每次增删或移动文件,文件引用和组引用都会更新。两个 session 各加一个 Swift 文件,就是同一个文件的相邻区域各写一遍——git 的自动合并在这种结构上表现很差。而这正是并行开发最常发生的操作。

再叠加两条 iOS 特有的串行瓶颈

  • 真机 / 模拟器验证不能并行。 手感、动画流畅度、触控响应,只能一次跑一个、你自己看。这是硬串行段。
  • 构建是全局的。 多个 session 同时 xcodebuild 同一个工程会抢 DerivedData。

三档缓解方案,按投入排序

档位 1 · 不改工程结构(今天就能做)

  • 写码 session 保持唯一。 这是成本最低、收益最高的一条。其它 session 只做不碰 .pbxproj 的事:素材、调研、文案、数值表。
  • 如果一定要并行写码,约定「本轮谁都不新增文件」——只改已有文件的内容。改内容不动 .pbxproj,冲突风险掉一个数量级。
  • 新增文件集中在一个人手上,批量加完再分发。

档位 2 · 用 Xcode 16+ 的文件系统同步组

  • 右键 group → Convert to Folder,把手工维护的 group 换成跟文件系统同步的文件夹。此后新增文件不再写 .pbxproj
  • 转换前先让本地目录结构和 Xcode group 结构对齐,否则会一次性产生巨大 diff。

档位 3 · 工程文件生成化 / 模块化

  • XcodeGen 或 Tuist:用 YAML/Swift DSL 描述工程,源文件用 Sources/**/*.swift 通配符匹配,.pbxproj 变成生成物、不进版本库,冲突从根上消失。
  • 按域拆成本地 Swift Package:Gameplay / Rendering / Audio / UI 各一个包,每个包一个主人。代价是编译和索引变慢。

SpriteKit 游戏的 session 排布建议

session干什么为什么单独开内部要不要多 agent
开发主线唯一写 Xcode 工程的 session避免 .pbxproj 冲突;真机验证要你在场要——但只用于只读扇出:并行通读代码定位问题、多维度 review。写码保持串行。
素材线AI 生图、图集切分、音效产出是文件不是代码;节奏是批量的要——素材之间天然无依赖,最适合无脑并行
调研线竞品拆解、玩法调研、ASO 文案上下文完全不同,混进开发 session 会污染思路要——多角度并行搜集,最后综合
手感专线动画/缓动/衔接的诊断与调优需要你反复看真机、反复拍板,是最典型的「必须留在 session 层」的活诊断阶段可以并行通读;调参必须串行 + 你在回路里

与你现有工作流的接口

如果你已经在用 ios-app-blueprintgame-dev-kickoff 这条链:把接口契约做成 kickoff 产出物的一部分。 本次实验里那份 256 秒写出来的契约(共享状态字段表 + 各模块导出签名 + 调用顺序),在 iOS 项目里的等价物就是: 共享 GameState 的字段归属表 + 各 SKNode 子系统的公开 API 签名 + 每帧 update 的调用顺序。 把它写进 CLAUDE.md,它就会自动进到每一个 subagent 的上下文里——这是唯一不用手动复述的传递通道。

Part 7本次没验证的

把话说全,下面这些是这次没测到测得不干净的,结论不要外推:

  • 真正的多 session 没有被直接测量。 我在这个环境里开不了第二个 Cowork session。Arm C 是用「独立目录 + 禁止跨读 + 无共享契约」模拟的,它复现了多 session 的信息隔离,但没复现跨天、人在回路、上下文重新灌注这几维。
  • Arm C 的隔离是自报的。 5 个 agent 都声称没读别人目录,我没有逐条核对 transcript 去证伪。
  • 墙钟数据被并发上限污染。 本机 2 核,三臂之间还互相抢占。表里的「理想关键路径」是按各 agent 实测时长重算的模型值,不是实测墙钟。
  • n = 1。 每臂只跑了一次,没有重复实验,没有方差估计。831 秒那个离群值可能不可复现。
  • 任务规模偏小。 一个 600–1600 行的小游戏,跟一个真实的 iOS 游戏项目差着量级。契约的价值大概率随项目规模上升,但这次没测。
  • 没测长会话的上下文衰减。 多 session 最重要的收益之一——突破上下文总量——本次完全没有直接测量,只能引用外部研究(见来源)。
  • Agent teams / background agents 只读了文档,没实跑。 它们是 Claude Code CLI 的能力,不在本次环境里。

如果要把这份调研做实,下一步该测什么

  1. 把同一实验在多核机器上重跑 3 次,拿到方差,并让并发不再是瓶颈。
  2. 加一个 Arm D:无契约但允许 agent 之间互相通信(agent teams 模式),看「能沟通」能不能替代「有契约」。这是本次最想知道但没条件测的对照。
  3. 把任务规模放大到 5000+ 行,看契约的收益是线性还是超线性。
  4. 在真 Xcode 工程上重复 Arm B/C,量化 .pbxproj 的冲突率。

附录来源

实验产物(本次生成)

  • 探针 workflow:14 个 agent,419,907 tokens,369.7 秒
  • 三臂 workflow:13 个 agent,755,388 tokens,2266.2 秒
  • 验证工具:Playwright + Chromium 无头运行 7 次;ES module 导入导出静态交叉分析

官方文档

实践与研究