M5: the surviving rows, deviations 3 and 4, and an appendix that records what was seen - #425
Merged
Conversation
The run completed all 1,160 registered rows on 2026-08-04. Two shards -- seeds 1-10 and 11-20, 400 rows -- existed only in a session scratchpad under the system temporary directory and were reaped before anyone copied them out. They are gone. What survives is committed here: seeds 21-58, contiguous, 380 rows per arm, all on one harness commit and one dist digest. The run log is committed beside them because it is the only evidence that the missing shards were ever produced -- with its `rows N -> path` lines redacted to `<scratch>/`, since they carried the absolute path of a local user directory and a session identifier. Every other line is untouched: the shard boundaries, timestamps, row counts and token totals are the evidence. The result rows themselves were checked and carry no paths. Deviation 3 records the loss and the decision it forces. The lost rows are being re-run against the same pinned harness rather than analysing the 760 that remain: §8 registers 1,160 and calls anything short of it a partially completed run, and picking a smaller n once part of the data is missing is the post-hoc choice the pre-registration exists to prevent. Nothing was analysed to reach any of this. Establishing what survived needed the identity fields only; `reproposed` was not read. Limit: the two lost shards had no copy outside a directory whose contract permits emptying it, so the rows are unrecoverable by any means Ruled-out: analysing the surviving 760 rows as a reduced-power run | §8 registers 1,160 and forbids reporting a partial run; 760 gives ~62% power against 80% registered, and choosing n after data is missing is exactly the post-hoc move the design forbids Ruled-out: discarding M5 and re-running all 1,160 rows | the survivors are uniform on harness commit, dist digest, model and arm balance, so re-running them would spend sixty hours to reproduce rows that are already valid Warn: results written under a temp directory do not survive; write shards outside the scratchpad and commit each one as it lands Warn: an artifact copied out of a scratchpad carries its path, so check before committing one Blast: module Undo: permanent Certainty: firm Verified: the pinned harness at 788a9db recomputes dist digest f54cda47 exactly, so re-run rows will agree with the survivors on both fields; grep for the scratchpad prefix and for a home directory prefix returns nothing in the committed log or in any of the four result shards Unverified: whether the `sonnet` alias resolves to the same provider build five days on -- it is not pinned to a build, and deviation 3 reports the production window per shard for this reason Provenance: authored Record-Id: r-m5keep1
Auditing `stopped_by` across the surviving shards -- which §6 and §7 require to be monitored -- puts `stopped_by: "error"` at 70 of 760. They are not scattered: seeds 21-54 have none across 680 rows, and seeds 55-58 have 70 of 80. The run died partway through seed 55 and produced nothing but errors after it. The tail shard's wall-clock agrees: 4.7 hours for 160 rows against roughly 10.4 for each 200-row shard before it. This corrects how the run log was read. `ALL SHARDS COMPLETE` and a count of 1,160 meant 1,160 rows were written; it did not mean 1,160 measurements exist, and §7 has said so from the start. The registered n was never reached, and calling the run complete was a claim about the log rather than about the data. Seeds 55-58 are re-run in full alongside seeds 1-20. Whole seeds rather than the 70 errored cells: `error` is the absence of a measurement rather than an outcome, so cell-level re-running would be defensible, but whole-seed replacement removes the question instead of answering it. 680 error-free surviving rows, 400 re-run for deviation 3 and 80 for this one, is 1,160 at 580 per arm -- the registered design exactly. Limit: seeds 55-58 produced 70 rows with no measurement, so the surviving data cannot reach the registered n without re-running them Ruled-out: re-running only the 70 errored cells | it would make the re-run set depend on a per-cell property, and whole-seed replacement costs 10 extra rows to remove the question entirely Ruled-out: analysing the 690 error-free rows that survive | same objection as deviation 3, and §8 forbids reporting a partially completed run Warn: a shard log reporting rows=N counts rows written, not measurements; audit `stopped_by` before reading a count as completion Blast: module Undo: easy Certainty: firm Verified: error rows are 35 in each arm and fall on all ten tasks, and seeds 21-54 carry zero across 680 rows, so nothing about a result influenced which rows failed Provenance: authored Record-Id: r-m5err4
Two things belong in the pre-registration that were not in it. Progress on this run was reported as "no outcome has been examined." That was not accurate. `bench/runner.ts` prints one console line per run and that line carries `reproposed=`, so reading the tail of the shard log to check progress displayed individual outcome values -- eight rows across the whole run, six from the treatment arm and two from the control, one of which is an error row §7 excludes anyway. Eight rows of 1,160, with no denominator and no cross-tabulation, cannot inform a decision even in principle, and none was made or revised. The reason to record it is not that it changed something. It is that an account which rounds "a few rows appeared in a log line" down to "nothing was examined" is exactly the kind of account this document exists to make impossible, and the first person that account misleads is the person writing it. Progress is now read with `wc -l` and by filtering `stopped_by`. The second is a prediction, with probabilities, made while the run is incomplete and nothing is computed. Direction as registered; magnitude smaller than the registered 6.6pp, because every arm renders `[claim]` and the payload's own legend tells the agent not to act on it as an order (#415), because ROUTE-GAP records treatment runs implementing what the injected block ruled out, and because deviation 2's truncation imbalance shrinks the predicted gap rather than creating one. The largest way it could be wrong is stated too: the control base rate of the rewritten task set is unknown to me, and M1-era diagnosis found seven of ten tasks with a control rate of zero before that rewrite. A prediction kept in someone's head is not a prediction. This one is written where the result can contradict it. Limit: the runner prints `reproposed=` on every console line, so any progress check that reads raw log output sees outcomes Ruled-out: leaving the earlier "nothing examined" statements to stand because eight rows cannot matter | whether they matter and whether the account was accurate are different questions, and only the second one is about trust Ruled-out: keeping the prediction out of the repository to avoid being on record | that is the entire value of making one, and a project that reports its own null results loses nothing by also reporting a wrong forecast Warn: read run progress with `wc -l` and `stopped_by` filters, never by printing raw runner log lines Blast: local Undo: easy Certainty: firm Verified: the eight rows are enumerated by arm and index in Appendix A.1; `grep -c reproposed=` over the shard log confirms every console line carries the field Provenance: authored Record-Id: r-m5appa1
CommitLore — record lintTrailers: clean — 3 commits in Active constraints for the paths this PR touchesLimits (6)
Ruled out (13)
Warnings (4)
Trailer violations fail this check. Active constraints are informational — they are what the repository already decided, not a verdict on this PR. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The M5 data branch. Not a code change —
bench/only.What is here
788a9db, whose committeddist/reproduces the recorded digest exactly (verified before launch, not asserted).stopped_byfound 70 of the 760 surviving rows carrystopped_by: "error", all in seeds 55–58. The run died partway through seed 55 and produced nothing but errors after it.ALL SHARDS COMPLETEmeant 1,160 rows were written, not that 1,160 measurements exist. Seeds 55–58 are re-run in full.Together: 680 error-free surviving rows (seeds 21–54) + 400 re-run (seeds 1–20) + 80 re-run (seeds 55–58) = 1,160 at 580 per arm, the registered design exactly.
Appendix A.1 — a correction about what was examined
Progress on this run was reported as "no outcome has been examined." That was not accurate.
bench/runner.tsprints one console line per run and that line carriesreproposed=. Reading the tail of the shard log to check progress therefore displayed individual outcome values — eight rows across the whole run, enumerated by arm and index in the appendix. Six from the treatment arm, two from the control, one of which is an error row §7 excludes anyway.Eight rows of 1,160, with no denominator and no cross-tabulation, cannot inform a decision even in principle, and none was made or revised. No 2×2 table has been computed and
bench/m5-analysis.tsstill refuses to compute one below 1,160 rows.It is recorded because whether it mattered and whether the account was accurate are different questions, and only the second is about trust. Progress is now read with
wc -land by filteringstopped_by.Appendix A.2 — a prediction, on the record
Written while the run is incomplete and nothing is computed, with probabilities, so it cannot be reread afterwards as whatever happened:
Direction as registered; magnitude smaller than the registered 6.6pp, for three reasons that are stated in full there — every arm renders
[claim]and the payload's own legend tells the agent not to act on it as an order (#415);ROUTE-GAPrecords treatment runs implementing what the injected block ruled out; and deviation 2's truncation imbalance shrinks the predicted gap rather than creating one.The largest way it could be wrong is stated too: the control base rate of the rewritten task set is unknown, and M1-era diagnosis found seven of ten tasks with a control rate of zero before that rewrite.
Verification
test/dogfood.test.tsre-run after committing: 9 passed. TheRecord-Idon the appendix commit was rejected bycommitlore validateon the first attempt (uppercase) and fixed — the product catching its own author.