← All experiments

Field notes / Experiment guide

What does a new cell cost?

Can compressed phase memory reproduce the boundary birth process, beyond its mean cost?

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

Physical excursion duration might explain why close total costs coexist with failed physical-return budgets.

What we learned

All compressed fields fail native return-budget and waiting-process criteria too; physical-time stretching alone cannot rescue them. All forty prior ant summaries replay exactly.

What this leaves open

Four inspected pilot rules, two seeds and early windows; no universal memory bound. Main outcomes remain unopened. A single coupled phase edit is proposed but unrun.

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

Can a local renewal model explain the cost of a new cell?

Current status (2026-10-20): calibrated recorder and boundary clock work. The rich lookup lacks transfer support. A finite colour-memory model also fails its registered cost/budget tests: preserving nearby short-loop phases while randomizing forgotten long-return phases is insufficient in this pilot. Read/write-bit closures also fail native boundary-return and birth-wait tests; physical-time stretching alone cannot rescue them. Main outcomes remain unopened; the c-law coefficients remain unexplained.

Scaffold created 2026-10-20 (+13:00), base revision adf66774570469da30b10ffc1ceab911670a9d09. Scaffold status at creation: prospective design, not a frozen preregistration. No simulations or scientific fits have been run for this experiment. Preparing rules is design generation, not evidence. Freeze the instrument, model and pilot decisions in a dated addendum before any main-cohort measurement. Preserve this draft.

Question and motivation

Why does the number of boundary reads per birth approximately follow 1/c = a + b m, where m is the opening same-letter run? Can a small local state predict both this cost and corrections from letters 5–8?

The parent experiment establishes a controlled flat-band setting and rejects the simple flat colour-profile and transition-kernel explanations. Its Stage 2/3 results motivate locality, but do not derive the intercept or slope. Its Stage 4 reconciliation rules out treating the conditional lead–kappa association as evidence of a mechanism. See the open questions and calibration. This experiment targets c, not kappa or a derivation of the growth exponent.

Hypothesis and competing explanations

H-local (untested): the sequence of boundary events can be approximated by a finite-state Markov reward process. Short loops, birth chains and excursions away from a local patch determine the boundary-read cost per birth. Increasing the lead changes their transition probabilities; later letters change survival after a short loop. Transition rules learned on training families should transfer to other rule families and interior seeds.

H-history: the same local state has different futures depending on long-lived field structure or previous returns. A model can reproduce pooled c while missing the return budget, paired-rule effects or history dependence. Births are candidate renewal points, not assumed independent regenerations.

Definitions and accounting

  • A boundary read starts on a visited cell with at least one unvisited four-neighbour, including inner-hole rims, exactly as probe/edge_trace.
  • A birth is a step onto a never-visited cell. The first read there occurs on the following step. Attribute births to the source read.
  • Measure c = births / boundary_reads over (T/2, T]. Report zero denominators.
  • Index all boundary reads in time order, including reads that do not birth. For each event record source state, whether it births, and the next event state. Interior steps between events have zero boundary reward but their elapsed duration and return category are retained.
  • For an ergodic closed embedded chain with stationary weights pi and expected birth reward p(s), predict c_hat = sum_s pi(s) p(s). This is a prediction only if transitions/rewards are learned without target-run counts. Computing pi from the target's empirical event frequencies is an accounting check and must never be scored as predictive success.
  • Independently partition each boundary read into previous source-cell read lag first, 4, other <=16, or >16. Lag is since any previous read, not merely the previous boundary read. Report category counts per birth; they sum exactly to 1/c. Chains are maximal consecutive births.
  • Keep initial/final partial chains and transitions explicit. Unseen next events at the end are right-censored, not long-return observations. Cell-lifetime N_b is secondary: window entrants and censored cells can invalidate an uncorrected Little's-law equality.

Proposed state hierarchy (must be frozen before main measurement)

Work in the incoming-heading frame, reflecting L-first rules to R-first. Candidate S0: source colour (0..13), its next eight rule turns relative to the initial turn (cyclic), and the four-neighbour visited mask. Candidate S1: S0 plus the visited mask and current turn signs at visited sites in the 3x3 patch. Unvisited cells are explicitly marked, not treated as visited colour 0. Candidate history challenge S2: S1 plus the previous-read lag category and previous birth-chain length (0,1,2,3,>=4).

S0/S1 are competing local models; S2 tests hidden history, not an excuse to silently enlarge a failed S1. States, orientation, transition pooling, smoothing/backoff, treatment of unseen states, stationary-solver choice and non-ergodic classes remain implementation gates. A raw rule identifier must not enter a state. No fit may use target-rule c, target event frequencies or target area. Publish unseen-state mass and solver failures.

Sparse states may make this hierarchy infeasible. Pilot support decides whether a prospective revised state is necessary; preserve the rejected candidate and register the revision before main measurements.

Cohort and paired challenge

scripts/prepare.py deterministically prepares the design in results/design/. Seed 2026102001; 14-letter primitive R-first bases; m=1,2,3,4, each with 8 training and 4 validation families (48 bases). Four additional pilot families, one per lead, are excluded from scoring. Every family contains:

  1. Base rule.
  2. An opposite-letter swap within zero-based indices 4..7 (letters 5–8).
  3. An opposite-letter swap within indices 10..13 (letters 11–14), a late-letter comparator, not assumed inert.

Swaps preserve length, R-fraction and lead. Accept only families with three primitive rules and no mirror/rotation-equivalent rules across or within families. Exclude necklaces in the parent's sample, band and validation lists; this does not guarantee absence from every historical dataset. Splits are by family: no sibling crosses training, validation or pilot boundaries. No stationarity or blob screening is used to select the design.

Band layout proposed: torus 256x4096, rows 0..2047 initially fresh, remainder visited with uniform i.i.d. colours using the parent's mix64 coordinate hash. Start at (128,2048), heading north. Main interior seeds 2026102011..14, paired across siblings; pilot seeds 2026102021..22. Later implementation must document the exact hash, coordinate convention and binary digest.

Pilot horizon ladder: T=2^22 through 2^26. Choose one common T, the smallest for which >=3 of 4 pilot families have all arms/seeds consume 10–80% of the initial fresh band and yield >=5000 window births. If none qualifies, stop and register a geometry/budget revision. Do not pick a different horizon for each main rule. Main failures are retained in status tables, never replaced.

Draft predictions and decision rules

Thresholds below are prospective design choices, not results or pilot-tuned claims. Freeze or explicitly revise them after instrument calibration and pilot support checks, before opening main outcomes.

| ID | Proposed test | Proposed criterion | |---|---|---| | G0 | Instrument equality vs edge_trace and independent sparse path reference | Exact births, boundary reads, chain counts and full lag categories on small seeded cases, including censoring and band prefill; same bytes with 1 and 6 threads | | G1 | Synthetic finite-state reward chains with known stationary answers | Absolute c error <=0.01 at 10^6 events, 16 fixed seeds; report signed bias and between-seed sd; controlled nonlocal process exposes inadequate local state | | G2 | Walker controls | Rotor and random-walk accounting agrees with unchanged tracer; larger rotor blank run c in [0.47,0.52], random walk in [0.40,0.48], 8 seeds each, configurations from parent calibration; these calibrate instruments, not ant models | | G3 | Cohort/support | >=12 of 16 validation families have all arms and >=3/4 seeds usable; unseen state mass <=5% on each scored run and solver well-defined; otherwise primary verdict UNINFORMATIVE | | P1 | S1 predicts validation c with training-only parameters | R² >=0.90 and median relative error <=5%, using per-rule means; beat training-fitted lead law and K3, with family-bootstrap interval for each MSE improvement above zero | | P2 | Predict the accounting decomposition | Per-category median absolute error <=0.10 boundary reads/birth for first, lag-4, other-short and long reads; test all four, not just their sum | | P3 | Predict paired early-swap effects | On validation family deltas of ln c, R² >=0.50 and sign accuracy >=75% for informative pairs; informative = paired |mean delta| >2 paired-seed SE, >=8 informative families required | | P4 | Test locality against history | Adding S2 improves held-out MSE by <10%; >=20% improvement with bootstrap lower bound >0 rejects the proposed S1 closure; intermediate outcomes unresolved |

Compute validation R² with validation-mean denominator; constant/near-zero delta variance makes P3 uninformative, not a pass. Fit lead baseline 1/c=a+bm and the parent's K3 on training data only. Fit all smoothing/hyperparameters by family-wise inner CV inside training. Validation is opened once after freezing the pipeline. No target-run transition estimation.

Uncertainty: 2000 family bootstrap draws, seed 2026102002, all siblings kept together. Report between-interior-seed sd separately; reads are not independent replicates. Publish unfiltered status and retention by arm and lead. Report each prediction's verdict independently. Mechanistic support requires P1–P3 and no P4 rejection; it would support this closure on this geometry, not prove an exact universal law. A good c fit with failed decomposition is a failure.

Implementation handoff and gates

  1. Commit this scaffold and design. Append the start entry to NOTEBOOK.md.
  2. Implement an experiment-prefixed Rust example and a clear independent reference. Existing src/edge_trace.rs is an aggregate oracle, not an ordered-event instrument. Its driver truncates lag output: do not infer a complete long-return budget from that JSON. Add path/oracle property tests, deterministic reduction and explicit censoring.
  3. Implement synthetic estimator calibration, then excluded pilot. Freeze model details, horizon, resource budget and runnable commands in README. No scientific inference before G0–G2. Main G3 is checked before scoring.
  4. Run resumable per-(family,arm,seed) chunks. Keep bulk ordered events under this experiment's ignored dumps/; commit small transition/reward summaries sufficient to refit without dumps. .done only after output validation; verify input and binary hashes before reuse. Interrupted chunks restart.
  5. Analyse once, execute the shareable notebook using only committed results, append verdicts here and in the lab notebook; update open questions and blog homepage when there is evidence or a changed research priority.

Use CPU: the new instrument is not GPU-ported. No concurrency with heavy jobs or GPU timing. Estimate runtime in the pilot before launching main work; long runs go in the background with a log under this experiment's results/. For published runs build into a fresh target directory, check build exit status and record binary SHA-256 to avoid the /mnt/f stale-build trap.

Available commands (WSL, repository root)

Every invocation must set the WSL environment:

export UV_PROJECT_ENVIRONMENT=$HOME/.venvs/turmite UV_LINK_MODE=copy
uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/prepare.py
uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/prepare.py --check
cargo test --release

Only the design preparer exists. There is deliberately no simulation or scientific analysis command yet; steps 2–3 above are required first. prepare.py refuses to overwrite different design files. Its provenance records exact command, base revision, source/config/script hashes and seeds. No dependencies are added. Notebook execution once Jupyter is available:

uv run --frozen --with jupyter --with nbconvert --with ipykernel jupyter nbconvert --to notebook --execute --inplace experiments/2026-10-20-c-law-renewal/notebook.ipynb

Results

None. The generated manifest contains planned rules and assignments only.

Scaffold verification — 2026-10-20 00:36 (+13:00)

Design generated and byte-checked: 4 pilot + 32 training + 16 validation families, three rules each. The shareable notebook executed in a fresh kernel against committed design inputs; cargo test --release passed (existing warnings). These checks do not evaluate G0–G3 or P1–P4. No Rust instrumentation or scientific estimator was implemented. See NOTEBOOK.md for commands, the mount-mode correction and concurrent commit provenance.

Ordered-event instrument registration — 2026-10-20 00:40 (+13:00)

Before new ant measurements: src/edge_renewal.rs implements source states exactly as the draft hierarchy, emitting every boundary read in (T/2,T]. Patch order is forward, forward-right, right, back-right, back, back-left, left, forward-left; each two-bit digit is fresh=0, visited with rule[0]'s turn=1, visited with the opposite turn=2. Four-neighbour bits are forward, right, back, left. Frame is incoming heading, reflected for L-first rules. next8 bit j marks equality of rule[(colour+j) mod n] to rule[0]. The full state also contains the source colour, previous-read lag category and count of consecutive preceding births (capped at 4). Lag tracking starts at step 1, including the warmup, and tracks all reads. Window chains are clipped as in edge_trace, with left/right censoring flags kept separately.

