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.
|