← All experiments

Field notes / Experiment guide

Do early rule letters control launches from the edge?

Changing an early letter often has a larger effect than changing a late one. Does that happen because the boundary mostly exposes early colours?

New to these ants? Start here.

An ant moves on a grid of coloured squares. Each colour tells it to turn left (L) or right (R). It advances that square to the next colour, then steps forward. A rule such as RLR is the list of turns, starting at colour zero. On a blank grid the same rule always makes the same trajectory.

Territory means every cell visited so far. Its boundary consists of visited cells with an unvisited neighbour. A highway is a repeating pattern of motion that carries the ant away. A tether means repeated returns to a small home region.

Growing like the cube root of time means taking eight times as many steps to double a linear size. The rotor walker is a comparison model that follows and rotates arrows stored on cells. A seed makes a random starting pattern reproducible; the ant itself can still move deterministically.

We distinguish c, the chance of discovering a cell per boundary step, from kappa (κ), time at the boundary normalized by perimeter divided by area. Explaining their values is harder than using them to account for growth.

The idea under test

Changes in boundary launch rates should predict changes in occupation across controlled rule mutations.

What we learned

The confirmation does not establish the launch-rate mechanism: key held-out prediction criteria fail, while a position gradient and mixed signs persist.

What this leaves open

Only a small validation set is informative and early mutations also change retention. The mechanism remains unresolved rather than cleanly ruled out.

Read the evidence and reproduction recipe ↗

Inside the experiment

Methods, registered predictions, exact commands and saved analysis. These are the working research documents; expand them for the detail behind the introduction.

Methods and original experiment record

Why would early rule colours set kappa?

Status: instrument built and piloted; confirmation registered 2026-10-16 00:05 (see Registration at the end), run complete 2026-10-16, see Results at the end. The draft sections below are superseded where the Registration says so. Created 2026-10-15 22:54 +13:00, base b3a0f762ac2230b5df92188206a4d3a1081897be (dirty tree). Mechanism note.

Question and mechanism

Does a rule prefix determine a fresh-cell return kernel that controls entry into long interior excursions? Prefix prediction is established only within the studied stationary cohort; it is not yet an exposure-based mechanism. This extends W6's mutation pilot rather than re-running a letter-position scan.

Draft design and predictions (freeze before ant outcomes)

  1. Select 24 distinct base rules of lengths 13–14 from a versioned census manifest, stratified by pre-existing regime label and prefix support, without ranking on prospective mutation effects. Use 12 development and 12 untouched validation bases, grouping by prefix family where possible. Report whether validation tests unseen prefixes or new suffixes; these are different claims. Include nonstationary bases as a separate stratum.
  2. For each base choose two early positions (indices 0..7) and two later positions (8..n-1), balanced deterministically over bases. Flip each position separately. Use 16 common start-patch seeds per base/mutant; pair initial patches and headings. Hash explicit rules, positions and initialized patches; do not canonicalize away the physically chosen fresh colour. Pilot four separate starts per base for instrument cost.
  3. Candidate areas: 32768 and 131072, bands A/16; cap 2^29 steps per run. Log per-colour exposure separately in the boundary, depth 1–4 and bulk, plus visit-count classes. For newly discovered cells, follow the next 64 steps and record heading/displacement, boundary departure and whether an interior episode lasts >=64 steps. Handle overlapping launch records as correlated observations, not independent samples.
  4. Fit a development-only model predicting mutation-induced changes in long- excursion launch probability from changes in this return kernel and exposure. Combine with separately estimated return durations to predict changes in B/S; explicitly state any geometry inputs needed for kappa. Draft P1: validation paired effect directions agree in >=70% of resolved pairs and paired-effect R2 >=0.20, with base-bootstrap lower bound >0. Resolution threshold is fixed from pilot replicate sd before confirmation; report all effects and counts, not only resolved pairs.
  5. Draft P2: the exposure/kernel model improves held-out paired-effect R2 by

    =0.10 over a position-only early/late model. If position remains predictive but exposure/kernel does not, reject this account of the prefix advantage. Compare early and late edits at overlapping exposure; no overlap means the matched-exposure contrast is unidentifiable, not a positive finding.

Controls and failure conditions

Unchanged-rule clones must agree exactly. Joint cyclic relabelling of the rule and all field colours must reproduce trajectories; rotating the rule alone is a different initial-background experiment. Before first exposure to the altered colour, base/mutant trajectories must be identical. After divergence, common seeds no longer imply equal environments: record that limitation rather than claim direct mediation.

Retain escape, periodicity and regime transitions as outcomes. Analyze total mutation effects on all attainable runs and conditional stable-regime effects separately; no late-kappa-based exclusions. Bootstrap by base (2000 draws), not by mutation or episode. Report sd over paired starts, censoring and power. If fewer than eight validation bases have informative attainable comparisons, report inadequate coverage rather than expand after seeing effect directions.

Implementation and next action

Read W6 and the latest prefix audit first. Reuse rule/start generation only after verifying its colour convention. Add reference-checked exposure and first-divergence tallies in kappa_prefix_exposure_* examples. Freeze a manifest with base/mutant relations, seed roles, selection code and input hashes. Prefer tail-budget estimates if that model passes; if it fails, test launch effects but do not claim a quantitative kappa explanation.

See PLAN.md, SCHEMA.md, and HANDOFF.md. Results: NOT RUN. No scientific test has passed or failed in this scaffold.

Scaffold verification — 2026-10-15 22:59 +13:00

Preflight and the planning notebook executed successfully under uv/WSL; local Markdown links resolve. The shared workspace passed cargo test --release. No new instrument or scientific prediction was tested. Commands are in HANDOFF.md; verification scope and the local test-log path are recorded in NOTEBOOK.md.

