rustcodegraph 1.2.10

Local-first code intelligence graph and CLI for AI agents
Documentation
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
# 调用序列分析——为什么读取节省不能转换为挂钟

**日期:** 2026-05-23 · **分支:** `architectural-improvements` · **来源数据:** 尚存
来自 A/B 矩阵的 Stream-json 日志(`/tmp/ab-matrix/<Cell>/run-headless-{with,without}.jsonl`,
37 个细胞 × 2 个臂)。重新开采 — **不重新运行** — 使用 `rustcodegraph agent-eval seq-matrix`。

## 为什么存在这个

[A/B矩阵](rustcodegraph-ab-matrix.md) 显示 rustcodegraph 削减 **读数 75%** 但 **仅限挂钟
~16%**,63% 的胜利来自 3 个大型回购单元。阅读内容在地板上
(~0),所以剩余的挂钟是**往返 + 综合回合** - 两者都没有读取
计数可以解释。矩阵记录工具*计数*,而不是调用**序列**或每次调用
**有效负载大小**。该分析恢复了两者,以找出挂钟的实际位置。

## TL;DR — 瓶颈是跟踪采用,而不是跟踪完整性

1. **在 37 个单元格中的 3 个单元格中调用跟踪** — 尽管每个问题都是规范流问题
(“跟踪控制器→服务→存储库”,“X如何到达Y”)。代理占绝大多数
相反,达到 **`context → search → search → explore`** — 精确的路径重建
指令告诉它要避免的反模式。
2. **`explore` 平均每次调用 17.9K 字符; `trace` 平均为 0.8K** — **22× 有效负载差异**。
解决小型仓库膨胀问题的路径范围工具是存在的,而且很小。只是不是
被调用。
3. **小型存储库仍然会获得臃肿的有效负载**,因为探索默认:一个**6文件**存储库
(`flutter_module_books`) 拉**17.4K**; 10 个文件的存储库需要 18.0K。这正是
“小代码库上的上下文太多”故障模式——现在正在发生,通过探索。
4. **使用 rustcodegraph 时,往返次数减少了 25%(283 次与 375 次相比)**,但挂钟次数仅为 16%
更快——因为带臂的每个转动都携带约 18K 的探索有效载荷,膨胀 TTFT 和
侵蚀回合储蓄。
5. **根本原因:** `src/mcp/server_instructions.rs` 以*“直接回答... `context`
首先,然后 ONE `rustcodegraph_explore`"* 作为标题模式。跟踪优先的指导被埋葬
在一个表+它下面的链表中。特工锚定在显着的标题→上下文→探索。

**决定:**下一个实验是**跟踪优先转向/采用**,而不是丰富跟踪。我们
当使用 3/37 次时,无法评估跟踪的完整性。先采用,然后衡量
残差`node`/`explore`后续是否需要更丰富的迹线。

## 发现 1 — 跟踪采用情况:3/37

| 公制 | 价值 |
|---|---|
| 流动问题细胞 | 37(全部) |
| 称为 `trace` 的单元格 | **3**(`cpp-leveldb`、`excalidraw`、`c-redis`) |
| 代替主导模式 | `context` → `search`×N → `explore` |

3 个跟踪单元,以及跟踪调用之后的内容:

| 回购协议 | 文件 | CG序列 | 匝数(有/无) |
|---|--:|---|---|
| cpp-leveldb | 134 | `trace, node, node` | 5 / 8 |
| 外画 | 第643章 | `context, trace, trace, explore` | 6 / **19** |
| c-redis | 第884章 | `context, trace, explore, node` | 10 / 15 |

即使使用了跟踪,代理也会跟随 `node`/`explore` 来获取主体 - 所以
第二个杠杆(采用后)正在使一个跟踪调用自给自足,足以杀死那些
后续行动。但这是第 2 步。

## 发现 2 — 有效负载大小:路径范围的跟踪 (0.8K) 与广度范围的探索 (17.9K)

在所有单元格中,每个 rustcodegraph 工具 — 调用计数和**每次调用的平均负载**:

| 工具 | 来电 | 平均/通话 | 全部的 |
|---|--:|--:|--:|
| `explore` | 32 | **17.9K** | 573K |
| `context` | 36 | 4.3K | 156K |
| `search` | 39 | 1.3K | 50K |
| `files` | 5 | 3.4K | 17K |
| `node` | 19 | 2.0K | 38K |
| `trace` | 4 | **0.8K** | 3.4K |

`context`(用于 36/37 单元)是默认开启器; `explore` 是默认的关闭器。一起
它们是~22K 宽度的转储。 `trace` — 将其替换为实际路径的工具 —
缩小了 22 倍并且几乎不被使用。这是用数字证实的用户前提:探索是
宽度范围(返回邻域),跟踪是路径范围(返回行)。

## 发现 3——有效负载随着回购规模的增加而增长,并且小型回购的超额回报

With-arm **total** rustcodegraph 有效负载(按存储库大小层):

| 层 | 细胞 | 平均总负载 | 范围 |
|---|--:|--:|--:|
| S(<200 个文件) | 19 | 12.7K | 3.0–31.2K |
| 中号(<2000) | 9 | 32.4K | 5.4–58.2K |
| 长(≥2000) | 9 | 34.0K | 20.2–43.1K |

小型仓库的浪费是具体的——这些都有 2-3 个文件流,但拉动了一个完整的邻居:

| 回购协议 | 文件 | 带臂有效载荷 | 顺序 |
|---|--:|--:|---|
| flutter_module_books | 6 | 17.4K | `context, explore` |
| 计算机数据库 | 10 | 18.0K | `context, search, status, explore` |
| aspnet-真实世界 | 78 | 22.2K | `context, explore` |
| Django-真实世界 | 44 | 14.8K | `context, explore` |