The callback is after the move but all state features are captured before the move. No target outcome or area is encoded. Consecutive emitted events are linked only within the measurement window; the last is right-censored, never linked back to the first. Counts output retains state reads/births and ordered transition counts plus event-gap category/duration sum. Events mode retains every emitted timestamp. Summary mode avoids count-map allocation. Tests compare against an independent sparse position oracle and the full unchanged aggregate tracer, including rotor and random walk.

examples/c_law_renewal_trace.rs is a single-run driver. Interface:

band RULE SEED LOG2 W H FRESH_ROWS [counts|events|summary]
blank RULE|rotor:SEED|rw:SEED LOG2 SIZE [counts|events|summary]

CSV goes to stdout; a summary JSON goes to stderr. In summary mode the JSON also goes to stdout. Band initialization matches the parent's hash exactly: mix64(mix64(seed) XOR ((x as u64)<<32 | y as u64)) mod rule_length. This registration covers the instrument; main models remain unfrozen.

Calibration and excluded-pilot freeze — 2026-10-20 00:42:53 (+13:00)

Frozen before running these scripts. scripts/calibrate.py tests the actual stationary solver on a two-state chain P=[[.9,.1],[.2,.8]], rewards (.1,.7), known c=.3, 10^6 events per seed 2026102031..46. G1's <=.01 absolute-error criterion applies. A periodic chain must converge under lazy iteration; a reducible chain is rejected pending an explicitly registered class rule. Negative control: a hidden alternating 256-event regime, birth probabilities .05/.95, seed 2026102047, 10^6 events. Its pooled c is near .5 even when P(next birth | birth) and P(next birth | no birth) differ by >.5. This exposes why a correct total cannot validate history-free closure. G1 calibration here covers the stationary/reward solver, not yet the ant state/backoff model, which still needs its own synthetic validation after selection.