Registration (frozen 2026-10-16 00:05 +13:00, BEFORE any confirmation spec is run)

Base commit 997c9b2da6efa526fc6c5a57104d103e1345e916, working tree dirty. The 16-seed, positions-0..7, primary-kernel-w=64 items of the draft above are superseded by this section (reasons: NOTEBOOK entries of 2026-10-16 00:20 "deviation" and "decision"; pilot data used for those choices are development bases only). No validation-base mutant has been simulated. Source hashes (sha256): src/prefix_exposure.rs 1f9dc086..., examples/kappa_prefix_exposure_sampler.rs 10966a7a..., tests/prefix_exposure.rs 5f7e4ac3..., scripts/kpe_lib.py 67917ff6..., scripts/confirm_analyse.py 971f6570... (full hashes are written to results/confirm_run.json at launch and to confirm_analysis.json after the run), results/arms.csv b3924e38..., results/cohort.csv 2ef3bf89..., specs_confirm_dev.txt 547e6532..., specs_confirm_val.txt 833d3f15....

Design. 24 bases (12 dev, 12 val; 10 stationary + 2 nonstationary per side; results/cohort.csv), 7 arms per base (base; a1,a2,m1 = flips at positions 1,2,3, "early"; l1,l2 = two later positions, "late"; p0 = position-0 flip, descriptive anchor only), 64 seeds per (base,arm): prediction seeds 2026101571001..071032, target seeds 2026101571033..071064. Specs: 5376 dev + 5376 val = 10752 (lists in results/specs_confirm_*.txt). Boards 4096^2, step cap 2^29, bands A in [32768,34816] (band 0) and [131072,139264] (band 1, primary), launch window 64, episode thresholds {1,16,64,256,1024}. Mutants not canonicalised. Compute budget about 10 CPU-hours (pilot mean 3.3 s/spec), run at 3 threads.

Definitions (scripts/kpe_lib.py; pooled ratios of sums over a seed set). B/S = boundary steps over steps in the band; kappa_end; Lam_w = episodes begun in band lasting >= w states per discovered cell; effect of a mutation y_lnbs = ln(B/S)_mutant - ln(B/S)_base on TARGET seeds; predictor x_lnLam_w = same difference of ln Lam_w on PREDICTION seeds (disjoint from targets). A pair is attained if both arms have

= 16 valid runs in both roles (valid = band reached, no short open episode at stop). Escapes, cap hits and unattained mutants are reported, not imputed. Resolved pair: |y_lnbs| > 2 se, se = s_pool*sqrt(2/32) with s_pool = 0.528 (band 0) / 0.649 (band 1) from the v2 development pilot.

Gates (checked before P1/P2 verdicts). (G1) coverage: >= 8 validation bases with an informative attained stationary pair, else "inadequate coverage", no verdict (no expansion after seeing effects). (G2) reliability: over development stationary pairs, Spearman correlation of y_lnbs between the two target-seed halves (seeds 1-16 vs 17-32 of the target set) >= 0.30, else P1 and P2 are uninformative. (G3) P2 only: overlap of early and late mean read depth: >= 30% of early values inside the late range and >= 6 pairs on each side; else "unidentifiable".

Predictions (primary: stationary bases, band 1, arms a1,a2,m1,l1,l2; the model is fitted on development bases only and scored on validation).

  • P1. Held-out validation R^2 of y_lnbs ~ x_lnLam256 (OLS on dev; development slope must be negative) >= 0.20, base-bootstrap (2000 draws, seed 7015001) lower 95% bound > 0, >= 10 resolved pairs, and sign agreement >= 70% among resolved pairs. w=64 and 1024 are secondaries reported without a bar. Expectation, written now: the pilot's association (Spearman -0.17 to -0.37 for w=256) is weak, and replicate noise dominated it, so I expect P1 to be marginal; I put about 30% on it holding.
  • P2. An ex-ante exposure model (lead/mid position indicators + mean read depth + log boundary read share, from the base run on prediction seeds) raises held-out R^2 over the position-only model by >= 0.10 with base-bootstrap lower bound > 0, subject to G3. If position stays predictive but exposure does not, this account of the prefix advantage is rejected. Expectation: about 20%; pilot exposure and position are strongly collinear (R^2 0.33-0.44).
  • P5 (sign-mixed kappa, from kappa-rule-space W6m; key P5_sign_mixed_kappa). W6m found early letters change kappa at fixed area in both directions (M2 failed: the early effect is not a mean shift; signed shifts by letter were +0.109, -0.032, -0.004, +0.048 in the W6 pilot, no consistent direction). Prediction: for positions 1-2 (arms a1,a2; stationary; band 1; attained; dev+val pooled, n >= 20) the share of pairs with ln(kappa_mut/kappa_base) > 0 is in [0.25, 0.75] and |mean shift| <= 0.5 x median |shift|. A consistent direction (share outside the interval or |mean| > half the median) falsifies the sign-mixed expectation. Consequence: P1's predictor must carry sign, which is why the Lam change is regressed on the signed y, not on |y|.
  • Descriptive, no bar: valid-run shares for early vs late arms (pilot: early 0.75, late 0.92), median |y| early vs late, kappa shifts, position-0 anchor, nonstationary bases (listed separately), per-colour exposure tables. Per-arm tests beyond P1-P3 are exploratory and labelled so.

Commands. Run (WSL, repo root, CARGO_TARGET_DIR=~/turmite-target, RAYON_NUM_THREADS=3; .done markers make it resumable and the output is byte-identical for any thread count, verified in the pilot): cargo run --release --example kappa_prefix_exposure_sampler -- dumps/confirm_dev 536870912 4096 64 32768-34816,131072-139264 < results/specs_confirm_dev.txt (same with confirm_val; logs results/confirm_run_*.log). Analysis: uv run experiments/2026-10-15-kappa-prefix-exposure/scripts/confirm_analyse.py -> results/confirm_pairs.csv, results/confirm_analysis.json. Pilot stats for the new arm set were not regenerated; the pilot numbers quoted above come from results/pilot_stats_v2_oldarms.txt (same bases, arms 0..7 early pool).