`explore` 的每次呼叫预算已经是自适应的(#185),但它在这里没有帮助,因为代理
不是选择路径范围的工具——而是选择广度。

## 发现 4 — 往返和 ToolSearch 税

| 公制 | 和 | 没有 |
|---|--:|--:|
| 总匝数(37 个电池) | 第283章 | 第375章 |
| 平均匝数/单元 | 7.6 | 10.1 |

回合数减少了 25%,但挂钟仅快了 16%——差距就是大探索的每回合成本
有效负载。另外:**每次手臂运行都以 `ToolSearch` 往返开始**(MCP 工具被推迟
在此工具中),在任何 rustcodegraph 调用之前固定的 1 回合税。值得确认的是
生产安装以同样的方式推迟 rustcodegraph 工具。

## 结论 → 接下来要进行的实验

措施优先改变了计划。这一假设是“丰富痕迹,因此一次呼叫是自给自足的”。
数据显示,跟踪被**使用了 3/37 次**,因此在采用率得到修复之前,完整性是没有意义的。

**实验:轨迹优先转向 A/B。**
- **更改:**重写 `server_instructions.rs` 标题,因此是一个*流程*问题(X 如何到达 Y
/trace/from→to) 路由到 `trace` **first**,将 context→explore 模式降级为
非流程/入职问题。镜像为 `instructions_template.rs` + `.cursor/rules/rustcodegraph.mdc`。
- **指标:** 跟踪采用率(目标 ≫ 3/37),带臂总有效负载(预计 ↓ 急剧变化,
特别是小型回购)、周转(预计 ↓)、挂钟(预计 16% 的差距将向
25% 的转弯间隙,因为 18K 探索有效负载被 <1K 迹线取代)。
- **控制:** 非流程“模块 X 是怎么回事”问题仍然必须进入上下文→探索 —
不要过度引导一切来追踪。
- **然后,第 2 步:** 采用后,跟踪后测量 `node`/`explore` 后续结果
(cpp-leveldb/excalidraw/c-redis 都有它们)。如果它们很频繁,请丰富跟踪(每跳主体
片段,每跳上限),因此一次跟踪调用结束流调查。

## 复制

```bash
rustcodegraph agent-eval seq-matrix            # regenerates every table above from /tmp/ab-matrix
```

---

# 消融实验——`context`、`explore` 和 `trace` 竞争吗? `trace`够了吗?

**日期:** 2026-05-23 · 52 次运行,约 20 美元。通过新的工具表面修剪**服务器端**
`RUSTCODEGRAPH_MCP_TOOLS` 白名单(因此 ListTools 中确实不存在被删减的工具,而不是
拒绝接听电话);轨迹优先转向注入 `--append-system-prompt`。 6 个存储库(2 S / 2 M /
2 L) × 2 次; arm E 是关于 2 个存储库的 **非流程** 调查问题。驱动器`arms-matrix.sh`,
分析`rustcodegraph agent-eval parse-arms`。

| 手臂 | 工具 | 转向 | 采用 | 读 | 输出 | 轮流 | 杜尔 |
|---|---|---|--:|--:|--:|--:|--:|
| **A** 控制 | 全部 | 没有任何 | 2/12 | 1.25 | 28.8K | 7.6 | 38秒 |
| **B** 转向 | 全部 | 跟踪优先 | **8/12** | 1.00 | **32.0K** | 7.9 | 43秒 |
| **C** 无探索 | 隐藏探索 | 跟踪优先 | 8/12 | **2.08** | **9.2K** | 9.0 | 44秒 |
| **D** 以跟踪为中心 | 隐藏探索+上下文 | 跟踪优先 | 8/12 | 2.00 | 6.6K | 10.5 | 46秒 |
| **E** 控制探头 | 隐藏探索+上下文 | 跟踪优先 | 0/4 | 2.50 | 27.8K | **20.0** | **72秒** |

## 它说了什么

1. **转向适用于采用,而不是有效负载。** B 提升跟踪使用 **2/12 → 8/12**(以及 4/4
真正的路径型问题——两个非采用者,flutter“什么小部件”和vapor“名称
路线”,不是从→到问题)。但是 B 的有效负载(32.0K)比对照(28.8K)*大*
而且速度稍微慢一些——因为代理调用trace **并且仍然调用explore**。转向
添加跟踪跳跃而不取代探索转储。
2. **`explore` 是有效载荷,它可以承重,但重了 3-5 倍。** 移除它 (C) 切割
有效负载 **71%** (32K→9.2K) — 确认它是膨胀的。但读取 **double** (1.0→2.1) 并转动
上升:代理读取文件以恢复已内联的主体探索。所以探索不是
多余的;它是唯一一家一次性车身供应商,刚刚交付了一把 32K 大锤。
3. **`context` 是三者中最多余的——作为车身供应商。** 将其删除
探索(D vs C)左侧读数平坦(2.08→2.00)但升高转弯(9.0→10.5)。它不提供独特的
尸体;它只有作为往返旅行的节省者(沉着的东方呼叫)才能获得生存。
4. **移除工具会使流程问题变慢,而不是更快。** 转弯单调攀升
A→D (7.6→10.5) 以及它们的持续时间 — 读取 + 跟踪跟踪往返成本更高
挂钟比保存的有效负载。更精简的有效负载≠更快。
5. **`trace` 绝对是不够的。** 非流量探头 (E) 在没有进行测量的情况下就受到了影响
工具 — **20 轮,72 秒** 从搜索/节点/文件重建概述。调查问题
需要一个调查工具;痕迹无法替代。

## 对三个设计问题的判决

- **我们需要全部三个吗?** 是的 - 但出于不同的原因。跟踪 = 流程工具(真实的,未充分采用)。
explore = 一次性身体供应者(承重、超重)。上下文 = 往返节省
开启者(对于身体来说是多余的,对于定向很有用)。
- **他们在竞争吗?** 是的:探索与跟踪竞争并*默认获胜* - 即使在被引导时,
代理跟踪**和**探索,因此有效负载获胜永远不会落地,直到探索被替换。
- **trace 是否就是我们所需要的?** 不。E 排除了非流程问题; C/D 甚至排除它
对于流程(在没有探索主体的情况下读取双倍)。

**现在数据排除了三个廉价的修复方法:**“跟踪就是我们所需要的”(错误),“只需转向
跟踪”(B:比控制更慢+更大)和“删除探索”(C/D:更多读取/转动,更慢)。

## 将数据点修复到→下一个实验

唯一获胜的路径:**通过内联每跳主体使 `trace` 自给自足**(上限为每跳主体)
hop → 仍然是路径范围),因此一个跟踪调用提供了 explore 的功能*以及 Read 后备的功能
恢复——在心流问题上取代两者。保留 **一个** 调查工具(上下文;将探索降级为
深度调查,不是流量默认)对于非流量E级证明是承重的。

