Field notes / Experiment guide
Is the predictive part of the rule at its start?
Is the information about kappa specific to the first letters of a rule, or would the last letters or simple letter counts do as well?
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
Registered: the first eight letters predict held-out kappa well (within 0.1 of an earlier 0.63); the last eight and composition do not.
What we learned
All four registered predictions held: held-out R^2 is +0.62 for the first eight letters, -0.11 for the last eight and +0.08 for composition, which adds nothing to the prefix.
What this leaves open
The prefix lookup is a family-membership predictor and families overlap between training and test; the unexplained third of the spread is not reached.
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
What carries the rule-determined spread of ln kappa? Prefix vs suffix vs composition (2026-10-20)
Question
../2026-10-20-kappa-spread-budget/ found that the first eight rule letters predict about half of the variance of ln kappa
(held-out R^2 0.55-0.63 on rule means) and that about a third is rule-determined but unexplained. Is the predictable part
specific to the start of the rule string (consistent with the lead-run / early-evolution story), or would other string
summaries do as well (end of the string, letter composition)?
Design (registered before running, 2026-10-20 03:10 +13:00, git 91a2243)
- Train: census rules in
../2026-10-13-probe-growth-census/results/probe_summary.csv, blob class,kappa > 0,|g_k| < 0.05(stationary), ln kappa as target. Test: the fresh stationary rules (13-14 letters, 162) with ln kappatargetfrom../2026-10-kappa-rule-space/results/prefix_audit_predictions.csv(one row per rule, cohortstationary, encodingloo, arealinear). Train and test are disjoint by rule. The training filter approximates the audit's (2183 rules there); the exact count is reported. - Models (all area-free, rule string only; strict held-out R^2 against the training mean, as in W3c):
- P8: mean of ln kappa over training rules sharing the first 8 letters, falling back to shorter prefixes with >= 3 rules (the W3c lookup).
- S8: same with the last 8 letters (suffix), same fallback.
- C: ordinary least squares on composition: length, count of R, number of runs, longest run of L, longest run of R.
- P8+C: P8 prediction plus C as a second regressor (OLS on training predictions made leave-one-out within training).
- Uncertainty: bootstrap over test rules, 2000 resamples, seed 20261020.
Predictions (written before the run)
- F1: P8 test R^2 is within 0.1 of the W3c value 0.633 (the training cohort differs slightly).
- F2: S8 test R^2 is at least 0.2 below P8 (the predictable part is specific to the start of the string).
- F3: C test R^2 < 0.2.
- F4: P8+C improves on P8 by less than 0.05 (composition adds nothing beyond the prefix).
Any of these failing is reported as failed. Choices made after seeing results will be labelled post hoc.
Results (results/features.txt; 2185 train rules, 162 test rules, 0 in both)
| model | strict held-out R^2 | 95% CI |
|---|---|---|
| P8 (first 8 letters) | +0.624 | [+0.486, +0.732] |
| S8 (last 8 letters) | -0.114 | [-0.298, +0.034] |
| C (composition) | +0.079 | [-0.052, +0.190] |
| P8 + C | +0.632 | [+0.499, +0.737] |
P8 - S8 = +0.739 [+0.571, +0.919]; (P8 + C) - P8 = +0.008 [-0.025, +0.043]. F1-F4 all HELD. Post hoc control (unregistered): leave-one-out inside the training set gives P8 +0.589 and S8 -0.065 (training lengths 3-12, test 13-14), so the suffix failure is not only a length-alignment artefact of the transfer.
Reading. The rule-determined, predictable part of ln kappa sits in the first eight letters. The last eight letters carry nothing measurable (even slightly negative), and simple composition (length, R count, run structure) adds nothing beyond the prefix. This is consistent with the lead-run / early-evolution picture, where the opening of the rule sets the regime, and is evidence against kappa being a bulk property of letter composition. It does not say which feature of the prefix matters (the prefix lookup is a family-membership predictor, see the paper's caveats), and prefix families overlap between train and test. It also does not explain the remaining unexplained third of the spread: the prefix, suffix and composition summaries tried here do not reach it. Not tested: middle letters, interactions beyond the group means, and any dynamical (non-string) predictor.
Reproduce
uv run experiments/2026-10-20-kappa-spread-features/scripts/features.py -> results/features.txt, results/features.json.
Analysis notebook: notebook.ipynb
1 saved outputs · 1 code cells. Cells are not executed during publication. Download notebook
Where in the rule string is the information about kappa?
Registered test (predictions F1-F4 committed before the run, see README). Train: 2185 stationary census rules; test: 162 fresh stationary rules (13-14 letters), disjoint. Models use the rule string only: lookup on the first 8 letters (P8), on the last 8 (S8), regression on composition (C), and P8 plus C. Score: strict held-out R^2 against the training mean.
Assumptions. Stationarity filter |g_k| < 0.05 is applied to both train and test (as in the W3c audit); the lookup falls back to shorter keys with at least 3 training rules.
Code
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-features/results/features.json").read_text())
print("inputs:", {k: v[:12] for k, v in d["input_sha256"].items()}, "train", d["n_train"], "test", d["n_test"], "overlap", d["overlap"])
for k, v in d["r2"].items():
lo, hi = d["ci"][k]
print(f"{k:5s} R^2 {v:+.3f} 95% CI [{lo:+.3f}, {hi:+.3f}]")
print(d["verdicts"])
assert d["overlap"] == 0 and all(d["verdicts"].values())
assert abs(d["r2"]["P8"] - 0.624) < 2e-3 and d["r2"]["S8"] < 0 and d["r2"]["C"] < 0.2
What this shows and does not show
- The predictable part of ln kappa is in the first eight letters (R^2 0.62). The last eight letters carry nothing measurable (-0.11; -0.07 in an unregistered leave-one-out control inside the training set), and composition (length, R count, run structure) adds nothing beyond the prefix (+0.008).
- Consistent with an early-evolution / lead-run picture; evidence against kappa being a bulk property of letter composition.
- Not shown: which prefix feature matters (the lookup is a family-membership predictor, and families overlap between train and test); what carries the remaining unexplained third of the spread (middle letters and interactions were not tested).
Next
A registered comparison of structural prefix features (lead length, second-run length) against the 8-letter group mean.
Read the dated lab log
Lab notebook: kappa spread features
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 03:10 (+13:00) · 91a2243 · intent
Test whether the rule-determined, predictable part of ln kappa is specific to the start of the rule string (prefix) or shared by the
end (suffix) and by letter composition. Design and predictions F1-F4 registered in README and committed (d5e0ff0) before scripts/features.py was written or run.
2026-10-20 03:20 (+13:00) · d5e0ff0 · observation
Ran features.py (seed 20261020, 2000 bootstraps). Train 2185 stationary blob census rules, test 162 fresh stationary rules, no overlap. Strict held-out R^2: P8 +0.624 [0.486, 0.732], S8 -0.114 [-0.298, 0.034], C +0.079 [-0.052, 0.190], P8+C +0.632. F1-F4 all held.
2026-10-20 03:25 (+13:00) · d5e0ff0 · deviation
Added an unregistered control to the script after seeing the S8 result: leave-one-out R^2 inside the training set, because training rules are length 3-12 and test rules 13-14, so S8 might fail only through length misalignment. Result P8 +0.589, S8 -0.065. Labelled POST HOC in the output and README.
2026-10-20 03:30 (+13:00) · d5e0ff0 · interpretation
The predictable part of ln kappa is carried by the first eight letters; the last eight and simple composition add nothing. Consistent with the lead-run / early-evolution picture; not evidence about which prefix feature matters, and the prefix lookup is a family-membership predictor with overlapping families across train and test. The unexplained third of the spread is not reached by any summary tried here.
2026-10-20 03:30 (+13:00) · d5e0ff0 · question
Which prefix feature matters (lead-run length, the first letters after the lead, position of the first L after it)? And is the unexplained third carried by middle letters or by interactions? A registered comparison of structural prefix features (lead length, second run length) against the 8-letter group mean would address the first.