这么做缓解了我的token焦虑

Xiao Qiang Lv4

上一篇文章,我提到了如何减少人在vibe coding过程中的干预。通过给coding agent设置给种限制,把软件工程中的敏捷实践搬到了skill中,确实能够增加代码的健壮性和正确性。同时也能够将很多的内容都沉淀下来,将claude code干的每一步都沉淀成文档,这样不仅人能够很快的回忆起来我做了什么,claude code在每一次执行的过程中就算断了也没有问题,不用重新给他上下文,因为他本身就有短期记忆,然后把当前的plan再给他就有可以继续恢复工作了。这样的工作模式下,确实让我工作效率提升了不少,先不说一些什么量化的数据,就是把一些重复的prompt蒸馏成了对应的skill,不用重新输入。哈哈哈这个就是说笑了,其实最大的提升是我对于整体需求理解又回到传统的软件开发模式,只是把纯搬砖的活扔给了code agent。
这样的爽感是一时的,这个月开头的一件事就让我感到了头皮发麻。头一天我就烧了170+刀的token,差不多整体容量的10%了。然后这个迭代都一个礼拜,我就用了300多刀了。这还是在我用了各种节约token的手段下,比如装了claude code mem,让我们记忆可以跨session。装了ponytail,让code agent不会写又长又臭的代码。然后还装了rtk,会将一些又长又臭的bash命令压缩以此来节约token。貌似这样还不够,token还是烧的比较多。后来我就在想,能不能让claude code干自己最擅长的工作,分析业务,写plan,最后执行就扔给其他的coding agent。我们不是还买了copilot,然后看了看支持的模型还能支持到opus4.7,这不正好,让搬砖的工作给到copilot,单纯的去执行就好了。通过翻阅手册,copilot是支持通过cli来发起调用的。
当然之前的workflow,我做了一些分工,analyze-requirements,refine-ticket这些需要分析代码,这些需要深度分析的工作还是由claude来完成。在implement这一步中会明确分工,那既然分工了,肯定就会出现主从,claude是主,copilot是从。需要解决的问题现在就明确了,主从之间的通信问题,写交接文档,一下就是claude code写给copilot要做的事情。如果不想让copilot乱干活,就需要把规则列清楚,列明确。形象的比喻,claude就相当于是一个TL,copilot就是一个搬砖的junior dev。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# <TICKET> 执行交接单