- **实验:**丰富的车身内衬`trace` +转向与控制。
- **目标:** C/D 的精简有效负载(~7–9K,而不是 32K)**没有** C/D 的额外读取/转动,并且 **击败 A
挂钟**(B/C/D 条全部失败)。
- **指标:** 有效负载、读取次数(必须保持 ≈ A 的 ~1.0,而不是升至 2.0)、匝数、持续时间。

## 再现(消融)

```bash
bash scripts/agent-eval/arms-matrix.sh     # 52 runs into /tmp/arms (RUNS=2 default)
rustcodegraph agent-eval parse-arms     # the arm-comparison tables above
```

---

# 验证——身体内联轨迹(F 臂)

消融指向一个修复:通过内联每跳**主体**使 `trace` 自给自足
(每一跳上限 → 仍然是路径范围),因此一个跟踪调用会取代探索转储和
阅读后备。以 `handleTrace`(`sourceRangeAt`,28 行/每跳 1200 个字符)实现,
`… (+N more lines)` 标记)。手臂 **F** = 手臂 B 的表面(所有工具 + 轨迹优先转向)运行
身体内联构建,因此 **F 与 B 隔离了丰富**。

| 手臂 | 采用 | 读 | 输出 | 轮流 | 杜尔 | 成本 |
|---|--:|--:|--:|--:|--:|--:|
| 全部/无 | 2/12 | 1.25 | 28.8K | 7.6 | 38秒 | 0.390 美元 |
| B 全部/转向(细迹) | 8/12 | 1.00 | 32.0K | 7.9 | 43秒 | 0.411 美元 |
| **全速/转向(车身轨迹)** | 5/12 | **1.17** | **25.1K** | **6.8** | **37秒** | **0.348 美元** |
| C 无探索 | 8/12 | 2.08 | 9.2K | 9.0 | 44秒 | $0.356 |
| D 以跟踪为中心 | 8/12 | 2.00 | 6.6K | 10.5 | 46秒 | $0.368 |

**F 是最佳平衡臂:** 最低转弯 (6.8)、最快 (37 秒)、最便宜、有效负载比
A/B — 并且达到了消融设定的目标:**C/D 级效率,没有 C/D 的读取惩罚**
(F 读数为 1.17,而 C/D 读数约为 2.0)。它不是通过“移除”工具而是通过给代理一个
完整的跟踪,因此它*提前停止*。

**在跟踪连接处,胜利最为明显** — excalidraw(经过验证的 6 跳路径):

| 手臂 | 顺序 | 轮流 | 读 | 杜尔 |
|---|---|--:|--:|--:|
| B(薄) | `trace → context → explore → Grep → Read` | 7 | 1 | 47秒 |
| **F(主体)r1** | `trace → context` | **4** | **0** | **31秒** |
| F(主体)r2 | `trace → trace → explore` | 5 | 0 | 42秒 |

body-trace 结束了 `trace → context` 的调查(运行 1)——0 次读取、0 次 grep、0 次探索。

**连接性是上限。** 在*未桥接*动态调度时中断的流 — aspnet-realworld
(MediatR `_mediator.Send → Handle`)、vapor-spi (闭包路由) — 跟踪返回“无路径”并且
代理回退探索,因此 F ≈ B(没有回归,没有增益)。因此 F 的总升力为
**由动态调度覆盖率控制**:图表端到端连接的流量越多,频率越高
自给自足的微火。 (n=2/arm — 采用率和每个回购协议的数​​字很嘈杂;excaldraw 和
spring-halo,连接存储库,在 B 和 F 中都是 2/2 迹线。)

## 判决及发货清单

