M0 slice zero: the experiment estate audited against git
Spec 2105's M0 starts by reconciling what the June experiment journal says shipped against what the tomo tree actually carries. The audit checked one identifiable symbol per patch set across the committed tree and git log -S.
M0 of spec 2105 is called land the estate: before any new mechanism, make the tree actually contain what the experiment campaign proved.
The journal is honest but it trails the tree, because several experiment notes were written while a patch sat on a branch that later squash-merged.
So the slice-zero audit trusts neither the journal nor memory; it checks one identifiable symbol per patch set against the committed tree and git log -S.
Method
Each June patch set has a symbol that only exists if the patch landed.
The audit greps the tree at main for the symbol, then asks git log -S which commit introduced it.
The tomo tree audited is main at 69ebbaf; the labs halves of each mechanism were checked in tomo-labs the same way.
Verdicts
| set | mechanism | journal claim | git verdict | landed in |
|---|---|---|---|---|
| P1 | oi glued-fence split (reopenAfterClose) + oi head-and-tail output clamp |
shipped (exp 0052) | landed | tomo #71 (e07694d) |
| P2 | gateway-worded 400 retried as transient (retryableStatus) |
shipped, openai path (exp 0053) | half landed; anthropic twin missing | openai in #71, anthropic in #75 (557be53) |
| P3 | dialect zoo costume salvage (parseExecuteXML et al) + prose-hallucination guard (actingMarkers) |
shipped (exp 0052, 0054) | landed | tomo #71, #72, #73 |
| P4 | dropped-file-block guard (droppedBlockNudge) |
NOT committed (exp 0056) | landed; the journal flag went stale when #71 squashed the branch | tomo #71 |
| P5 | defensive value-threading paragraph in the oi system prompt | NOT committed (exp 0057) | landed inside the #71 squash (branch commit f5c15e5 absorbed) | tomo #71 |
| P6 | prompt_cache_key routing pin on the openai path |
NOT committed (exp 0050) | landed | tomo #71 |
| PR 8 | default-engine 48KB tool-result backstop cut head-only | gap claimed by spec 2105 doc 01 | real: pkg/agent/agent.go kept the head and ate the verdict | tomo #76 (69ebbaf) |
Three of the journal's NOT-committed flags were stale in the same direction: the work rode the oi engine branch and landed when #71 squashed it. The lesson for the journal habit is that a shipped-or-not flag written mid-campaign has to be re-checked once the branch merges, which is exactly why M0 makes this audit a slice.
What actually needed landing
Two mechanisms were genuinely missing, and both are now on main.
Tomo #75 gives the anthropic provider the same rule the openai path has carried since exp 0053: a 4xx whose body names a gateway or upstream failure is the proxy hiccuping, not the request being malformed, so it retries instead of sinking the turn.
The error path now reads the response body and feeds it through the shared retryableStatus, with two unit tests: the zen-style 400 with an Upstream request failed body must come back transient, and a malformed 400 must stay permanent.
Tomo #76 replaces the default engine's head-only cut at the 48KB backstop with one shared tool.Clamp(s, max, advice) in pkg/tool.
A long tool result front-loads its frame and back-loads its verdict, so a head-only cut throws away exactly the line a verify-to-green loop needs.
The clamp keeps three quarters head and one quarter tail, backs both cut points off to line boundaries, and names the elided byte count in the middle.
cx's clampResult and oi's clampOutput now delegate to it, so the three engines bound results with the same shape, and oi keeps its re-run-narrower advice string through the advice parameter.
Pre-M0 baseline: core-14 on deepseek-v4-flash-free
The baseline anchors the exit gate: post-M0 smoke must not pass fewer core-14 scenarios than this. Image pins at baseline: tomo@92b5e82, tomo-cx@71b6e30, tomo-oi@402e0dd, all pre-#75. Runs are pass at one, greedy decoding through the proxy, free zen tier.
| tool | pass | failed | tokens total | tokens fresh | requests | wall |
|---|---|---|---|---|---|---|
| tomo | 14/14 | none | 263,764 | 20,436 | 90 | 165s |
| tomo-cx | 14/14 | none | 275,008 | 19,904 | 83 | 160s |
| tomo-oi | 13/14 | 07-refactor-dedupe | 125,184 | 47,616 | 68 | 1000s |
Tokens total is the billed sum including cache reads; fresh is prompt minus cached plus completion, the number that actually costs money on a caching provider. oi's shape is the known one: half the total tokens of the structured-tool engines, more of them fresh, and a much longer wall on the two long scenarios. The single oi failure is 07-refactor-dedupe at pass at one on the free tier; the same scenario passed on the same model in the two prior recorded runs (Jul 16 and early Jul 17), so it reads as variance, and the exit-gate comparison is on pass count, not on which scenario wobbles.
Reproduce: for t in tomo tomo-cx tomo-oi; do go run ./cmd/lab run $t; done at tomo-labs 12f848c with the pins above.
What this closes and what is next
This is M0 PR 1 (the audit note), PR 2 (anthropic twin, tomo #75) and PR 8 (shared clamp, tomo #76) of spec 2105 doc 10. Tracking lives in tomo issue #77. Next: bump the three tool image pins to tomo 69ebbaf, rebuild, run the post-M0 core-14 smoke against this baseline, then the three journal flips at the new pin (smolagents-285 glued fence, fonttools prose-hallucination guard, gitingest-94 costume salvage at 6 of 8 or better).