/machines/1RB0LD_1RC0RA_1RD1RF_1LA0LE_1RE1LD_0RB---/review-invariant-2.md · raw

Second skeptic review: proof.md §3.8 (INV+(e)) and its use in §3.3–3.5, 2026-10-10

Scope. Revision 3 of proof.md: §3.8 (statement, F1–F3, L6 and its corollary, L5′ with C1–C3, §3.8.3 survival of pairs 1 and 2, §3.8.4 proof of the Theorem, §3.8.5 notes), and the places where §3.3–3.5 rely on it. I did not re-review §0–§2 (the rules) or §3.7 beyond what my own tooling needed.

Stance and tooling. I started from the assumption that the proof is wrong. All code is new and written for this review. It does not use check_proof.py, scripts/ or the first skeptic's code. It lives in /tmp/claude-1000/-home-dennis/dbf3e2a9-21e7-4eb2-b481-38a0113aca31/scratchpad/m3-skeptic2/, a session scratchpad that may not persist: - lib.py: the TM simulator, the K encoder and parser, the abstract rules transcribed from §2, the accelerated countdown and the INV+(e) checker. - cyc.py: the cycle-pair driver. It checks every §3.8 claim at every event. - gen.py: the adversarial INV+(e) start generator. - counter.py: the pure counter model (L6 and F2 under arbitrary merges). - exh.py and rand_run.py: the sweeps. - validate.py and base.py: tool validation.

Verdict: no fatal or major gap. INV+(e) is inductive, and the Theorem (period) of §3.8.1 holds as stated. - I re-derived every equality and inequality in §3.8 by hand (sketches below), and each one is justified by the text, not just checked. - L6, F2 and the L5′ identities survive exhaustive tests in a pure counter model where any end touch may be a run-out, which is far more adversarial than the machine. - INV+(e) preservation survives: - 1,022,976 exhaustive near-threshold starts (L* = 3–6, regular and T2), each run for 2 chained cycle pairs (2,045,952 cycle pairs in all); - 150,600 random adversarial cycle pairs, with L* up to 600 and Ep blocks drawn to hit every L-slot run-out timing.

Every check passed and no configuration left D. - I found 7 minor items: wording and terminology (m1, m4–m6) and formalization aids for §3.8.1 and §3.8.5 (m2, m3, m7). None affects correctness.

1. Validation of my own tooling

2. What was attacked, and the result

2.1 L6 (Φ = steps + V − 2^n never decreases; each merge adds ≥ 2^(k−1))

2.2 The (e2) touch upper bound (F2 and §3.8.3)

So §3.8.3's budget is tight but never exceeded. - The arithmetic of §3.8.3 and §3.8.4 (e2), re-derived: - q₁ᴸ ≥ 11·2^(L*−1) − 4 ≥ (3·2^(L*) − 2) + 1; - q₂ᴸ ≥ 7·2^(L*−2) − 1 ≥ 3·2^(L*−1); - p₂′ = q₁ᴸ − T1 ≥ 5·2^(L*−1) − 2 ≥ 2^(L*+1) ≥ 2^(L*′).

All three hold for L* ≥ 2. Empirically, min p₂′/2^(L*′) = 1.125, which is exactly (5·4 − 2)/16 at L* = 3.

2.3 L5′, C1 and C2 (the explicit potential s_i)

Re-derived: - Plain Dec and EndLast: s does not change. - Merge at k > i: R′ = 2^(k−i) − 1 + H·2^(k−i) + c·2^(n−1−i), which gives 2(p + 1 + R′) − (p + R) = p + 2^(k−i). - Fused block: R_F equals R_(k+1) before the step, and e_F = e_(k+1). - Blocks above k + 1: they shift down with s unchanged, since ⌊V′/2^(i−2)⌋ = ⌊x/2^(i−1)⌋. - End of slot: s = r′, with δ = 1 after Ov and δ = 0 after X1. - L-start values: 9 − 3/2^(M−1) or 8 − 3/2^(M−1) for the head, and r or r − 1 for the other blocks.

Checked with exact rationals at every event of every slot, for L* ≤ 160: the plain-run invariance, the exact merge and fusion increments, the L5′.4 start values, s_end = r′, the A-bound p_i ≥ 2^(e_i) + 1 for non-tail i ≥ 2 before every event, rises > 1 for i ≥ 2, and fusion gains ≥ 2. There were 0 failures.

The threshold argument of §3.8.4 (b) holds, including the after-T2 case. Its margin is larger than claimed: - At the DecMergeTail, k = n and δ = 1, so the boost is > p_i/2^(e_i) + 1/2 > 1.5. - Empirically, min r′ at a regular K′ after a T2 start is 8.0.

2.4 INV+(e) preservation from adversarial starts inside INV+(e)

