Phase 6 · complete · the whole grid, no holes

Running everything — and finding two ways the plan could not have worked

Phase 5 proved one cell works. This phase runs all of them, and its single promise is that when hundreds run, none can go missing. Building it surfaced two problems that would have wasted a great deal of time and quota: the experiment did not fit its own budget, and two of your three recovery conditions could never have run at all.

Cells1,308
Tests374
Problems found2 structural
Statedone

The one promise

Every cell is listed before a single call is made, and afterwards a separate program checks that each one produced exactly one result. That check shares no code with the thing that runs the cells — deliberately, so a bug in the runner cannot hide inside the check that validates it.

VERIFY

  planned  28
  written  28

  COMPLETE — every planned cell has exactly one row.

Why this is the whole point of the project.

Your original study lost eight of twenty-four cells because a failure could quietly produce nothing, and phase 3 found twenty-two more evaluations whose patches and logs survived but which no table could see. A sweep that cannot prove completeness would repeat exactly that. So a refused condition, an exhausted budget, a provider outage and a missing file all write a result — the reason is recorded, and nothing is absent.

Problem one: it did not fit its own budget

Your configuration has had a line in it since the beginning — estimate_before_run: true — with nothing implementing it. Phase 6 implemented it, and the first run of the estimate said this:

PROJECTED TOKENS, BY EXPERIMENT ARM a5_format_at_scale 8.32M a4_reasoning 2.97M a2_workhorse 1.49M a3_capability 1.49M a1_replication 0.30M Total 14.56M against a 8.00M ceiling — 178%. One arm, a5, exceeds the entire allowance by itself.
a5 runs 60 tasks through whole-file context, in two formats, three times each — and those tasks include files of 3,300 and 3,444 lines. The estimate uses the real file sizes, never an average: a grid that is only affordable on average is not affordable.

This is the same defect as your token limit written 8_000_000, which the config format read as text so that no comparison against it ever did anything. There, a ceiling was never compared to anything. Here, a ceiling was never compared to the experiment. Both looked complete and neither was checked.

The sweep now refuses to start and names the arm responsible, rather than running until the money stops. The tempting fix is to raise the ceiling — one line, and the warning disappears. That would be meaningless: a ceiling is only a claim about what you are actually allowed to spend.

Which is why the real answer was different

Your three NVIDIA keys were each created from a separate account, so each has its own allowance — the real capacity is three times eight million, not eight. That makes the grid fit comfortably at 59%.

But it had to be declared, not assumed. The configuration now says per_key: true, which states the claim so a reader can see and contradict it, and capacity is multiplied by the keys actually present rather than by the number hoped for. Two changes were needed to make it real: the spend ledger now records which key paid (names only, never values), and the key pool hands out keys in rotation instead of sticking to the first — otherwise one account would have been drained while the other two sat idle.

Problem two: two of three conditions could never have run

This is the more serious finding, and it only appeared by actually running things. The first live sweep of 24 cells refused 16 of them:

  8  l2_reflection needs a previous attempt to reflect on, and none was produced
  8  l2_5_diagnose_revise needs a previous attempt to diagnose, and none was produced

The reason is obvious once seen. Reflection-only and Diagnose+Revise are defined by looking back at a failed attempt. In your study that earlier attempt was the baseline — day8_test is round zero, and each condition's round one reflected on it. The grid had no round zero at all, so two thirds of your recovery design was unreachable.

BEFORE — NOTHING TO LOOK BACK ON Reflection r1 refuses — no prior attempt Diagnose r1 refuses — no prior attempt AFTER — ONE SHARED BASELINE AT ROUND 0 Baseline r0 Blind Retry Reflection-only Diagnose+Revise all three see the SAME baseline failure — as in your original, where one day8 attempt fed them all
One baseline per task, shared. A separate baseline for each condition would give each a different failure to recover from, and the comparison between them would stop being about the condition.

So phase 5's decision to make the baseline replay-only was reversed. It now runs, using your own first-attempt prompts — the pre-retrofit unified-diff prompt for the diff format, the blind-retry prompt for SEARCH/REPLACE, since that one shows no history and so already is a first-attempt prompt.

What stays replay-only is the claim. A baseline run here cannot say "resolved", because nothing here runs tests. Your 12/20 remains the submitted number, regenerated from the logs by phase 3.

It works, verified on a live model.

With the baseline in place, Reflection-only round one runs against a real model and produces a real attempt — it was handed the baseline's own response and reflected on it. Before the fix, that cell refused.

An honest limit worth stating

Running it revealed something sharper about Diagnose+Revise than phase 5 knew. When the baseline patch applies cleanly, there is no failure evidence to diagnose — and without Docker there never will be, because the only evidence this pipeline can produce is git rejecting a patch.

So those cells are refused and the reason recorded, rather than quietly run as Reflection-only under a Diagnose+Revise label. It is a permanent consequence of the no-Docker decision, not a gap to be closed later, and the results say so cell by cell.

Deliberately broken, and one escape

Sabotage introducedResult
Skip a cell whose task file is unavailablenothing failed — then 1 test failed
Drop the budget-stop result instead of writing it2 tests failed
Ignore the three separate accounts when estimating1 test failed
Put the round into the lineage, so round 2 loses its history3 tests failed
The first row again

Making the sweep silently skip a cell whose file could not be read broke nothing — because every test ran against a warm cache, so that path was never exercised. That is the phase 3 defect exactly: a cell attempted, no record left.

There is now a test using a task deliberately absent from the committed cache. It asserts that both its cells still produce results, that no request is sent, and that verification passes. The same sabotage now fails.

Where this leaves the project

Seven of nine phases done. The pipeline can enumerate 1,308 cells, tell you what they will cost before spending anything, refuse if that exceeds what you actually have, run them in the right order across three accounts, survive being stopped and restarted without paying twice, and then prove that every single one produced a result.

Next is phase 7: the dashboard. The data is complete; what is missing is a way to read it that is not a command line.