scripts/run_pilot.py builds in a fresh WSL-home target directory, records binary/source hashes, then runs sequential resumable controls and excluded pilot only. No heavy job or GPU timing may overlap measurement. Control seeds 2026102051..58: rotor blank 2^24, 4096 square; random walk blank 2^20, 4096 square (the parent's non-escaping configurations). Mean c must meet G2; report between-seed sd and escapes, never silently exclude escaped runs. Small band count output must match byte-for-byte at thread settings 1 and 6.

Pilot follows the original ladder 2^22..2^26 and exact family gate above. No automatic extension is allowed after failure. Counts at a selected horizon are recorded only for excluded pilot rules; bulk goes to ignored dumps/. Before main freeze, measure support of S0, S1 and S2 by leave-one-pilot-family out count summaries, comparing both exact features and rule-independent coarsenings. This is a feasibility diagnostic, not a validation score. If the 8-turn word isolates rule families, reject this state design rather than passing a transition model off as a learned lookup of rule identity.

Commands (WSL, usual UV exports; no main-run command exists):

uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/calibrate.py
uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/run_pilot.py --stage build
uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/run_pilot.py --stage controls
uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/run_pilot.py --stage pilot

Run long stages in the background, logging under results/pilot_v1/. Every chunk has its exact argv, build/driver hashes, duration, complete summary and SHA-256 .done marker. This is an instrument/pilot stage and does not establish P1–P4.

Exact immediate reward; remaining modelling task

The source state determines the immediate birth outcome exactly. In the canonical frame, let d=1 (right) when next8 & 1 is set, otherwise d=3 (left). Then born = ((visited4 >> d) & 1) == 0. Consequently a fitted birth-probability regressor is unnecessary for ant states. The independent path comparison also checks this identity for each emitted ant event. The reward-estimator calibration remains a solver control, not evidence for a learned ant birth mechanism.

What needs explaining is the occupancy of these local states, including how loops and long returns generate their distribution. A cross-rule transition model must additionally enforce target-rule-compatible successor features; a pooled transition matrix can otherwise jump into an eight-turn word that the target rule cannot produce. This is an explicit main-model gate, not permission to estimate successor weights on the target trajectory. Neither the immediate predicate nor the accounting identity derives a or b.

Pilot outcome and diagnostic addendum — 2026-10-20 00:49 (+13:00)

The original ladder terminated normally with no usable common horizon: 0/4 complete families pass at any k=22..26. At k=26 only 2/24 runs pass; 6 miss the >=5000 window-birth requirement and 22 miss the 10–80% consumed band requirement. The main cohort remains unrun. Source: results/pilot_diagnostics.{json,csv}, made by scripts/pilot_diagnose.py. G0 oracle checks and G2 walker controls pass; the synthetic stationary solver passes its narrow calibration, but the full ant estimator is not calibrated. This pilot failure gives no verdict on P1–P4 or local closure.

Before collecting any state counts from this cohort, register a diagnostic repeat only of all 24 excluded pilot runs at k=26, same geometry, seeds and hashed binary. This changes neither geometry nor horizon and cannot rescue the failed gate. Budget <=24*2^26 extra steps; no other heavy jobs may run. Require summaries to match original runs exactly. Save state/transition counts under ignored dumps/pilot_support/, hashes and compact audits under results/; every chunk is validated before its .done marker.

Prospective feasibility prediction: S1's full source-colour/eight-turn-word state will have >5% unseen read mass in at least 12/24 runs when trained on the other three pilot families. The same test on S0, S2 and C0/C1/C2/C4/C8 coarsenings (word prefix lengths 0,1,2,4,8 plus patch, omitting source colour) is descriptive. No c model or target transition weights will be fitted. Passing support would only permit further model design; it would not repair the horizon failure, demonstrate transfer or establish a mechanism.

Command, usual WSL UV exports: uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/support_probe.py.

To queue this diagnostic behind existing heavy jobs, use uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/launch_support.py. The worker records its live PID and waits on actual /proc release/cargo command lines; read results/pilot_support/session.log and local .exit status before attempting a restart. No scientific inference follows from waiting or from completion of a process alone; inspect its validated outputs.

Excluded state-support audit — 2026-10-20 00:59:52 (+13:00)

Completed with exit status 0 after other observed heavy jobs finished. All 24 counts-mode summaries match their original k=26 summaries exactly. State rewards obey the exact immediate-birth predicate; outgoing edge counts plus one terminal event equal state counts, and incoming counts leave exactly one window-entry event. These checks validate ordered summary serialization.

scripts/support_probe.py -> results/support_report.json; all chunk recipes, hashes and .done markers in results/pilot_support/. Compressed bulk count tables stay in ignored dumps/pilot_support/ and can be regenerated with the recorded binary/argv. The notebook reads only committed compact summaries.

Representation Median unseen read mass Maximum Runs >5%
S0: source colour + eight turns + neighbour mask 1.000 1.000 24/24
S1: S0 + patch 1.000 1.000 24/24
S2: S1 + history 1.000 1.000 24/24
C0: patch alone 0.00888 0.06894 4/24
C1: current turn + patch 0.02264 0.07459 7/24
C2: two turns + patch 0.04275 0.30089 12/24
C4: four turns + patch 0.36132 0.54622 24/24
C8: eight turns + patch 0.94443 1.00000 24/24

Training support here is the union of all other three pilot families, all their arms and both seeds; an unseen state has zero examples, not merely few examples. S0/S1/S2 have 100% unseen mass in every individual run. The prospective feasibility prediction held. This is not a main-cohort G3 score: the planned training cohort is larger and no validation outcomes were opened. It shows the pilot cannot train/test a literal cross-family lookup over the proposed rich states. C8's loss of support without source colour also shows that the eight-turn word itself isolates contexts. Removing the word and colour improves support but does not validate a replacement model.

Decision: do not fit the original rich-state lookup or interpret its unseen-state fallback as mechanistic success. Preserve the failed horizon gate and original predictions. A prospective replacement should apply the target rule's phase updates exactly and learn only missing neighbourhood or return information. A pool of observed successors must not silently change the target rule. This compositional closure is a proposal, not an implemented or registered main model. Its synthetic calibration, sampling revision, mechanism tests and held-out evaluation remain required. P1–P4 are untested.

Finite colour-memory closure pilot — 2026-10-20 01:06:34 (+13:00)

Registered before implementing or measuring the new model. This is an excluded-pilot intervention, not a replacement score for original P1–P4. The previous turn made progress by rejecting an unsupported representation; all original jobs are terminal. The main cohort stays unopened.

H-memory: exact phase updates in a small moving patch are sufficient to reproduce the ant's boundary-read cost. Long-range phase memory is dispensable for c even if it changes growth or boundary occupation. This is stronger than the known immediate-birth identity and is falsified by a changed return budget.

The model generates its own complete path and visited set. Keep colours for read cells inside a Chebyshev-radius r square centred on the walker, evicting the outgoing strip after every step. Inside the patch, turn and increment by the target rule exactly. At a previously read cell absent from the cache, replace its phase by a uniform draw from 0..n-1 before reading, then advance normally. First reads retain their original blank/background phase. No target trajectory, target state frequency, census c, or learned rule identifier is used. The persistent visited geometry is produced by this model, not supplied by the full ant. Thus it tests local colour memory, not whether global geometry is dispensable. An r=4 reset-to-zero arm challenges sensitivity to the chosen external-phase distribution. The no-eviction arm is the exact ant.

Random draws: the existing SplitMix64 stream, one draw per forgotten re-read, uniform modulo n. Interior seeds 2026102021/22 use reset seeds 2026102061/62, respectively; all arms have these fixed seeds. Rule phase remains exact between explicit resets. Resets occur before source statistics are recorded; the instrument needs a tested pre-read hook to avoid labelling the old phase. Neighbour phase labels in the old rich lookup are not model inputs or scored predictions. A reset changes colour, never whether a cell has been visited.

Frozen pilot recipe and predictions

  • Four base rules of the existing excluded pilot, both original seeds; no choice by c or survival, no replacement. T=2^26, original 256x4096 torus, 2048 fresh rows, same start and hash. Window (2^25,2^26].
  • Arms: full ant; uniform-reset r=0,1,2,4,8; zero-reset r=4. At most 56*2^26 steps. Fresh build, binary/source hashes, background log, resumable per-(rule,seed,arm) chunks. No overlapping heavy job or GPU timing.
  • M0 oracle gate: ring-cache walker matches an independent HashMap implementation step for step (phase before/after reset, headings, positions, eviction and reset counts) on seeded blank/band cases including wrapping. Full arm matches AntWalker; a cache containing the entire path causes no resets; a radius >=1 preserves the all-same-turn four-step loop. The pre-read instrument matches existing no-hook control totals exactly.
  • M1 pilot sufficiency candidate: r=4 and r=8 uniform arms each have median absolute paired ln(c_model/c_full) <=0.10 and maximum <=0.25 on eligible pairs. This criterion is not a proof of transfer and cannot finish the goal.
  • M2 accounting challenge: at r=4 and r=8, median over eligible pairs of the maximum absolute error across first/lag4/other-short/long reads per birth <=0.20. Matching c with a wrong decomposition fails the candidate.
  • M3 phase-prior challenge: r=4 zero and uniform arms have median absolute paired ln c difference <=0.10. Failure says the external-phase closure matters, not that long-range memory is necessarily required.

Sampling revision for this pilot only: eligibility requires >=1000 boundary reads and >=500 births in both compared windows, no escape and <80% total fresh-band consumption at the end. Do not require 10% consumption: the earlier pilot showed this geometric-size gate suppresses many otherwise measurable boundary samples. This explicitly revises the pilot sampling criterion; it does not retrospectively pass the failed original gate. Require >=6/8 eligible pairs for each primary comparison, otherwise UNINFORMATIVE. Publish all runs, eligibility reasons, per-seed deltas and within-rule two-seed spread. These pilot comparisons are descriptive feasibility tests; no tiny-n significance claim or main-cohort validation. r=0/1/2 profiles and reset exposure are descriptive, with no monotonicity assumed. All arms are fixed before data.

If no finite radius meets M1+M2, stop this closure and diagnose which budget component changes. If it does, freeze a fresh held-out test and paired-mutant challenge before opening the main cohort. Deriving/predicting the c-law coefficients and later-letter corrections remains part of the research goal.

Boundary-clock amendment — 2026-10-20 01:09:00 (+13:00), before implementation/run

Prospective design correction, not a response to new model outcomes. The fixed-step recipe immediately above is superseded for the finite-memory pilot; retain it as the original proposal. Forgetting bulk phases may change growth enough to exhaust the finite band before a step-time window opens. That would confound a local boundary-cost comparison with growth rate again.

Use an embedded boundary-event clock: exclude the first 2048 boundary reads, measure the next 8192, cap the entire run at 2^28 physical steps. The measurement includes all physical steps between its first/last boundary events; lag is still physical time since any previous read. Record physical start/end time, completeness, clipped chains and partial windows explicitly. No choice of clock or threshold per rule. Stop a completed run on its last measured boundary read. At most 10240 births can occur before this stop, so fresh-band consumption cannot exceed 10240/524288 (<2%); this analytically prevents the depletion confound without dropping fast-growing model arms. The original failed fixed-time pilot remains failed.

Eligibility: the full-ant reference must complete its 8192-read window with

=500 births; each comparison arm must complete the same read count without escape. >=6/8 eligible pairs are needed for M1/M2, otherwise UNINFORMATIVE. A complete model window with zero/few births is not excluded: it is an outcome (zero c gives an infinite log-cost discrepancy and fails sufficiency). Cap failures remain visible, with read progress and all partial summaries. All original M1/M2/M3 thresholds, arms, excluded base rules, seeds and policy choices are unchanged. Worst-case bound is now 56*2^28 steps; actual work stops at the event budget. Profile feasibility/runtime on these fixed cases; do not enlarge the cap or replace slow rules without another registration.

This changes the observation window, so add calibration before any pilot claim: independent offline prefix/window selection must agree exactly with the new clock (including physical lags and chain censoring). Rotor and random walk controls: 8 seeds 2026102051..58, blank 4096 board, the same boundary clock and cap; means within G2's original ranges, report sd and deviations from the parent controls. The M0 walker oracle and no-reset identity remain mandatory.

Exact spatial-return bound — 2026-10-20 01:21:42 (+13:00)

This is a geometric deduction, not a simulation result. Between two reads of the same cell on the square lattice, axes alternate. A closed path of length k has k/2 horizontal moves, half in either sign, and the same vertically. Therefore k is divisible by 4 and its maximum coordinate excursion from the source is at most k/4. Evicting that source from a Chebyshev-radius r cache before its next read requires an excursion >=r+1, hence k>=4(r+1). For the large torus this also holds for winding returns: each circumference exceeds 2r+1, so an alternating-axis winding route takes at least 4(r+1) steps.

Consequences: radius 1 always preserves lag-4 source phases; radius 4 preserves every source phase returned to within 16 physical steps; radius 8 within 32. The r=4/r=8 interventions directly change only the registered long-read class, although a reset can indirectly change all subsequent trajectories and budgets. This sharpens the mechanism test: preservation of immediate short loops is guaranteed, while the importance of longer-return phase memory is empirical. It does not predict that c or the lag-4 frequency stays unchanged.

M0 additionally checks this bound on every reset in the sparse oracle, and exhausts all 16-step turn words and their closed prefixes. The driver reports reset exposure by read-lag class; r>=4 must have no resets in first/4/<=16 classes. Exact turn-bound logic is not a fitted statistic. These checks and exposure reports are registered before new model measurements.

Implementation and reproducible commands

src/local_memory.rs has a ring cache checked against independent HashMap eviction; edge_renewal::trace_clock applies resets before read labels and implements the embedded window. Existing trace remains the exact old octave interface. Source-phase exposure and per-colour read/birth counts are recorded, with reset counts by lag class. A match without meaningful reset exposure is only a weak locality challenge and cannot establish sufficiency.

All code, seeds, clock, policies and analysis criteria are frozen in the implementation commit and memory_design.json before data collection. Commands from WSL repository root with usual UV exports:

uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/run_memory.py --stage build
uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/run_memory.py --stage controls
uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/run_memory.py --stage pilot
uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/analyse_memory.py

For a detached sequential execution of these stages, after waiting on verified heavy jobs: uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/launch_memory.py. Read the actual worker PID/terminal status before retrying. Results and background log are in results/memory_v1/. Fresh build directory, binary/source hashes and oracle test exit status are captured. Each case has a recipe-keyed .done marker; parallelism is across independent seeded cases (default 2 workers), with identical scientific JSON regardless of scheduling. Timing is printed only to the log; there is no speed claim. Old data are never overwritten.

Finite-memory outcome — 2026-10-20 01:34:30 (+13:00)

Code/registration revision c826721c2591201c45efeca9900abac5f8f4f841. Fresh-build oracle tests and boundary-clock walker controls pass. Rotor c 0.500748 (between-seed sd 0.003133, 8 seeds); rw 0.462433 (sd 0.006132, 8). Their differences from the earlier fixed-time means are +0.003244/+0.015830; this early boundary clock is not an unbiased substitute for a late-time walker comparison. Sources: results/memory_v1/controls.json, build.json.

All 56 pilot cases are recorded with validated markers. Both primary uniform arms have 8/8 eligible pairs. M1 and M2 fail for both radii as registered.

Arm Median absolute ln(c model/full) Maximum Median largest budget error M1 / M2
Uniform r=4 0.012054 0.298926 0.248662 FAILED / FAILED
Uniform r=8 0.012623 0.276185 0.200881 FAILED / FAILED

M2's r=8 miss is narrow (criterion <=0.20); do not round it into a pass. Six of eight zero-reset r=4 runs reach the 2^28-step cap without opening the measurement window. Only 2/8 policy comparisons are defined, so M3 is UNINFORMATIVE, not support for prior independence. Those two are the lead-3 rule, whose boundary reset exposure is zero at r>=4; matching that rule is a weak locality challenge. No capped run was replaced or assigned c=0.

The lead-4 rule RRRRLLRRLLLLRR accounts for the large cost discrepancy: r=4 predicts c 31–35% higher than full, in both seeds (equivalently about 24–26% fewer boundary reads per birth). r=8 remains 30–32% high. The other rules' closer totals do not establish the proposed closure.

Exploratory decomposition (scripts/diagnose_memory.py, after the registered failures): for that lead-4 rule, r=4 reduces long-return reads per birth by 1.63/1.59, increases lag-4 reads by 0.51/0.47, and changes total cost by -0.95/-1.05. For the lead-2 rule, increased lag-4 and decreased long-return costs nearly cancel: a good total c hides a wrong return budget. r>=4 resets only the long class directly, so these changed short-loop frequencies are indirect effects of the altered return history, not direct short-phase erasure. The full-ant boundary-clock versus old k=26 c audit has maximum absolute ln ratio 0.0406 across these eight seeds. That is a limited age check on this pilot, not a fresh confirmation of stationarity or a universal bias bound.

Finite-memory pilot cost and return-budget errors

Points are eight paired runs from four rules, not eight independent rules; black bars are medians, no confidence interval is claimed. Figure recipe: uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/plot_memory.py (inspect the existing generated image before --replace). JSON inputs only; no fitted parameters. Numerical results: results/memory_report.json; signed budgets and clock audit: results/memory_diagnostics.json. The plot omits zero-policy arms because their clock completion is the separate M3 issue.

Decision: stop this uniform-exterior finite-memory candidate as promised; do not extend the radius or open the main cohort to find a passing case. Local short-loop phase clocks alone, with uniform forgotten phases, do not predict the full read cost/budget. This does not rule out a better local closure or prove a universal need for a particular radius. No c-law coefficients or later-letter mechanism have been derived.

Next candidate (proposal only): on a forgotten re-read, scramble the phase within its old current-turn class, rather than across all phases. This retains one exterior bit per cell while erasing the rest of its phase clock. Compare with retaining the next two turns. If one-bit preservation restores the long-return budget while phase scrambling remains substantial, the lost information is a directional field rather than a distant full phase clock; otherwise future-turn timing matters. This requires its own oracle, registration and fresh tests; it is not yet implemented or measured.

Forgotten-phase information test — 2026-10-20 01:46:12 (+13:00)

Registered before implementation or outcomes for these policies. The prior goal turn was progress: the exact return bound, calibrated finite-memory model and its registered failure narrowed the mechanism. Current worktree inspection confirms no own live job and no one-/two-turn policy yet.

H-bit: the distant phase clock can be replaced by the old current-turn bit, provided the nearby clock remains exact. H-next: retaining the next turn as well is necessary to reproduce the local cost and return budget. These are candidate explanations of the previous uniform-forgetting failure, not claims supported by that failure alone.

At a forgotten re-read, let the old phase in this model's own generated field be c. Policy turn samples uniformly from all j with rule[j]=rule[c]. Policy word2 samples uniformly from j whose next two cyclic rule turns equal those at c. Both retain radius 4, the same first-read initialization, and one seeded SplitMix draw per forgotten re-read, even for a singleton equivalence class. They never inspect a reference ant's trajectory or phases. Outside the cache, the first policy requires only the old turn bit for previously read cells; the second requires its two-turn word. The implementation may retain a latent old phase for instrumentation, but its sampling law must be invariant under substitution by another phase with the same retained word. First-read phases are reproducible from the original background seed; they are not learned data.

Frozen recipe and checks

Four original excluded base rules, both original interior/reset seeds; same 2048+8192 boundary clock and 2^28 cap, geometry and start. No main outcomes. Arms: full, uniform r=4, turn r=4, word2 r=4 (32 runs). New driver must first reproduce every previously recorded field of all 16 full/uniform baseline summaries exactly. Reproduce all 16 boundary-clock rotor/rw control summaries too. Extra diagnostic fields are permitted; no change to old scalar values. Then and only then collect the 16 information-preserving outcomes.

I0 oracle gate: extend the independent HashMap path oracle to word policies; check source phases, steps, resets and preserved words. Test alias invariance under substitution of evicted phases with the same retained word. A complete rule word with unique cyclic rotations must give the full ant's path even at radius 0, with zero actual phase changes. Word policies must never change the retained turns at a reset. Radius-4 direct resets still belong only to >16 lags. Fresh build, source/binary hashes, deterministic per-case markers and no overlapping heavy jobs remain mandatory.

Predictions for turn (primary H-bit) and word2 (predeclared alternative):

  • I1 whole-pilot efficiency: >=6/8 eligible pairs, median |ln c ratio| <=.10 and maximum <=.25. Eligibility unchanged from the memory pilot: full reference completes with >=500 births, treatment completes, neither escapes. A complete zero-birth treatment is a failure, never an exclusion.
  • I2 budget and sensitive-rule restoration: median over eligible pairs of largest absolute first/lag4/other-short/long reads-per-birth error <=.20; additionally both seeds of RRRRLLRRLLLLRR must complete, have |ln c ratio| <=.10 and maximum category error <=.20. Selecting this rule is informed by the previous pilot, so this is an explanatory follow-up, not fresh validation.
  • I3 effective perturbation: actual phase changes on >=10% of measured boundary reads in at least four eligible pairs, including both sensitive-rule seeds. A numerical match without this exposure is UNINFORMATIVE for compressed memory sufficiency. Report reset, phase-change, current-turn-change and next-turn-change counts; current-turn changes must be zero for both policies, next-turn changes zero for word2.

H-bit gains pilot support only if I0 and all three criteria hold for turn. Turn failing but word2 holding supports a need for more than one turn of phase timing on this pilot. Both failing rejects these closures, not every compressed field representation. Both holding favours the smaller state but does not prove minimality. Exposure failure prevents a sufficiency claim; eligibility failure is UNINFORMATIVE, with every cap retained. No fits, CI or significance claim on four families. Publish all paired values and two-seed spreads. Any promising mechanism still requires fresh held-out rules, later-letter interventions and window stability before the c-law coefficients can be called explained.

Parameters and thresholds are frozen in information_design.json. Worst-case bound 32*2^28 ant steps plus controls; do not extend the cap or choose another radius after seeing outcomes. Register any changed plan as a new stage.

Read-versus-write control — 2026-10-20 01:51:18 (+13:00), before outcomes

Prospective amendment before this stage has run: add a next arm preserving only rule[(c+1) mod n]. That is the turn bit written by this read. The registered one-turn versus two-turn comparison otherwise cannot separate future timing from this immediate write instruction. The resulting 2x2 comparison retains neither bit (uniform), only the read bit (turn), only the write bit (next), or both (word2), plus full as reference. No treatment outcome has been inspected. Total ant budget becomes 40*2^28 steps, 24 new treatment runs plus 16 full/uniform replays; controls unchanged.

Score next using the same predeclared I1/I2/I3 criteria. It is an explanatory alternative, not an extra opportunity for a fresh-validation claim. If next and word2 succeed where turn fails, the write bit is the sharper candidate; if only word2 succeeds, the pair matters. If none succeeds, neither immediate bit nor pair closes this field memory. The same alias/path oracle must cover the new policy, and next-turn changes must be exactly zero in its resets. Meaningful scrambling, paired budgets and eventual fresh confirmation remain required. Preserve the initial two-policy proposal above as history.

Information pilot implementation and commands

Reset::Word(1) retains the read bit; Reset::Next the written bit; Reset::Word(2) their pair. All conditional class lists are ordered by phase index and sampled with one seeded draw. Independent oracle lists are rebuilt from the rule on each reset. Diagnostic JSON adds current-/next-turn change counts and ambiguous-class exposure. Old scientific fields must replay exactly. Calibration uses no target-frequency lookup and consumes no main-cohort input.

Commands (WSL repository root, usual UV exports):

uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/run_information.py --stage build
uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/run_information.py --stage replay
uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/run_information.py --stage pilot
uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/analyse_information.py

Or queue the complete sequence with scripts/launch_information.py under uv run --frozen; logs, recipes, hashes and markers go in results/information_v1/. Runtime PID/exit files are ignored. Verify a live handle or terminal state before resuming; never infer termination from a log timeout. There are two independent case workers, no performance claim, no new dependencies. The implementation/analysis commit freezes all thresholds before this pilot. Any support is confined to these inspected pilot families until a genuinely fresh rule and window test succeeds.

Information-policy outcome — 2026-10-20 02:01:53 (+13:00)

Registration and implementation 1002d9c14e55cfc8a6d5fb924cb7e529b8263985. All 16 old full/uniform summaries and 16 walker controls replay exactly; alias/path/word oracles pass. All treatment windows complete (8/8 per arm). I1 and I3 hold in all three policies, but I2 fails in all three, so every candidate is rejected under the registered cost-and-physical-budget criterion.

Retained information Median / maximum abs ln c error Median max budget error Sensitive max budget error I1 / I2 / I3
Read bit .041496 / .062709 .231996 1.036914 HELD / FAILED / HELD
Written bit .055218 / .246332 .159919 1.580011 HELD / FAILED / HELD
Both bits .004752 / .061969 .137589 .571254 HELD / FAILED / HELD

Six eligible pairs in every policy have >=10% actual phase changes, including both RRRRLLRRLLLLRR seeds. Current/read preservation restores that rule's c to |ln ratio| <=.0421, but not its return budget; preserving both bits improves the budget without reaching .20. These results do not establish a sufficient compressed field, and the selected sensitive case is not fresh validation. Sources: results/information_report.json, results/information_v1/; commands and all seeds in the frozen config/recipe. Full release tests pass.

Boundary-clock diagnostic proposal

Before adding memory, audit a possible confound in the physical-time budget. A visited cell's number of fresh neighbours only decreases. Therefore any cell read on the boundary was on the boundary at all its earlier reads: interior reads cannot advance its phase and later reappear as boundary reads. Its boundary phase clock is consequently indexed by boundary visits exactly. Interior excursions can change elapsed time between these visits without changing the number of boundary reads per birth. A physical-lag-bin mismatch is not by itself a proof of a different intrinsic boundary birth process.

Keep every I2 failure above. The next diagnostic must compare boundary-event return lags AND the distribution/serial structure of boundary reads between births, not simply discard a failed budget test. Calibrate with synthetic clock stretching and known renewal sequences; replay old trajectories exactly. Freeze new thresholds before inspecting native-clock outputs. Any alternative mechanism still needs fresh main/window/mutation tests. No goal completion or retrospective pass is claimed by raising this instrument question.

Native boundary-process audit — 2026-10-20 07:30 (+13:00)

Registered before native-clock instrumentation or outcomes. Existing M/I failures stand. Hypothesis H-clock: physical-time budget differences can coexist with a matching boundary birth process. Test the same four excluded bases, two seeds, five information arms, unchanged 2048+8192 boundary window and 2^28 cap. No main outcomes, changed radius or longer retained word.

Add a per-event return lag in all boundary reads, including warmup, since the source's previous boundary read; zero denotes no previous read. Monotone visitation implies a boundary source has never previously been interior, so first-read status must agree with the physical clock. Classify native returns as first / 1..4 / 5..16 / >16; these counts per birth sum exactly to 1/c. This is a new classification, not a reinterpretation of physical lag-4.

Record the complete empirical distribution of waits between successive births in boundary-event indices. Exclude the left partial and right censored waits, report both explicitly, and verify first-birth-index + complete wait sum + right tail = window reads. Report adjacent-wait joint distributions using fixed bins 1,2,3,4,5..8,9..16,17..32,>32. This tests serial structure beyond a matched marginal or mean; finite samples do not establish renewal/independence.

N0: independent sparse path oracle must reproduce native lags including warmup; all 40 old ant summaries replay every old field exactly before interpretation. Calibrate the analysis on known deterministic renewal sequences, arbitrary physical-time stretching (native summaries exactly invariant), and sequences with equal waiting marginals but changed serial order (joint TV >.20). Instrument equality and these analysis calibrations gate interpretation.

N1 (each compressed arm): >=6/8 eligible pairs, median largest native-budget error <=.20, and both sensitive-rule seeds <=.20. N2: complete waiting-law TV <=.05 and adjacent binned-wait joint TV <=.075 in both sensitive seeds and in >=6/8 eligible pairs. Eligibility is unchanged; zero-birth complete arms fail, caps are retained. Compare uniform as a negative comparator, not a required negative result. Preserve I1/I3 exposure gates; even all N tests holding would support only this pilot's boundary-process approximation and would not withdraw I2 or explain c-law coefficients. Any failed N test rejects H-clock as a sufficient explanation for that arm under these descriptive thresholds. No p-values or confidence intervals from eight dependent pairs. Thresholds are prospective resolution choices; report all distances and two-seed spreads, including the full reference's own seed-to-seed distances.

Fresh build and SHA-256, no overlapping heavy jobs, per-case provenance and validated .done markers required. New recorder emits optional event rows; compact exact histograms/joint counts are committed, bulk rows are discarded after checks and can be regenerated. Synthetic calibration uses seed 2026102071. Commands: uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/run_native.py (background, results/native_v1/session.log), then scripts/analyse_native.py.

Native-clock outcome — 2026-10-20 07:35 (+13:00)

Registration 3521b6c037168657e26b21bb0b6bdc254eed8faf; instrument/analysis b1bcbbc4844a221abb02a36778664ae23a53ccaf. Background worker 1997684 completed with exit 0. All 40 old ant summaries replay every prior field exactly. All windows complete, with 8 eligible pairs per treatment. Independent sparse native-lag oracle and synthetic counter/time-stretch/order tests pass. The full cargo test --release suite passes in a fresh target; logs, binary SHA-256, source hashes and per-case recipes are in results/native_v1/. No dependencies added; no GPU code changed. No main-cohort outcomes opened.

N1 and N2 FAIL for every arm. The physical-budget failure is not explained solely by stretching interior excursion durations: native return costs and the boundary birth-waiting process differ too, on these inspected pilots.

Retained bits Median largest native-budget error Waiting/serial pass pairs Sensitive waiting TV (two seeds) Sensitive serial TV (two seeds)
Neither (uniform) .228905 2/8 .128870 / .143031 .270117 / .293761
Read .221129 2/8 .153984 / .158839 .316819 / .316485
Written .169516 2/8 .124561 / .123878 .264662 / .262601
Both .137275 4/8 .143930 / .145131 .289429 / .281639

Sensitive native-budget errors for both bits are .574366/.619567 (limit .20). For comparison, the full reference's two sensitive-rule seeds differ by .050881 in native budget, .044029 in waiting TV and .041941 in serial TV. These between-seed distances are descriptive, not confidence bounds or independent replication. Across all four full rules the waiting TV is .000303–.044029, serial TV .000455–.052924. Full per-case exact waiting histograms and fixed-bin joint counts are committed, including endpoint censoring and accounting checks. Source: results/native_report.json; regenerate with the registered commands.

The pair-of-bits model has a close total c in the prior test, yet plainly changes the distribution and ordering of boundary effort between births in this challenge. This rejects H-clock as a sufficient explanation for these arms under the frozen resolutions. It does not establish what remote information is sufficient, whether larger words work, or an asymptotic result. Keep I2 and every original failed prediction. Main P1–P4 remain untested; no intercept, slope or later-letter correction has been derived.

Next discrimination: one phase edit rather than sustained forgetting

Proposal only, no new measurement. Repeated resets change the field and path together, so their failure does not isolate a single causal carrier. At a predetermined eligible boundary read of the full ant, replace only that source phase by another phase with the same next two turns, then evolve both copies with full memory and no more resets. Until the perturbed source reaches its first differing future turn, all moves and visited geometry must be identical: with a preserved two-turn word, no heading divergence can occur before its third read counting the edited read. This is an exact coupling prediction, not a fitted locality claim. A longer shared cyclic prefix delays divergence further; the first differing turn fixes the first divergent departure exactly.

A registered branch test could ask whether hidden future-clock information has sustained effects on boundary birth waits or washes out after a finite boundary horizon. Choose eligible events and phase draws without target future outcomes, retain censored/no-return branches, calibrate the coupling with an independent oracle, and freeze the horizon/response before inspecting it. This would separate delayed causal release from the accumulated geometry changes of repeated forgetting. It would not by itself derive the c law.

Analysis notebook: notebook.ipynb

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

What does a new cell cost?

This experiment asks what process sets births per boundary read. See the protocol and the append-only log. Calibrated recording exposed an unsupported rich lookup; a finite colour-memory closure subsequently failed both registered cost and return-budget tests. The main cohort remains unrun.

The immediate birth is fixed by the current turn and visited-neighbour mask. The unknown is their distribution. Births are not assumed independent regeneration points, and a pooled cross-rule transition matrix must respect target-rule-compatible successor states.

Provenance and design

The following cell reads only committed design files under this experiment's results directory, verifies their hashes and checks assignment invariants. Counts below describe a planned cohort, not measured ants. It runs from the repository root or any descendant directory.

Code
In [1]:
import csv, hashlib, json, subprocess
from collections import Counter, defaultdict
from pathlib import Path

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-20-c-law-renewal'
inputs = [EXP / 'results/design/families.csv', EXP / 'results/design/provenance.json']
for p in inputs:
    subprocess.run(['git', 'ls-files', '--error-unmatch', str(p.relative_to(ROOT))], cwd=ROOT, check=True, capture_output=True)
    subprocess.run(['git', '-c', 'core.filemode=false', 'diff', '--exit-code', 'HEAD', '--', str(p.relative_to(ROOT))], cwd=ROOT, check=True, capture_output=True)
    print(hashlib.sha256(p.read_bytes()).hexdigest(), p.relative_to(ROOT))
provenance = json.loads(inputs[1].read_text())
assert hashlib.sha256(inputs[0].read_bytes()).hexdigest() == provenance['manifest_sha256']
print('Source revision:', provenance['base_revision'])
print('Notebook revision:', subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=ROOT, text=True).strip())
print('Sampling seed:', provenance['sampling_seed'])
rows = list(csv.DictReader(inputs[0].open()))
families = defaultdict(list)
for row in rows:
    families[row['family']].append(row)