The generator. Every clause sits at its minimum, or a few units above it. The Ep blocks p_j (j ≥ 3, and the T2 top pair) range over every L-slot run-out timing, p ∈ {2, 4, …, 3·2^e + 2}, plus one survivor. The Eq q_j sit at threshold or threshold + 1, so both parities occur. The far p_L is 1–8 (x = 3–10), or up to 40 in random runs. T2(k) has k = 4–40. T2 starts with L = 2 (L* = 3) are included: INV allows them although they are unreachable.

At each start the checker asserts: - every macro step is a rule (in D); - the E-cycle is [X2,] End, Ov, with exact τ_j, h + 5 = 3·2^(L*+1) − 1 and x as claimed; - the L-start shape, and that every q-block below the x-pair is good; - merges only at k ≥ 3, only good or x ∈ {3, 5} run-outs, and no DecMergeEmpty; - the slot type matches the S2 table (EndLast iff x ≠ 4, X1 iff x = 4); - the pair-1/pair-2 touch bounds; - the L6 inequalities; - the L5′ checks; - p₁′ = 4·T1 + 7, p₂′ = q₁(end), L*′ = M − m ≤ L* + 1, and L*′ ≥ 4 after X1; - all of INV+(e) at K′: h, digits, q_L ≥ 6, k ≥ 4, θ-thresholds, parity, L* ≥ 3, (e1) and (e2).

sweep starts cycle pairs checked failures
exhaustive, regular, L* = 3 (q offsets 0–5) 2,304 4,608 0
exhaustive, regular, L* = 4 (q offsets 0–3) 16,384 32,768 0
exhaustive, regular, L* = 5 (q offsets 0–2) 145,152 290,304 0
exhaustive, regular, L* = 6 (q offsets 0–1) 745,472 1,490,944 0
exhaustive, T2, L* = 3 / 4 / 5 / 6 288 / 2,048 / 18,144 / 93,184 227,328 0
random, L* = 3–20, 5-pair chains (incl. 'timing' mode) 20,000 100,000 0
random, L* = 3–14 timing / 3–12 mixed 5,300 12,800 0
random, L* = 13–60 / 20–80 (4- or 3-pair chains) 5,000 18,000 0
random, L* = 60–200 / 80–160 / 200–400 / 300–600 700 1,800 0
random, L* = 3–30 (p₁ check at regular starts) 6,000 18,000 0

Every row-type of the far-end table was exercised many times: x = 3, 4, 5 and ≥ 6; X1 slots; cascading DecMergeTails; and up to 16,770 merges in 120 cycle pairs at L* = 200–400.

Minimum margins over all runs:

quantity minimum
p₁′/(2^(L*′+2) − 1) 1.000
T1/(2^(L*′) − 2) 1.000
p₂′/2^(L*′) 1.125
min r′/θ′ 1.000
ΔΦ/2^(k−1) 1.000
p₁′/(3·2^(L*′+1) − 1) at regular K′ 1.000 (16,161 cases)

The tight cases are expected: - (e1) and L6 are tight after a merge-free X1 slot; - (b) is tight after an X1 slot from a threshold regular start, where r′ = r − 1 = 4 = θ′; - the last row confirms §3.8.1's remark that regular starts give p₁ ≥ 3·2^(L*+1) − 1.

2.5 Is each informal step actually justified?

I went through §3.8.3–3.8.4 line by line. Every step follows from the stated lemmas, and none rests on a check alone: - The goodness of the L-start q-blocks comes from INV(c), from the fact that touches preserve p + d, and from X2's non-flipping touch. Merges preserve goodness below the x-pair, because the fused pair takes pair k+1's q and d. - The far-end schedule is F3 plus the explicit touch sequence end, pass, end at the x-pair. DecMergeEmpty is impossible: before EndLast the top pair has q = 1 and d = 0, and is never touched again. - "V = 0 ⇒ every pair below the far pairs has q even ≥ 2" holds because these pairs are good with d = 0. - The pair-1/pair-2 survival argument is not circular. §3.8.3 uses only F2, and L6 is applied afterwards. - (a), (c) and (d) at K′ follow from Ov/X1 mechanics and from the survival argument.

3. Gap list

