|
| 1 | +# P-022 / #263-A — training collection preregistration (step 6) |
| 2 | + |
| 3 | +```text |
| 4 | +Status: |
| 5 | + TRAINING PREREGISTRATION RECORDED. |
| 6 | + NO TRAINING COLLECTION HAS RUN. |
| 7 | + NO EMPIRICAL CONSTANT EXISTS. |
| 8 | + STEP 7 COLLECTION NOT AUTHORISED. |
| 9 | + STEP 8 FIT NOT AUTHORISED. |
| 10 | + HOLDOUT NOT AUTHORISED. |
| 11 | +``` |
| 12 | + |
| 13 | +This document and `docs/evidence/calibration/p022-263a-training-preregistration.json` |
| 14 | +fix the protocol of a training collection **that has not happened**. Step 6 contains |
| 15 | +no clock, no observation, no fitted `A_abs` or `R_rel`, no selected `N` and no |
| 16 | +width. It changes neither the frozen policy nor the measurement harness. |
| 17 | + |
| 18 | +## The gap this step closed, and where it was |
| 19 | + |
| 20 | +The owner's review found that platform had fallen between two levels of the model |
| 21 | +rather than out of a report. Ratified §2.1 defines a cell as the four-part |
| 22 | +`(rung, engine, workload, regime)` and says *no finer*. §3.3 then pools every cell |
| 23 | +of the named universe into one fit per rung, and §3.4 turns that into one width and |
| 24 | +one selected `N`. Meanwhile the instrument requires both Linux and Windows, and |
| 25 | +§6.5 makes environment part of comparability while recording that a GitHub-hosted |
| 26 | +runner has already shown itself not measurement-grade. |
| 27 | + |
| 28 | +Nothing in the ratified text said whether the universe spans platforms. Three |
| 29 | +readings all survived every sentence, and they disagree about whether an unstable |
| 30 | +machine widens the bound a stable one must then live under. That is a statistical |
| 31 | +model decision, so it went to the owner rather than being chosen here. |
| 32 | + |
| 33 | +## The owner's ruling |
| 34 | + |
| 35 | +**Platform is not a fifth cell axis.** The frozen four-part identity is unchanged. |
| 36 | +Platform is an **outer training stratum**, and there are exactly two universes, |
| 37 | +`U_linux` and `U_windows`. |
| 38 | + |
| 39 | +Within a stratum, cold and warm remain distinct cells and every cell pools into one |
| 40 | +fit per rung by the frozen fitter, unchanged. Across strata, observations, medians, |
| 41 | +envelopes and widths are **never** pooled, averaged or summed. The result is |
| 42 | +`E_p,N` and `W_p(N)` per platform, rather than one envelope inflated by the noisier |
| 43 | +runner into a forgiving blanket. |
| 44 | + |
| 45 | +**One global `N` all the same.** Each stratum computes its own admissible set |
| 46 | + |
| 47 | + Q_p = { N in the ladder : W_p(N) <= (1 + G) * min_N W_p(N) } |
| 48 | + |
| 49 | +and the selection is the smallest ladder rung in `Q_linux ∩ Q_windows`. Three |
| 50 | +alternatives are rejected by name. `max` of the per-stratum picks looks conservative |
| 51 | +for about twenty seconds and can select a rung admissible under neither stratum's |
| 52 | +margin. Averaging the widths lets an unstable platform buy a stable one a wider |
| 53 | +tolerance with its own instability. Treating one platform as the reference puts the |
| 54 | +other into D7 with no measurement model of its own. |
| 55 | + |
| 56 | +**Empty intersection is a stop.** `NO_COMMON_N` is an **orchestration** refusal, not |
| 57 | +a fifth reproducibility verdict: the frozen four describe cells and run pairs and |
| 58 | +are untouched. There is no fallback rung, no stricter-platform tie-break, no second |
| 59 | +`G` and no second fit. |
| 60 | + |
| 61 | +## The combiner, and the one thing it refuses to do |
| 62 | + |
| 63 | +`scripts/training/scope.py` exists because `Q_linux ∩ Q_windows` is code that takes |
| 64 | +a statistical decision, and §3.6 requires such code to be written and |
| 65 | +provenance-bound **before** the data it will judge. It lives outside |
| 66 | +`scripts/calibration/` deliberately: the step 4 control proves the frozen root grew |
| 67 | +no new file, and it would stop proving that if this landed inside it. |
| 68 | + |
| 69 | +**It does not re-implement the `(1 + G)` test.** The frozen `select_n` already |
| 70 | +computes the margin and reports `widths` and `limit` beside its own pick, so `Q_p` |
| 71 | +is read back off that result. A second copy of the margin arithmetic would only ever |
| 72 | +prove that the two copies agree, which is the defect this PR has spent thirteen |
| 73 | +rounds removing. `training-scope-admissible` proves the reading is real rather than |
| 74 | +incidental: it perturbs the `limit` the frozen function reported and requires the |
| 75 | +combiner's answer to move. A combiner that recomputed the margin itself would ignore |
| 76 | +that and pass. |
| 77 | + |
| 78 | +On `NO_COMMON_N` the result carries **no** `selected_n` key at all, so a caller that |
| 79 | +reads it without checking the outcome raises `KeyError` rather than proceeding on a |
| 80 | +number the rule did not select. |
| 81 | + |
| 82 | +### A control that could not tell a traceback from a finding, for the seventh time |
| 83 | + |
| 84 | +`training-scope-refusals` was first written with a helper that caught bare |
| 85 | +`Exception` and scored that as a refusal. Under the mutation that deletes the |
| 86 | +strata-versus-selections check, the combiner then raised `KeyError` reaching for a |
| 87 | +stratum that was not there, and the helper read that crash as the guard working. |
| 88 | +The mutation came back MISSED, which is the only reason it was found. |
| 89 | + |
| 90 | +This is the same family the ledger already records six times, in a file written |
| 91 | +after all six. The helper now returns empty only for a refusal raised **by name**, |
| 92 | +and reports anything else as the defect it is. Recorded rather than quietly fixed, |
| 93 | +because the interval between knowing this lesson by heart and writing it wrong |
| 94 | +again was, this time, about forty minutes. |
| 95 | + |
| 96 | +## Three binding axes from here on |
| 97 | + |
| 98 | + policy_implementation_digest c3068ed7fa88… |
| 99 | + measurement_harness_digest 562a7f7232da… |
| 100 | + training_scope_implementation_digest 614bf9efe6ba… |
| 101 | + |
| 102 | +The third is new and is computed over every committed `*.py` under |
| 103 | +`scripts/training/` with the **same framing** step 4 froze, imported rather than |
| 104 | +restated. If the combiner changes after collection starts, the training corpus is |
| 105 | +stale, with no discussion about it having been only a small change to an |
| 106 | +intersection. |
| 107 | + |
| 108 | +## The collection, fixed in advance |
| 109 | + |
| 110 | +Per stratum, one preregistered environment identity covers the whole ladder: rungs |
| 111 | +5, 15 and 45, five full runs each, over the complete universe of that stratum. |
| 112 | +Fifteen runs per platform, thirty in total. Measuring one rung on one runner and |
| 113 | +another rung on a different one would leave `N` as something other than the only |
| 114 | +variable that changed. |
| 115 | + |
| 116 | +Five runs per rung give exactly four observations per cell, from the consecutive |
| 117 | +pairs `(r1,r2)`, `(r2,r3)`, `(r3,r4)`, `(r4,r5)` — not five convenient pairs chosen |
| 118 | +once the outcome is visible. The universe is the 40 cells the frozen instrument |
| 119 | +emits for the six `cal-*` workloads across five rungs, two engines and both regimes; |
| 120 | +`training-prereg-universe` computes that from the manifest and the instrument rather |
| 121 | +than trusting the number written here. |
| 122 | + |
| 123 | +Execution order and its seed are fixed now. The seed is `c3068ed7fa880a70`, the |
| 124 | +first sixteen hex digits of the policy digest the owner accepted at step 4 before |
| 125 | +this document existed, so it is not a number that could have been re-rolled until |
| 126 | +the order looked tidy. |
| 127 | + |
| 128 | +**Exactly one collection.** Not the first satisfactory one of several. It carries a |
| 129 | +durable identity from its first run and ends `ADMISSIBLE` or `INVALID` by rules |
| 130 | +written here. There is no automatic retry because CI blinked; a repeat after an |
| 131 | +abort needs a rule already in this document or a new owner ruling. |
| 132 | + |
| 133 | +**If either stratum invalidates, the collection yields no admissible step 8 input.** |
| 134 | +The surviving stratum's numbers remain durable evidence of what happened, and must |
| 135 | +never become a single-stratum fallback model. That would be selection on |
| 136 | +survivorship wearing a CI badge. |
| 137 | + |
| 138 | +## What this does not authorise |
| 139 | + |
| 140 | +Not the collection, not the fit, not the holdout. The validation pair remains a |
| 141 | +separate owner decision, and this document deliberately does not describe it, so |
| 142 | +that a training preregistration cannot quietly authorise a fresh validation run. |
0 commit comments