def necklace(rule):
    mirror = rule.translate(str.maketrans('RL', 'LR'))
    return min(r[i:] + r[:i] for r in (rule, mirror) for i in range(len(r)))
assert len({necklace(r['rule']) for r in rows}) == len(rows)
for family in families.values():
    assert len(family) == 3 and len({r['split'] for r in family}) == 1
    assert {r['arm'] for r in family} == {'base', 'early_swap', 'late_swap'}
    assert len({r['rule'].count('R') for r in family}) == 1
    for r in family:
        assert len(r['rule']) - len(r['rule'].lstrip('R')) == int(r['lead'])
print('Planned families by split:', dict(sorted(Counter(f[0]['split'] for f in families.values()).items())))
print('Planned rules:', len(rows))
print('This cell audits planned assignments only; pilot outcomes are audited below.')
bc37ff7e19aa4102dbbec69d17d39cb13986ea73f9225343263cad9eb1b946c8 experiments/2026-10-20-c-law-renewal/results/design/families.csv
46df2597f5e2fdab027d097513467be8f4c1913fd04667d219a9b8f34370b28a experiments/2026-10-20-c-law-renewal/results/design/provenance.json
Source revision: adf66774570469da30b10ffc1ceab911670a9d09
Notebook revision: 94516e5c277ce026c3b5f5cea03545e2654338e1
Sampling seed: 2026102001
Planned families by split: {'pilot': 4, 'train': 32, 'validation': 16}
Planned rules: 156
This cell audits planned assignments only; pilot outcomes are audited below.

