/machines/1RB1RA_0LC0RF_1LD1LC_1RE1LB_---0RA_1RF0RD/research/erosion.md · raw

#5 1RB1RA_0LC0RF_1LD1LC_1RE1LB_---0RA_1RF0RD: is the erosion deterministically bounded?

Research note, 2026-10-10. Code: research/code/, figures: research/img/.

Answer in four lines

  1. No deterministic bound was found, and every certificate family tried fails by a factor of 5 to 12 (section 5).
  2. What the data shows: the edge is a chaotic front moving into the block at a steady 0.039 cells per bounce (constant across four decades, 10^4 to 10^8 bounces). In short windows it can still outrun the block: +149 cells in 128 bounces at worst. Over 10^8 bounces the block never lost more than 47 cells net, and it was never shorter than 33 cells after bounce 40.
  3. Why simple proofs fail: - What decides a burst sits 50 to 500+ cells deep in the edge. - The edge carries about 0.63 bits of entropy per cell. - Any certificate (potential, regular language) must "see" that deep, and every finite window we tried allows fake cycles that erode at 5 cells per bounce or more.
  4. Recommendation: treat #5 as cryptid-like for proof purposes and follow the protocol: formalize the rules (done, section 1), flag, stop. Section 8 lists the one route with a real but small chance.

Side result (computer-checked, not a proof): with the exact wall model, the machine does not halt in its first ~9.6·10^15 steps (10^8 bounces).


1. What one bounce is: 7 exact rules

seven rules

start: constructed, each rule from its own minimal context · rows: every step · window: the cells the rule touches, plus one ? cell on each side · legend: white = 1, black = 0, ? = any symbol, blue = C, orange = A, dark gray = B/D/E/F · style: custom

Every bounce, from "C at the edge's last 0" until "A steps onto an untouched block cell", is a sequence of these rules. Between rules, C walks left over 1s and A walks right over 1s.

rule before → after (wiki notation) steps
T turn x 0 0 <C y → x 1 0 A> y 3
Ca carry x 0 1 0 <C y → x <C 0 1 1 y 3
Fo fold x 1 1 0 <C y → x 0 <C 0 1 y 6
E1 re-dive x A> 0 1 1 1 y → x 1 0 <C 0 1 y 5
E2 re-dive x A> 0 1 0 1 1 y → x 1 0 <C 1 0 1 y 7
P1 pass x A> 0 1 1 0 1 y → x 1 0 0 1 0 A> y 5
P2 pass x A> 0 1 0 1 0 1 y → x 1 0 1 0 1 0 A> y 6

The dive is a binary-counter carry (exact)

Write the edge as runs of 1s separated by single 0s, with 00 counted as a run of length 0. A dive started at the right end does the following:

runs, right to left:   ...  a(j-4)  a(j-3)  a(j-2)  a(j-1)  a(j) | block
C examines:                  ^               ^               ^
  a odd  -> rewrite "1^a 0" into "1 1 (0 1)^((a-1)/2)", skip the next run, examine the one after it
  a even -> rewrite "0 1^a 0" into "1 0 (0 1)^(a/2)" and turn (A heads right)

This is an increment of a binary counter whose digits are the parities of every other run: odd means digit 1 (carry on), even means digit 0 (stop). It follows from Ca, Fo and T by induction on a, and it matched 15,450 of 15,450 random run sequences (code/divecheck.py).

It matches the ruler pattern of dive depths seen in receding phases: 9, 18, 9, 27, 9, 18, 9, ...

The return pass is not a clean counter. Its E1 and E2 rules re-dive repeatedly (the "tiny wiggles"). The rewrites also change the run structure, so the "digits" do not keep their meaning from one bounce to the next. That mixing is where the chaos comes from.

one real bounce

start: mid-run, the tape after bounce 1,825,625 (about 3.2·10^12 steps) · rows: every step of bounce 1,825,626 (117 rows) · window: cells 75,865..75,894, one square per cell · legend: white = 1, black = 0, peach = untouched block 1s, blue = C, orange = A, gray = B/D/E/F; the right margin names the rule applied at that row · style: custom


2. The race: block vs edge

race

start: blank tape · rows: n/a (a chart): one point per bounce up to bounce 32,262 (= step 10^9, real simulation), then every 1,000 bounces (wall model) · legend: orange = block length n, blue = edge width |w| · style: custom chart