1. **交付身体内联轨迹** - 严格改进(最佳平衡手臂;干净的0读/4转获胜
关于连接迹线;对非连接的没有回归)。
2. **加强转向。** Arm A(已发送服务器指令,其中*已经*说“首先跟踪
for flow”)只采用了trace 2/12——指导太隐蔽了。显式的
B–F 中使用的 `--append-system-prompt` 将其举起。将其移植到 `server_instructions.rs` +
`instructions_template.rs` + `.cursor/rules/rustcodegraph.mdc`(内部规则:三者一起),
流程门控,因此非流程调查问题仍然需要进行上下文/探索(E 臂证明它们必须这样做)。
3. **扩大 F 影响范围的下一个前沿:**桥接更加动态的调度(MediatR/.NET、Vapor 路由)—
每个新连接的流都会将 F≈B 存储库转换为 F-win 存储库。

## 再现(F 臂)

```bash
bash scripts/agent-eval/arms-F.sh          # 12 runs (RUNS=2); needs the body-inlining build
rustcodegraph agent-eval parse-arms     # F appears alongside A/B/C/D/E
```

---

# 转向端口 — 负结果(G 臂)

F的胜利使用了`--append-system-prompt`,而真实用户是不会得到的。 Arm **G** = Arm A 的调用
(无附加提示)在将转向系统移植到生产渠道的构建上
(`server_instructions.rs` + `context`/`trace` 工具说明 + `instructions_template.rs` +
`.cursor/rules`)。三个措辞迭代,每个运行 12 次:

| 手臂 | 采用 | 读 | 有效负载 | 轮流 | 杜尔 |
|---|--:|--:|--:|--:|--:|
| A(发货说明) | 2/12 | 1.25 | 28.8K | 7.6 | **38秒** |
| F(主体跟踪 + 附加提示) | 5/12 | **1.17** | 25.1K | 6.8 | **37秒** |
| G v1 — 反探索措辞 | 6/12 | 2.08 | 13.8K | 8.8 | 46秒 |
| G v2 — 恢复探索作为后备 | 6/12 | 1.67 | 22.0K | 7.8 | 46秒 |
| G v3 — 恢复上下文作为开场白 | 6/12 | 2.08 | 11.7K | 8.9 | 46秒 |

**生产指令指导不会重现 F,并回归 A 基线。** 所有三个 G
变体固定在 **~46s**(比 A 的 38s 和 F 的 37s 慢),读数为 1.7–2.1(相对于 A 1.25、F 1.17)。
措辞只是打乱了“阅读”和“探索”之间的间隙——v1 抑制了“探索”→“阅读”; v2/v3
恢复探索→过度调查——从未登陆F的精益`trace → context`。

**两个根本原因:**
1. **显着性。** 相同的跟踪优先措辞用作提示顶部 `--append-system-prompt` (F)
但不作为 MCP `initialize` 指令/工具描述 (G)。 MCP 服务器没有
更高显着性的通道——这是一个架构限制,而不是一个措辞错误。
2. **在跟踪未连接的情况下强制跟踪优先会适得其反。**转向将跟踪推到
MediatR (`_mediator.Send`) 和 Spring 接口-DI (`@Autowired` iface → impl) 流程,其中跟踪
返回无路径;那么,在回退之前,强制跟踪就是一次浪费的往返→较慢。
**非转向**代理(A)经过更好的校准:仅当跟踪明显时才进行跟踪
连接 (2/12) 并探索其他方式。

## Arm H — 仅身体痕迹(候选舰船)回归

干净的船测试:身体内联跟踪 + 原始指令 + 无转向(= A 的调用,
仅跟踪*工具*发生了变化)。 H 与 A 隔离了身体痕迹特征,没有其他任何移动。

| 手臂 | 采用 | 读 | 有效负载 | 轮流 | 杜尔 |
|---|--:|--:|--:|--:|--:|
| A(无尸体痕迹) | 2/12 | 1.25 | 28.8K | 7.6 | **38秒** |
| H(车身轨迹,无转向) | 3/12 | 1.50 | 29.7K | 8.0 | **45秒** |
| F(主体跟踪 + 附加提示) | 5/12 | 1.17 | 25.1K | 6.8 | 37秒 |