Results: see "Results" below.

Registration — 2026-10-16 (git 997c9b2, dirty tree; hashes in results/registration_hashes.txt)

Registered BEFORE any validation-base mutant, and before any confirmation run on development bases, was simulated. Only the 336-spec development pilot (seeds 2026101570001..04) has run. Full rationale and deviations from the draft above: NOTEBOOK.md (2026-10-16 entries). Handover: HANDOVER.md.

Design (frozen). 24 bases of length 13-14 from W3c's 176 usable rules (results/cohort.csv): 12 dev + 12 validation, each 10 stationary + 2 nonstationary; dev and validation 5-letter prefix families disjoint. Arms per base (results/arms.csv, rules used as written, never mirrored): base; single-letter flips at positions 1 (a1), 2 (a2), one in 3..7 (m1), two in 8..n-1 (l1, l2); position-0 flip (p0, descriptive anchor only). Seeds 2026101571001..64 per arm: first 32 = prediction role, last 32 = target role. Radius-2 patch (shared by base and mutant of equal length). Bands [32768, 34816) and [131072, 139264); primary band = the second. Grid 4096 (walker stops 12 cells short of the edge), cap 2^29 steps, launch window 64, episode thresholds 1/16/64/256/1024. Specs: results/specs_confirm_{dev,val}.txt (5376 each, ~10 CPU-h total at 2.6-3.3 s/spec).

Estimators (frozen = scripts/confirm_analyse.py + kpe_lib.py). Per arm and role, pool valid runs by ratio of sums (>= 16 valid seeds per arm and role, else unattained). Y = ln(B/S)_mutant - ln(B/S)_base on target seeds. X = ln Lam_w(mutant) - ln Lam_w(base) on prediction seeds, Lam_w = (episodes begun in band lasting >= w states + 0.5)/new cells. Stationary bases only in tests; nonstationary listed separately. Resolved pair: |Y| > 2 * se, se = 0.700*sqrt(2/32) (primary band; 0.533 for band 0), constants from pilot v3. Bootstrap over validation bases, 2000 draws, seed 7015001. Coefficients from dev bases only.

Gates (uninformative if failed, not a null). Dev split-half Spearman of Y (two 16-seed halves of target seeds) >= 0.30; >= 8 validation stationary bases with an attained pair; all specs complete; tests pass at the registered commit.

Predictions.

  • P1 (primary): dev-fitted Y ~ X(w=256); validation held-out R^2 >= 0.20 with bootstrap lower bound > 0, AND sign agreement >= 70% among resolved pairs with >= 10 resolved. w=64 and 1024 secondary. Confidence ~45%.
  • P2: ex-ante model (lead/mid dummies + mean read depth and ln boundary share of the altered colour, from base runs on prediction seeds) beats the lead/mid dummies alone by held-out delta R^2 >= 0.10, bootstrap lower bound > 0; unidentifiable (not a pass) unless >= 30% of early mean-depth values lie in the late range and >= 6 pairs each side. Confidence ~20%.
  • P3: median |Y| of lead (positions 1-2) over late >= 1.5, bootstrap lower bound > 1 (replicates the W6 matched-area finding on fresh mutants at fixed area). ~70%.
  • P4 (descriptive): sign mix of resolved lead pairs. P5 (descriptive): valid share early < late (pilot: 0.85 vs 0.93).

Interpretation, fixed now. P1+P2 true: launch-rate change tracks the B/S change and exposure predicts it beyond position (predictive, not yet causal). P1 true, P2 false: launches account for it but why a letter changes them is open. P1 false with gates passed: the w=256 launch-frequency account of the prefix effect is rejected at these scales. Any gate failed: uninformative. All results reported, including nulls.

Results: NOT RUN (confirmation).

Registration addendum (2026-10-16 00:08 +13:00, still before any confirmation outcome was read)

The confirmation was launched at 00:03:33 (results/confirm_run.json), a little before the 00:05 stamp above (the registration text was written and saved before launch; the stamp is approximate). While I was registering, scripts/confirm_analyse.py was edited on disk by another process (00:03:06) to add two items I had not registered: P3 (position gradient: median |y_lnbs| of leading-position arms a1,a2 over late arms l1,l2 on validation, held if ratio >= 1.5 and base-bootstrap lower bound > 1; replicates the W6 matched-area M1 on fresh mutants) and P4 (descriptive: share of positive y_lnbs among resolved leading-position pairs, expected near 0.5 per W6m; no bar). I adopt both as registered here, since no outcome had been read, and renamed my sign-mixed kappa item P5. The sha256 of the script in confirm_run.json (458c8eaf...) is the pre-run version of that edited file (before my P5 rename, which does not alter any computation); the final hash is in confirm_analysis.json. The analysis script was only dry-run on pilot data (mechanics, not results).

Results (confirmation run, analysed 2026-10-16 03:49 +13:00)

All 10752 specs finished (results/confirm_run.finished; logs results/confirm_run_{dev,val}.log; analysis results/confirm_analysis.json, confirm_analysis.log, confirm_pairs.csv). Stops: dev 4863 complete / 192 hit the 2^29 cap / 321 escaped; val 4556 / 497 / 323. Coverage: 10 validation bases informative (gate G1 met, >= 8); 39 validation and 44 development attained stationary pairs (25 early, 14 late on validation). Reliability gate G2: Spearman 0.97 between target-seed halves (informative). Primary band 1, stationary bases, bootstrap over 10 validation bases (so intervals are wide).

