← All experiments

Field notes / Experiment guide

How much of the spread of kappa is accounted for?

Boundary occupation varies a lot between rules. How much of that variance is start-to-start noise, how much can the rule opening predict, and how much is left?

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

A post hoc budget from earlier committed results can split the variance without new runs (not a registered test).

What we learned

About 0.15 of the variance is start noise, 0.47-0.54 is predicted by the first eight letters and 0.31-0.38 is rule-determined but unexplained.

What this leaves open

Three different cohorts feed the budget, no uncertainty is propagated (shares are rough to +-0.1), and the location of the kappa distribution is not addressed.

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

kappa spread budget (2026-10-20)

Status: post hoc synthesis. Every input value was seen before this was written; nothing here is a registered test. No new simulations.

Question

notes/ACTIVE.md / notes/open-questions-hypotheses.md ask why kappa/kappa_unif has median 0.81 and a 5-95% range of 0.44-1.33 over stationary blob rules. That is two questions: the spread and the location. This folder budgets the spread only.

Reframing

kappa_unif(a, beta) is rule-independent (1.105, sd ln 0.004; experiments/2026-10-16-kappa-uniform-baseline/results/census_spread.txt), so the spread of kappa/kappa_unif is the spread of ln kappa, sd 0.349 over 2185 stationary rules (variance 0.122). Predictors such as c, ln A(2^22), a, beta and fill are tied to kappa through the growth identity, and conditioning on area is the collider flagged in experiments/2026-10-19-c-law-mechanism/; the budget therefore uses only start-to-start noise and predictors read off the rule string (the prefix lookup).

Result (results/spread_budget.txt, .json)

Shares of the single-run variance of ln kappa (stationary cohort):

component share source
start-to-start noise (not rule-determined) 0.15 1 - ICC, ICC = 0.851, pool-192 patched starts (w2_stationarity.txt)
rule-determined, predicted by the first 8 letters 0.47 - 0.54 prefix-8 held-out R^2 0.552 (pool patched means, x2_prefix_heldout.txt) to 0.633 (fresh rules, strict, w3c_stats.txt), times the ICC
rule-determined, not predicted by the prefix 0.31 - 0.38 remainder

Absolute scale: noise sd 0.13, rule-mean sd 0.30, total sd 0.35.

What it does and does not show

  • About half of the spread is predictable from the first eight letters, about a third is rule-determined but not captured by the prefix, and about a sixth is start noise. The unexplained rule-determined part (sd about 0.2 in ln kappa) is where a mechanism for the spread would have to act.
  • Not shown: anything about the location (why about 0.8 x kappa_unif, below every walker reference). Open.
  • Caveats: three cohorts (census single runs, pool-192 patched starts, fresh 13-14 letter rules); the prefix R^2 is against rule-level means and is scaled by the ICC as if those means were noise-free; no uncertainty is propagated (shares are rough to about +-0.1); prefix families overlap between training and test, so this is transfer within families, not to unseen ones.

Reproduce

uv run experiments/2026-10-20-kappa-spread-budget/scripts/spread_budget.py (parses the committed result files; input sha256 in results/spread_budget.json). notebook.ipynb reads only results/spread_budget.json.

Analysis notebook: notebook.ipynb

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

How much of the spread of kappa is accounted for?

Status: post hoc synthesis, no new runs. The ratio kappa/kappa_unif has median 0.81 and a 5-95% range 0.44-1.33 over stationary blob rules. kappa_unif is rule-independent (sd ln 0.004), so its spread is the spread of ln kappa. This notebook budgets that spread into start-to-start noise, variance predicted by the first eight rule letters, and the rest. It does not address why the location is about 0.8 x kappa_unif.

Assumptions. Predictors tied to kappa by the growth identity (c, ln A22, a, beta, fill) are excluded; ln A22 is the collider found in the c-law Stage 4. The prefix R^2 is against rule-level means and is scaled by the ICC to a share of single-run variance (valid if those means are noise-free).

Code
In [1]:
import json
from pathlib import Path

root = next(p for p in [Path.cwd(), *Path.cwd().parents] if (p / "AGENTS.md").exists())
d = json.loads((root / "experiments/2026-10-20-kappa-spread-budget/results/spread_budget.json").read_text())
print("command:", d["provenance"]["command"])
for name, h in d["provenance"]["input_sha256"].items():
    print(h[:16], name)