Method and controls

The source recorder is compared event by event to a sparse independent path oracle, plus exact totals against the existing aggregate tracer. The solver is calibrated on known two-state reward chains and challenged by hidden history. Rotor and random-walk controls use eight seeds each. The excluded pilot uses four families, three arms and two interior seeds, with horizons 2^22..2^26. Commands, seeds, thresholds and binary hashes are in the README and result provenance.

No main transition model is fitted. Draft P1–P4 remain untested; G1's solver calibration does not calibrate an ant state/backoff model. The support repeat at k=26 is a registered feasibility diagnostic after the horizon failure, not a rescue of the gate.

What remains unestablished

There is no validated local renewal model, no derived intercept or slope, and no new mechanism claim about kappa. The pilot gate failed; no families were replaced and no validation outcomes were opened. Unseen-state mass is only a feasibility check, not a measure of predictive accuracy. Coarsening can improve support while destroying relevant information.

Next decisions must address both sampling failures and target-rule-compatible transitions. A good total birth rate alone cannot show Markov closure; the hidden-history calibration supplies a counterexample.

Pilot provenance and results

Only committed JSON/CSV summaries are read. Every input is checked for content changes and hashed; ignored event dumps are not notebook inputs. Uncertainty below is between seeds, not a fit standard error.

Code
In [2]:
files = [EXP / 'results' / name for name in ['calibration.json', 'pilot_report.json', 'pilot_diagnostics.json', 'pilot_diagnostics.csv']]
if (EXP / 'results/support_report.json').exists():
    files.append(EXP / 'results/support_report.json')
for p in files:
    subprocess.run(['git', 'ls-files', '--error-unmatch', str(p.relative_to(ROOT))], cwd=ROOT, check=True, capture_output=True)
    subprocess.run(['git', '-c', 'core.filemode=false', 'diff', '--exit-code', 'HEAD', '--', str(p.relative_to(ROOT))], cwd=ROOT, check=True, capture_output=True)
    print(hashlib.sha256(p.read_bytes()).hexdigest(), p.relative_to(ROOT))
calibration, controls, diagnostic = [json.loads(p.read_text()) for p in files[:3]]
support = json.loads(files[4].read_text()) if len(files) == 5 else None
assert calibration['passed']
print('Synthetic reward solver: maximum |c error|', calibration['max_absolute_error'], 'signed bias', calibration['signed_bias'], 'between-seed sd', calibration['between_seed_sd'])
print('Hidden-history control: pooled c', calibration['negative_control']['pooled_c'], 'conditional contrast', calibration['negative_control']['contrast'])
for walker, result in controls['controls'].items():
    assert result['passed'] and result['n'] == 8
    print(walker, 'c mean', result['mean'], 'between-seed sd', result['between_seed_sd'], 'escapes', result['escapes'])
assert controls['thread_check']['identical']
assert controls['horizon']['selected_log2'] is None
print('Original pilot horizon verdict:', controls['horizon']['status'])
print('Usable k=26 runs:', diagnostic['k26_usable_runs'], '/', diagnostic['k26_n'])
for name, result in (support['models'] if support else {}).items():
    print(name, 'unseen read mass median', result['median_unseen_mass'], 'maximum', result['max_unseen_mass'], 'runs >5%', result['runs_over_5pct'])
if support is None:
    print('Excluded support diagnostic is pending; no support verdict yet.')
print('These outputs are calibration and feasibility evidence; P1-P4 are untested.')
223c59d49fb1c2e3033630f941e5c2fff86b120e4855cac4ae6ae7222e394786 experiments/2026-10-20-c-law-renewal/results/calibration.json
60c51af722ba71a690fbe7290697f3fb72e9e6e2644fac48a6c45554e5ec3a4e experiments/2026-10-20-c-law-renewal/results/pilot_report.json
0c79950115ec834669cd9ede9a8c73846278caa250951a85bbc97d0ae78aa0d3 experiments/2026-10-20-c-law-renewal/results/pilot_diagnostics.json
aff83d63c41f98a45d30ddff3f4b13817084f397c2d3c8f537e4d54b78c8a553 experiments/2026-10-20-c-law-renewal/results/pilot_diagnostics.csv
2ef41335ed667d842ef7a1252d7f7a0a0bef4f1974be1d7c8e94074a537b03c1 experiments/2026-10-20-c-law-renewal/results/support_report.json
Synthetic reward solver: maximum |c error| 0.0018502018274182408 signed bias 0.0002107888335104724 between-seed sd 0.000865310084626809
Hidden-history control: pooled c 0.499742 conditional contrast 0.8029957507452465
rotor c mean 0.4975039943500837 between-seed sd 0.00046687638082219373 escapes 0
rw c mean 0.44660243172590325 between-seed sd 0.008121941614407723 escapes 0
Original pilot horizon verdict: STOP_register_geometry_or_budget_revision
Usable k=26 runs: 2 / 24
S0 unseen read mass median 1.0 maximum 1.0 runs >5% 24
S1 unseen read mass median 1.0 maximum 1.0 runs >5% 24
S2 unseen read mass median 1.0 maximum 1.0 runs >5% 24
C0 unseen read mass median 0.008884325343085211 maximum 0.06893571487365215 runs >5% 4
C1 unseen read mass median 0.02264340955995678 maximum 0.07459419051687313 runs >5% 7
C2 unseen read mass median 0.042752241640382826 maximum 0.30088715180842485 runs >5% 12
C4 unseen read mass median 0.361318097157028 maximum 0.5462187480612941 runs >5% 24
C8 unseen read mass median 0.9444270080966247 maximum 1.0 runs >5% 24
These outputs are calibration and feasibility evidence; P1-P4 are untested.

Interpretation and next discrimination

The controls validate recording and the narrow solver task. They do not validate a model of ant state frequencies. The original pilot failed to supply a common sampling window; its support diagnostic cannot retroactively make that gate pass. Full eight-turn states may encode family identity and lose transfer support. A smaller state still needs a generative transition rule consistent with the target rule and a test against hidden history.

Finite colour memory: an exact-rule intervention

Keep the target rule's exact colour clock inside a moving Chebyshev-radius r patch. On a forgotten re-read sample a uniform phase; first reads retain the original phase. The model creates its own path and visited geometry, without target state frequencies. Compare full, r=0/1/2/4/8 and zero-reset r=4 on four excluded base rules and two seeds.

Before measuring, replace the proposed fixed-time window by 2048 warmup boundary reads followed by 8192 measurement reads, capped at 2^28 steps. At most 10240 births can occur before a complete stop, preventing band depletion. Report every cap. This prospectively amended pilot does not rescue the original failed horizon gate.

Exact deduction: a k-step returning quarter-turn path can stray at most k/4 cells in either coordinate. Forgetting at radius r requires return lag at least 4(r+1). Thus r=4 directly resets only >16-step phases. Independent eviction/path/window oracles and exhaustive 16-step turn-word checks precede data; full release tests pass. Calibration and finite-window bias appear below.

Code
In [3]:
import numpy as np
memory_files = [EXP / 'results' / name for name in ['memory_report.json', 'memory_diagnostics.json', 'memory_v1/controls.json', 'memory_pilot.png']]
for p in memory_files:
    subprocess.run(['git', 'ls-files', '--error-unmatch', str(p.relative_to(ROOT))], cwd=ROOT, check=True, capture_output=True)
    subprocess.run(['git', '-c', 'core.filemode=false', 'diff', '--exit-code', 'HEAD', '--', str(p.relative_to(ROOT))], cwd=ROOT, check=True, capture_output=True)
    print(hashlib.sha256(p.read_bytes()).hexdigest(), p.relative_to(ROOT))
memory, memory_diagnostic, memory_controls = [json.loads(p.read_text()) for p in memory_files[:3]]
for walker, result in memory_controls['controls'].items():
    assert result['passed'] and result['n'] == 8
    print(walker, 'boundary-clock c', result['mean'], 'between-seed sd', result['between_seed_sd'], 'difference vs old fixed time', result['difference_from_parent_fixed_time_mean'])
for mode, result in memory['tests'].items():
    pairs = [r for r in memory['comparisons'] if r['mode']==mode and r['eligible']]
    errors = [float('inf') if r['error_infinite'] else r['abs_log_error'] for r in pairs]
    budgets = [float('inf') if r['budget_error_infinite'] else r['max_budget_error'] for r in pairs]
    assert len(pairs) == result['eligible_pairs']
    assert np.isclose(np.median(errors), result['median_abs_log_error'])
    assert np.isclose(max(errors), result['max_abs_log_error'])
    assert np.isclose(np.median(budgets), result['median_max_budget_error'])
    print(mode, 'n', len(pairs), 'median |ln c ratio|', np.median(errors), 'max', max(errors), 'median max budget error', np.median(budgets), 'M1', result['M1'], 'M2', result['M2'])
print('M3', memory['policy']['M3'], 'defined pairs', memory['policy']['eligible_defined_pairs'])
for row in memory_diagnostic['decomposition']:
    if row['lead']==4 and row['mode']=='uniform:4':
        print(row['rule'], row['seed'], 'signed cost change', row['delta_reads_per_birth'], 'first/lag4/short/long', row['signed_budget_delta_first_lag4_short_long'])
print('Max full-ant absolute ln event-clock/fixed-time c:', max(abs(r['ln_event_over_fixed']) for r in memory_diagnostic['clock_audit']))
print('Main P1-P4 untested. Four rules, two seeds each; no confidence interval or universal locality claim.')
313cee96d78355d2ada2320198eeedbaf2ddb82ef9d24291751bc84dbdbf7c4f experiments/2026-10-20-c-law-renewal/results/memory_report.json
7b742081ea5894b4fcfc6d57c80992090d194bc99af0c315584ebbc1cff18713 experiments/2026-10-20-c-law-renewal/results/memory_diagnostics.json
12692c5cfd5ff2a45848bab3a5684a4002b066c57660c1aa84949168e4245902 experiments/2026-10-20-c-law-renewal/results/memory_v1/controls.json
c5ee5b43bc1f42af437e3ebadb2b1b2c838843ef7d420adf7e54f3d296862830 experiments/2026-10-20-c-law-renewal/results/memory_pilot.png
rotor boundary-clock c 0.5007476806640625 between-seed sd 0.0031329445670095434 difference vs old fixed time 0.003243686313978811
rw boundary-clock c 0.462432861328125 between-seed sd 0.006131614311152842 difference vs old fixed time 0.01583042960222175
uniform:4 n 8 median |ln c ratio| 0.012053640265808484 max 0.29892578143930193 median max budget error 0.24866150578978552 M1 FAILED M2 FAILED
uniform:8 n 8 median |ln c ratio| 0.012622660828981086 max 0.27618482008612333 median max budget error 0.20088074993888094 M1 FAILED M2 FAILED
M3 UNINFORMATIVE defined pairs 2
RRRRLLRRLLLLRR 2026102021 signed cost change -0.9532008227204058 first/lag4/short/long [-0.0016575492669566039, 0.5133090279438044, 0.16954745468829002, -1.634399756085544]
RRRRLLRRLLLLRR 2026102022 signed cost change -1.052035007060475 first/lag4/short/long [-0.08958669655491303, 0.4697284410016129, 0.15318996452541664, -1.5853667160325915]
Max full-ant absolute ln event-clock/fixed-time c: 0.040581858906086773
Main P1-P4 untested. Four rules, two seeds each; no confidence interval or universal locality claim.
Code
In [4]:
from IPython.display import Image, display
display(Image(filename=str(EXP / 'results/memory_pilot.png')))
No description has been provided for this image