Item Criterion Observed Verdict
P1 (w=256) held-out R^2 >= 0.20, boot lower > 0, >= 10 resolved, agreement >= 70%, dev slope < 0 slope -0.26; R^2 0.105, CI [-0.21, 0.32]; 20 resolved, agreement 75%; Spearman -0.41 FAILED (R^2 and CI bars). w=64 R^2 0.103, w=1024 0.092: same
P2 delta R^2 >= 0.10, boot lower > 0, G3 identifiable R^2 position 0.045, exposure 0.260, delta +0.215, CI [-0.002, 0.281]; G3 met (40% overlap, 20/31 pairs) FAILED on the interval bar by 0.002; point estimate clears 0.10. Not a clean rejection or support
P3 (position gradient) median abs y early(1-2)/late >= 1.5, boot lower > 1 ratio 9.0, CI [1.27, 27.6]; n 17 vs 14 HELD (wide interval)
P4 (descriptive) none 6 of 11 resolved leading pairs positive (0.55) sign-mixed as expected
P5 (sign-mixed kappa) share positive in [0.25, 0.75] and abs mean <= 0.5 median abs n 34, share 0.47, mean -0.11 (CI [-0.41, 0.14]), median abs 0.33 (a1 -0.28, a2 +0.04) HELD

Descriptive: median abs d ln(B/S) early 0.47 (dev and val) vs late 0.15 (dev) / 0.07 (val); median abs d ln kappa early 0.31 / 0.41 vs late 0.14 / 0.12. Valid-run share early 0.83 / 0.82 vs late 0.93 / 0.73 (dev / val: late validation mutants hit the cap more often than in dev). Position-0 anchor: median abs y 0.55 (n 22). Nonstationary bases are listed in the JSON (large positive y for most; not tested).

Interpretation (limited). The prefix/position effect at fixed area replicates on fresh mutants (P3) and is sign-mixed (P4, P5), consistent with W6/W6m. The proposed mechanism, that the change in the rate of long interior excursions launched from fresh cells carries that effect out of sample, is not supported at the registered bar: Lam_256 explains about 10% of validation variance with an interval including zero. Exposure features add +0.215 R^2 over position alone, but the lower bootstrap bound is just below 0, so this is suggestive only. Caveats: 10 validation bases; early mutants fail to attain more often (selection); the predictor and target share the base run only through the ratio, and common seeds diverge after first exposure (no direct mediation claim). Script provenance: the analysis hash is fcae4442... (the script was edited by another process before the run, see addendum; the P1-P3 computations match the registered text). Git HEAD at analysis was 269288e (HEAD moved during the run; the sampler sources were unchanged, hashes in confirm_run.json).

Analysis notebook: notebook.ipynb

2 saved outputs · 2 code cells. Cells are not executed during publication. Download notebook

2026-10-15-kappa-prefix-exposure

Question and why it matters

See README for the mechanism and candidate predictions and mechanism note for competing accounts.

Assumptions and definitions

Untested: the mechanism transfers across seeds and area bands. The cohort, estimator reliability, seed freshness and resource budget still need verification. Boundary means a visited cell with an unvisited four-neighbour, including holes.

Provenance

Code
In [1]:
import hashlib, subprocess, datetime
from pathlib import Path
SEED = 2026101599  # proposed bootstrap seed; no sampling in this scaffold
ROOT = next(p for p in [Path.cwd(), *Path.cwd().parents] if (p / "AGENTS.md").exists())
EXP = ROOT / "experiments" / "2026-10-15-kappa-prefix-exposure"
INPUTS = []  # add explicit committed results only when available
print("draft base: b3a0f762ac2230b5df92188206a4d3a1081897be")
print("current git:", subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=ROOT, text=True).strip())
print("executed UTC:", datetime.datetime.now(datetime.timezone.utc).isoformat())
print("seed:", SEED)
for path in INPUTS:
    assert path.is_file(), f"Missing input: {path}"
    subprocess.run(["git", "ls-files", "--error-unmatch", str(path.relative_to(ROOT))], cwd=ROOT, check=True, capture_output=True)
    print(path.relative_to(ROOT), hashlib.sha256(path.read_bytes()).hexdigest())
print("No scientific inputs. NOT RUN.")
draft base: b3a0f762ac2230b5df92188206a4d3a1081897be
current git: 269288eb62bf6b6ec125a3b420dd899057858be5
executed UTC: 2026-10-15T14:50:15.532807+00:00
seed: 2026101599
No scientific inputs. NOT RUN.

Data and method

Confirmation run done (10752 specs: 24 bases x 7 arms x 64 seeds, 3 threads; commands in README Registration). Analysis: scripts/confirm_analyse.py -> results/confirm_analysis.json. This notebook only reads that file; it launches no simulation.

Results