# severity where issue status
m1 minor (wording) §3.8.2 F2 The proof treats only a merge at k > j, and "pair j" is ambiguous once merges below it renumber the pairs. The claim is true for all k under both readings. Index-based: V′ ≤ x − 1 always, and a run-out at k = j counts its touch, giving touches + H ≤ 2H + 1. Block-based: F3. Exhaustive DP over all strategies gives 0 violations. Only j = 1, 2 with k ≥ 3 is used. Add one sentence: "merges at k ≤ j: V′ ≤ x − 1 still gives the bound".
m2 minor (formalization) §3.8.5 J, "pair-1/pair-2 budget: q_j ≥ (remaining touch bound) + 1" §3.8.3's bound is a whole-slot count that uses N₁ ≤ M, which is not yet known during the first countdown. A loop invariant needs a state function. This one works: q_j ≥ R_j + 1 for j = 1, 2, with R_j = ⌊V/2^(j−1)⌋ + c·2^(n−j), the R of L5′. It holds at the L-start by (e). It is preserved: q_j − R_j is unchanged by plain Dec and by EndLast, and it does not decrease at merges at k ≥ 3, since V′ ≤ x − 1 (and x is even when k ≥ 2). I asserted q_j ≥ R_j + 1, with q_j − R_j non-decreasing, before every event of every run above. There were 0 failures. Suggest stating J's budget this way.
m3 minor (formalization) §3.8.5 J, "s_i ≥ σ" σ changes during the slot after a T2 start: it is 4 before the x-block's DecMergeTail and 5 after it. "Tail block" also needs a state definition. Both are expressible: a block is a tail block iff it is the top pair's p-block before EndLast or X1. σ is then a function of whether the x-block has been absorbed, which J already tracks via "far end is in one of the S2 rows". Spell out σ(phase) and the tail predicate in J.
m4 minor (terminology) §3.8.4 (b), "Tail blocks are absorbed by EndLast, X1 or DecMergeTail: t₀, and the x-block's p in slots with x ∈ {3, 5}" By the definition just before C1 (t₀, or a block fused with it), the x-pair's p-block in an x = 5 slot is not a tail block. It is a non-tail block that DecMergeTail absorbs. The block is never interior, so this is harmless, and the A-bound holds for it anyway. Say "tail blocks, and the x-pair's p-block when x = 5, are absorbed".
m5 minor (cosmetic) §3.4 S2 table, x = 3 "[p_{M−1}+t₀+4, 1, 0]" mixes conventions: p_{M−1} is the value at the merge, after 2 touches, while t₀ is the L-start value. In L-start values the fused p is p_{M−1} + t₀ + 6. Check: an L-start with x-pair (20, 3, 1) and last pair (9, 2, 1) fuses to (35, 1, 0). Not load-bearing, since the block is a tail block. Fix the constant or name the convention.
m6 minor (wording) §3.3, "pair j runs out in the E-cycle iff r_j < 3" Only "r_j ≥ 3 ⇒ survives" is true and used. With r_j < 3, the q can reach 0 on a pass touch, which is (o1), not a run-out. Say "can run out only if r_j < 3".
m7 minor (formalization) §3.8.1 (a), T2 digits "(0,1,…,1,0)" With L = 2 this must read (0,0). INV+(e) admits T2 starts with L = 2 (L* = 3). They are unreachable, since X1 yields L*′ ≥ 4, but the Theorem covers them, and the exhaustive T2 L* = 3 box passes. State the digits as "d₁ = d_L = 0, all others 1".

Not gaps, noted for calibration: - Several INV constants are stronger than needed: q_L ≥ 6, k ≥ 4, and (e1) itself, since p₁ only needs to support (e2) and pair-1 survival. - The after-T2 bound r′ ≥ 5 is loose: 8 is observed. - C3 is informational.

4. Claims attacked that held, with the reason

The fused blocks satisfy s_F > s_(k+1). - (c) at K′. Every q-block below the top pair is good with d = 0 at V = 0, so it is even, and Ov/X1 give d = 1. The T2 top pair is the stated exception: even p, d = 0. - (a) and (d) at K′. h = 2, p₁′ ≥ 7, t ≥ 5 ⇒ q_L′ ≥ 6, k = t₀ + 4 ≥ 8. Pairs 1 and 2, the x-pair and the last pair are distinct at X1, so L*′ ≥ 4 there; L*′ ≥ 3 after Ov. - The §3.3–3.5 narrative agrees with §3.8. This covers the τ_j table (L3, both start types), h + 5 = 3·2^(L*+1) − 1, x = p_L + 2 or 5, the S2 table (the m5 constant aside), the head-block values 9 − 3/2^(M−1) and 8 − 3/2^(M−1), the fusion bound r_F ≥ 2(r_a − 3) + r_b (−1 after X1), C3's 2r − 3 / 2r − 4, and the corrected "L*′ ≥ 4 after X1".

5. Reproduce

cd /tmp/claude-1000/-home-dennis/dbf3e2a9-21e7-4eb2-b481-38a0113aca31/scratchpad/m3-skeptic2
python3 validate.py 1; python3 validate.py 2      # rules vs TM, accel vs single-step
python3 base.py 300                               # base from blank tape + orbit to L*=300
python3 counter.py                                # L6 / F2 / corollary, all merge strategies
python3 exh.py reg 5 3; python3 exh.py T2 6 2; python3 exh.py reg 6 2   # exhaustive boxes
python3 rand_run.py 31 20000 3 20 5               # random chains (seed, N, Lmin, Lmax, chain [, modes, s-check limit])