## 分支
<feature/TICKET-slug>(已创建,base=<base-branch>

## 方案来源
- [ ] Obsidian Implement Details(已定稿): <文件路径 # 章节锚点>
- [ ] 无已定稿方案,按 Jira 描述执行

## 要改的文件(按建议顺序)
1. <file:line改动说明>
2.

## AC(验收标准,逐条对应测试)
- [ ] AC1 — <预期测试名或断言>
- [ ] AC2 — …

## 明确排除(本次不做)
- <例如:迁移文件单独 PR>

## 约束(必须遵守,不可绕过)
- TDD:先写失败测试再写实现
- 新代码只能进 app/,不能碰 expenses/、onboarding/、GraphQL
- 不得手工改 migration 文件,只能 makemigrations
- commit 按小步拆分、不带 AI 署名
- 绝不 git push、绝不开 PR、绝不改 Jira 状态

具体claude与copilot之间的通讯的时序图如下。再次过程中,我会让copilot在调用的过程中retry三次,如果三次还没有改好,claude就会去接手来完成剩下的工作。如果copilot能够正常的完成工作,同样会写一份result,然后claude就会通过这份result来检查结果,完成每次的code review。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
sequenceDiagram
autonumber
actor User as 用户
participant Claude as Claude<br/>(Orchestrator)
participant Jira as Atlassian MCP
participant Obsidian as Obsidian<br/>(Implement Details)
participant FS as .agent-handoff/
participant Copilot as Copilot CLI<br/>(claude-opus-4.7)
participant Repo as Git 仓库 / 测试 / Postman

User->>Claude: /implement <TICKET> [base-branch]

rect rgb(235, 245, 255)
note over Claude: Step 1-3 由 Claude 执行
Claude->>Jira: getJiraIssue(TICKET)
Jira-->>Claude: summary / AC / description
Claude->>Obsidian: grep 找 Epic md 里的<br/>Implement Details(已定稿)
Obsidian-->>Claude: 已定稿方案(或缺失)
Claude->>Repo: fetch + 切 feature/<TICKET>-<slug>
Claude->>User: 展示 Plan + AC checklist + 排除项
User-->>Claude: 确认 / 澄清(最后一次问答窗口)
end

rect rgb(240, 255, 240)
note over Claude,FS: Step 3b 写交接单
Claude->>FS: 写 <TICKET>-plan.md<br/>(方案来源 / 要改的文件 / AC / 排除项 / 约束)
end

rect rgb(255, 250, 235)
note over Claude,Copilot: Step 3c 拉起 Copilot(同步阻塞)
Claude->>Copilot: copilot -p "执行 Step 4-7"<br/>--model claude-opus-4.7<br/>--deny-tool git push / gh / rm -rf / reset ...
activate Copilot

note over Copilot,Repo: Step 4-7 由 Copilot 执行
Copilot->>FS: 读 <TICKET>-plan.md
Copilot->>Repo: TDD red → green → refactor<br/>(用 .agent-handoff/run.sh 跑 --keepdb 单测)
Copilot->>Repo: make lint / pre-commit
Copilot->>Repo: 小步 git commit(无 AI 署名)
Copilot->>Repo: postman-request skill 同步 API<br/>(如有 schema 变更)
Copilot->>FS: 写 <TICKET>-result.md<br/>(Commits / AC / lint&test / 问题)
Copilot-->>Claude: 退出码
deactivate Copilot
end

alt 退出码 = 0 且无「遇到的问题」
note over Claude: 继续 Step 7b
else 超时被截断(大部分改动已在 working tree)
Claude->>Repo: git status / log / grep 估断点
Claude->>Copilot: 续跑 prompt(最多 2 次)<br/>「接着 plan.md 继续,不要重做已完成部分」
Copilot-->>Claude: 退出码
else 硬失败(方案不对 / 环境坏 / result 有问题)
Claude->>User: 停下报错,问 (a) 补交接单重跑 (b) 转手动
end

rect rgb(255, 235, 245)
note over Claude,Repo: Step 7b 独立复核(Claude 亲自做,不采信 result.md)
Claude->>Repo: Tier 0 硬约束<br/>(无 push / 无 PR / 无 AI trailer)
Claude->>Repo: Tier 1 git diff --stat 对齐交接单范围
Claude->>Repo: Tier 2 重跑 --keepdb 单测 + lint
Claude->>Repo: Tier 3 抽查 AC 测试断言 / 高危文件
end

rect rgb(245, 235, 255)
note over Claude,User: Step 8 汇报
Claude->>FS: 读 <TICKET>-result.md
Claude->>User: 汇报 Commits / AC / lint&test / Postman<br/>+ 独立复核:通过 / 打回(原因)
end

note over Claude,Repo: 永不 git push / 永不开 PR / 永不改 Jira 状态

最后演进成了一种Multi-agent的模式【简称MA】,claude为主要agent,其他agent作为协作的一种工作模式。每个agent都有各司其职,虽然claude很全能各方面也很强,但是有一个问题,还是贵。为了合理利用token,减少token的浪费,可以将一些边界特别明确的工作交给一些其他的agent,例如copilot kiro等。不过上述的这个MA的稳定性还需要经过一些继续的调试,主要是围绕

  • 如何让他能够运行的更加稳定
  • 如何让能够让这些执行的agent不会调入loop旋涡
    不过,即便还有这么些遗留问题,token的焦虑目前已经大大降低了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
flowchart LR
U["用户提供 Jira/Confluence 链接"] --> AR["analyze-requirement (Claude)"]
AR --> OB1["Obsidian: 需求分析 md"]
OB1 --> RTP["refine-ticket-plan (Claude, 交互讨论定方案)"]
RTP --> OB2["Obsidian: Implement Details(已定稿)"]

OB2 --> IMP1["implement Step1-3 (Claude): 取ticket/读方案/出计划/建分支"]
IMP1 --> HANDOFF1["写交接单 .agent-handoff/TICKET-plan.md (Claude)"]
HANDOFF1 --> COP1["调用 Copilot CLI 执行 (Claude 触发)"]

subgraph COPILOT_IMPL ["Copilot 自动执行 Step4-7"]
C1["TDD: 先写失败测试再写实现"] --> C2["lint + 单元测试"]
C2 --> C3["分小步 commit"]
C3 --> C4["postman-request: 同步 API 到 Postman"]
end

COP1 --> COPILOT_IMPL
COPILOT_IMPL --> RESULT1["写结果 .agent-handoff/TICKET-result.md (Copilot)"]
RESULT1 --> REVIEW["Step7b 独立复核 (Claude): git核验/diff范围/重跑测试/抽查代码"]
REVIEW -->|"复核通过"| REPORT1["Step8 汇报给用户 (Claude)"]
REVIEW -->|"发现问题"| ESCALATE1["打回用户处理,不自行放行"]

REPORT1 --> UITEST1["juno-ui-test Step1-3 (Claude): 拉Jira上下文+生成测试用例"]
UITEST1 --> OB3["Obsidian: 测试用例 md"]
OB3 --> MODE{"RUN_MODE"}
MODE -->|"plan"| PLANOUT["输出用例文件+执行提示 (Claude)"]
MODE -->|"execute"| COP2["调用 Copilot CLI 驱动浏览器 (Claude 触发)"]

subgraph COPILOT_UI ["Copilot 自动执行浏览器测试"]
B1["登录 juno-scale (密码经环境变量传入)"] --> B2["按优先级执行用例"]
B2 --> B3["截图并写测试报告"]
end

COP2 --> COPILOT_UI
COPILOT_UI --> RESULT2["写结果 .agent-handoff/PREFIX-result.md (Copilot)"]
RESULT2 --> SUMMARY["Claude 读取结果汇总给用户"]

classDef claude fill:#DCE8FA,stroke:#3B6EA5,color:#1a1a1a;
classDef copilot fill:#E4F5E1,stroke:#4C9A5B,color:#1a1a1a;
classDef obsidian fill:#F3E9D2,stroke:#B8935B,color:#1a1a1a;
classDef decision fill:#FBE7E4,stroke:#C0645A,color:#1a1a1a;

class AR,RTP,IMP1,HANDOFF1,COP1,REVIEW,REPORT1,UITEST1,PLANOUT,COP2,SUMMARY claude;
class COPILOT_IMPL,C1,C2,C3,C4,RESULT1,COPILOT_UI,B1,B2,B3,RESULT2 copilot;
class OB1,OB2,OB3 obsidian;
class MODE,ESCALATE1 decision;
  • Title: 这么做缓解了我的token焦虑
  • Author: Xiao Qiang
  • Created at : 2026-07-25 19:08:38
  • Updated at : 2026-07-25 19:08:38
  • Link: http://fdslk.github.io/LLM/agent/vibe-coding/2026/07/25/multi-agent/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
这么做缓解了我的token焦虑