Code
In [2]:
import json
from pathlib import Path
R = next(p for p in [Path.cwd(), *Path.cwd().parents] if (p / "AGENTS.md").exists())
a = json.loads((R / "experiments/2026-10-15-kappa-prefix-exposure/results/confirm_analysis.json").read_text())
print("coverage", a["coverage"], "reliability", a["reliability"])
p1 = a["P1_primary_w256"]; print("P1 w256: heldout R2 %.3f, boot CI %s, resolved %d, agreement %.2f, verdict %s" % (p1["heldout_r2"], [round(x, 3) for x in p1["boot_ci"]], p1["n_resolved"], p1["direction_agreement"], p1["verdict"]))
p2 = a["P2"]; print("P2: R2 position %.3f exposure %.3f delta %.3f CI %s identifiable %s verdict %s" % (p2["r2_position"], p2["r2_exposure"], p2["delta_r2"], [round(x, 3) for x in p2["boot_ci"]], p2["identifiable"], p2["verdict"]))
p3 = a["P3"]; print("P3: ratio %.2f CI %s n %d/%d verdict %s" % (p3["ratio_lead_over_late"], [round(x, 2) for x in p3["boot_ci"]], p3["n_lead"], p3["n_late"], p3["verdict"]))
print("P4", a["P4_sign_mix_descriptive"]); print("P5", {k: a["P5_sign_mixed_kappa"][k] for k in ("n", "share_positive", "mean", "median_abs", "mean_boot_ci", "verdict")})
print("descriptive", a["descriptive"])
coverage {'dev_pairs': 44, 'val_bases_informative': 10, 'val_early': 25, 'val_late': 14, 'val_pairs': 39} reliability {'informative': True, 'n_pairs': 44, 'spearman_half1_half2': 0.9663143058491894}
P1 w256: heldout R2 0.105, boot CI [-0.206, 0.324], resolved 20, agreement 0.75, verdict False
P2: R2 position 0.045 exposure 0.260 delta 0.215 CI [-0.002, 0.281] identifiable True verdict False
P3: ratio 9.02 CI [1.27, 27.62] n 17/14 verdict True
P4 {'n_resolved_lead': 11, 'share_positive': 0.5454545454545454}
P5 {'n': 34, 'share_positive': 0.47058823529411764, 'mean': -0.11144035664691165, 'median_abs': 0.3267731662088967, 'mean_boot_ci': [-0.4142996585405972, 0.1447466923159825], 'verdict': True}
descriptive {'dev': {'early_valid_share': 0.8291666666666667, 'late_valid_share': 0.93359375, 'median_abs_y_early': 0.47376650023351236, 'median_abs_y_late': 0.14557124100032648, 'median_abs_ykappa_early': 0.31199149692155087, 'median_abs_ykappa_late': 0.13575610153773493}, 'val': {'early_valid_share': 0.8239583333333333, 'late_valid_share': 0.7296875, 'median_abs_y_early': 0.47112631763342044, 'median_abs_y_late': 0.06610751366377027, 'median_abs_ykappa_early': 0.4095053841778015, 'median_abs_ykappa_late': 0.1162747318286397}}

Reading: only P3 (the position gradient, ratio 9.0 with a very wide interval) and P5 (sign-mixed kappa) held. P1 failed (held-out R2 0.10 against 0.20; bootstrap interval spans zero). P2 failed on its interval bar (delta R2 +0.215 but lower bound -0.002), so it is not a clean negative either. Only 10 validation bases are informative, so every interval is wide, and early letters are also the mutations that most often fail to reach the band (valid share about 0.82 vs 0.73-0.93 late), which is a selection caveat. The launch-rate mechanism is therefore not established; it is not retired. See README "Results".

Read the dated lab log

Lab notebook

2026-10-15 22:58 +13:00 · b3a0f762ac2230b5df92188206a4d3a1081897be · intent

User requested brainstorming notes and experiment scaffolds. Prepare a prospective plan from current evidence; do not run new measurements. Existing workspace changes are preserved.

2026-10-15 22:58 +13:00 · b3a0f762ac2230b5df92188206a4d3a1081897be · assumption

The mechanism in README is untested. Candidate cohort and budgets may be infeasible; calibration, coverage and seed-history audits must resolve this before registration. Thresholds and seeds are draft choices.

2026-10-15 22:58 +13:00 · b3a0f762ac2230b5df92188206a4d3a1081897be · decision

Separate this mechanism from prior failed tests; add explicit independent-seed prediction and reliability gates. No new scientific outputs exist. See README and the linked prior investigations.

2026-10-15 22:59 +13:00 · b3a0f762ac2230b5df92188206a4d3a1081897be · observation

Scaffold preflight and clean-kernel notebook execution passed using the uv/WSL commands in HANDOFF.md. All new Markdown links resolved in a PowerShell local-path check. The shared workspace passed cargo test --release; full log is local scratch at experiments/2026-10-15-kappa-tail-budget/scratch/scaffold-release-tests.log (ignored). These checks validate scaffolding and existing code, not the proposed instrument. Initial sandbox WSL access failed with E_ACCESSDENIED; the approved elevated retry succeeded. No scientific runs were performed.

2026-10-15 22:59 +13:00 · b3a0f762ac2230b5df92188206a4d3a1081897be · decision

Planning complete; all predictions remain draft and NOT RUN. Next session should calibrate the proposed instrument, audit seed freshness, fix the cohort and budget, then append a frozen registration. No dependencies changed and no commit made.

2026-10-15 23:10 +13:00 · b3a0f762ac2230b5df92188206a4d3a1081897be (dirty tree) · intent