What failed, what we learned, what remains

M1 and M2 fail at both r=4 and r=8; r=8's budget miss is narrow but remains a failure. The lead-4 rule has both paired c estimates roughly 30–35% too high under uniform forgetting. In the lead-2 rule, increased short-loop cost nearly cancels decreased long-return cost, hiding a wrong budget behind a close total. The lead-3 rule has negligible boundary reset exposure and is a weak challenge. Six zero-policy cases never open a measurement window; M3 has only two defined pairs and is uninformative.

Short-loop phase preservation alone with uniform forgotten phases is insufficient here. This is not a general rejection of local mechanisms. Global geometry is retained by the model, the window is early, there are only four pilot rules, and main outcomes remain unopened. The full-ant clock audit is exploratory and not a proof of asymptotic equivalence.

Next proposal: preserve only the old turn bit when scrambling a forgotten phase, then compare preserving two future turns. That distinguishes a directional field from a distant phase clock. It needs a fresh oracle, registration, exposure checks and held-out confirmation; no such result exists yet. The c-law coefficients and later-letter corrections remain unexplained.

Code
In [5]:
# Subsequent read/write-information pilot; original failures stand.
p = EXP / 'results/information_report.json'
subprocess.run(['git', 'ls-files', '--error-unmatch', str(p.relative_to(ROOT))], cwd=ROOT, check=True, capture_output=True)
subprocess.run(['git', '-c', 'core.filemode=false', 'diff', '--exit-code', 'HEAD', '--', str(p.relative_to(ROOT))], cwd=ROOT, check=True, capture_output=True)
print(hashlib.sha256(p.read_bytes()).hexdigest(), p.relative_to(ROOT))
information = json.loads(p.read_text())
print(json.dumps(information['tests'], indent=2))
print('All information candidates fail I2; close total cost does not restore the physical return budget.')
7ad35e2d75c26e58eede00cb6c59e5c530b84e9c39a68c0fe6d7137f5b0804e2 experiments/2026-10-20-c-law-renewal/results/information_report.json
{
  "turn:4": {
    "eligible_pairs": 8,
    "median_abs_log_error": 0.041496427111369166,
    "max_abs_log_error": 0.06270948415997094,
    "cost_has_infinite_error": false,
    "median_max_budget_error": 0.23199599678868682,
    "sensitive_eligible_pairs": 2,
    "sensitive_max_abs_log_error": 0.0420913400014354,
    "sensitive_max_budget_error": 1.0369142481886442,
    "exposed_pairs": 6,
    "exposed_sensitive_pairs": 2,
    "I1": "HELD",
    "I2": "FAILED",
    "I3": "HELD",
    "candidate": "REJECTED_ON_PILOT"
  },
  "next:4": {
    "eligible_pairs": 8,
    "median_abs_log_error": 0.05521801526968151,
    "max_abs_log_error": 0.2463318569364421,
    "cost_has_infinite_error": false,
    "median_max_budget_error": 0.15991916682154758,
    "sensitive_eligible_pairs": 2,
    "sensitive_max_abs_log_error": 0.2463318569364421,
    "sensitive_max_budget_error": 1.5800113042343535,
    "exposed_pairs": 6,
    "exposed_sensitive_pairs": 2,
    "I1": "HELD",
    "I2": "FAILED",
    "I3": "HELD",
    "candidate": "REJECTED_ON_PILOT"
  },
  "word2:4": {
    "eligible_pairs": 8,
    "median_abs_log_error": 0.004752050669515511,
    "max_abs_log_error": 0.061968954435637755,
    "cost_has_infinite_error": false,
    "median_max_budget_error": 0.13758889758668139,
    "sensitive_eligible_pairs": 2,
    "sensitive_max_abs_log_error": 0.061968954435637755,
    "sensitive_max_budget_error": 0.5712538346415932,
    "exposed_pairs": 6,
    "exposed_sensitive_pairs": 2,
    "I1": "HELD",
    "I2": "FAILED",
    "I3": "HELD",
    "candidate": "REJECTED_ON_PILOT"
  }
}
All information candidates fail I2; close total cost does not restore the physical return budget.

Does the boundary birth process differ, or only physical return time?

The next registered audit keeps all earlier failures. A boundary source cannot have been interior on a previous read, since visitation only removes fresh neighbours. Its phase clock therefore counts boundary visits. Compare first/1..4/5..16/>16 native return budgets, the complete empirical inter-birth waiting distribution, and adjacent waiting pairs in fixed bins. Left and right partial waits are retained as censored endpoints.

Same four excluded bases, two seeds, five arms, 2048 warmup plus 8192 measurement reads. No main outcomes, parameter fitting or new treatment. Known synthetic waits calibrate the counters; physical-time stretching must leave native summaries invariant, and reordering equal-marginal waits must change the serial test. The sparse path oracle checks native lags through warmup. Every earlier ant summary must replay exactly.

Code
In [6]:
p = EXP / 'results/native_report.json'
subprocess.run(['git', 'ls-files', '--error-unmatch', str(p.relative_to(ROOT))], cwd=ROOT, check=True, capture_output=True)
subprocess.run(['git', '-c', 'core.filemode=false', 'diff', '--exit-code', 'HEAD', '--', str(p.relative_to(ROOT))], cwd=ROOT, check=True, capture_output=True)
print(hashlib.sha256(p.read_bytes()).hexdigest(), p.relative_to(ROOT))
native = json.loads(p.read_text())
print('Synthetic calibration:', native['calibration'])
for name, digest in native['inputs_sha256'].items():
    q = ROOT / name
    subprocess.run(['git', 'ls-files', '--error-unmatch', name], cwd=ROOT, check=True, capture_output=True)
    assert hashlib.sha256(q.read_bytes()).hexdigest() == digest
    r = json.loads(q.read_text())
    s = r['native']
    assert sum(s['native_lag']) == s['reads'] == r['summary']['boundary_reads']
    assert s['births'] == r['summary']['births']
    assert s['left_partial_reads'] + sum(int(k)*v for k,v in s['wait_counts'].items()) + s['right_censored_reads'] == s['reads']
    assert sum(s['wait_counts'].values()) == s['complete_waits']
    assert sum(s['joint_counts'].values()) == max(0, s['complete_waits']-1)
for mode, result in native['tests'].items():
    print(mode, 'N1', result['N1'], 'N2', result['N2'], 'median native budget error', result['median_budget_error'], 'waiting-pass pairs', result['waiting_pass_pairs'])
    for r in result['sensitive']:
        print('  sensitive seed', r['seed'], 'budget', r['native_budget_error'], 'wait TV', r['wait_tv'], 'serial TV', r['joint_tv'])
print('Full-reference between-seed distances:', native['reference_seed_spreads'])
c5dd3cff437647a2a8eb4fcad5de48f5de56a4f3f7cf30d89cc1134a194121e4 experiments/2026-10-20-c-law-renewal/results/native_report.json
Synthetic calibration: {'seed': 2026102071, 'known_wait_counts_exact': True, 'time_stretch_invariant': True, 'same_marginal_serial_tv': 0.9974937343358395, 'empty_window_accounting': True}
uniform:4 N1 FAILED N2 FAILED median native budget error 0.2289049961356466 waiting-pass pairs 2
  sensitive seed 2026102021 budget 1.1803134344395358 wait TV 0.1288695811670375 serial TV 0.27011696785091494
  sensitive seed 2026102022 budget 1.173555973411283 wait TV 0.14303062507242612 serial TV 0.2937611830188783
turn:4 N1 FAILED N2 FAILED median native budget error 0.22112920981112058 waiting-pass pairs 2
  sensitive seed 2026102021 budget 0.8632407738977129 wait TV 0.15398413802138444 serial TV 0.3168192921342004
  sensitive seed 2026102022 budget 0.8886841166740018 wait TV 0.15883879711704954 serial TV 0.3164849106901025
next:4 N1 FAILED N2 FAILED median native budget error 0.16951628465404817 waiting-pass pairs 2
  sensitive seed 2026102021 budget 1.192697480259164 wait TV 0.12456058726220015 serial TV 0.2646623319989612
  sensitive seed 2026102022 budget 1.1413735921688208 wait TV 0.12387813392451119 serial TV 0.26260145617170755
word2:4 N1 FAILED N2 FAILED median native budget error 0.13727524297030747 waiting-pass pairs 4
  sensitive seed 2026102021 budget 0.5743657113955111 wait TV 0.14392986276635814 serial TV 0.28942879895382
  sensitive seed 2026102022 budget 0.6195667937662779 wait TV 0.14513057050893174 serial TV 0.281639469992835
Full-reference between-seed distances: [{'family': 'pilot-m1-00', 'rule': 'RLLRLRRRLLRLLL', 'native_budget_error': 0.06866195966314159, 'wait_tv': 0.03198597974323568, 'joint_tv': 0.05292412036970971}, {'family': 'pilot-m2-00', 'rule': 'RRLLRLRLRRRLLR', 'native_budget_error': 0.01897050895757091, 'wait_tv': 0.029350480527189794, 'joint_tv': 0.03683606803121957}, {'family': 'pilot-m3-00', 'rule': 'RRRLRRRLLRRLRL', 'native_budget_error': 0.002725724313314748, 'wait_tv': 0.0003028009084027339, 'joint_tv': 0.0004545455197637466}, {'family': 'pilot-m4-00', 'rule': 'RRRRLLRRLLLLRR', 'native_budget_error': 0.05088084099215162, 'wait_tv': 0.04402934398442972, 'joint_tv': 0.04194066343101121}]

Limits of the native-clock comparison

These are descriptive distances between finite early windows, not independent-event significance tests. Complete waits exclude endpoint-censored intervals; the exact endpoint identity checks accounting without assuming their absence. Adjacent-pair agreement would not prove independence or equality of all higher-order history. Two seeds per four previously inspected pilot rules cannot establish general sufficiency. Full-reference seed distances expose sampling variability but do not change registered thresholds. All physical-budget failures remain recorded; main P1–P4 are untested, and the c-law intercept and slope remain unexplained.

Read the dated lab log

Lab notebook: local renewal model of the c law

Append-only. Corrections are new dated entries. No measurements in this scaffold.

2026-10-20 00:30 (+13:00) · adf66774570469da30b10ffc1ceab911670a9d09 · intent

Scaffold the selected enquiry: explain boundary reads per birth through a local reward process, and challenge it with lead- and composition-preserving early/late swaps. Read the parent's README, src/edge_trace.rs, its driver, notes/open-questions-hypotheses.md and notes/calibration.md before design. User requested a scaffold, not a simulation campaign.

2026-10-20 00:30 (+13:00) · adf66774570469da30b10ffc1ceab911670a9d09 · assumption

Local boundary states may close approximately under transition. Untested. Births are not known regeneration times; stationary event weights are not automatically transferable between rules. Matched interior seeds provide paired replicates, not independent boundary reads.

2026-10-20 00:30 (+13:00) · adf66774570469da30b10ffc1ceab911670a9d09 · decision

README predictions are draft until instrument calibration, pilot support and model choices are frozen. Existing aggregate tracer cannot train ordered transition models; do not simulate the main cohort before that gap is filled. Keep this work isolated from the lattice and blog edits already in progress.

2026-10-20 00:34 (+13:00) · adf66774570469da30b10ffc1ceab911670a9d09 · observation

First design-generation attempt caught an invalid swap at the end of the opening run: index 4 can be the first opposite letter when lead=4. Added an explicit lead-preservation rejection before accepting any family; no design files had been written by the failed attempt. Re-ran uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/prepare.py and --check in WSL: 52 families generated and byte-verified (4 excluded pilot, 32 training, 16 validation; three rules each). These are design counts, not measurements. Provenance and exact source hashes are in results/design/provenance.json. WSL initially required sandbox escalation; the authorized retry succeeded.

