File size: 6,218 Bytes
0ffbb74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# BeamPilot evaluation plan v2

Status: pre-registered on 27 Oct 2026, **before any v2 run and before the code

changes it tests**. This file is the first commit on branch `add-agent-efficiency`.
Any later change goes under "Deviations" at the end, with date and reason.

v1 ([evaluation-plan.md](evaluation-plan.md), results in
[evaluation-results.md](evaluation-results.md)) **stays unchanged**. v2 does not
replace it; v2 results go to `docs/evaluation-results-v2.md`.

## Why v2

v1 showed an efficiency problem, not a judgement problem:
- **A8 and C2 were stopped by the 40-model-call limit** before `finish`; the
  controller's fallback verdict made both wrong.
- **In 12 of 31 agent runs the model made one tool call per model call** instead of
  requesting independent calls together.

v2 makes exactly two changes to the agent and nothing else (tools, simulator,
scoring, scripted and naive contenders all stay as in v1):

1. **Model-call limit 40 β†’ 60.** The token budget (1.5 M per run) and the cost cap
   ($0.50 per run) stay unchanged.
2. **Prompt:** it says clearly that independent measurements are to be requested
   together in one turn (parallel tool calls), and that after each `evaluate` the
   agent plans several positions at once. The prompt stays under 1,500 words and
   still names no fault.

The question: with these changes, does the agent finish on its own in every run,
with fewer model calls, and without losing accuracy?

## Contenders

| Name | What it is |
|---|---|
| `agent` | `run_agent`, model `muse-spark-1.2`, reasoning effort `low`, limits **60 model calls**, 1.5 M tokens, $0.50 per run |
| `agent-noview` | as `agent`, with `view_frame` switched off (group C only, as v1 deviation 4) |
| `scripted` | `scripted_iso`, unchanged |
| `naive` | `naive_uniform`, unchanged (reference only) |

## Cases: same groups and definitions as v1, new seeds

**New seeds.** None of these seeds was used before. Used so far: 0–99 (tests and
development runs), 100, 200–204, 300–304 and 1000–1009 (v1).

| Group | Cases | Definition | Seeds (v1 β†’ v2) |
|---|---|---|---|
| A | A1–A6 | the six known scenarios | 100 β†’ **500** |
| A | A7–A16 | mystery beams (`random_scenario`) | 1000–1009 β†’ **3000–3009** |
| B | B1–B5 | operator notes, word for word as in v1 | 200–204 β†’ **600–604** |
| C | C1–C5 | the five faults exactly as defined in v1 (incl. C5 from deviation 3) | 300–304 β†’ **700–704** |

The seed sets only the noise for A1–A6, B and C, so their expected verdicts are
the same as in v1. Expected verdicts of the new mystery beams, from v1's oracle
rule (computed before this commit, without any API call):

| Case | Seed | Expected | Case | Seed | Expected |
|---|---|---|---|---|---|
| A7 | 3000 | iso_compliant | A12 | 3005 | iso_compliant |
| A8 | 3001 | iso_compliant | A13 | 3006 | iso_compliant |
| A9 | 3002 | iso_compliant | A14 | 3007 | iso_compliant |
| A10 | 3003 | iso_compliant | A15 | 3008 | waist_not_accessible |

| A11 | 3004 | iso_compliant | A16 | 3009 | iso_compliant |



**Nothing in group C is held out in v2.** All five fault types were seen in the v1

results (C1 also during development). v2 measures efficiency and repeatability on

new noise and new mystery beams, not generalisation to new faults. Group C totals

are reported as "seen in v1".



## Metrics



The same as v1, with the same scoring rules (v1 deviations 5 and 8):

- correct verdict, with B3 scored on x only;

- C3 and C5 count as correct only if MΒ² is within 3 %;

- MΒ² error;

- constraint violations in group B;

- positions used;

- cost;

- fault noticed (keywords, plus the hand check for C3 and C4).



Also reported, not scored:

- model calls per run;

- tool calls per model call (batching);

- the number of runs stopped by a limit.



## Comparison with v1



`docs/evaluation-results-v2.md` gets, next to the v2 tables, a short table for

`agent` v1 against v2:

- correct verdicts per group;

- mean positions;

- mean model calls;

- tool calls per model call;

- runs stopped by the call limit;

- median and maximum |MΒ² error|;

- cost.



The seeds differ between v1 and v2 and each case runs once. A difference of one or

two cases is therefore noise, not a measured effect.



## Budget and stopping



Agent runs: 16 (A) + 5 (B) + 2 Γ— 5 (C) = 31.

- **Hard stop at $4** in total for the v2 agent runs; the remaining cases are then

  reported as not run.

- Order: A1–A16, B1–B5, then C1–C5, each case with and without `view_frame`.
- Up to 3 runs go in parallel. The budget is checked before each run starts.
- No code changes between runs. If something breaks, the evaluation stops and is
  reported, and no case is re-run.

## Known limitations

- One run per case, as in v1.
- Two changes at once (call limit and prompt). If v2 improves, this plan cannot say
  which change caused it. The model-call and batching numbers give a hint.
- A higher call limit can raise the cost per run; the per-run cap stays at $0.50.

## Deviations

Both dated 27 Oct 2026 and committed **before any v2 run**, after the physics
review of the v2 changes.

1. **The prompt changes more than the two lines described above.** To stay under
   1,500 words, three sentences were also shortened or dropped:
   - the frames-per-position rule;
   - the saturation hint;
   - "You explain every decision briefly."

   The required `reason` argument is still "one short sentence", but shorter reasons
   could lower the keyword hits for "fault noticed" in group C, independently of
   the two intended changes.
2. **Wording fix: no accept before seeing a result.** The Fill step said "Then accept
   or reject the results and call `evaluate` in the same turn". Measurement ids are
   predictable (m1, m2, …), so this could be read as accepting a batch in the same
   turn that measures it, without seeing the flags. It now says "Once you have seen
   the results, accept or reject them and call `evaluate` in that same turn". The
   v2 report counts any `set_status` that lands in the same model call as the
   `measure_at` that created its id.