User asked to begin this experiment. Scope for this session (HANDOFF): build and calibrate the exposure/launch instrument, resolve the draft choices, pilot for cost and replicate noise on development bases only, append a frozen registration. No validation-base mutant is simulated before the registration, and no confirmation run is launched in this session. Existing uncommitted work (including src/field_age.rs, another scope's untested code) is left alone; the new instrument does not use it.

2026-10-15 23:10 +13:00 · b3a0f762ac2230b5df92188206a4d3a1081897be · assumption

(1) Exposure of colour j is close to collinear with letter position j: a blank-start cell reads colour j only on visits j mod n, so per-cell reads of j fall with j. Only the 25 radius-2 patch cells escape that. So P2's "exposure beats position" is likely unidentifiable on total counts; what can differ is where colour j is read (boundary / depth share) and the launch kernel. Checked on the development pilot before P2 is frozen. (2) Predictors must come from the base run or from seed-disjoint mutant runs, not from the trajectory whose B/S is the target (circularity noted in the mechanism note). (3) The sibling scaffolds share this PLAN template and propose the same seed namespace 2026101501..; this experiment will use its own (13-digit) namespace.

2026-10-15 23:50 +13:00 · b3a0f762ac2230b5df92188206a4d3a1081897be (dirty tree) · observation

Instrument built: src/prefix_exposure.rs (producer drive + pure Accountant), tests/prefix_exposure.rs, runner examples/kappa_prefix_exposure_sampler.rs. It does not use src/field_age.rs. src/lib.rs gained pub mod prefix_exposure; next to the other scope's uncommitted field_age line. cargo test --release --test prefix_exposure: 11 tests pass (WSL, CARGO_TARGET_DIR=~/turmite-target). What they check:

  • producer vs a HashMap oracle that recomputes every field, with a full multi-source BFS for depth at every step (160 proptest cases, rules of 2..14 colours, random seeds);
  • accountant vs an independent offline implementation of bands and launch windows (160 cases, two bands, w = 1..9), plus a hand-worked stream and a censoring case;
  • boundary stream vs fixed_area::run (b_dep, i_dep, band times and areas agree);
  • depth known-answer on a filled 11x11 block (analytic distance to the edge, no BFS);
  • controls: unchanged clones agree exactly; base and mutant agree through the state of the base's first read of the altered colour and differ at the next (200 cases); joint cyclic relabelling of rule and every field colour reproduces trajectories (100 cases); rotor and random-walk runs obey the invariants. Power check on the depth map: update radius 5 disagrees with the oracle in 0 of 120 cases, radius 4 in 99, radius 3 in 107, so 5 is tight and the test would catch a too-small ball. The rotor/random-walk runs only check invariants; no known-answer calibration of the launch statistics on those walkers exists (none is analytic), so launch numbers are uncalibrated against any independent known quantity beyond the oracle agreement. One spec costs ~0.7 s (RLLLLLLLLRLLR@2026101570001, bands 32768-34816 and 131072-139264, grid 4096, t = 5.6e5): compute is not a constraint at this design size. This rule has B/S = 0.70 in band 1, so it is an unusual base; flagged, not yet interpreted.

2026-10-16 00:20 +13:00 · 07a0951e22aba7e4e0d2a2c99bf8382a54235da0 (dirty tree) · observation

Cohort selected (scripts/select_cohort.py -> results/cohort.csv, arms.csv, selection_manifest.json). Source of labels: the W3c per-rule recipe (core band, >= 6 runs, |median g_k| < 0.05) recomputed from the gitignored kappa-rule-space/dumps/w3c_probe.csv (sha256 in the manifest); it reproduces W3c's counts (176 usable rules, 162 stationary, 14 nonstationary). 24 bases of length 13-14: 12 development, 12 validation, each side 10 stationary + 2 nonstationary, no quota shortfall. Families are the first five letters; development and validation families are disjoint (8 vs 8), so validation tests unseen 5-letter prefixes. Mutants of a validation base at positions 1-4 can still land in a development family; that is not controlled. Seed namespace 2026101570001.. (pilot) and 2026101571001.. (confirmation) appears nowhere else in the repo (audit in the manifest); the sibling scaffolds' proposed 2026101501.. namespace was NOT used. One arm rule, LLLRLLLLLLRLLL (position-0 anchor of a validation base), is non-primitive (period 7); it is simulated as written with 14 colours.

2026-10-16 00:20 +13:00 · 07a0951e22aba7e4e0d2a2c99bf8382a54235da0 (dirty tree) · observation

Pilot v1 (288 specs, development bases only, seeds 2026101570001..04, sampler dumps/pilot 536870912 4096 64 32768-34816,131072-139264, kept as results/pilot_*_v1.* and dumps/pilot_v1). Its launch statistic was Pr(an interior episode of >= 64 states begins within 64 steps of a fresh cell): 0.38 per discovery, with left = 1.000. Both are artefacts: consecutive fresh cells share one episode, so windows overlap and the same episode is counted for many discoveries; left is trivially 1 because the ant leaves the boundary within 64 steps of every discovery.

2026-10-16 00:20 +13:00 · 07a0951e22aba7e4e0d2a2c99bf8382a54235da0 (dirty tree) · deviation

README item 3 said to record "whether an interior episode lasts >=64 steps" after each fresh cell and treat overlapping records as correlated. Before registering, the primary kernel statistic is changed to a non-overlapping one: episodes (maximal interior runs) that begin in the band and last >= w states, per discovered cell, Lam_w, for w in {16, 64, 256, 1024}, plus tau_w = share of band time spent in episodes of >= w states. The per-discovery windows are kept as a secondary (forward/lateral displacement after 64 steps). Instrument extended and re-tested (11 tests pass, including an offline episode oracle and the identity tail_steps(w=1) = i_dep). Primary w = 256: episodes of >= 64 are only ~7% of discoveries yet carry 94-98% of band time, so 64 is not a rare-trap threshold, while 1024 leaves a few thousand events per arm; the pilot's association with the change in B/S rose with w (Spearman of d ln Lam_w with d ln B/S in band 0: -0.13, -0.22, -0.37, -0.52 for w = 16, 64, 256, 1024), so w = 256 is a compromise chosen on development-pilot data and 64 and 1024 are registered as secondaries. This choice used the development pilot, which is not a test. Pilot v2 (same specs, extended instrument) replaced v1 for all further analysis.

2026-10-16 00:20 +13:00 · 07a0951e22aba7e4e0d2a2c99bf8382a54235da0 (dirty tree) · observation

Pilot v2 results (results/pilot_stats.txt, pilot_pairs.csv; 288 specs, 2.1 s median / 3.3 s mean per spec, 962 CPU-s). 252 complete, 16 hit the 2^29 cap, 20 escaped. Valid (band reached, no short open episode) fraction by arm: base 1.00, late mutants 0.95/0.92 (bands 0/1), early 0.80/0.75, position-0 0.96/0.92: early mutants fail to attain more often. Base-arm pooled B/S 0.0216 and 0.0077, kappa_end 0.86 and 0.59 (census-like). Time budget: episodes lasting >= 1024 states are 1.5% of discoveries and 82-94% of band time. Between-seed sd of ln(B/S) within a rule: 0.53 (band 0), 0.65 (band 1); sd of the half-difference of two disjoint 2-seed means 0.56 and 0.55, consistent with iid seeds. So the paired effect of 4 seeds per side has se ~0.46: the pilot's median |d ln B/S| (early 0.41-0.54, late 0.26-0.29) is largely noise (late is at or below the null median 0.31 for band 1). With 32 target seeds per arm se falls to 0.13 (band 0) / 0.16 (band 1). Exposure: the share of reads of a colour is ~1/n for every colour (ln share -2.4..-2.7), so total exposure carries almost no information beyond n; what varies is where the colour is read: boundary share of reads (Spearman with position -0.92, R^2 0.35) and mean depth class of reads (R^2 on position 0.33-0.44; 53-56% of early values lie in the late range). Exposure is strongly but not wholly collinear with position, as the advisor-style prior suggested; P2 is identifiable only if the overlap gate in the registration is met on the confirmation data.

2026-10-16 00:20 +13:00 · 07a0951e22aba7e4e0d2a2c99bf8382a54235da0 (dirty tree) · decision

Seeds per (base, arm) raised from the README's draft 16 to 64 (32 prediction + 32 target): the pilot noise requires it, and cost permits it (9216 confirmation specs ~ 8.5 CPU-hours at the pilot's 3.3 s mean). Position 0 is excluded from the early pool (README draft said indices 0..7): it is read at every fresh cell and flipping it mirrors the rest of the rule; it is run as a separate descriptive anchor. Predictors come from the base run or from seed-disjoint runs (prediction seeds), never from the target seeds. Mutants are not canonicalised.