2026-10-20 00:36 (+13:00) · 3e7b307 · observation

cargo test --release completed with exit status 0 in WSL (existing compiler warnings; no Rust changed by this scaffold). Local full log: scratch/release-tests.log (ignored). prepare.py --check verified the committed design. Executed notebook.ipynb top to bottom in a fresh kernel with the README's uv run --frozen --with jupyter --with nbconvert --with ipykernel jupyter nbconvert ... command; saved small design-audit outputs. The first notebook attempt rejected WSL mount-only executable-bit changes; the read-only content check now passes git -c core.filemode=false diff. Dependencies were not added to the project or lockfile.

2026-10-20 00:36 (+13:00) · 3e7b307 · deviation

Another active repository session committed the initially staged scaffold alongside its lattice results in 3e7b307 before this session's commit ran. Kept that existing commit intact. The scaffold's recorded base revision is still adf66774570469da30b10ffc1ceab911670a9d09; generated-input hashes are unchanged. Final notebook and verification entries get a separate scoped commit. No unrelated edits were reverted.

2026-10-20 00:36 (+13:00) · 3e7b307 · decision

Scaffolding complete. Ordered-event instrument, estimator implementation, synthetic calibration, walker controls, pilot and main simulations remain unrun. The draft blog entry and open-question pointer label that status. No homepage result highlight is warranted by design preparation alone.

2026-10-20 00:37 (+13:00) · a976af5 · intent

The active goal now authorizes continuing beyond scaffolding: learn the local process governing reads per birth. Previous turn made progress by committing the reproducible scaffold. Authoritative inspection finds no ordered-event instrument or live run for this experiment. Implement a callback instrument and an independent sparse-path oracle first, retaining complete read-lag categories and both window-edge censoring flags. Do not open main-cohort outcomes before the pilot and model freeze.

2026-10-20 00:37 (+13:00) · a976af5 · assumption

New lattice results in notes/open-questions-hypotheses.md reject a slope proportional to loop length. This does not invalidate testing square-lattice local closure, but rules out interpreting a loop-cost decomposition as a universal slope derivation without a separate model for how many cells share each loop. No new measurement made in this session yet.

2026-10-20 00:52:43 (+13:00) · 02f5d13 · observation

Implemented src/edge_renewal.rs, the single-run driver, sparse path oracle and aggregate-oracle comparisons. Initial test failed on the invalid "R" fixture (rules require >=2 colours); corrected to "RR", then all four test groups passed. The recorder also satisfies the exact immediate-birth predicate for every oracle-tested ant event. Entire cargo test --release passed with exit 0 after the pilot (log scratch/full-release.log). No GPU files or probe estimator changed; no CUDA tests required for this addition.

2026-10-20 00:52:43 (+13:00) · 02f5d13 · observation

Frozen calibration/pilot scripts ran via the detached scripts/launch_pilot.py -> run_pilot_all.sh job. PID 1642950 was observed live during the run; terminal session.exit is 0. An earlier shell launch never created a PID/log or live child, verified before the successful retry. Fresh-build recipe, binary/source hashes, per-run argv and resumable markers are under results/pilot_v1/; commands are in README.

Synthetic stationary reward calibration: 16 seeds x 10^6 events, maximum absolute c error 0.0018502, signed bias +0.0002108, between-seed sd 0.0008653. Hidden history: pooled c 0.499742, conditional contrast 0.802996. This passes the solver/negative-control criteria; the ant backoff estimator is still unimplemented. results/calibration.json records all seeds and code hash. Rotor (8 seeds): c mean 0.497504, between-seed sd 0.000467; random walk (8): 0.446602, sd 0.008122; no escapes. Count CSV identical at thread settings 1 and 6. G2 passes. See results/pilot_report.json.

2026-10-20 00:52:43 (+13:00) · 02f5d13 · surprise

The original pilot horizon gate failed for every family at every k=22..26. At k=26 only 2/24 individual runs meet both requirements: 6 fail >=5000 window births; 22 fail 10–80% band consumption. Boundary-time fractions range from 0.0000459 to 0.01148. No rules were screened or replaced. scripts/pilot_diagnose.py -> results/pilot_diagnostics.{csv,json}. The low event supply may come from geometry, starting-field trapping or genuine rule dynamics; these summaries do not distinguish the causes.

2026-10-20 00:52:43 (+13:00) · 02f5d13 · decision

Do not launch the main cohort or claim closure failed. A registered support diagnostic repeats only excluded pilots at the same k=26/binary, retaining the horizon failure. It will test whether the source-colour/eight-turn word isolates families before any model is fitted. A separate lattice sweep (observed live PID 1655913) currently occupies the machine; wait for it to finish before this diagnostic. Main prediction tests P1–P4 remain unrun.

2026-10-20 00:57:10 (+13:00) · e81f238 · observation

Updated shareable notebook from committed calibration/pilot summaries using scripts/build_notebook.py, then executed it top to bottom in a new kernel with the README's nbconvert command. Outputs reproduce control means, between-seed variation and failed horizon gate. Support results are explicitly pending. uv run --frozen --only-group blog blog/scripts/test_experiments.py passes (2 tests); homepage and reader guide now point to the pinned pilot failure, not a claimed mechanism. The full release suite already passed.

2026-10-20 00:57:10 (+13:00) · e81f238 · decision

uv run --frozen experiments/2026-10-20-c-law-renewal/scripts/launch_support.py queued the registered support diagnostic. Worker PID 1662130 was confirmed live with its exact command; it checks actual /proc command lines before starting, waiting for all observed release/cargo jobs. The earlier lattice PID 1655913 finished; a new live colour-analysis job PID 1661904 still runs. Worker log: results/pilot_support/session.log; runtime PID/exit files are local and ignored. Do not restart this job based on a stale log or observation timeout: inspect that handle and terminal status first. The research goal is not achieved: no ant transition model, held-out prediction, or coefficient derivation exists yet. Sampling and physically compatible transitions remain the next scientific decisions after the excluded support audit.

2026-10-20 00:59:52 (+13:00) · e7052b7 · observation

Queued worker 1662130 waited for actual heavy jobs, then completed the registered support repeat with terminal status 0. All 24 counts-mode summaries exactly match the original k=26 summaries; deterministic reward and incoming/outgoing/censoring flow checks pass. scripts/support_probe.py produced results/support_report.json; bulk count tables and their hashes are under dumps/pilot_support/ and results/pilot_support/ respectively.

Every S0/S1/S2 read is unseen under leave-one-pilot-family-out support: 100% unseen mass in all 24 runs. The registered feasibility prediction held. Without source colour, eight turns + patch still has median 0.94443 unseen mass. Current turn + patch has median 0.02264, maximum 0.07459 (7/24 >5%). No c model, main outcomes or original P1–P4 test was fitted or scored.

2026-10-20 00:59:52 (+13:00) · e7052b7 · interpretation

The proposed rich lookup has no transfer support in this pilot. It preserves so much rule context that different families never share its observed states. This is a representation/feasibility failure, not evidence against all local mechanisms, and not a proof about the larger planned training cohort. Coarse states share support but omit the explicit future phase sequence. A candidate revision is compositional: apply the target rule's colour clock exactly and learn only unknown patch/return conditions. That proposal still requires a sampling revision, synthetic calibration and new frozen predictions before any main measurement. The original horizon failure stands.

2026-10-20 01:02:24 (+13:00) · 0fa4db2 · observation

Rebuilt and re-executed notebook.ipynb in a clean kernel after committing the support summaries; it reproduces the complete support table and retains all untested predictions as untested. Experiment-page publication tests pass again (2 tests). Updated the open-question record, active-work index, blog draft, reader guide and homepage with the support failure and pinned evidence. The support worker is terminal with exit 0; no experiment job remains live. Release tests passed earlier; only data, notebooks and documentation changed after that check. Goal remains active: a supported local process determining state frequencies, a tested replacement closure and coefficient derivation are still missing. Next session must redesign and register those tests, not relaunch the completed diagnostic or score the original rich lookup.

2026-10-20 01:06:34 (+13:00) · a95ad13 · intent

Previous goal turn was progress: calibrated recorder, failed sampling gate and unsupported rich representation were measured and committed. Inspected current files and goal; no own experiment job is live. A separate lattice colour job (PID 1663389) is live, so do not begin new ant measurements yet. Register the finite colour-memory intervention in README before implementation: apply target-rule phase updates exactly while resident; erase only forgotten phases, retaining the model's own visited geometry. M0 oracle tests come first. Four excluded base rules, two seeds, fixed radii/policies; main cohort unopened.

2026-10-20 01:06:34 (+13:00) · a95ad13 · decision

The earlier 10% consumed-band requirement is not retained for this new pilot: it mixes a size requirement into a boundary-cost measurement and failed despite some substantial boundary samples. Replace it prospectively by minimum boundary reads/births and an upper depletion bound, reporting every exclusion. This does not change the original failed verdict. The finite-memory model is a counterfactual colour-field closure, not an unmodified ant and not a proof that local geometry alone suffices. Its source phase must be reset before instrumentation; a Walker.step-only reset would label the wrong phase.

2026-10-20 01:23:41 (+13:00) · a95ad13 · deviation

Before any new model run, amended the proposed fixed-time pilot to a boundary clock: warm 2048 reads, measure 8192, global cap 2^28 steps. The original fixed-time proposal remains in README. At most 10240 births can occur before completion, analytically preventing band depletion (<2%) in every completed run. Complete model windows with zero births remain outcomes, not exclusions. This is a new prospective window; rotor/rw calibration and independent offline-window equivalence are mandatory before interpreting comparisons.

2026-10-20 01:23:41 (+13:00) · a95ad13 · observation

Implemented finite colour cache, source-preparation hook and boundary clock. Release checks: 5 local-memory tests, 4 existing renewal tests and 5 original aggregate-tracer tests pass; driver builds and Python runner/analysis compile. Logs: scratch/memory-instrument-tests.log, scratch/memory-driver-build.log. The new walker matches independent HashMap cache eviction step for step with seeded wrapping paths; full mode equals AntWalker. Known loops and an entire path retained in-cache have zero resets. No ant-pilot outcomes measured yet.

2026-10-20 01:23:41 (+13:00) · a95ad13 · interpretation

Exact geometric deduction: alternating axes imply a closed k-step path has k/4 positive and k/4 negative moves along each axis, so no coordinate can stray by more than k/4. Cache eviction at radius r therefore requires a return lag >=4(r+1). Radius 4 preserves every <=16-step source phase. Tests exhaust all 16-step turn words/closed prefixes and check the bound on every oracle-observed reset. This clarifies the intervention: it directly erases only long-return phases while preserving immediate short-loop clocks, though the changed path may alter the frequency of those short loops indirectly. It does not yet explain the measured c-law coefficients.

2026-10-20 01:23:41 (+13:00) · a95ad13 · decision

Freeze memory_design.json, implementation and M1/M2/M3 analysis before launch. Cases are four excluded bases x two seeds x seven arms, no fitting or main-outcome access. A fresh build re-runs oracle tests; boundary-clock rotor and random-walk controls gate the pilot. Source hashes and deterministic per-case markers make the run resumable. Most recent process inspection showed no cargo/lattice/memory runner live, but the launcher rechecks actual heavy jobs before each stage. Do not claim locality from a low-exposure match.

2026-10-20 01:37:33 (+13:00) · c826721 · observation

Worker PID 1686706 ran build, controls, 56-case pilot and registered analysis; terminal results/memory_v1/session.exit is 0. Fresh binary SHA-256 393aafa68177b7c51f94a967583290a742b7c6912da65e3ef9f15b4033eb29e7, full recipe/source hashes and logs in results/memory_v1/build.json. Boundary-clock controls, 8 seeds each: rotor c 0.500748, between-seed sd 0.003133; rw 0.462433, sd 0.006132. Relative to the old fixed-time means, differences are +0.003244/+0.015830; record that window bias rather than treating the early clock as asymptotically calibrated. Source/clock oracles and the entire cargo test --release pass; full log scratch/memory-full-release.log. No new dependencies or GPU code changed.

