Field notes / Experiment guide
Long interior trips, with territory size fixed by design
Does the connection between extreme interior excursions and boundary occupation survive comparing ants at the same visited area?
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.
A closer look

The idea under test
Excursion-tail information measured on separate seeds should improve prediction beyond boundary residence and perimeter geometry.
What we learned
The larger-area association and held-out predictive improvement persist. The primary small-area correlation criterion fails; a narrower-band sensitivity does not erase that failure.
What this leaves open
This selected cohort supports an association, not causality. Full all-seed thread replay was not performed, and an earlier noise-floor failure remains.
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
Fixed-area sampling with cycle accounting
Current status: production, registered analysis and executed notebook complete. P1 fails the registered both-band criterion; secondary P2 passes at both bands. The original scaffold description below is historical; the dated pilot and frozen registration at the end supersede its draft parameters. See NOTEBOOK.md for the continuation log.
Original scaffold (historical)
Created 2026-10-15 21:27 +13:00 at base da88e61 (dirty workspace).
User requested a directory, files and research plan for a fresh agent.
Start here
Read HANDOFF.md, then PLAN.md and
SCHEMA.md. Candidate parameters are in config.draft.json.
The next agent should implement and calibrate the instrument, then freeze a
dated preregistration here before inspecting ant outcomes. This scaffold
does not implement the sampler or launch jobs.
Question
At comparable visited area, does the extreme interior-excursion tail predict boundary activity across rules? If so, is the difference carried by interior return time rather than boundary residence time?
Motivation: research avenues, independent-area test, earlier excursion audit, matched-area noise-floor failure. The previous association is a lead, not evidence of causality. Its failed noise-floor gate remains failed.
Proposed predictions — NOT frozen
- At each prespecified area band, rule-mean ln kappa is negatively associated with the exact completed-excursion 99.9th percentile, using disjoint seed groups for predictors and outcomes. Candidate success bar: Spearman <= -0.30 with rule-bootstrap upper 95% bound <0 at both primary bands. Quantile reliability and censoring must pass a pilot gate first; otherwise this prediction is not testable with the proposed budget.
- A model using interior tail burden improves prediction of independent-seed boundary occupancy beyond size, geometry and boundary residence. Candidate bar: rule-held-out R² gain >=0.10 with bootstrap lower bound >0. Explicit features, folds, baseline and training-mean R² definition must be frozen first. Exact accounting on the same trajectories does not test this claim.
- Complete episodes plus clipped fragments reconstruct every step exactly; this is an instrument acceptance condition, not a scientific discovery.
Commands available now
All toolchains run in WSL, from /mnt/f/Code/turmite:
export UV_PROJECT_ENVIRONMENT=$HOME/.venvs/turmite UV_LINK_MODE=copy
uv run experiments/2026-10-15-fixed-area-cycles/scripts/preflight.py
This validates the scaffold, resolves source paths and prints hashes. It runs no simulation and writes no results. See HANDOFF for future build/test commands.
Output and reproducibility contract
Scripts locate the repository via Path(__file__).resolve().parents[3] and
write only inside this experiment. Bulk episodes/checkpoints go in dumps/
or scratch/; small summaries, run manifests and completion markers go in
results/. Do not hand-edit generated results. Deterministic rule/seed order,
explicit RNG seeds, input/config/source hashes and exact commands are required.
Only completed, verified per-run outputs receive .done markers. Resume must
check hashes and parameters before skipping work. Never silently reuse results
from a different config. No new dependencies are proposed.
Results / status
No scientific results. notebook.ipynb is a shareable scaffold that runs with
standard-library Python, reports provenance and explicitly reports missing
results. Fill it from small committed summaries after the experiment runs.
No Rust source, existing results or dependency locks changed by scaffolding.
Scaffold verification
scripts/preflight.py passed under uv/WSL. The notebook was built from
experiments/_template/notebook.ipynb using scripts/make_notebook.py, then
executed successfully from a clean kernel with the nbconvert command in HANDOFF.
It explicitly reports NOT RUN. The generator refuses to overwrite an existing
notebook. No scientific simulations were run; release tests are required when
the sampler is implemented. The prior session's release tests passed, but do
not validate this unimplemented instrument.
Pilot protocol (registered 2026-10-15 21:48 (+13:00), da88e61; BEFORE the pilot ran)
Scope: feasibility only. 44 cohort rules (results/cohort_rules.txt) x seeds 701..704, plus rotor:701..704 and rw:701..704; bands [32768,34816) and [131072,139264) (1/16 width) and a sensitivity run with 1/8-width bands [32768,36864), [131072,147456); grid 8192, cap 2^28, RAYON_NUM_THREADS=4. Seed-reuse check: no use of seeds 701..716 in prior specs found by grep of experiments/ (2026-10-15).
Reported per spec x band: status, t at band end, steps, complete-contained I counts, complete-I share of band steps, clipped fragments (count, max), q99.9 and its rank position n*0.001, plus wall time and peak RSS. NOT computed in the pilot: any relation between tail/L999 and kappa/f_B across rules.
Gates frozen now (revisions only by dated deviation):
- G-budget: every pilot run must reach tau(hi) of the last band with t_final <= 2^28/4, else cap/grid are revised before production.
- G-escape: no escaped runs; peak RSS per job <= 400 MB (concurrency 4-6 allowed).
- G-quantile (unit = rule x band x seed-group): >= 10,000 complete-contained I episodes (>=10 observations beyond q99.9). Seeds per group derived from the pilot as in the NOTEBOOK decision.
- G-censor: (largest clipped I fragment + clipped I steps)/ (band I steps) <= 0.10 per spec x band.
- G-bias: rotor and rw controls have to satisfy the exact accounting identities (fresh_from_interior = 0, B+I = steps) and the pilot runs from 1 and default thread count must agree byte-for-byte (determinism). Failure of any gate is reported as such; no rule or seed is dropped from the denominator.
Registration (frozen 2026-10-15 21:58 (+13:00), da88e61; BEFORE any production ant run)
Everything below is in config.frozen.json (sha256 4bf1215ccd2275dc413e95c4434bf2b4d7de03ea784550d4b267fe4e4107fc1a, also in results/config.frozen.sha256). Pilot and controls are done (results/pilot_feasibility.txt, results/controls.txt; summary in NOTEBOOK). No ant tail-vs-kappa association has been computed by anyone in this experiment.
Design: 44 cohort rules x 64 fresh seeds 1001..1064 = 4 disjoint groups A,B,C,D of 16; primary bands [32768,34816), [131072,139264); grid 8192; cap 2^29; 1/8-width bands are a sensitivity run only. Per rule x band x group: ln q999 = ln of the nearest-rank 99.9th percentile of the pooled complete-contained I durations; ln kappa_time = mean over the group's 16 seeds of ln(f_B / PA_time).
- P1 (primary): statistic = mean of Spearman(ln q999 from A, ln kappa from C) and Spearman(ln q999 from B, ln kappa from D) over the 44 rules. Predicted sign negative. Success: statistic <= -0.30 and its rule-bootstrap (2000 draws, seed 20261016, rules resampled with all groups and both bands) 95% percentile upper bound < 0, at BOTH bands (intersection-union, so no multiplicity adjustment).
- P2 (secondary): leave-one-rule-out OLS; baseline features ln mean complete-B duration and ln PA_time; added feature ln q999; R2_cv = 1 - sum(y - yhat_loo)^2 / sum(y - ybar_loo)^2; rotations (tail A, baseline B, outcome C) and (tail B, baseline D, outcome A); success: mean gain >= 0.10 with bootstrap lower bound > 0 at both bands.
- G-reliab: Spearman(ln q999 A vs B) >= 0.5 and Spearman(ln kappa C vs D) >= 0.5 at each band; if it fails P1/P2 are reported as untestable at this precision (numbers still shown).
- P3 (instrument): fresh_from_interior = 0, B+I = steps, fragments + complete episodes partition B and I, and byte-identical output across thread counts, on all production runs.
- Gates G-budget, G-escape, G-quantile (>=10,000 complete I episodes per rule x band x group), G-censor as in the Pilot protocol; failures are reported, nothing is dropped.
- Additional descriptive (not tests, no thresholds): kappa_end instead of kappa_time; 1/8-width bands; within-rule between-group sd; completed-only vs clipped shares. Revisions only by dated deviation in NOTEBOOK.md.
Primary results — 2026-10-15, session 3
All 44 rules x 64 seeds = 2816 primary runs completed, with both bands reached; max final time 78,900,629 < cap/4. Every saved band's B/I accounting, duration count/sum, histogram totals and exact area endpoints pass the payload audit. No interior time was clipped. Minimum pooled complete-I counts per group are 16,469 and 65,701 (bands 0/1), above 10,000. Reliability gates pass: q999 A/B Spearman 0.613/0.969, kappa C/D 0.964/0.954.
| Registered test | Area 32768 band | Area 131072 band | Both-band verdict |
|---|---|---|---|
| P1 mean cross-seed Spearman | -0.285; 95% CI [-0.558,-0.005] | -0.814; [-0.908,-0.665] | FAIL: smaller-area statistic misses <= -0.30 |
| P2 held-out R2 gain | +0.336; [0.115,0.578] | +0.544; [0.316,0.822] | PASS (secondary) |
These are rule-bootstrap percentile intervals (2000 draws, seed 20261016).
For P2, the registered bootstrap resamples fixed held-out squared-error terms;
it does not refit models and therefore conditions on the fitted training sets.
Per-seed kappa sample sd and within-rule group dispersion are in
results/rule_summary.prod16.csv and results/analysis.prod16.json.
P2 baseline/full R2 by rotation are 0.197/0.514 and 0.130/0.486 (smaller area),
0.152/0.684 and 0.162/0.720 (larger area).
Interpretation: the extreme cutoff adds predictive information beyond the registered boundary-residence/P-A baseline in this selected cohort. The primary prediction nevertheless fails; neither rounding nor the larger-area result rescues its both-band rule. This does not establish a causal mechanism, a direct tail-time-budget explanation, or generalisation to new rules. Fixed area leaves shape, age and colour-field differences uncontrolled.
Correction to the earlier control interpretation: a fresh arrival can fill an
interior hole, so first area hits are not guaranteed to be boundary states.
The zero observed I clipping is empirical, and the censor gate remains necessary.
The hand-worked hole case is now in tests/fixed_area.rs.
Reproduce from the WSL repo root, with
export UV_PROJECT_ENVIRONMENT=$HOME/.venvs/turmite UV_LINK_MODE=copy:
bash experiments/2026-10-15-fixed-area-cycles/scripts/run_production.sh
uv run experiments/2026-10-15-fixed-area-cycles/scripts/check_determinism.py
uv run experiments/2026-10-15-fixed-area-cycles/scripts/audit.py
uv run experiments/2026-10-15-fixed-area-cycles/scripts/analyse.py
uv run experiments/2026-10-15-fixed-area-cycles/scripts/check_analysis.py
uv run experiments/2026-10-15-fixed-area-cycles/scripts/check_loader.py
uv run experiments/2026-10-15-fixed-area-cycles/scripts/figures.py
uv run experiments/2026-10-15-fixed-area-cycles/scripts/results_notebook.py
uv run --with nbconvert --with ipykernel --with nbformat jupyter nbconvert --to notebook --execute --inplace experiments/2026-10-15-fixed-area-cycles/notebook.ipynb
cargo test --release
The completed-primary interim audit/analysis used --run prod16; final combined
files are produced by the default commands above. scripts/finish.sh waits for
production and the determinism sample, then runs the final pipeline. It does
not start production. results/release_tests.log, release_tests_hole.log and
analysis_checks.log record successful validation. No dependencies changed.
Dirty base commit: da88e61b690507526ba4e2a2c017d9c7941beb91. No commit made.
Reproducibility limits: resume is per finished trajectory with parameter-only markers, not a source-hashed walker checkpoint. The continuation leaves sampler source unchanged; post-run hashes record checked payloads and current sources. The one-thread production replay covers one of 64 seeds per rule at both widths; it cannot establish P3's full all-production determinism clause.
Width sensitivity and final validation — 2026-10-15
All 2816 sensitivity runs completed; max final time 86,613,887 < cap/4. All accounting/coverage gates pass, zero clipped I, minimum pooled I counts 33,089/131,429. Reliability q A/B = 0.756/0.975, kappa C/D = 0.969/0.965.
| 1/8-width sensitivity | Area 32768 band | Area 131072 band |
|---|---|---|
| P1 mean cross-seed Spearman | -0.417; 95% CI [-0.651,-0.132] | -0.815; [-0.905,-0.661] |
| P2 held-out R2 gain | +0.488; [0.219,0.767] | +0.530; [0.300,0.777] |
Both sensitivity predictions pass their numerical and statistical gates. These reuse the same rules/seeds and do not rescue the primary P1 failure. The weaker small-area association is sensitive to band width; these data alone do not separate greater event counts from the changed sampling ensemble. No post-hoc retuning was performed. The larger-area association and P2 prediction persist.
Final outputs: analysis, machine-readable analysis, rule/group summaries, payload audit, thread replay, figure, and executed notebook. The final primary statistical results exactly match the original-loader interim primary results. Figure visually checked; notebook executes without error outputs (results/notebook.log).
All 5632 production runs / 11264 band rows pass accounting. The one-thread determinism sample passes for 88 specs / 440 files. P3 is only partially validated: full all-seed thread replay is not done. Release tests pass, including 13 fixed-area tests; synthetic numerical checks pass. The earlier noise-floor failure remains failed. No causal conclusion is warranted.
Provenance: initial base da88e61; shared-workspace HEAD advanced externally to 4529f86 during the combined audit and then 275c2af before final analysis/notebook. This continuation issued no commit command. Each output records its observed commit and hashes; sampler sources were unchanged during the continuation. See NOTEBOOK's provenance correction rather than treating these as distinct simulation batches. New report files remain for the user's next commit.
Analysis notebook: notebook.ipynb
5 saved outputs · 5 code cells. Cells are not executed during publication. Download notebook
Fixed-area cycles: registered confirmation
Question and why it matters
Does the extreme interior-excursion tail predict boundary activity when visited area is fixed by design? Does it add held-out information beyond boundary residence and perimeter/area? See registration and results, lab notebook, and research context.
Assumptions and definitions
The selected 44-rule T1b cohort is not representative of all chaotic rules. Patched starts use radius 2. State t follows t moves; B means the current visited cell has an unvisited four-neighbour. Bands contain departures between first hits of the registered areas. Boundary labels change with the visited region. Quantiles pool complete-contained I episodes across 16 seeds; kappa_time is boundary fraction divided by time-averaged P/A. Seed groups A/B predict C/D in the primary test. Reliability is checked rather than assumed.
Provenance
All inputs below are small files under results/. No dumps are read. Files are currently uncommitted; commit only on user request.
Code
from pathlib import Path
import csv, datetime, hashlib, json, subprocess
SEED = 20261016
ROOT = next(p for p in [Path.cwd(), *Path.cwd().parents]
if (p / 'Cargo.toml').exists() and (p / 'experiments').is_dir())
EXP = ROOT / 'experiments/2026-10-15-fixed-area-cycles'
names = ['analysis.json', 'rule_summary.csv', 'audit.json', 'determinism.json',
'cohort_rules.txt', 'controls_summary.csv', 'controls.txt', 'pilot_feasibility.txt',
'association.png', 'association.json']
print('git', subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=ROOT, text=True).strip())
print('UTC', datetime.datetime.now(datetime.timezone.utc).isoformat(), 'bootstrap seed', SEED)
for name in names:
p = EXP / 'results' / name
print(p.relative_to(ROOT), hashlib.sha256(p.read_bytes()).hexdigest())
analysis = json.loads((EXP / 'results/analysis.json').read_text())
audit = json.loads((EXP / 'results/audit.json').read_text())
det = json.loads((EXP / 'results/determinism.json').read_text())
assert analysis['bootstrap']['seed'] == SEED
print('Frozen config SHA256:', analysis['config_sha256'])
Data and method
Production uses 44 rules × 64 seeds (1001–1064), split into four groups of 16.
Primary bands are [32768,34816) and [131072,139264); 1/8-width bands reuse the
same seeds as a sensitivity analysis. Grid 8192, cap 2^29. The sampler,
scripts/audit.py, and scripts/analyse.py do the heavy work.
P1 averages two independent-seed Spearman correlations. P2 compares OLS with
and without ln q999 in leave-one-rule-out prediction of ln kappa; its baseline
uses ln mean B duration and ln P/A from disjoint seeds. Bootstrap uses 2000 rule
resamples; P2 resamples fixed per-rule held-out errors rather than refitting.
Both area bands must pass each prediction's threshold.
Results
Coverage and accounting first; no failed run or rule is dropped.
Code
for run in ['prod16', 'prod8']:
print(run, audit['runs'][run])
print('quantile minimum pooled counts:', analysis[run]['g_quantile_min_pooled_n'])
print('max final time:', analysis[run]['checks']['max_t_final'],
'budget gate:', analysis[run]['checks']['g_budget_ok'])
print('Determinism check:', det['scope'])
print(det['runs'])
These checks test coverage and conservation. Accounting identities do not establish an excursion mechanism, and the production thread replay covers one seed per rule.
Code
for run in ['prod16', 'prod8']:
print('\n', run)
for band in [0, 1]:
b = analysis[run][f'band{band}']
p1, p2 = b['P1'], b['P2']
print(f"band {band}: reliability q={b['rel_lnq999_AB']:.3f}, kappa={b['rel_lnk_CD']:.3f}, gate={b['g_reliab_ok']}")
print(f" P1 rho={p1['statistic']:.3f}, CI={p1['ci95']}, numerical threshold={p1['success']}")
print(f" P2 R2 gain={p2['gain']:.3f}, CI={p2['ci95']}, numerical threshold={p2['success']}")
print(' baseline/full R2 per rotation:', p2['r2_cv_baseline_full_per_rotation'])
print('Statistically testable:', analysis[run]['statistically_testable'])
print('P1 both bands:', analysis[run]['P1_overall_success'],
'P2 both bands:', analysis[run]['P2_overall_success'])
The registered tests assess an association and incremental prediction in this cohort. Even a pass would not demonstrate causality; a failed reliability gate makes the predictions untestable at the achieved precision.
Code
from IPython.display import Image, display
display(Image(filename=str(EXP / 'results/association.png')))
Each panel shows 44 rules twice, using disjoint seed rotations; the dots are not 88 independent rules. The plot shows the registered association and does not control field geometry or demonstrate tail causality.
The primary both-band verdict is P1 FAIL and secondary P2 PASS. P1 correlations are -0.285 and -0.814; its required cutoff is <= -0.30 at both bands. P2 held-out R2 gains are 0.336 and 0.544. The smaller-area primary association cannot be rescued by rounding or reporting only the sign of its confidence interval. The q999 predictor adds information in the registered model; it does not measure the amount of time carried by the tail or establish mediation.
The 1/8-width sensitivity passes P1 at both areas (-0.417 and -0.815) and passes P2 again. It reuses the same seeds and does not rescue the primary P1 failure. The smaller-area conclusion depends on band width; the wider band changes both event counts and the sampling ensemble.
Between-seed uncertainty
Per-rule lnk_time_sd is the sample sd across 16 seeds. The following quantities compare variation across the four groups with variation across rule means.
Code
for band in [0, 1]:
b = analysis['prod16'][f'band{band}']
for col in ['ln_q999', 'lnk_time']:
print('band', band, col, 'between-rule sd', b[f'{col}_sd_between_rules_of_means'],
'RMS within-rule group sd', b[f'{col}_mean_within_rule_group_sd'])
These dispersion estimates expose finite-seed noise. Group dispersion is not the standard error of a single trajectory or proof of a universal noise ceiling.
Caveats and controls
Oracle/property tests and the release suite validate instrumentation. Rotor and
random-walk controls quantify band-width and normalization effects; see
results/controls.txt. Their conditional kappa has no prespecified known target.
The pilot budget gate initially failed; the cap was raised before production.
The all-production conservation audit and the one-seed-per-rule thread replay
are different checks: the full all-seed determinism clause of P3 remains unchecked.
First-area-hit sampling differs from fixed-time sampling. Equal area does not
fix age, shape or colour field. The width sensitivity shares trajectories.
The q999 cutoff is not a direct tail-time-burden measurement, and P2 uses ln kappa
rather than unnormalized occupancy. This limits any mechanistic interpretation.
The prior matched-area noise-floor failure remains failed.
What this changes / next steps
Use the registered gate verdicts above to decide whether the earlier cutoff lead survives fixed-area sampling at this precision. Do not select a successful band or replace the tail statistic after seeing outcomes. A fresh experiment would be needed for a revised estimand, larger cohort, or causal mutation/transplant test.
Open questions
How much of the tail variability is seed noise versus rule structure? Does a direct tail-time burden outperform a high quantile on fresh data? Which field interventions can change return times while controlling boundary residence?
Read the dated lab log
Lab notebook
2026-10-15 21:27 (+13:00) · da88e61 · intent
User requested a new fixed-area sampling and cycle-accounting scaffold so a fresh agent can work quickly. Create a research plan and explicit interfaces; do not start simulations or represent draft settings as preregistration.
2026-10-15 21:27 (+13:00) · da88e61 · assumption
The prior T1b cohort is a useful selected replication cohort, not representative of all blob rules. Candidate seeds may have appeared elsewhere; verify before claiming fresh trajectories. Tail precision and attainability are untested.
2026-10-15 21:27 (+13:00) · da88e61 · decision
Define bands by first area hits and episodes by dynamic pre-step boundary labels. Preserve clipped fragments for exact accounting; separate this identity from independent-seed, held-out predictive evidence. Keep numerical settings draft until oracle tests, controls and a pilot establish feasibility. No results yet.
2026-10-15 21:33 (+13:00) · da88e61 · observation
uv run experiments/2026-10-15-fixed-area-cycles/scripts/preflight.py passed;
source/config inputs exist, candidate pilot/production seeds are disjoint and
candidate bands are valid. Built notebook from the repository template using
scripts/make_notebook.py; uv/nbconvert executed it from a clean kernel and it
reports NOT RUN. Commands are in README/HANDOFF. No scientific measurements.
2026-10-15 21:33 (+13:00) · da88e61 · decision
Scaffolding complete: plan, code map, output contract, candidate config, preflight, executed notebook and isolated bulk directories are ready. Next agent starts with definitions and oracle-backed instrumentation, then calibrates feasibility before freezing the primary test. No commit; no sampler implemented.
2026-10-15 21:31 (+13:00) · da88e61 · deviation
Corrects the two entries labelled 21:33 above: the observed local clock at verification was 21:31, not 21:33. Their content and execution status stand.
2026-10-15 21:42 (+13:00) · da88e61 · intent
Session 2 (fresh agent). Following HANDOFF order: finalise conventions, build instrument (producer + accounting state machine, split so each has an independent oracle), property tests, controls, pilot. No ant outcomes inspected yet. Core code goes in src/fixed_area.rs (adds one pub mod line to the already-dirty src/lib.rs; the existing pub mod bulk; there belongs to another investigation and is left alone). Tests in tests/fixed_area.rs.
2026-10-15 21:42 (+13:00) · da88e61 · decision
Conventions fixed before code (PLAN B/C refinements; none depend on data):
- State t = after t moves; stream is states 0..=T where departures 0..T-1 were executed and state T is the final (its departure not executed). Z_t=B iff x_t visited with >=1 unvisited 4-nbr in state t. Origin visited at t=0, so Z_0=B.
- First episode (B, starting t=0): true_start_observed=false (conservative; the run start is not an observed transition). Never in a complete-contained set.
- tau(a)=first t with A_t>=a; band = departures [tau(lo), tau(hi)). Requires lo>=2, hi>lo, bands ordered, hi_k<=lo_{k+1}; A grows by <=1 per step, so A_tau(a)==a exactly (asserted).
- Run STOPS at tau(hi_last) (no follow-up). Hence at most one left-clipped and one right-clipped fragment per band per trajectory; clipping is structurally O(1) episodes, and the censoring gate reduces to the size of those two fragments vs band duration.
- Complete-contained episode: both transitions observed AND [s,e) inside [tau_lo, tau_hi). Primary full-duration set = complete-contained (band attribution = fully contained only; episodes straddling a band edge get fragments in the band, flagged, and never enter duration quantiles). Straddlers are therefore not double counted.
- Complete cycle = complete B episode immediately followed by complete I episode (I->B transition to next I->B transition); contained in band iff the whole [s_B, e_I) lies in the band. Records D=|B|, T=|I|.
- Quantile: nearest-rank, q-quantile = sorted[ceil(q*n)-1] (no interpolation) so it is an observed duration; reported q in {0.5,0.9,0.99,0.999,0.9999} plus max. Tail burden uses fixed log2 duration bins (exact counts and step sums per bin per label) so any threshold 2^j can be applied later without rerunning.
- "Complete I episode" for the 10k gate = complete-contained I episode in that band.
- Escape = ant within 2 cells of grid edge after a move (as probe.rs); the state after that move is the final state, status=escaped, bands not reached are null.
- Guard: sum_pa accumulated as f64 sequentially in t order (identical order in the oracle).
2026-10-15 21:48 (+13:00) · da88e61 · observation
Implemented src/fixed_area.rs (producer drive + pure Accountant), tests/fixed_area.rs (12 tests: accountant vs offline oracle on 600 synthetic streams, hand-worked cases, producer vs HashSet recount for ant/patched ant/rotor/random walk, oracle positions vs reference, escape; 3 deliberate mutants all caught) and CLI examples/fixed_area_cycles_sampler.rs. All 12 pass in --release. Smoke run (pilot seed 701, bands 32768-34816,131072-139264, grid 8192, cap 2^28; counts only, no associations inspected): RLLLLLLLLRR@701, rotor:701, rw:701 each finish in <=0.6 s, 264 MB peak RSS, t_final 8.2e6 / 4.2e6 / 7.5e5. Complete-contained I episodes for the ant: 1087 (band 0) and 4143 (band 1); 2 clipped B fragments per band, 0 clipped I.
2026-10-15 21:48 (+13:00) · da88e61 · surprise
The draft gate "10,000 complete I episodes per seed/band" is unattainable for a 1/16-width band: ~0.08 episodes/step times ~1.3e4 band steps gives ~1e3 per seed at 2^15 (n^0.5 scaling up to ~4e3 at 2^17). The q99.9 of ~1e3 events is essentially the maximum. Runs are cheap (0.6 s), so the lever is seeds, not wider bands (wider bands change what 'fixed area' means).
2026-10-15 21:48 (+13:00) · da88e61 · decision
Revise the gate UNIT before the pilot (records a deviation from PLAN E / config.draft: no outcome data involved): the quantile gate is evaluated per rule x band x seed-group (seeds pooled within a group), threshold unchanged at >=10,000 complete-contained I episodes. Seeds per group to be chosen from the pilot's measured per-seed counts (ceil(10000 / min-over-rules median per-seed count), rounded to a power of two), with at least two disjoint groups per rule for the cross-seed design. Pilot widened from 'first four rules' to ALL 44 cohort rules x seeds 701..704, because runtime/attainability heterogeneity across the cohort is the feasibility question; pilot output is summarised by feasibility columns only (no kappa/L999 association is computed). Pilot seeds 701..704 are excluded from production. Cohort list: results/cohort_rules.txt (44 sorted unique rules from t1b_cutoff_seeds.csv).
2026-10-15 21:58 (+13:00) · da88e61 · observation
Pilot (184 specs x 3 runs; results/pilot_feasibility.txt, scripts/run_pilot.sh): all runs completed, no escapes; fresh_from_interior = 0 and B+I = steps in every row; 1-thread vs 4-thread payload CSVs byte-identical (368 files). Peak RSS 133 MB (1 thread) / 527 MB (4 threads). Per-seed complete-I counts: 1014..4719 (band 0), 4084..18601 (band 1), median seed-to-seed max/min 1.06. Slowest ant: RRRLLRLLLL (t_final 7.6e7 at 1/16; 8.3e7 at 1/8). Walkers/ants needed per-group seeds: band 0 binding rule RLLLRRRRRRRR needs 10 seeds -> 16.
2026-10-15 21:58 (+13:00) · da88e61 · deviation
G-budget (registered: t_final <= 2^28/4 = 6.71e7) FAILED in the pilot (max 7.64e7; every run did complete, 3.5x below the cap). The registered consequence is a cap revision, so cap raised to 2^29 (>= 4x the slowest observed 1/8-band run 8.3e7*... cap/4 = 1.34e8). No other gate failed.
2026-10-15 21:58 (+13:00) · da88e61 · observation
Controls (rotor, rw; seeds 801..928; results/controls.txt, controls_summary.csv). (i) I-episodes are never clipped: 0 clipped I steps in all 1024 control band-runs: band edges are arrivals on a fresh cell, which is B, so the single left/right straddlers are B fragments. Hence completed-only I accounting is not selected by band edges, a structural property to be checked on ants, not assumed. (ii) PA_end/PA_time = 0.995 (rotor, 1/16, both bands) so lnk_end - lnk_time = +0.005..0.007, an order of magnitude below between-seed sd of lnk (0.08..0.17). (iii) Direct vs cycle-reconstructed f_B: gap -0.0002 (rotor), -0.0011 (rw) at 1/16 band 0 (~0.2% of f_B); identity bookkeeping holds. (iv) Width: f_B falls 7-15% from 1/32 to 1/4 (rotor), ln kappa_end shifts by <=0.04; ln q999 shifts <=0.014 (rotor, 1/16 vs 1/32) vs 16-seed group sd 0.05-0.07 (rotor) or 0.17-0.36 (rw). (v) Scatter of pooled 16-seed ln q999 across the 8 control groups: rotor 0.070/0.050, rw 0.355/0.168 (band 0/1 at 1/16). Nothing here is a target-value test (no known answer for conditional kappa).
2026-10-15 21:58 (+13:00) · da88e61 · decision
FREEZE (config.frozen.json sha256 4bf1215ccd2275dc413e95c4434bf2b4d7de03ea784550d4b267fe4e4107fc1a, README section 'Registration'): primary kappa = kappa_time (rationale: (ii)); primary tail = ln pooled q99.9 per 16-seed group; 1/16 bands primary, 1/8 sensitivity only; production seeds 1001..1064 as 4 groups x 16; P1/P2 definitions, rotations, G-reliab, bootstrap as in the file. Registered before any production ant run; no ant kappa/tail association has been computed anywhere in this experiment.
2026-10-15 21:58 (+13:00) · da88e61 · deviation
Corrects the garbled parenthesis in the previous 'G-budget' deviation entry. Cap raised from 2^28 to 2^29 = 5.37e8; the gate (t_final <= cap/4 = 1.34e8) is then met by the slowest pilot run (8.33e7 at 1/8 width) with 1.6x headroom for seed variation (observed seed-to-seed spread of t_final for the slowest rule ~5%).
2026-10-15 22:00 (+13:00) · da88e61 · decision
Implementation details of the frozen analysis, fixed before production outcomes were opened (scripts/analyse.py; header comment): (1) P2 bootstrap resamples the per-rule leave-one-rule-out squared-error terms computed once on the 44 rules (no refit on bootstrap samples), so a duplicated rule never sits in its own training set; (2) Spearman with average ranks; (3) feature 'ln PA_time' = mean over the group's seeds of ln(PA_time), 'ln mean complete B duration' = ln(pooled complete-B steps / pooled complete-B count); (4) the 1/8-width run (prod8) re-uses the same seeds, so it is a sensitivity analysis, not an independent replication. No outcome files were opened while writing this script.
2026-10-15 22:02 (+13:00) · da88e61 · decision
Session stopped at a usage limit. State: full cargo test --release passes (incl. 12 fixed_area tests). Production (scripts/run_production.sh, log results/production.log) was still running in the background and may have been killed with the session; it is resumable (rerun the script; parameter-stamped .done markers skip finished specs). NOT done: run analyse.py (written, unrun, no outcomes seen), thread-count determinism check on production, notebook.ipynb (still the NOT RUN scaffold), README results section, linking in notes/.
2026-10-15 22:04 (+13:00) · da88e61 · intent
Session 3: user requested continuation. Production sampler is still live (PID 436679; 1487/2816 primary markers observed at 22:04). Preserve it; audit saved payloads and frozen analysis, verify production determinism and release tests, then analyse both complete batches and replace the shareable scaffold with a results notebook. WSL requires sandbox elevation in this session; access succeeded. No outcomes inspected yet.
2026-10-15 22:07 (+13:00) · da88e61 · decision
Before outcome analysis: add audit.py to verify every frozen marker, band endpoint, integer partition, duration count/sum and payload hash; analyse.py now requires the audit and cannot report overall success through failed reliability/coverage gates. Frozen estimands, folds and bootstrap unchanged. Run a one-thread replay of seed 1001 for all 44 rules at both widths against five-thread production; this samples 1/64 seeds and does not fully establish the registered all-production determinism clause of P3. Report this validation limit explicitly.
2026-10-15 22:10 (+13:00) · da88e61 · observation
Primary production completed: 2816/2816 markers, production.log at 22:09:55. Sensitivity production started automatically. Full cargo test --release passed (results/release_tests.log), frozen input preflight passed (results/preflight.log). Commands run through WSL with the prescribed uv environment. No associations inspected yet.
2026-10-15 22:10 (+13:00) · da88e61 · decision
Add --run prod16 to audit/analyse, writing distinctly named interim files, so the completed primary can be inspected while the same-seed sensitivity sweep runs. This changes scheduling/output paths only; the frozen analysis remains unchanged. Final default invocation will produce the combined result files.
2026-10-15 22:12 (+13:00) · da88e61 · observation
Primary payload audit passed for all 2816 specs / 5632 band rows, no incomplete runs and max censor-gate ratio 0 (audit.prod16.json; command: uv run experiments/2026-10-15-fixed-area-cycles/scripts/audit.py --run prod16). A synthetic estimator check initially failed an exact floating-point equality between an intercept-only least-squares prediction and the arithmetic mean; revised the check to tolerance 1e-12. Exact linear-model and independent PRESS checks had already passed. No analysis estimator was changed.
2026-10-15 22:14 (+13:00) · da88e61 · deviation
Corrects the structural explanation in the 21:58 controls observation: a fresh arrival can fill a hole with all four neighbours already visited, so an area-band edge need not be B. Zero clipped I in the controls and primary production is empirical, not a theorem of this sampling scheme. Added a 3x3 hole-filling counterexample in tests/fixed_area.rs. No sampler or frozen estimator changed; retain the censor gate and audit every band rather than assume it away.
2026-10-15 22:16 (+13:00) · da88e61 · observation
Frozen primary analysis complete (uv run experiments/2026-10-15-fixed-area-cycles/scripts/analyse.py --run prod16; results/analysis.prod16.json and .txt). All 2816 runs complete; max t_final 78900629; min pooled I count 16469/65701 (bands 0/1); no clipped I. Reliability q A/B = 0.613/0.969, kappa C/D = 0.964/0.954, all pass. P1 = -0.285 (95% CI [-0.558,-0.005]) / -0.814 ([-0.908,-0.665]); P1 FAILS the both-band rule because band 0 misses <= -0.30. P2 R2 gains +0.336 ([0.115,0.578]) / +0.544 ([0.316,0.822]); both pass. Full release tests pass again after the hole counterexample (results/release_tests_hole.log). Synthetic analysis checks pass (results/analysis_checks.log).
2026-10-15 22:16 (+13:00) · da88e61 · interpretation
The cutoff carries incremental held-out predictive information under this selected-cohort design, particularly at the larger area, but the primary prediction fails as registered. The smaller-area effect cannot be rescued by rounding -0.285 to the threshold or reporting only its confidence-interval sign. P2's success does not identify tail time burden as the carrier, nor establish causality: the predictor is a quantile, geometry is incompletely controlled, and the same 44 selected rules supply all folds. Await the predeclared width sensitivity; do not retune estimators.
2026-10-15 22:21 (+13:00) · da88e61 · observation
Changed ingestion only: parse the thousands of tiny CSVs with stdlib csv, construct polars frames once. uv run experiments/2026-10-15-fixed-area-cycles/scripts/check_loader.py validates every primary summary field against the original-loader results/rule_summary.prod16.csv (agreement at 1e-12; results/loader_checks.log). Original primary outputs retained, not overwritten. All frozen transformations, statistics and gates unchanged. The earlier inline uv command failed to launch (-c without an interpreter); the successful check is the file-based command above.
2026-10-15 22:22 (+13:00) · da88e61 · observation
Production finished: prod16 2816 specs at 22:09:55; prod8 2816 specs at 22:21:24 (results/production.log, scripts/run_production.sh). The one-thread replay of all 44 rules at seed 1001 matches five-thread production at both widths: 88 specs, 440 files byte-identical (results/determinism.json; uv run experiments/2026-10-15-fixed-area-cycles/scripts/check_determinism.py). This checks a subset, not the full registered all-seed P3 determinism clause. scripts/finish.sh is now running the combined audit/analysis and notebook execution.
2026-10-15 22:24 (+13:00) · da88e61 · observation
Combined production payload audit passed for both batches: 5632 runs total, 11264 band rows; every target reached, accounting/histograms/duration checks passed, max censor gate ratio zero at both widths. Command: uv run experiments/2026-10-15-fixed-area-cycles/scripts/audit.py; results/audit.json and results/production.sha256 (manifest SHA256 8db06ca76587db93ddf2fbd5c068d6c51a9423c46cd2033b3d68df570ad712e3). Final frozen analysis is in progress; no sensitivity associations inspected yet.
2026-10-15 22:24 (+13:00) · 275c2af · deviation
Shared-workspace provenance correction: HEAD advanced elsewhere during this session, first to 4529f86 (literature review), then 275c2af (fixed-area experiment). This continuation issued no git commit command. Entries above retaining da88e61 identify the session's starting base; their actual write-time HEAD after the external commits may differ. The combined audit records observed HEAD 4529f86, while final analysis/notebook may record 275c2af. No sampler/core-source difference from current HEAD is present (git diff of src/fixed_area.rs, src/walkers.rs, src/rule.rs, example and Cargo.lock is empty). Post-run source and payload hashes remain the precise provenance. Do not reinterpret these commit changes as new simulations or rewritten predictions.
2026-10-15 22:28 (+13:00) · 275c2af · observation
Final pipeline completed: scripts/finish.sh ran combined audit, frozen analysis, figure and notebook. Sensitivity P1 -0.417 CI [-0.651,-0.132] / -0.815 [-0.905,-0.661], P2 gains +0.488 [0.219,0.767] / +0.530 [0.300,0.777]; all statistical/coverage gates pass. Maximum sensitivity final time 86613887; min pooled I counts 33089/131429. Results: analysis.json/.txt, rule_summary.csv, audit.json, production.sha256, run_status.csv, association.png/.json. The combined primary statistical object exactly equals the original primary analysis object. Figure visually inspected; final notebook regenerated and executed after adding sensitivity interpretation (results/notebook.log), no error outputs.
2026-10-15 22:28 (+13:00) · 275c2af · interpretation
P1 primary fails as registered; P2 secondary passes. Both width-sensitivity tests pass, demonstrating lower-area band-width dependence, not an independent rescue of P1. The higher-area association and the added predictive value persist. The changed width alters event counts and the first-area-hit ensemble simultaneously, so the reason for the smaller-area shift remains unresolved. No causal or direct tail-time-burden conclusion follows.
2026-10-15 22:28 (+13:00) · 275c2af · decision
Session complete for production, frozen analysis, reproducible summaries and shareable write-up. README, notebook and research-avenues note agree; tests and numerical checks passed. Explicit outstanding validation: P3 all-production thread determinism was not fully replayed (88/5632 production specs replayed, all match); no mid-run walker checkpoints or raw episode/cycle tables are claimed. Future mechanistic work needs a fresh registered intervention/time-burden design; do not tune this primary result post hoc. No commit command issued by this continuation; concurrent external commits are recorded above.