2026-10-16 00:20 +13:00 · 07a0951e22aba7e4e0d2a2c99bf8382a54235da0 (dirty tree) · observation

Reproducibility checks on the sampler (24 pilot specs): output of a 1-thread uninterrupted run is byte-identical to a run started with 3 threads on 10 specs and resumed with 6 threads (10 specs skipped via .done), 144 files compared, and also identical to the corresponding files of the 6-thread pilot run. The scripts' dry run of confirm_analyse.py on pilot data (2 prediction + 2 target seeds, validation replaced by development, stdout only, nothing saved) exercised every code path without error; its numbers are mechanics, not results.

2026-10-16 01:15 +13:00 · 997c9b2da6efa526fc6c5a57104d103e1345e916 (dirty tree) · decision

Arms revised after the concurrent W6 matched-area reanalysis (3d00123): positions 1 and 2 for every base, one mid (3..7), two late, position-0 anchor; pilot v2 (old arms) superseded by pilot v3 (336 specs; sd of ln B/S 0.533/0.700 frozen as S_POOL). Registration appended to README, hashes in results/registration_hashes.txt, handover in HANDOVER.md. Full release test suite ran with no failures in the log. No confirmation run done; session ended here at the user's request.

2026-10-16 00:06 +13:00 · 997c9b2da6efa526fc6c5a57104d103e1345e916 (dirty tree) · intent

Session resumed to continue the experiment. Found the registered confirmation already running (scripts/run_confirm.sh, launched 00:03:33, 3 threads, dev then val chained; ~220 of 5376 dev specs done at 00:05). Nothing to change: no code or registration edits. Plan: wait for results/confirm_run.finished, then run confirm_analyse.py once, check gates in order (G1, G2, G3), and report all P1-P5 outcomes in the README, this notebook and notebook.ipynb, whatever they are.

2026-10-16 00:00 +13:00 · 997c9b2da6efa526fc6c5a57104d103e1345e916 (dirty tree) · intent

Session goal: take the experiment from pilot to its confirmation run, with at most 3 threads (other agents share the machine). README had no frozen registration despite the v2 notebook entries saying predictions would be frozen (confirm_analyse.py cites a README "Registration" that did not exist). So the first step is to register, before any confirmation spec runs.

2026-10-16 00:08 +13:00 · 997c9b2da6efa526fc6c5a57104d103e1345e916 (dirty tree) · decision

Registration appended to README (P1, P2, P3 position gradient, P4 descriptive, P5 sign-mixed kappa from W6m; gates G1-G3; seeds, hashes, commands). Corrections to the earlier notebook: the actual spec count is 10752 (7 arms including the position-0 anchor x 24 bases x 64 seeds), not 9216; at the pilot's mean 3.3 s this is about 9.9 CPU-hours. Pilot stats for the final arm set were not regenerated (dumps/pilot is 259/336 specs complete; the quoted pilot numbers are from the old-arms run, pos 0 included in the early pool). I added to confirm_analyse.py: a requirement that the development slope of y on x_lnLam256 be negative for the P1 verdict, and the P5 block. Another process edited the same script at 00:03:06 (added P3 and P4 blocks); I adopted these and registered them in an addendum, because no outcome had been read. Launch at 00:03:33 preceded the 00:05 stamp in the README by about a minute; flagged in the addendum.

2026-10-16 00:10 +13:00 · 997c9b2da6efa526fc6c5a57104d103e1345e916 (dirty tree) · observation

Confirmation running: scripts/run_confirm.sh (3 rayon threads, dev specs then val specs, logs results/confirm_run_{dev,val}.log, finish marker results/confirm_run.finished). After ~3 min 254 dev specs were done. Machine load average was already about 3-6 from other agents, so expect it slower than the pilot.