bounces 10^3 to 10^4 10^4 to 10^5 10^5 to 10^6 10^6 to 10^7 10^7 to 10^8
cells eaten per bounce 0.0566 0.0489 0.0392 0.0388 0.0395

3. Bursts: the edge can outrun the block, but only briefly

worst burst

start: mid-run, bounces 2,123,040..2,123,290 (about 4.3·10^12 steps) · rows: one row per bounce: the tape when A reaches the right end · window: cells 87,189..87,488, one pixel column per cell · legend: white = 1, black = 0, orange = the 1-block, blue dot = deepest cell the head reached in that bounce (arrow at the left edge = deeper than shown); the dashed line has slope +1 cell per bounce · style: custom

The diagonal checkerboard stripes are receding phases: the edge end moves 1 cell left per bounce while the counter from section 1 ticks. A burst follows when a deep dive reorganizes the material.

window max

rows/window: n/a (a chart) · legend: blue = max over all windows of the 10^8-bounce orbit; orange dots = best found from arbitrary short starting edges (section 6); dashed = block growth; dotted = long-run average · style: custom chart

window w (bounces) 1 8 32 64 128 160 256 1,024 4,096
max cells eaten 15 37 79 107 149 159 187 359 742

beta vs alpha

The bound a proof would need, measured on the 10^8-bounce orbit: cells eaten in any w consecutive bounces ≤ α·w + β. The smallest β that works for each slope α:

α 0.10 0.25 0.50 1.00
smallest β that works 441 149 86 47

Read-off: empirically, eaten ≤ 0.25·w + 149. A proof needs some such bound for every reachable edge, not just along one orbit.

4. Where erosion comes from: deep dives

depth

legend (left): fraction of bounces whose dive reaches depth ≥ d, from 10^8 bounces, with the dashed fit exp(−d/80) · legend (right): mean (blue) and max (orange) cells eaten per bounce, by dive depth, from 2·10^6 bounces · style: custom chart

5. Potential-function search (task item 2)

The goal is a Φ(w) ≥ 0 (or ≥ −γ|w| with γ < 1) with eaten + ΔΦ ≤ α < 1 on every bounce. That would give eaten(k bounces) ≤ α·k + Φ(start). Each family was solved as a linear program over the real orbit.

certificates

family (Φ is a linear combination of ...) orbit sample best α (need < 1)
counts of all words ≤ 3/4/5/6 cells in w, plus any bounded term on the last 6 cells first 10^9 steps (32,222 bounces) 9.39 / 9.16 / 8.99 / 8.56
same 10^6 bounces 12.0 / 11.60 / 11.46 / 11.05
same, any sign (only required bounded along the orbit) 10^6 bounces 11.23 / 10.77 / 10.48 / 10.25
counts by distance from the edge end (bounded, any sign): 3-words in 7 or 35 bands, 4-words in 23 bands, out to 509 cells 10^5 training bounces 7.08 / 5.53 / 5.03 in-sample (9.4 to 10.1 on the next 10^5)
last K cells as a finite state, observed transitions only (optimistic: unsound) 10^6 bounces K ≤ 14: 12 · 16: 9 · 20: 7.9 · 24: 7.0 · 32: 5.4
exact conserved local valuation (ΔVal = 1 every bounce, words ≤ 6) 2.7·10^5 distinct bounces none (rms residual 0.8)

Why count potentials cannot work. The LP's dual gives a concrete obstruction. Take the run up to step 10^9 and words of ≤ 4 cells. The dual is a mix of 6 real bounces, each eating 8 to 11 cells: - their end-of-edge states form a closed cycle; - their combined change in every pattern count is ≥ 0.

So after them, any count-based Φ is at least as large as before, while about 9 cells per bounce were eaten. In other words, some bursts create exactly the patterns other bursts destroy. The "fuel" for erosion is not a local statistic (code/dual.py).

How deep the information sits. We computed the ideal potential Φ*(w) = max over the future of (eaten − 0.5·bounces) along the orbit. Then we grouped bounces that share the same last D cells:

D (cells) 32 48 64
mean spread of Φ* within a group 37 12.4 4.1
max spread of Φ* within a group 85.5 84.5 84.5

So the last 64 cells still do not determine how much the edge will eat; 84.5 is the whole range of Φ*.

6. Regular-language (CTL-style) search (task item 3)

m 6 8 10 12 14 16 20
words leaving X_m 11% 1.7% 9% 11% 16% 21% 29%

