Rendered from submission/proof.md (raw file). This is the submission copy, the one you would post. The working copy proof.md differs only in its formal-status lines (header, §4, §5, §6, §7); the working copy still says §3.3 is informal.

1. Families and notation2. Rule table3. The argument3.1 Every clause is an exact pass-level transition (RIncs_spec), Rocq-checked3.2 Sweep (BigStep)3.3 The domain is closed (RIncs_nxt')3.4 Progress3.5 The halting transition F14. Initial segment5. Conclusion6. Mapping to SOMDCv6 TM77. EvidenceReview log

1RB0RF_1LC0RE_0LC0LD_1RD1LB_0RF1RA_0RB---: never halts #

Submission copy of the working proof.md, made 2026-10-10 after the kill. Only the formal-status lines were updated: header, §4, §5, §6, §7. Scripts and scratch files it cites (check_proof.py, check_rules.py, the Rocq scratch file probe_segments_2.v, notes.md) live in the working directory and are not in this folder.

Summary. The configuration at each sweep boundary is S(r) = 0^inf 11 D> <r> 0^inf, where r is a word over three 3-cell digits. TM7's proof carries over with three changes:

  1. Where TM7's sweep enters an L digit, ours first runs one extra "+1 pass" over everything to the right. This adds an Inc premise to two clauses of TM7's RIncs.
  2. RIncs gets two new end clauses, Z0 and Z1, that use zero passes. They describe no new machine behaviour (each is an identity between two ways of writing the same tape), but without them the sweep map's domain is not closed under the sweep map (§3.3).
  3. TM7's domain lemma RIncs_nxt gets an extra parameter j, the number of pending +1 passes. Its condition Inv reduces to TM7's when j = 0.

1. Families and notation #

2. Rule table #

1RB0RF_1LC0RE_0LC0LD_1RD1LB_0RF1RA_0RB---      (SOMDCv6 TM7 with A1 = 0RF instead of 0RC)

S(r) = 0^inf 11 D> <r> 0^inf          L = 110, 0 = 000, 1 = 100
start: 0^inf A> 0^inf  -(5)->  S(1)
sweep: S(r) -+-> S(r')  if R(hx,0,r,r')            (r' starts one cell further left)
domain P(r) := exists r', R(hx,0,r,r');   P(1);   P(r) /\ R(hx,0,r,r') -> P(r')

Inc (one h pass = +1):
  I1  Inc(1::r, 0::r')  <- Inc(r,r')         I3  Inc(L::r, L::r')  <- Inc(r,r')
  I2  Inc(0::r, 1::r)                        I4  Inc([], [1])

R (k >= 0); NEW = differs from TM7's RIncs:
  X1  R(hx,k,    L::r, L::r')  <- Inc(r,r1), R(hx,k+1,r1,r')   NEW (TM7: R(hx,k+1,r,r'))  RIncs_hx_ld
  X2  R(hx,k,    0::r, L::r')  <- R(hx,k+1,r,r')                                          RIncs_hx_d0
  X3  R(hx,k,    1::r, L::r')  <- R(h1,k,r,r')                                            RIncs_hx_d1
  C1  R(h1,k+1,  L::r, L::r')  <- Inc(r,r1), R(hx,k+1,r1,r')   NEW (TM7: R(hx,k+1,r,r'))  RIncs_h1_ld
  C2  R(h1,k+1,  1::r, L::r')  <- R(h1,k,r,r')                                            RIncs_h1_d1
  C3  R(h1,2k+1, 0::r, 0::r')  <- R(h1,k,r,r')                                            RIncs_h1_d0_0
  C4  R(h1,2k+2, 0::r, 1::r')  <- R(h1,k,r,r')                                            RIncs_h1_d0_1
  R0  R(h1,0,    [],   [1])                                                               RIncs_h1_rh_0
  R1  R(h1,2k+1, [],   0::r')  <- R(h1,k,[],r')                                           RIncs_h1_rh_1
  R2  R(h1,2k+2, [],   1::r')  <- R(h1,k,[],r')                                           RIncs_h1_rh_2
  Z1  R(h1,0,    [1],  [L])     NEW: 0 passes, 1 100 0^inf = 110 0^inf
  Z0  R(h1,0,    [0],  [1])     NEW: 0 passes, 1 000 0^inf = 100 0^inf
  (no clause: hx at the right end; h1 with 0 passes on a word other than [], [1], [0])

machine level (j = number of digits of X before its first 0 digit, or |X| if none):
  B> 100 X  -(3)->  000 B> X            B> 000 X  -(1)->  <C 100 X        B> 0^inf  -(1)->  <C 100 0^inf
  B> 110 X  -(3)->  011 B> X            011 <C  -(3)->  <C 110            000 <C  -(3)->  <C 000
     =>  B> <X> 0^inf  -(6j+1)->  <C <X+1> 0^inf                       (Inc, no A1)
  eater enters L:   1 D> 110 <X>  -(6j+13)->  1 111 D> <X+1>       TM7: -(11)-> 1 111 D> <X>
  drain enters L:   B> 1 110 <X>  -(6j+12)->  1 111 D> <X+1>       TM7: -(10)-> 1 111 D> <X>
  wall:             0^inf 1 <C <r'>  -(3)->  0^inf 11 D> <r'>      (C1, D0, D0)

In words:

Worked example. This is the start of the Checkpoint A picture pair, S(L^4 1L1), and it is the extra 1 Dennis noticed there (checked in §7).

3. The argument #

3.1 Every clause is an exact pass-level transition (RIncs_spec), Rocq-checked #

Claim: R(hx,k,r,r') implies sideRLs ([h'] ++ h^k) <r> <r'>, and R(h1,k,r,r') implies sideRLs (h^k) (1 <r>) <r'>. Proof by induction on R, one clause at a time, as in TM7.

This section compiles. check_proof.py --rocq states Inc and all 12 clauses of R for the real machine string, then proves Inc_spec, seg_hx_ld, seg_h1_ld and RIncs_spec. Print Assumptions is closed. The two segment facts were first probed in probe_segments_2.v.

3.2 Sweep (BigStep) #

Suppose R(hx,0,r,r'). The left part 0^inf 1 is never read by the pass, so:

S(r) = 0^inf 1 · 1 D> <r> -+-> 0^inf 1 <C <r'> -(3)-> 0^inf 11 D> <r'> = S(r')

The first arrow is the single pass h' (sideRLs_1); the second is the wall rule. This is TM7's BigStep, with the same proof. It compiles (§7).

3.3 The domain is closed (RIncs_nxt') #

Let P(r) := exists r', R(hx,0,r,r'). We need R(hx,0,r,r') to imply P(r').

Why the extension is needed. Without Z0/Z1 this is false:

Z0/Z1 are never used on the run from blank (§7), so they matter only to the domain lemma.

Auxiliary lemmas. All are stated as relations. The only functionality the proof uses is that of Inc.

lemmastatementproof
Inc total and functionalfor every r there is exactly one r' with Inc(r,r')induction on r
AR(tp,k,r,r') /\ Inc(r',r'') -> R(tp,k+1,r,r'')induction on R; each clause maps to the same clause with k+1, except C3 -> C4, C4 -> C3 (carry), R0 -> R1, R1 -> R2, R2 -> R1, Z1 -> C2, Z0 -> C3
Total_1forall q, exists w, R(h1,q,[],w)TM7's RIncs_nxt_1, unchanged
End_1R(h1,m,[],w) /\ m <= q -> exists w', R(h1,q,w,w')induction on the derivation of R(h1,m,[],w), generalizing q. Only R0–R2 apply to []; write m0 for the premise's count. R0 (w = [1]): Z1 if q = 0, else C2 + Total_1. R1 (w = 0::w0, m = 2m0+1): C3 or C4 by q's parity, then IH at floor((q-1)/2) ≥ m0. R2 (w = 1::w0, m = 2m0+2): C2, then IH at q-1 ≥ m0
End_xR(h1,m,[],w) /\ m <= 2q+2 -> exists w', R(hx,q,w,w')induction on the same derivation, generalizing q. R0: X3 + Total_1. R1: X2, then IH at q+1 (m0 ≤ q). R2: X3, then End_1 (m0 ≤ q)

Lemma A says one extra pass after the k passes is +1 on the result. It is what turns the second sweep's +1 passes into extra count for the first.

Key lemma (RIncs_nxt'). Two sweep processes run over the same digits:

Write K = k+j. The lemma:

R(tp,k,r,r1) /\ R(tp,K,r,rK) /\ Inv(tp,k,j,tq,q)  ->  exists r2, R(tq,q,rK,r2)
  Inv(hx,k,j,hx,q) := k <= q /\ j <= q
  Inv(h1,k,j,hx,q) := k+1 <= q /\ j <= q
  Inv(h1,k,j,h1,q) := (j = 0 /\ 2k+1 <= q) \/ (j >= 1 /\ K <= q /\ 1 <= q)      [both imply K <= q, 1 <= q]
  Inv(hx,_,_,h1,_) := False

With j = 0 these are exactly TM7's conditions (k<=k', k+1<=k', k*2+1<=k'). The domain step is the instance tp = tq = hx, k = j = q = 0.

Proof. Induct on the derivation of R(tp,k,r,r1), generalizing j, rK, tq and q. The induction is on the derivation, not on r, because X1/C1 recurse on inc r. In each case, invert R(tp,K,r,rK); Inc is functional, so both derivations name the same incremented word. The second process reads the first digit of rK, and that leaves one IH obligation. Each obligation's count K' is supplied by Lemma A, since the second's +1 passes land on the first's rest.

Some shorthand for the table:

firstsecond readsIH instance (tp,k,j -> tq,q)Inv holds since
(hx,hx) X1/X2: rK = L::t, R(hx,K+1,_,t)X1: R(hx,q+1,t+,_); R(hx,K+2,_,t+) by A(hx,k+1,j+1 -> hx,q+1)k+1 ≤ q+1, j+1 ≤ q+1
(hx,hx) X3: rK = L::t, R(h1,K,w,t)X1(h1,k,j+1 -> hx,q+1)k+1 ≤ q+1, j+1 ≤ q+1
(h1,hx) C1: rK = L::t, R(hx,K,_,t)X1(hx,k,j+1 -> hx,q+1)k ≤ q+1, j+1 ≤ q+1
(h1,hx) C2: rK = L::t, R(h1,K-1,w,t)X1(h1,k-1,j+1 -> hx,q+1)k ≤ q+1, j+1 ≤ q+1
(h1,hx) C3/C4, K odd: rK = 0::tX2(h1,k1,j1 -> hx,q+1)k1 < k, j1 ≤ j
(h1,hx) C3/C4, K even: rK = 1::tX3(h1,k1,j1 -> h1,q)j1 = 0 only if j ≤ 1, and then 2K1+1 = K-1 ≤ k ≤ q; otherwise K1 = (K-2)/2 < q, q ≥ 2
(h1,hx) R0-R2: the K-derivation is R(h1,K,[],rK)End_x on itnoneK = k+j ≤ 2q-1
(h1,hx) Z1/Z0 (k = 0, so K = j ≤ q)Invert the K-derivation. K = 0: Z1 gives [L] -> X1, X3, Total_1; Z0 gives [1] -> X3, Total_1. K ≥ 1: C2 gives L::t with R(h1,K-1,[],t) -> X1 on t+; Lemma A on that R0–R2 derivation gives R(h1,K,[],t+), then End_x. C3 gives 0::t with R(h1,(K-1)/2,[],t) -> X2, End_x. C4 gives 1::t with R(h1,(K-2)/2,[],t) -> X3, End_1noneK ≤ 2(q+1)+2; (K-1)/2 ≤ 2(q+1)+2; (K-2)/2 ≤ q
(h1,h1) C1 (k ≥ 1)C1 (q ≥ 1)(hx,k,j+1 -> hx,q)k ≤ K ≤ q; j+1 ≤ K ≤ q since k ≥ 1
(h1,h1) C2 (k ≥ 1)C1(h1,k-1,j+1 -> hx,q)k ≤ q; j+1 ≤ K ≤ q
(h1,h1) C3/C4, K odd: rK = 0::tC3/C4: q1 = floor((q-1)/2)(h1,k1,j1 -> h1,q1)j = 0: K ≤ q1 since 2K+1 ≤ q. j ≥ 1: j1 ≥ 1, K1 ≤ q1, and q ≥ K ≥ 3 so q1 ≥ 1
(h1,h1) C3/C4, K even: rK = 1::tC2: q-1(h1,k1,j1 -> h1,q-1)j ≤ 1: j1 = 0, 2K1+1 = K-1 ≤ q-1. j ≥ 2: K1 ≤ q-1, and K ≥ 4 so q-1 ≥ 1
(h1,h1) R0-R2End_1 on the K-derivationnoneK ≤ q
(h1,h1) Z1/Z0 (k = 0; Inv gives q ≥ 1 and K ≤ q)Invert the K-derivation. K = 0: [L] -> C1, X3, Total_1; [1] -> C2, Total_1. K ≥ 1: L::t with R(h1,K-1,[],t) -> C1 on t+; Lemma A gives R(h1,K,[],t+), then End_x. 0::t with R(h1,(K-1)/2,[],t) -> C3 or C4 by q's parity, End_1. 1::t with R(h1,(K-2)/2,[],t) -> C2, End_1noneK ≤ 2q+2; (K-1)/2 ≤ floor((q-1)/2); (K-2)/2 ≤ q-1

No other case occurs:

∎

3.4 Progress #

R is inductive, so every derivation is finite. Each clause is a finite run: its segment lemma, plus the finitely many passes of its premises (§3.1). So S(r) -+-> S(r') is a finite run of at least 4 steps: h' takes at least 1, and the wall takes 3. Example: S(1) to S(L1) takes 11 steps (steps 5 to 16).

3.5 The halting transition F1 #

Formally, every rule is a proved exact run, so no step on the way from c0 is the halting transition.

As a sanity check: F is entered only by A1 = 0RF and E0 = 0RF. In the machine-level rules of §2, F is entered on the last cell of a digit, and that cell is 0 for all three digits, so F0 = 0RB fires. In every simulated rule instance F read a 0; the count of F reading 1 is 0 (§7).

4. Initial segment #

0^inf A> 0^inf reaches S(1) in 5 steps:

S(1) is in the domain: R(hx,0,[1],[L,1]) by X3 and R0.

TM7's nonhalt uses the same start, S' [D1], by esx. Here too, init: c0 -[tm]->* S' [D1] compiles by esx (§7).

The .v file starts one sweep later: start : c0 -->* S' [LD;D1] (S(L1), step 16), also by esx. Its initial domain witness is R(hx,0,[L,1],[L,L,L,1,1]): X1 with Inc([1],[0,1]), then X2, X3, and R2 over R0.

5. Conclusion #

Use multistep_nonhalt with c' = S(1) (§4), then progress_nonhalt_cond with P(r) := exists r', R(hx,0,r,r'):

So the machine never halts. In Rocq this is TM7's nonhalt with RIncs replaced by R and with a different call to the domain lemma. TM7 calls RIncs_nxt with (tp':=hx) (k':=O) on one hypothesis. Here the call is RIncs_nxt' at tp = tq = hx and k = j = q = 0. Both R hypotheses are I1 (K = k+j = 0), and Inv(hx,0,0,hx,0) is discharged by lia.

In the .v file c' = S(L1) (see §4), RIncs_nxt' is named key, and the instance above is the lemma domain.

6. Mapping to SOMDCv6 TM7 #

TM7 (SOMDCv6.v)herechange
S', lhS(r)none
ld/d0/d1, RD, toRCdigits L/0/1none
hR/hR'/hL, h/h', toH/toH'passes h, h'none
noneInc (I1–I4), Inc_specnew: sideRLs [h] (toRC r) (toRC r'); compiles
RIncs (10 clauses)R (12 clauses)RIncs_hx_ld/RIncs_h1_ld gain an Inc premise and recurse on inc r; new clauses Z1 R(h1,0,[D1],[LD]) and Z0 R(h1,0,[D0],[D1])
RIncs_spec§3.18 cases unchanged (X2, X3, C2–C4, R0–R2). The X1/C1 segment facts gain a leading h ([h'] -> [h;h';h] on 110, [h] -> [h;h';h] on 1110), followed by sideRLs_trans with Inc_spec. Z0/Z1 by sideRLseq_O and const_unfold. Compiles
noneLemma A, End_1, End_xnew (TM7 handled r = [] inside RIncs_nxt by an inner induction on k)
RIncs_nxt_1Total_1unchanged
RIncs_nxtRIncs_nxt' (§3.3)new parameter j (pending +1s) and Inv; j = 0 gives TM7's conditions; induction on the derivation instead of on r
BigStep§3.2unchanged; compiles
nonhalt§5P uses R; the domain call is RIncs_nxt' at k = j = q = 0 with I1 passed twice (§5); start S' [D1] compiles

Formal status: all done. Every row above compiles in 1RB0RF_1LC0RE_0LC0LD_1RD1LB_0RF1RA_0RB---.v, and check_kill (our checker) passes (check_kill.txt).

7. Evidence #

The checks are in check_proof.py, in this directory (reuses check_rules.l_entry). The numbers below are from python3 -B check_proof.py --full (36 s). That mode includes the Rocq check, which --rocq runs alone (4 s). The default run (8 s) gives the same verdicts on smaller samples, with the from-blank check to 1e8 steps. "Real machine" means simulation of the actual transition table: a pass stops the first time the head reaches its exit cell, so cells left of it are never read.

claiminstancesresult
Inc: B> <r> -(6j+1)-> <C <r+1>, no A1 (all r ≤ 6 digits + random)13,093all pass
§3.1 every clause: the pass list of R(tp,k,r,r') turns the input into <r'> on the real machine, with #A1 firings = #X1 + #C1 (exhaustive r ≤ 4 digits with k ≤ 8; k < 80 at the right end; random r up to 53 digits with k ≤ 200)8,477 derivations; clause uses X1 69,237, X2 15,894, X3 15,109, C1 10,450, C2 12,353, C3 4,215, C4 3,855, R0 8,031, R1 12,659, R2 9,742, Z0 58, Z1 388all pass
F never reads 1 in any of those runsall0 occurrences
TM7's own RIncs on TM7 (template sanity, same A1 count)1,410all pass
L entry, ours vs TM7, eater and drain (every X ≤ 6 digits + 150 random)1,243 per case, 4 casesall pass
Lemma A (all r ≤ 6 digits, k ≤ 12, both tp)21,347all pass
Lemma A at the right end, as used by the Z rows of §3.3: inc(R(h1,m,[])) = R(h1,m+1,[]) (m < 2000)2,000all pass
End_1, End_x (m < 300, q < 160). End_1 is tight: m = q+1 fails for q = 0, 2, 6, 14, 30, ...38,679all pass
RIncs_nxt' at the smallest q allowed by Inv (exhaustive r ≤ 5 digits with k, j ≤ 8; random up to k, j ≤ 60)83,794all pass
The case table of §3.3, run as an abstract transition system on (tp,k,K,tq,q): every Inv state closes under every digit, the end, and Z0/Z1 (k < 28, K, q < 56)100,744 statesall close
Domain closed: sweep(r) defined implies sweep(sweep r) defined (all words ≤ 11 digits)76,738all pass; without Z0/Z1, 170 fail
BigStep on the real machine: S(r) -+-> S(sweep r), one cell left5,843 (502 use Z0/Z1)all pass
Worked example (§2): S(L^4 1L1) gives S(L^9 111) on ours and S(L^7 101) on TM7, abstractly and on both real machines, with the intermediate words 1L11 and 0014all pass
Initial segment c0 -(5)-> S(1)1pass
From blank to 2e9 steps: consecutive sweep boundaries follow sweep256 sweeps256/256; Z0/Z1 never used; last boundary at step 1,976,201,019 = S(L^2068 0000LLLLL00100001)
Abstract orbit from S(1)3,000 sweepsstays in the domain; Z0/Z1 never used; ends at S(L^31762 0LLLL10111111101111)
Rocq (not simulation): Inc_spec, seg_hx_ld, seg_h1_ld, RIncs_spec (all 12 clauses), BigStep, init compile with Coq 8.20.1 against unmodified busycoq; no Admitted/Axiom; Print Assumptions closed for RIncs_spec, BigStep, init1 filecompiles; 3/3 closed
Rocq, full kill (not simulation): 1RB0RF_1LC0RE_0LC0LD_1RD1LB_0RF1RA_0RB---.v, all of §3–§5 ending in nonhalt, run through our checker, check_kill (check_kill.txt)1 filePASS: 3.6 s compile, 0 assumptions, coqchk pass

Gaps: none. The simulation rows are evidence only. The kill rests on the .v file alone, which passes our checker, check_kill.

AI assistance: this proof sketch, the scripts and the checks were produced with Claude (Anthropic) under Dennis's direction.

Review log #

Independent skeptic review, 2026-10-10. Verdict: sound; 5 minor gaps, no fatal or major ones. All 5 were accepted and fixed.

#gapresolution
1§6 clause counts were wrong. TM7's RIncs has 10 constructors, not 12; R has 12 clauses, not 14; and §3.1 lists 8 unchanged cases, not 10.Fixed: RIncs (10 clauses), R (12 clauses), 8 cases unchanged (X2, X3, C2–C4, R0–R2). Checked against SOMDCv6.v lines 1663–1701.
2Formal status was understated. The X1/C1 segment facts and all of §3.1, §3.2 and §4 already compile: probe_segments_2.v, plus the reviewer's RSpec2.v, which takes 3 s and has closed assumptions.Accepted. I recompiled RSpec2.v (3.3 s, 3/3 Print Assumptions closed). It is now embedded in check_proof.py as --rocq (also run by --full), so it can be rerun from this directory. Risk 1 is retired, and the header, §3.1, §3.2, §4, §6 and §7 now say what compiles. Remaining formal work: §3.3 and nonhalt. The reviewer's 2e9 from-blank figure was reproduced and now replaces the 1e9 row: 256/256, last boundary at step 1,976,201,019 = S(L^2068 0000LLLLL00100001).
3§5 called the conclusion "TM7's nonhalt verbatim", but RIncs_nxt' has a different signature.Fixed: §5 now gives the call (RIncs_nxt' at tp = tq = hx, k = j = q = 0, I1 passed twice, Inv by lia). This matches §6.
4§3.1 said TM7's A1 "turns straight back, 0RC". 0RC moves right; C0 = 0LC is the step that turns back.Fixed in §3.1. notes.md ("Where the +1 comes from") has the same wording and was not changed here, because it is outside this revision's files.
5word(m) as a function relied on R(h1,m,[],·) being functional, and the Z rows also used inc(word(K-1)) = word(K); neither was listed as a lemma.Fixed: End_1 and End_x are now relational and proved by induction on the R0–R2 derivation. The Z rows get R(h1,K,[],t+) from Lemma A applied to that derivation. Only Inc's functionality is used. check_proof.py adds the right-end Lemma A instance (m < 2000, all pass).

Also added, though the review did not ask for it: the worked example in §2, which explains Dennis's Checkpoint A observation (the extra 1 after the first eat is carried away by +1 pass 5), with a check in §7.