2026-10-16 · 997c9b2da6efa526fc6c5a57104d103e1345e916 (dirty tree) · observation (design review; no confirmation outcome read)

External stat-phys design review (read-only, run while the confirmation was in progress, dev side ~1000/5376 specs; no outcomes read). The reviewer's claims were not independently verified except where noted. Findings, ranked:

  1. P2 as coded (confirm_analyse.py ~L149-168) regresses SIGNED y_lnbs on unsigned features (lead/mid dummies, mean depth, ln boundary share). With the sign-mixed effects the registration itself expects (P4/P5), both models should score held-out R^2 near or below 0, so delta-R^2 >= 0.10 is close to unreachable by construction. A P2 "fail" therefore does NOT support rejecting the exposure account; read it as uninformative-by-design. (I confirmed the code regresses signed y; the consequence is the reviewer's inference.)
  2. P1: Lam_w ~ 1.06 x Pr(T >= w) (pilot: ~1.06 episodes per discovered cell), so Y~X is partly rule-level accounting (a duration-scale change moves X without a launch-rate change). A P1 pass is predictive, not evidence of a launch mechanism. The pilot's rise of association with w (-0.13 -> -0.52) is what a scale change would also produce.
  3. P1 power is limited by the ~10 stationary bases per side: reviewer's ceiling R^2 <= ~0.68 rho^2, needing true rho >~ 0.53 against a pilot ~0.45 (disattenuated); G2 is a weak gate (expected ~0.75). Type I risk negligible.
  4. Survivorship differs by arm (valid 0.83-0.86 early/mid vs 0.92 late); dropped runs (cap hits, open episodes) are the long-excursion ones.
  5. Estimator details: resolution threshold may be lenient for pairs with 16-31 valid runs; sign agreement leans on the dev intercept when X is small; R^2 is against the dev mean; P3's denominator is near pure noise so the ratio mostly measures lead signal over noise; a percentile bootstrap over ~10 bases under-covers.
  6. Provenance (checked by me): README has two Registration sections that disagree (S_POOL 0.528/0.649 vs 0.533/0.700; the code uses 0.533/0.700; confidence 30% vs 45%; P5 defined in both). The registered script hash 971f6570... (first section) differs from confirm_run.json/registration_hashes.txt 458c8eaf..., and the script on disk now hashes to fcae4442... i.e. it was edited again AFTER launch. The 458c8eaf version no longer exists on disk, so I cannot diff it; the README addendum says the later edit was a P5 rename only, which I cannot verify. Governing statement: the analysis is the on-disk script at run time; its hash will be written to confirm_analysis.json; any difference in numbers from the pre-run version is unresolved.

decision: no change to the registered analysis, the running job or the specs. Added scripts/confirm_exploratory.py (unregistered; E1 P2 on |Y| and with flip direction, E2 Lam association across w, E3 survivorship, E4 empirical noise vs S_POOL, E5 sign/R^2 variants and band-0 P1, E6 noise-corrected P3), to be run only after confirm_analyse.py and reported in a section labelled exploratory. Mechanics tested on synthetic pairs (scratch/, gitignored) only. Follow-ups for a new experiment, not this one: >= 30 bases, a rule-only prediction of Lam change, a survival model separating launch amplitude from duration scale, an intervention that changes the fresh-cell kernel without flipping a letter.

2026-10-16 03:49 +13:00 · 269288eb62bf6b6ec125a3b420dd899057858be5 (dirty tree) · observation

Confirmation finished (10752 specs, 3 threads, about 3.7 h wall with other agents sharing the machine; no resume was needed, .done for all). Registered analysis run: P1 FAILED (held-out R^2 0.105 vs 0.20, CI [-0.21, 0.32], 20 resolved, agreement 75%); P2 FAILED on its interval bar (delta R^2 +0.215, CI [-0.002, 0.281]); P3 HELD (ratio 9.0, CI [1.27, 27.6]); P4 6/11 positive; P5 HELD (share positive 0.47, mean -0.11 vs median abs 0.33). Gates: 10 informative validation bases, reliability Spearman 0.97, P2 identifiable. Stops: dev 192 cap / 321 escaped, val 497 cap / 323 escaped.

2026-10-16 03:55 +13:00 · 269288eb62bf6b6ec125a3b420dd899057858be5 (dirty tree) · interpretation

The position effect is real and sign-mixed on fresh mutants; the launch-rate (Lam_256) account of it is not supported at the bar, and the exposure-vs-position question is inconclusive (point estimate favours exposure, interval touches 0 with 10 bases). Selection caveat: late validation mutants hit the cap more often (valid 0.73 vs dev 0.93) so attained late pairs may be biased towards easy cases. The sign of the Lam slope is negative as the pilot suggested, but weak.

2026-10-16 03:55 +13:00 · 269288eb62bf6b6ec125a3b420dd899057858be5 (dirty tree) · deviation

(1) The analysis script's hash at analysis time (fcae4442...) differs from the one in confirm_run.json (458c8eaf...) and from my P5 rename; the file was touched by another process during the run. I did not diff it against the registered logic beyond reading the P1-P5 blocks, which match the README. (2) Launch preceded the stated registration stamp by about a minute (addendum). (3) Pilot stats for the final arm set were never regenerated. notebook.ipynb updated and executed from a clean kernel; it reads results/confirm_analysis.json only.

2026-10-15-kappa-prefix-exposure · Source revision ba38590b33e3

Original source ↗ · Input hashes

Introductions summarize the evidence; the expandable record preserves the original predictions, methods and caveats. Figures and notebooks are published as saved. Publication runs no simulations or notebook cells.