None is closed. - Not a finite-type language at small scale. The real edge (3.9 million cells) avoids 000, 00100, 001100, 001111 and 0011100. After that the number of minimal forbidden words keeps growing (lengths 9 to 16: 6, 10, 9, 15, 42, 77, 99, 166). Factor counts grow ×1.55 per cell, which is about 0.63 bits of entropy per cell. - A positive-entropy edge is not substitutive or automatic (those have linear factor complexity). That rules out the usual "renormalize by a substitution" proof. - Weighted-automaton test. We took the max-mean erosion cycle of the right-end abstraction. Even using only the transitions actually observed, which is an optimistic bound, it gives ≥ 5.4 cells per bounce for windows up to 32 cells (section 5). A sound abstraction contains those cycles too.

7. Is the slow drift universal? (random and adversarial starts)

The wall model was run from starting edges other than the real one:

starting edges bounces result
6 uniform-random + 6 random golden-mean words, 200 or 2,000 cells 10^5 rate 0.033 to 0.050; worst 100-window 84 to 102; worst 1,000-window 197 to 304
all 226 periodic words with primitive period ≤ 10 (about 1,200 cells) 2·10^4 no halt; worst 100-window ≤ 116; at most 235 cells in the first 1,000 bounces
every word ≤ 20 cells (exhaustive) 10 at most 34 cells
every word ≤ 18 cells (exhaustive) 100 at most 66 cells
hill-climbed words, 30 to 240 cells (adversarial search) 30 / 100 / 300 / 1,000 best 66 / 120 / 171 / 373 cells
single bounce, every word ≤ 28 cells 1 max eaten grows with length: 10 at 15 cells, 17 at 26 and 28 cells

8. What is proven, what is empirical, and the best remaining route

statement status
7 rules (section 1) and their completeness under the no-00 invariant proven by case analysis + sim 60/60 each
dive = binary-counter carry on parities of every other run proven by induction from Ca/Fo/T + 15,450/15,450 check
wall model exact while n ≥ e + 3 argument + per-bounce check
no halt in the first ~9.6·10^15 steps (10^8 bounces) computation (exact wall model)
front speed 0.039 per bounce; eaten ≤ 0.25·w + 149 in every window; block ≥ 33 after bounce 40 empirical (10^8 bounces)
same drift from random, periodic, exhaustive and adversarial starts empirical
no potential from pattern counts (≤ 6-cell words, also by distance bands to 509 cells, also with a 32-cell finite state) gives α < 5 computed (LP, in-sample, so the real α is worse)
a deterministic bound α·k + β with α < 1 open; no route found

Most promising (still long-shot) proof route: a two-scale computer-assisted abstraction.

  1. State: - the exact last D cells of the edge; - a sound regular summary of the deep part.

The rules make this possible in principle: the head enters the deep part only as a C dive and comes back only as an A return. So a deep excursion is a black box with few possible effects on the window. 2. Invariant: find a regular language for the deep part that rules out the adversarial returns. 3. Check: compute the max-mean-cycle erosion of the finite product graph and show it is < 1.

Measured obstacles: - Windows up to D = 32 already contain cycles eating 5.4 per bounce, so D must be well above 64. - Distinct reachable tails grow about ×1.35 per cell: 58,000 at D = 40 in only 4·10^5 bounces. That points to 10^12 or more states at D = 100. - Small factor-closed deep languages are not invariant.

Without a new compression idea this is out of reach. A hidden-arithmetic route (the edge as a counter in some numeration) is unlikely: there is no conserved local valuation, the entropy is positive, and the counter structure lasts only 2 to 3 levels before the deep part turns pseudo-random.

Bottom line for Dennis: #5 halting reduces to "a chaotic front never outruns a block that grows 25× faster on average". That is true over 10^16 steps by a wide margin, but proving it looks as hard as a cryptid.


Reproduce

Code is in research/code/. It was run from the session scratchpad, so paths inside it point there.

file what it does
wallc.c wall-model runner: per-bounce eaten and depth, window maxima, snapshots, range dumps
phistar.c α to β curve (smallest β per slope)
feat.c, lp.py, lp2.py, band.py, tailmmc.py, conserve.py, dual.py potential searches
locality.py the Φ* spread test
sftinv2.py, mfw.py regular-language tests
wallmany.c, exh1.c, climb.c other starting edges
verify_rules.py, divecheck.py, shallow.py rule checks
fig_*.py, figs.py figures
run_1e8.summary.txt the 10^8-bounce summary