# CB-EV-0003: did converting mechanical turns to tooling recover anything? research: [CB-RES-0003](../research/CB-RES-0003-agent-vs-deterministic.md) workplan: [CB-WP-0004](../workplans/CB-WP-0004-mechanical-work.md) instrument: `make cost-mix` (`tools/cb-cost.py --composition`) commit: measured on the tree at CB-WP-0004 T05 **Two windows over the same transcripts**, cut at `578dcbe` — the commit that published the baseline: | window | command | responses | pass cost | |---|---|---|---| | **baseline** (CB-WP-0001…0003 + the review) | `cb-cost --pin 578dcbe` | 662 | **$135.60** | | **this pass** (CB-WP-0004 T01–T04) | `cb-cost --since 578dcbe` | 83 | **$7.82** | The windows differ 17× in size, so **every verdict below is on share of pass**, per the normalization this task required. Absolute dollars are shown but decide nothing. --- ## Test 1 — did the mechanical turns disappear? | category | baseline $ | baseline share | this pass $ | this share | predicted | verdict | |---|---|---|---|---|---|---| | environment setup | $15.58 (85 turns) | **11.5%** | $0.05 (1 turn) | **0.6%** | <10 turns | **met, decisively** | | hub task status + workplan edit | $11.52 (46 turns) | **8.5%** | $0.00 (0 turns) | **0.0%** | ~6 turns | **met** | | ad-hoc text patching | $14.11 (76 turns) | **10.4%** | $0.75 (8 turns) | **9.6%** | $6–9 saved | **not met** | | orientation / inspect | $6.87 (49 turns) | **5.1%** | $1.66 (16 turns) | **21.2%** | ~1 turn/session | **not met — worse** | | ad-hoc transcript analysis | $4.56 (39 turns) | 3.4% | $0.08 (1 turn) | 1.0% | $2 saved | met | | **mechanical total** | **$51.76 (292)** | **38.2%** | **$2.53 (26)** | **32.4%** | **25–30% recovered** | **not met** | **Mechanical share fell 38.2% → 32.4%. That is 6 points, not the 25–30 points the review predicted.** The prediction is reported unmet. Per InnerLoop §Step 4 no target was moved in the commit that measured it. ### The two that worked Environment setup went from the single largest category to effectively zero — 85 turns to 1, an 18× drop in share. `make env-test` runs in `make all`, so it cannot regress silently. Hub and workplan closes went to **exactly zero** hand-written turns. Four tasks were closed this pass, each with one `make task-done`, and each hub event carries measured tokens rather than a typed estimate — the first time that has been true in this repo. ### The two that did not **Text patching barely moved (10.4% → 9.6%).** `facts-check` gates drifted copies but nothing removed the act of patching markdown: the Makefile edits and the fact-tagging in T04 were both done with the same heredocs the task was meant to retire. The gate closed the error class; it did not close the cost category. Those are different claims and the review conflated them. **Orientation got worse — 5.1% → 21.2% of pass.** This is the largest single miss and it deserves the plain reading first: `make status` was built this pass and then barely used. 16 turns of `grep`/`sed`/`ls` still went to reading the repo. ## The confound, stated before any defence of the numbers **This pass is the pass that built the tools.** Writing `make status` requires inspecting exactly the artifacts `make status` summarizes; writing `facts-check` requires grepping for every duplicated number in the repo. The two categories that missed are precisely the two whose tools were under construction. So this measurement **understates** the effect, and no part of it should be read as the settled answer. The clean test is the *next* pass, which uses the tools without building them. That test is not optional: a prediction that can only be confirmed by a differently-shaped future run is not yet confirmed, and CB-WP-0005 should carry it. What this pass does establish is the half that is not confounded: environment setup and task closes are gone, they were 20% of baseline pass cost, and their tools have gates that keep them gone. ## Test 2 — did the work relocate? The named failure mode: an agent that can no longer write heredocs simply writes more prose, and the pass costs the same. | signal | baseline | this pass | reading | |---|---|---|---| | output tokens per response | **896** | **681** | fell 24% — no prose inflation | | output share of cost | 13.2% | 18.1% | rose, but see below | | cost per response | $0.205 | $0.094 | fell 54% — **not attributable to this work** | | non-mechanical share | 61.8% | 67.6% | rose 6 pts, mirroring the mechanical fall | **Relocation into prose is not supported.** Output per response *fell*. The output share of cost rose only because cache-read share fell (64.6% → 62.5%) as context shrank — the denominator moved, not the numerator. **The halved cost per response is a compaction effect, not a T01–T04 effect,** and claiming it would be the most tempting error available here. `specs/SessionShape.md` measures mean context at 232,982 tokens in the baseline window against **117,822** in this one, because this session was compacted twice. Attributing that to tooling would repeat CB-WP-0002's original mistake in a new direction. The 6-point rise in non-mechanical share is arithmetic, not relocation: if mechanical work leaves and the same judgment work remains, judgment's share rises by construction. ## Test 3 — did quality hold? Recorded as explicit judgment, because the loop has no metric for this and a cost number does not settle it. - `make all` green, now including two gates that did not exist: `env-test` and `facts-check`. - **Findings kept surfacing at the same rate.** This pass produced four, each caught by a control rather than by review: 1. `loop-lint` failed on `repo.py` — a new tool with a positive control but no `--self-test` entry point. 2. `task-done`'s self-test reported **$12.10** for "T01" where the qualified figure is **$2.33** — a bare `T\d\d` attribution key collided across three workplans. That 5.2× overstatement would have been pushed to the hub *as a measured number*. Fourth instance of trusted arithmetic. 3. `status.py`'s heading regex returned twenty paragraphs of the preceding task's prose as a "task heading". 4. `facts-check` failed on a live fact tag inside its own documentation example in `specs/InnerLoop.md`. - No scenario, benchmark or coverage number regressed. The pinned benchmark is **$93.15**, unchanged by the attribution-key fix, which is the evidence that historical attribution was not disturbed. **Verdict: quality held.** Three of the four findings were caught by controls written this pass, which is the pattern the loop is trying to buy. ## Verdict | claim | status | |---|---| | environment setup eliminated | **confirmed** | | task closes eliminated, hub on measured numbers | **confirmed** | | DFD has an executable gate | **confirmed** (falsified against a real artifact) | | text patching reduced | **not met** | | orientation reduced | **not met — worse this pass** | | 25–30% of pass recovered | **not met — 6 points, on a confounded window** | | work did not relocate into prose | **confirmed** (output/response fell 24%) | The workplan said a saving that cannot be demonstrated in this table did not happen. Two of five categories are demonstrated; the aggregate prediction is not. Both are recorded as measured.