summaryrefslogtreecommitdiff
path: root/design/preregistration.md
diff options
context:
space:
mode:
Diffstat (limited to 'design/preregistration.md')
-rw-r--r--design/preregistration.md52
1 files changed, 52 insertions, 0 deletions
diff --git a/design/preregistration.md b/design/preregistration.md
index f800461..30f731f 100644
--- a/design/preregistration.md
+++ b/design/preregistration.md
@@ -92,3 +92,55 @@ The interpretation matrix (O/H/P codes) above is NOT amended; only setup details
- Giannou et al. (2023), "Looped Transformers as Programmable Computers", arXiv:2301.13196
- Xu et al. (ICLR 2020), "What Can Neural Networks Reason About?", arXiv:1905.13211
- Xu et al. (2021), "How Neural Networks Extrapolate: From Feedforward to Graph Neural Networks", arXiv:2009.11848
+
+---
+
+## Addendum 2 (2026-08-14, pre-launch — operationalization + correctness fixes)
+
+Trigger: OpenAI Codex code review (experiment repo `design/reviews/codex-review.md`).
+The interpretation matrix is unchanged; this addendum (a) locks the code thresholds that the
+prose left unquantified, and (b) records setup correctness fixes. Everything below is
+pre-launch and pre-run.
+
+### Operationalization of O/H/P codes (thresholds now locked)
+
+- **O1:** train EM ≥ 0.95 for ≥ 10 CONSECUTIVE evals (window start `sat_start`), THEN val EM
+ reaches ≥ 0.9 at eval `hi` with `hi ≥ sat_start + 10` (strictly after the window), where the
+ last eval with val ≤ 0.2 (`lo`) satisfies `hi - lo ≤ 5`.
+- **O2:** train EM ≥ 0.95 sustained AND val EM never reaches 0.9 AND final val EM ≤ 0.3.
+- **O3:** train EM ≥ 0.95 sustained AND val EM reaches 0.9 but not via the O1 pattern.
+- **O4:** train EM never sustained at ≥ 0.95 for 10 evals (setup/optimization failure).
+- **O-PARTIAL** (new — the original matrix left this region unspecified): train saturated,
+ val never reaches 0.9, final val EM in (0.3, 0.9). Reported as measurements, interpreted
+ cautiously as partial in-range generalization; NOT retrofitted into O1/O2/O3.
+- **H1:** mean steps at run end ≤ min_steps + 0.5 (collapse to the floor — see fix 2: with
+ min_steps = 2 the floor is 2, so literal "collapse to 1" is impossible by construction).
+- **H2:** mean steps ≥ K − 0.5 (never learned to halt).
+- **H3:** min_steps + 0.5 < mean < K − 0.5 AND Pearson ρ(gap-to-next-prime, steps) ≥ +0.3
+ (positive correlation = larger gap consumes more compute steps).
+- **H4:** intermediate but ρ < 0.3 (halt signal noisy/unused).
+- **P1:** ≥ 3 of {121, 143, 169, 187} wrong AND ≤ 6 total errors AND all errors within the flagged set.
+- **P2:** scattered errors not matching P1/P3/P4.
+- **P3:** probe accuracy ≥ 85% (checked after P4).
+- **P4:** > 50% of trivial-composite inputs (even or multiple of 5) wrong.
+
+### Correctness fixes (codex review)
+
+1. **Layout invariance (BLOCKER).** Inputs are now LEFT-padded to a fixed global length
+ (3 digits for [2,100]) in EVERY context — training batches, eval, greedy decoding; outputs
+ right-padded to the global length (4 incl. EOS). Previously batch-max padding made an
+ example's representation depend on its batchmates (RNN pad steps transformed the state;
+ transformer logit positions misaligned and absolute position embeddings shifted).
+ RNN pad steps are now exact no-ops. Regression tests: mixed-batch vs singleton logit
+ invariance for both models.
+2. **min_steps off-by-one.** Halting probs forced to 0 only for the first `min_steps − 1`
+ steps (was: first `min_steps`), so the earliest halt is step `min_steps` — matching
+ "execute at least min_steps steps".
+3. **integers vocab EOS alias.** Integers-mode vocab is now `next_prime(range_end) + 2`, so
+ the value token 101 (= next_prime(100)) is NOT aliased with EOS. Boundary test added.
+4. **Rerun protection.** train.py refuses to run if `metrics.csv` exists (append + header
+ would corrupt provenance). Fresh `--out_dir` required per run.
+5. **Checkpoint-selection honesty.** eval reports BOTH `best.pt` (val-selected — flagged as
+ selection-holed) and `last.pt` (unselected); probe + halting analyses use `last.pt`.
+6. **Dead config removed:** `halt_eps` (was never read).
+7. **`run_meta.json`:** python/torch/numpy versions, device, thread count recorded per run.