2026-10-20 01:37:33 (+13:00) · c826721 · surprise

All 8 full references and uniform r=4/r=8 arms complete their windows. Registered M1 and M2 FAIL for both radii. Median absolute ln c ratio is small (0.012054/0.012623) but maxima 0.298926/0.276185 exceed 0.25. Median largest budget errors 0.248662/0.200881 exceed 0.20 (r=8 narrowly). Do not round the last value into a pass. Lead-4 RRRRLLRRLLLLRR has c 31–35% too high at r=4 in both seeds, not an isolated noisy point. This corresponds to about 24–26% fewer reads per birth, not a 35% increase in read cost.

Six zero-reset arms cap at 2^28 steps before the measurement window opens; only the lead-3 rule supplies two defined comparisons. M3 is UNINFORMATIVE. That rule has zero boundary reset exposure at r>=4, so its close match is weak evidence. Every case, cap and paired comparison is retained in results/memory_report.json and per-case files/markers.

2026-10-20 01:37:33 (+13:00) · c826721 · interpretation

Post-failure exploratory scripts/diagnose_memory.py -> results/memory_diagnostics.json: r=4 on the lead-4 rule removes 1.63/1.59 long-return reads per birth while adding 0.51/0.47 lag-4 reads; net cost falls 0.95/1.05. Lead-2 short/long changes nearly cancel in the total. The exact radius bound ensures short source phases were not directly reset; the altered long-return history indirectly changes short-loop frequencies. This is the confound the registered budget challenge was intended to detect. Full-ant event-clock versus old k=26 maximum absolute ln c ratio is 0.0406 on these same eight seeds, an exploratory age audit, not a universal bias bound. Neither a close total nor this audit establishes the local closure.

2026-10-20 01:37:33 (+13:00) · c826721 · decision

Stop the uniform-forgetting closure as registered. Do not enlarge the radius or open main outcomes. Next candidate: retain only the old turn bit at forgotten cells, sampling a phase within that turn class; compare preserving two future turns. This can distinguish a directional exterior field from the distant full phase clock. It is still a proposal requiring a new oracle, registration and held-out test; the mechanism and c-law constants remain open. Rendered results/memory_pilot.png from the report with scripts/plot_memory.py. Inspected the image, corrected only its generated y-axis bounds/label using --replace, then inspected again; numerical inputs were not changed.

2026-10-20 01:41:53 (+13:00) · a878d5e · observation

Rebuilt the shareable notebook with scripts/build_notebook.py and executed it top to bottom in a clean kernel using the README nbconvert command. It reads committed JSON/image summaries only, recomputes the primary medians and maximum errors, and reproduces both registered failures and exploratory decomposition. Saved small outputs include the inspected figure. Publication tests (uv run --frozen --only-group blog blog/scripts/test_experiments.py) pass (2 tests). Updated the notes, active index, experiment guide and homepage; added a coherent blog entry at _posts/2026-10-20-the-short-loops-kept-their-clocks.md with pinned evidence. No own simulation or build job remains live.

2026-10-20 01:41:53 (+13:00) · a878d5e · question

What information must a forgotten cell keep? A prospective one-bit exterior model could preserve its old current turn and randomize the phase within that equivalence class; a two-turn version preserves some future timing. These are interventions on the model's own generated history, not reads from a target ant. A match requires substantial actual phase scrambling and correct return budgets, not just close c. No variant is implemented yet; register predictions and a new sparse oracle before running. Main outcomes and original P1–P4 remain unopened/untested. The full scientific goal is not achieved.

2026-10-20 01:42:49 (+13:00) · aaf6662 · observation

Rendered actual committed experiment pages with uv run --frozen --only-group blog blog/scripts/experiments.py --baseurl /turmite-autoresearch --repository-url https://github.com/timClicks/turmite-autoresearch: 102 pages and 37 saved notebooks, exit 0. The renewal page includes its assets/notebook. The sole unavailable reference is the existing end link in the kappa-rule-space README, not a renewal source. Generated publication files remain ignored. This is a local render, not an external deployment.

2026-10-20 01:46:12 (+13:00) · 8520fa3 · intent

Previous goal turn was progress: uniform-forgetting failure and its budget decomposition are committed. Authoritative files have no information-preserving policy yet, no own live job; process inspection found no heavy runner/cargo. Register the old-turn versus two-turn experiment before implementing. Preserve radius, clock, seeds and all original failures. The new policies act on their own generated field and must pass a sparse oracle, compressed-state alias invariance and exact replay of all full/uniform/control baseline summaries.

2026-10-20 01:46:12 (+13:00) · 8520fa3 · assumption

The missing long-return cost might be carried by the current directional bit, not the entire remote phase clock. Untested. Preserving a two-turn word is a predeclared alternative, not a knob to expand after failures. Retained-word classes must have meaningful actual phase scrambling for a match to inform this question. RRRRLLRRLLLLRR is a diagnostic case chosen from inspected pilot data, not an independent replication; fresh main outcomes remain unopened.

2026-10-20 01:54:03 (+13:00) · 8520fa3 · deviation

Before any new policy outcome, added a write-bit-only control to the two-policy proposal. Current turn versus two turns alone confounds future timing with the immediate bit written after the read. The factorial now preserves neither, read only, write only, or both, with the full ant as reference. Same thresholds, geometry, radius, seeds and clock; the added arm has a prospective README amendment. It is an explanatory alternative, not a fresh-validation claim.

2026-10-20 01:54:03 (+13:00) · 8520fa3 · observation

Implemented ordered equivalence classes and read/write diagnostics. Seven local-memory oracle/control tests pass, plus four renewal and five aggregate tracer tests, in release mode; driver builds. Alias tests deliberately vary the unretained turn information and still obtain identical futures. The full unique-word control gives exact AntWalker summary with zero phase changes. An initial missing fn in a test declaration was corrected before compilation; no path/oracle discrepancy was observed. Logs: scratch/information-tests.log and scratch/information-build.log. No scientific pilot outcomes yet.

2026-10-20 01:54:03 (+13:00) · 8520fa3 · decision

Freeze config, implementation and scoring. New fresh build re-runs oracles; all full/uniform and walker control summaries must exactly reproduce their earlier fields before any information-policy case. The source-word assertions and phase-change exposure gate prevent a trivial no-change match from being called support. Candidate support still requires cost AND budget restoration, both sensitive-rule seeds, and fresh confirmation later. Do not open main outcomes or increase word length after failures without another registration.

2026-10-20 02:01:53 (+13:00) · 1002d9c · observation

Worker 1717817 completed with exit 0. Fresh oracle build, all 16 full/uniform baseline and 16 rotor/rw control replays match old fields exactly. All 24 new treatment cases complete. I1/I3 hold for read-only, write-only and paired bits; I2 fails for all three. Sensitive-rule maximum budget errors are 1.036914, 1.580011 and .571254, respectively (limit .20). Read-only restores that rule's c to |ln ratio| <=.0421; paired bits have overall median |ln c| .004752. Six genuinely phase-scrambled pairs per policy include both sensitive seeds. No candidate passes the registered closure test. Source: results/information_report.json, results/information_v1/ and config. Full cargo test --release passes, log scratch/information-full-release.log.

2026-10-20 02:01:53 (+13:00) · 1002d9c · question

Physical lag includes the interior clock, whereas the goal's cost counts boundary reads. Exact monotonicity: a currently boundary cell cannot have had an earlier interior read, because fresh neighbours cannot reappear. Its colour clock is therefore a boundary-visit clock. Could physical-time bin shifts hide a correct native boundary birth process, or do inter-birth boundary waiting costs differ too? Do not withdraw I2 failures. Add a stronger, native-process audit (return lags plus complete waiting law and serial transitions), calibrated on time-stretched traces/known renewal sequences and frozen before new outputs. This tests a confound instead of automatically expanding the word length.

2026-10-20 07:30 (+13:00) · 6bb01f2 · intent

Resumed from committed read/write failures. No live release/cargo experiment process found. Register the native-return/waiting/serial audit before measuring; keep physical-budget failures and main-outcome seal. Boundary lag tracks warmup; complete inter-birth waits retain explicit endpoint censoring. No new model arm.

2026-10-20 07:36 (+13:00) · b1bcbbc · observation

Native-lag sparse path oracle passes all four release tests, including seeded band, blank ant and walker controls; warmup is tracked before emission. Synthetic known-wait, endpoint, time-stretch and equal-marginal/different-order checks pass (seed 2026102071; serial TV .997494 in the deliberately reordered control). Repository-wide cargo fmt --check reports pre-existing formatting differences; only the three edited Rust files were formatted. No unrelated files changed.

2026-10-20 07:36 (+13:00) · b1bcbbc · decision

Launched background audit worker PID 1997684, fresh target and entire release suite before any pilot interpretation. Log results/native_v1/session.log, PID/exit files local and ignored. Forty inspected pilot trajectories will be replayed, preserving every old summary field before native comparisons. An untracked lattice regression file predates this session and is left untouched.

2026-10-20 07:34 (+13:00) · b1bcbbc · deviation

Timestamp correction: the two entries labelled 07:36 above were written before 07:33:12 (verified UTC clock 2026-10-19 18:33:12). Their minute labels were mistaken estimates, not measurement times; preserve them with this correction. The registration commit 3521b6c preceded implementation b1bcbbc, synthetic checks and worker launch, and no native ant output exists yet. Worker is live, fresh release compilation continues. Commands, source hashes and eventual case markers are the measurement provenance; notebook clock labels are not elapsed timings.

2026-10-20 07:35 (+13:00) · b1bcbbc · observation

Worker 1997684 terminal exit 0. Fresh full release suite passes; all 40 old ant summaries replay exactly. Known-wait/time-stretch/order calibration passes; all native windows have 8192 reads, 8 eligible pairs per arm. N1 and N2 fail for uniform/read/write/pair. Pair-bit sensitive native-budget errors are .574366/.619567, waiting TV .143930/.145131, serial TV .289429/.281639. Reference seed distances .050881/.044029/.041941 respectively. Report and all exact histograms/recipes in results/native_report.json and native_v1/. No main outcomes measured, no fit, no dependency changes. Counter accounting and all physical summary fields match; bulk event rows need not be committed.

2026-10-20 07:35 (+13:00) · b1bcbbc · interpretation

Physical-time stretching alone cannot explain the failed memory budgets: the boundary-native birth process changes too. Both-bit total c agreement conceals different waits and serial ordering. Small early pilot, two seeds per rule, descriptive thresholds; no asymptotic theorem or general memory lower bound. Keep every original failure. Coefficients remain unexplained.

2026-10-20 07:35 (+13:00) · b1bcbbc · question

Prefer a single coupled phase edit over another larger-word sweep. Two equal future turns force identical paths through the first two reads of that source; the first differing rule turn determines the first possible path divergence. Can the delayed effect then persist in boundary waits? This is a proposal, not a run or a new pass criterion. Register branch selection, horizon, controls and censoring before measuring. Update notebook and public priorities with the completed native-clock failure first.

2026-10-20 07:37 (+13:00) · 94516e5 · observation

Shareable notebook rebuilt and executed top to bottom from committed JSON summaries in a clean kernel; all native accounting and input-hash checks pass. Outputs include the prior information-policy failures, native N1/N2 failures, sensitive-seed distances and full-reference seed distances. Publication tests pass (2 tests). First full page render failed because an existing tracked lattice-colours experiment lacked a reader-guide row; added a record-based summary without changing that experiment. Re-render succeeds: 103 experiment pages, 37 saved notebooks, one pre-existing unavailable source reference. Generated pages remain ignored. This is a local render, not a deployment.

2026-10-20 07:37 (+13:00) · 94516e5 · decision

Updated homepage, reader guide, active questions and a coherent blog post with pinned native-clock evidence and the single-edit proposal. All original failures remain. No own experiment/build process remains live; worker exited 0. This continuation completes the registered native audit, not the overarching scientific objective. Before further simulations, register the coupled branch instrument, event-selection rule, censoring and frozen response windows. Main cohort stays unopened. The pre-existing untracked lattice regression remains untouched.

2026-10-20-c-law-renewal · 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.