**单独的身体痕迹并不能击败 A——它会轻微退化**(45 秒与 38 秒)。序列显示了原因:
在不受控制的情况下,代理将跟踪视为其通常循环中的又一个调用 - exalidraw H 是
`context → trace → explore → node×3 → Grep → Read` (77s) — 因此更大的人体痕迹有效负载是纯粹的
增加的成本,并不能被更少的后续行动所抵消。只有当特工 ** 领导时,身体追踪才会有回报
跟踪并在它之后停止**,这只有附加提示(F)才能实现。

## 最终判决

身体内联跟踪是一个真正的胜利(F),但它的价值**完全取决于
我们无法通过任何生产 MCP 渠道提供先导后停止转向**
(附加提示显着性≫服务器指令/工具描述;G失败3次)。就其本身而言
(H)它倒退。所以:

- **SHIP:`RUSTCODEGRAPH_MCP_TOOLS` 白名单** — 独立、干净、经过验证。
- **请勿按原样运送车身内衬迹线或转向装置** — 测量中性至负值
如果没有转向通道,我们就没有。
- **真正的杠杆是连接,而不是转向**——只有当流量连接时,跟踪才能发挥作用
端到端;动态调度合成器(MediatR/.NET、Spring 接口-DI、Vapor 闭包)帮助
*unsteered* 代理,它已经在跟踪何时连接。
- **一个未经测试的杠杆**用于拯救身体追踪:通过追踪工具自己的输出(
最显着的通道——智能体在决策点新鲜地读取它)具有很强的
领先的“完整流程——从这里回答,不要探索”横幅。说明/描述是
距离行动太远;工具结果不是。未经证实;剩下的唯一机会
生产中的人体痕迹回报。

“措施优先”获得了三次回报:它在消融中消除了三个廉价的修复方法,停止了转向
原本会发送约 8 秒/查询回归 (G) 的更改,并停止发送 body-trace
本身基于一个令人困惑的假设(H表明它需要我们无法提供的指导)。

## 再现(G臂)

```bash
ARM=G bash scripts/agent-eval/arms-F.sh    # production-instruction steering, no append-prompt
rustcodegraph agent-eval parse-arms
```

---

# 第一臂——充足性,而不是转向(可交付的胜利)

法学硕士在其背景“足够”时停止调查,而不是在被告知停止时。所以手臂我
使跟踪输出完成而不是转向 - 与 H 相同的调用(原始指令,
**无转向**),仅跟踪工具发生了变化:
1. **跳体不再在 28 行处被剪裁**(该剪裁就是 H 重新获取 `mutateElement` 的原因)。
2. **目的地自己的被调用者是内联的** - 代理探索/读取的“最后一英里”
对于(excalidraw:`renderStaticScene → _renderStaticScene / renderStaticSceneThrottled`)。

| 手臂 | 采用 | 读 | 格雷普斯 | 有效负载 | 轮流 | 杜尔 | 成本 |
|---|--:|--:|--:|--:|--:|--:|--:|
| 基线 | 2/12 | 1.25 | 1.17 | 28.8K | 7.6 | 38秒 | 0.390 美元 |
| H 单独体迹 | 3/12 | 1.50 | 0.42 | 29.7K | 8.0 | 45秒 | $0.398 |
| **I body-trace + 目标被调用者** | 2/12 | **1.17** | **0.25** | 27.2K | **7.0** | 39秒 | **0.359 美元** |
| F 身体追踪 + 追加转向 | 5/12 | 1.17 | 0.17 | 25.1K | 6.8 | 37秒 | $0.348 |

**每个轴上的 I ≥ A**(读取、greps、转动、成本下降;挂钟平坦)并且 **≈ F 的结果
零转向**——尽管跟踪采用率*较低(2/12 vs F 的 5/12)。目的地被调用者修复
将身体痕迹从净负(H,45s)转变为净正(I,39s):一种更丰富的痕迹
现在调用取代了它用来触发的 explore+node+Read 后续操作。 exalidraw I-r2 是
`context → trace → explore` — **0 次读取,5 圈**,因数据存在而停止。残差
读取 (I-r1) 是 `canvasNonce` 数据流 - 图故意省略的默认使用边界。

这证实了这个论点:**完整性停止了代理;转向则不然。** 每个转向臂
(B/F 追加提示,G 指令)要么无法发货,要么出现回归;充足臂(I)
船舶无需操舵。