command: uv run experiments/2026-10-20-kappa-spread-budget/scripts/spread_budget.py
ad7a062d72dd9390 experiments/2026-10-16-kappa-uniform-baseline/results/census_spread.txt
30b2c42476650971 experiments/2026-10-kappa-rule-space/results/w2_stationarity.txt
13f993ec0598cf76 experiments/2026-10-kappa-rule-space/results/x2_prefix_heldout.txt
c2dc0e8cf016a69a experiments/2026-10-kappa-rule-space/results/w3c_stats.txt
Code
In [2]:
print(f"total sd ln kappa {d['sd_ln_kappa_census_stationary']:.3f} (n={d['n_census']}, variance {d['var_total']:.4f})")
print(f"start noise share {d['noise_share']:.3f} (ICC {d['icc_pool_stationary']:.3f}); noise sd {d['noise_sd']:.3f}, rule-mean sd {d['rule_mean_sd']:.3f}")
print()
print(f"{'prefix-8 R^2 source':26s} {'R^2':>6s} {'prefix':>7s} {'rule, unexplained':>18s} {'noise':>6s}")
for label, r in d["budget"].items():
    print(f"{label:26s} {r['r2_prefix8']:6.3f} {r['explained_of_total']:7.2f} {r['rule_unexplained_of_total']:18.2f} {r['noise_of_total']:6.2f}")

# agreement with README / results text
assert abs(d["sd_ln_kappa_census_stationary"] - 0.349) < 1e-3
assert abs(d["noise_share"] - 0.149) < 1e-3
b = d["budget"]
for r in b.values():
    assert abs(r["explained_of_total"] + r["rule_unexplained_of_total"] + r["noise_of_total"] - 1) < 1e-9
assert 0.46 < min(r["explained_of_total"] for r in b.values()) and max(r["explained_of_total"] for r in b.values()) < 0.55
total sd ln kappa 0.349 (n=2185, variance 0.1218)
start noise share 0.149 (ICC 0.851); noise sd 0.126, rule-mean sd 0.302

prefix-8 R^2 source           R^2  prefix  rule, unexplained  noise
pool patched means          0.552    0.47               0.38   0.15
fresh rules, strict         0.633    0.54               0.31   0.15

What this shows and does not show

  • About half the variance of ln kappa is predictable from the first eight letters, about a third is rule-determined but not captured by the prefix, and about a sixth is start-to-start noise.
  • The unexplained rule-determined part has sd about 0.2 in ln kappa; a mechanism for the spread would have to act there.
  • Not shown: the location (median about 0.8 x kappa_unif, below every walker reference), or a mechanism for any part.

Caveats

Three different cohorts (census single runs, pool-192 patched starts, fresh 13-14 letter rules); no uncertainty is propagated (shares are rough to about +-0.1); prefix families overlap between training and test, so this is transfer within families, not to unseen ones.

Next

A registered held-out comparison of prefix, suffix and composition features on the fresh rules, to say what the unexplained third consists of.

Read the dated lab log

Lab notebook: kappa spread budget

Append-only. Newest entry last. Never edit an old entry; correct it with a new one (corrects: <timestamp>). Tags: intent, assumption, observation, interpretation, surprise, decision, dead-end, question, deviation. See experiments/README.md.

2026-10-20 02:40 (+13:00) · 89ade3c · intent

Take the ACTIVE.md item 'kappa/kappa_unif distribution' (median 0.81, sd ln 0.35) and answer the part that needs no new runs: a variance budget of the spread. Registered as a post hoc synthesis because all input headline values were already known (listed in README). No prediction is registered, none is claimed.

2026-10-20 02:40 (+13:00) · 89ade3c · assumption

(1) kappa_unif is rule-independent, so the spread of kappa/kappa_unif is the spread of ln kappa (checked: sd ln 0.004 in census_spread.txt). (2) c, ln A22, a, beta and fill are excluded as predictors: tied to kappa through the growth identity, and ln A22 is the collider of the c-law Stage 4. (3) The prefix R^2 is against rule-level means, so multiplying by the ICC converts it to a share of single-run variance; this is only valid if those means are noise-free. Status: (1) checked, (2) a design choice, (3) untested (the pool means average about 12 starts, so the bias is small and conservative).

2026-10-20 02:45 (+13:00) · 89ade3c · observation

scripts/spread_budget.py -> results/spread_budget.txt. Total sd ln kappa 0.349 (census stationary, n=2185); ICC 0.851 (pool-192 stationary patched starts, sd 0.327), so start noise is 15% of variance (sd 0.126). Prefix-8 held-out R^2 0.552 (pool means) or 0.633 (fresh, strict): prefix-predictable 0.47-0.54, rule-determined but unexplained 0.31-0.38 of single-run variance.

2026-10-20 02:50 (+13:00) · 89ade3c · interpretation

Roughly half of the spread is predictable from the first eight rule letters, a third is rule-determined and unexplained, a sixth is start noise. The unexplained rule-determined sd is about 0.2 in ln kappa. Only the spread is budgeted; the location (about 0.8 x kappa_unif) is untouched and stays open. Caveats: three cohorts, no propagated uncertainty (shares rough to +-0.1), prefix families overlap train and test.

2026-10-20 02:50 (+13:00) · 89ade3c · question

Which letters or structural features carry the unexplained third? A held-out comparison of prefix, suffix and whole-string composition features on the fresh rules, registered before running, would be the next step (needs the per-rule fresh data and new analysis; not done).

2026-10-20-kappa-spread-budget · 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.