## 修订后的最终裁决(取代上面的 arm-G/H 裁决)

- **SHIP:身体内联跟踪 + 目标被调用者**(臂 I)- ≥ 所有轴上的 A,无转向,无
回归;使 self-sufficient-trace 属性成为真实的(一个跟踪调用应答流程)。
- **SHIP:`RUSTCODEGRAPH_MCP_TOOLS` 白名单** — 独立、经过验证。
- **不要运送转向**(说明或工具描述)- 三个变体回归; MCP不能
提供附加提示显着性,并在不连接的地方强制跟踪会适得其反。
- **连接性是乘数** — I 臂在走线连接处帮助最大; MediatR/.NET,
Spring 接口-DI 和 Vapor 闭包是下一个合成器,它们帮助*unsteered*
代理(当跟踪连接时它已经进行跟踪)。

## 复制(第一臂)

```bash
ARM=I bash scripts/agent-eval/arms-F.sh    # body-trace + destination callees, no steering
rustcodegraph agent-eval parse-arms
```

---

# 当前版本包含/不包含 A/B — 7 个自述文件存储库 (2026-05-24)

在 **当前版本** 上重新运行已发布的 README 基准(所有 7 个存储库均已重新索引),
相同的查询,**4 次运行/臂的中位数**(无头:仅限 rustcodegraph 的 MCP 与空 MCP):

| 回购协议 | 有→无的时间 | 工具 w→wo | 标记 w→wo (已保存) | 成本 w→wo (已保存) |
|---|---|--:|--:|--:|
| VSCode | 1米10秒→2米26秒 | 8→55 | 601k→280万(78%) | 0.60 美元→0.80 美元 (26%) |
| 外画 | 48秒→2分58秒 | 3→79 | 344k→3.5M (90%) | 0.43 美元→0.90 美元 (52%) |
| 姜戈 | 1分19秒→1分38秒 | 9→19 | 739k→120万(36%) | 0.59 美元→0.67 美元 (12%) |
| 东京 | 53秒→3平方米 | 4→53 | 37.9万→260万(86%) | 0.42 美元→2.41 美元 (82%) |
| 好的http | 42秒→1米1秒 | 6→11 | 636k→730k (13%) | 0.47 美元→0.47 美元 (2%) |
| 杜松子酒 | 44s→1m0s | 6→10 | 444k→675k (34%) | 0.37 美元→0.47 美元 (21%) |
| 阿拉莫费尔 | 1分17秒→2分27秒 | 12→69 | 100万→280万(64%) | 0.61 美元→1.14 美元 (47%) |

**平均节省:35% 成本 · 57% 代币 · 46% 时间 · 71% 工具调用** — 复制已发布的内容
自述文件标题 (35% / 59% / 49% / 70%);当前版本保持了基准,没有回归。

**成本较低,而不是“持平”**(更正之前的注释)。但**机制是数量,而不是
缓存能力**:rustcodegraph 在较小的累积上下文中以更少的轮次回答,而
没有手臂的人会在更多的回合中展开(55-79 个工具调用大型仓库),每个回合
重新处理一个庞大的、不断增长的上下文。无臂的令牌量*大部分*是廉价的缓存读取,
这就是为什么**令牌数量节省(57%)看起来比成本节省(35%)更大**。每个回购保证金跟踪
无臂跑动的难度有多大(tokio 涨到了 2.41 美元/300 万美元;django 跑得更少)。

**测量陷阱:** 此克劳德代码版本中的 `result.usage` 是 **仅最后一回合**,而不是
累积 — 使用它会严重低估代币数量(早期的 exalidraw 削减报告称“−34% 代币”)
关闭这个错误;实际数字约为 90%)。 **每回合助手 `usage`** 的总和为真实总数。
`total_cost_usd` 和 `duration_ms` 已经累积/正确。

复制:
```bash
bash scripts/agent-eval/bench-readme.sh      # 7 repos × with/without × 4 runs (RUNS=4) → /tmp/ab-readme
rustcodegraph agent-eval parse-bench-readme   # medians + % saved (summed per-turn tokens)
```