problems / covering

Also in this folder: compute/ · figures/ · result/ · share/ · explainer.html · explainer.pdf · explainer.tex · README.md

Attack log — Linear covering codes of radius two

2026-08-16 — q1 (recovered from Codex session 01a009f7-5a24-71e1-bf4c-9667f4d2cbc4)

2026-08-16 — q2 (recovered from Codex session 01a00a33-832e-7d13-bf0e-59aeab97ec82)

2026-08-16 afternoon — q3 (Claude, covering-result branch)

2026-08-18 — q4 (Claude, cursor/covering-n49-attack-48dc branch): push 50 → 49

Target: ℓ2(10,2)≤49\ell_2(10,2)\le 49 — 49 distinct nonzero 10-bit columns, rank 10, singletons + pair-XORs covering all 1024 syndromes. Budget check: 1+49+(492)=1226≥10241+49+\binom{49}{2}=1226\ge 1024, slack 202, density would be 1226/1024≈1.197271226/1024\approx 1.19727. Everything new lives in compute/q4/; the certified n=50 matrix and result/ are untouched.

Angle 1 — symmetry: 49 = 7×7 (new this quest)

If a 49-covering is invariant under a subgroup G≤GL(10,2)G\le GL(10,2), it is a union of GG-orbits, and coverage collapses to orbit-class space (the pair-sum multiset of two orbits is GG-invariant). For ∣G∣=7|G|=7 the orbit classes number ~147 and a selection is just 7 orbits of size 7 — small enough to exhaust completely. Tools:

Sweep driver: compute/q4/run_all_groups.sh → compute/q4/orbit_runs.log. Results so far (each line is an exhaustive claim for that subgroup class):

Angle 2 — exhaustive k-swap prover from 7-hole residues

compute/q4/kswap.c: given a 49-column configuration, decide exactly whether any swap of ≤ K columns reaches zero holes. Re-add search branches on the first live hole (fresh column = hole, hole^kept, hole^placed), with an explicit defer branch for holes covered by two future columns, resolved in an exact endgame (anchored chain closure + floating-pair components, which are always placeable by translation), plus a top-s coverage-count bound that prunes ~300×. Planted controls: corrupting k columns of the certified 50-set (compiled at -DN_COLS=50) is caught at exactly j=k for all k = 1, 2, 3, 4.

Baseline stochastic runs (q2 binaries, fresh deterministic seeds) re-hit the 7-hole floor quickly; two 7-hole configs harvested:

Results. best_sa_config admits no swap of ≤ 5 columns reaching zero holes (exhaustive: C(49,5) = 1,906,884 removal sets, 94.6M re-add nodes). best_lifted_config admits no swap of ≤ 4 (j=5 running). These local optima are deep.

Finding: two inequivalent canonical near-misses. Both hole sets have rank 5 and exactly one zero-sum quadruple (an affine parallelogram) among the 7 holes; both configs have identical GL-invariants (multiplicity histogram, unique-coverage distribution per column, dependent-triple count). Yet compute/q4/find_equivalence.py — color-guided backtracking over basis images, self-tested on identity and random GL(10,2) transforms — proves there is no linear map sending one 49-set to the other. The 7-hole floor is not one canonical configuration; the landscape has at least two distinct deep basins with the same signature.

Angle 3 — SAT with a frame reduction

compute/q4/sat_n49.py: full CNF (pair auxiliaries + coverage clauses + seqcounter cardinality ≤ 49) with the WLOG reduction that a rank-10 covering can be assumed to contain all ten unit vectors (GL(10,2) frame normalization). Cadical, long timeout, background. A long shot; UNSAT would be a theorem but is not expected to terminate.

Wrap (stopped on request, 06:09 UTC)

No 49-covering found. No dent. Everything below is certified residue / certified exclusion, all replayable.

2026-08-19 — q5 (Codex, QM32_3^2/QM52_5^2 propagation)

2026-08-19 — q6b (Codex, exact 3-sums, QM53_5^3, and p≤64p\le64)

2026-08-19 — q6c (Codex, explicit QM44_4^4 certificate)

2026-08-19 — q7c (Codex, explicit lift partitions and honest QM53_5^3 continuations)

2026-08-20 — leftover unused paper constructions (QM21_2^1, QM43_4^3)

2026-08-20 — q8c (Codex, exact recursive coarsening at r=28r=28)

2026-08-20 — odd-r Table 5.1 holes (wrap: residue only)

Hard wrap. No shorter radius-2 matrix. Paper lengths still ℓ2(11,2)≤79\ell_2(11,2)\le 79 and ℓ2(13,2)≤159\ell_2(13,2)\le 159. No f(2)f(2) claim.

2026-08-21 — q9 (Claude Opus 5, fable/covering-n49-traj): trajectory of the r=10r=10 record, and exact quotient-block replacement

No 49-covering. No dent. Everything below is a recovered artifact, a verified structural fact about the published solutions, or certified search residue. result/ was read only; no q2/q4 search (SA, guided, lifted, k-swap, invariant orbit DFS) was rerun. New material is in compute/q9/.

History first

The construction family that follows from that

Fix a quotient with kernel VV and coset representatives t00=0,t01,t10,t11=t01+t10t_{00}=0,t_{01},t_{10}, t_{11}=t_{01}+t_{10} (this choice kills the twist). Pulling the four blocks (A;B,C,D)(A;B,C,D) back into VV, covering radius ≤2\le2 is equivalent to

(00) {0}∪A∪Δ(A)∪Δ(B)∪Δ(C)∪Δ(D)=V,(01) (A∪{0})+B ∪ C+D=V,(10),(11) the label-permuted twins,\begin{aligned} (00)&\ \{0\}\cup A\cup\Delta(A)\cup\Delta(B)\cup\Delta(C)\cup\Delta(D)=V,\\ (01)&\ (A\cup\{0\})+B\ \cup\ C+D=V,\qquad (10),(11)\ \text{the label-permuted twins}, \end{aligned}

with Δ(X)={x+x′:x≠x′}\Delta(X)=\{x+x':x\ne x'\}. compute/q9/verify_blocks.py checks this equivalence in both directions against a direct syndrome sweep on the 51-set, the 50-set and both 7-hole residues, matching the exact hole sets, on 160 quotient instances.

Freeze A,B,CA,B,C: every condition on DD becomes a hitting-set constraint (u∉A++B⇒D∩(u+C)≠∅u\notin A^{+}+B\Rightarrow D\cap(u+C)\ne\emptyset, and twins) plus one pair constraint (h∈Δ(D)h\in\Delta(D) for each syndrome the other three blocks miss). So "is there any block of size ≤k\le k finishing A,B,CA,B,C?" is exactly decidable. compute/q9/block_solve.c decides it by constraint-directed DFS: sibling exclusion on the hitting branches, where the branches really are "d∈Dd\in D" and partition the space; deliberately no exclusion on the pair branches, where they overlap and exclusion would be unsound; counting prunes on all four families.

This is not a kk-swap. A block carries up to 18 columns, all re-chosen at once and exactly. --shrink asks for a block one column shorter (turning the certified 50-set into a candidate 49); --resolve asks for one the same size (turning a 7-hole 49-residue into a candidate covering).

Controls

Sweeps (node cap 20000 per instance, --maxblock 18)

Each sweep covers all 174251 quotients ×\times 3 non-kernel blocks = 522753 instances. skipped = block wider than --maxblock; capped = node cap hit, which is unknown, not a negative; decided = search tree exhausted, an exact exclusion.

sweep instances decided capped (unknown) skipped result
--shrink on the certified 50-set (asks for 49) 509468 220118 289350 13285 no completion
--resolve on best_sa_config (7 holes) 514224 156264 357960 8529 no completion
--resolve on best_lifted_config (7 holes) 514160 164382 349778 8593 no completion
--shrink on the KR 51-set (asks for 50) 507792 159279 348513 14961 no completion

A second, deeper pass restricted to narrow blocks (--maxblock 12, node cap 200000) leaves almost nothing undecided:

sweep instances decided capped (unknown) skipped result
--shrink on the certified 50-set, blocks ≤12\le 12 279034 271127 (97.2%) 7907 243719 no completion

That row is the strongest single statement of the quest: for every one of the 174251 quotients and every non-kernel block of at most 12 columns, replacing that whole block by any shorter block is decided — and 97.2% of the time the answer is exhaustively no. Not one instance produced a 49.

Calibration, and a limit of the move class. --shrink on the 2003 51-set does not find a 50 either. The 51→50 step that q1 actually made by annealing is therefore not a single-quotient-block shrink (at least not among the 159279 decided instances). The block move is far larger than a kk-swap — planted needles at depth 14 are found — but it is not a superset of what annealing did, and that is worth knowing before anyone reads a negative here as evidence about 49.

So: 220118 exact decisions say the certified 50-set cannot be shortened by replacing any one of those quotient blocks with a shorter block, and 320646 exact decisions say neither 7-hole optimum can be repaired by replacing any one of those blocks. Between them that is over half a million simultaneous rearrangements of up to 18 columns, ruled out one at a time — and roughly 57% of the instances were left undecided by the node cap. None of this is a lower bound. ℓ2(10,2)=49\ell_2(10,2)=49 remains open.

Replay

cd problems/covering
python3 compute/q9/build_kr51.py compute/q9/H_r10_n51_KR.txt
python3 compute/q9/trajectory.py
python3 compute/q9/profiles.py compute/q9/H_r10_n51_KR.txt compute/H_r10_n50.txt
python3 compute/q9/verify_blocks.py compute/H_r10_n50.txt 40
gcc -O2 -o /tmp/bs compute/q9/block_solve.c
/tmp/bs --input compute/H_r10_n50.txt --shrink --maxblock 18 --nodes 20000 --shard 0/4

2026-08-21 — q10 (Claude Opus 5, fable/covering-n49-traj): prescribed automorphisms

No 49-covering. No dent. Records unchanged: ℓ2(10,2)≤50\ell_2(10,2)\le50, ℓ2(11,2)≤79\ell_2(11,2)\le79. What is new is a construction family that does not start from a known covering, and the exhaustive exclusions it buys. Material in compute/q10/; replay with compute/q10/run_q10_checks.sh.

The family

q9 replaced one quotient block of the certified 50-set at a time. That move, however large, is still anchored to the 50. This one is not anchored to anything: fix σ∈GL(r,2)\sigma\in GL(r,2) of odd prime order pp and search only σ\sigma-invariant sets. Such a set is kk full σ\sigma-orbits of size pp plus mm of the 2c−12^c-1 nonzero fixed vectors (c=dim⁡ker⁡(σ−1)c=\dim\ker(\sigma-1)), so

n=pk+m,0≤m≤2c−1,n = pk+m,\qquad 0\le m\le 2^c-1,

and the search collapses from (2r−1n)\binom{2^r-1}{n} to (#orbitsk)(2c−1m)\binom{\#\mathrm{orbits}}{k}\binom{2^c-1}{m}. Covering radius ≤2\le2 becomes a condition on orbit sums, decided exactly by orbit_search_g.c (fixed space of dimension ≤1\le1) and orbit_search_f.c (general). Conjugating by the centraliser of σ\sigma sends solutions to solutions, so one representative per centraliser class suffices; a subgroup of the centraliser only refines the classes, so the reduction stays sound, and the classes are computed from the commutant algebra rather than assumed.

r=10r=10, n=49n=49: order 7 is completely settled

49=7⋅749=7\cdot7, so with a 1-dimensional fixed space SS is exactly 7 of the 146 orbits — the lone fixed vector ff cannot be used, since 7 does not divide 48. ff must then be covered by a sum, and a+b=fa+b=f forces b=a+fb=a+f, so SS contains a partner pair {O,O+f}\{O,O+f\}. The centraliser reduces the 73 partner pairs to 1 class for module type M13⊕1M_1^3\oplus\mathbf 1 and 3 classes for M12⊕M2⊕1M_1^2\oplus M_2\oplus\mathbf 1 — the only two types up to conjugacy, since σ↦σ3\sigma\mapsto\sigma^3 swaps the two 3-dimensional irreducibles and generates the same group. All four exhausted.

c=4c=4 (144 orbits, 15 fixed vectors) allows (k,m)∈{(7,0),(6,7),(5,14)}(k,m)\in\{(7,0),(6,7),(5,14)\} for both module types. (7,0)(7,0) and (5,14)(5,14) ran with one orbit forced per centraliser class; (6,7)(6,7) ran the other way round — fixed_classes.py collapses the (157)=6435\binom{15}{7}=6435 fixed subsets to 6 centraliser classes, and the orbit part was left completely free, (1446)=11,143,364,232\binom{144}{6}=11{,}143{,}364{,}232 per class. All 12 exhausted.

c=7c=7 needs no search: the touched-layer bound 1+k+(k2)+km≥2c1+k+\binom k2+km\ge2^c fails for every (k,m)(k,m) with 7k+m=497k+m=49.

So no 49-column radius-2 matrix of rank 10 has an automorphism of order 7. The same two bounds plus the arithmetic condition kill orders 11, 17, 31, 73 and 127 outright (prime_orders.py), and the odd primes dividing ∣GL(10,2)∣|GL(10,2)| are exactly 3,5,7,11,17,31,73,1273,5,7,11,17,31,73,127. Hence:

If a 49-set exists, its automorphism group in GL(10,2)GL(10,2) is a {2,3,5}\{2,3,5\}-group.

Odd-order symmetry that survives: p=3p=3 with c∈{2,4,6}c\in\{2,4,6\} and p=5p=5 with c=6c=6, whose exhaustive costs are ≥4.8×1020\ge4.8\times10^{20} — out of reach here, and honestly unknown, not negative. p=2p=2 (unipotent σ\sigma) was not attempted.

r=11r=11: the second target, also negative

ℓ2(11,2)≤79\ell_2(11,2)\le79 has more slack than 49 does, so the same machinery was aimed below it.

σ\sigma nn decomposition verdict
order 11, c=1c=1 78 7 orbits + f+\ f exhausted, 2×(1856)=102,603,129,7202\times\binom{185}{6}=102{,}603{,}129{,}720
order 11, c=1c=1 77, 67, 66 7 / 6+f / 6 orbits exhausted
order 23, c=0c=0 69 3 orbits exhausted, (882)=3828\binom{88}{2}=3828
order 17, c=3c=3 68–75 4 orbits + m≤7+\ m\le7 fixed exhausted, all eight
order 7 c=8c=8, order 31 c=6c=6 78, 69 — layer bound, no search

Order 23 is the prettiest case and the biggest disappointment: it acts freely with 89 orbits of size 23, so an invariant set has size a multiple of 23, and 69=23⋅369=23\cdot3 sits ten below the record. It is not there. The same search does find a C23C_{23}-invariant 92-set.

Controls

None of this is a lower bound. ℓ2(10,2)=49\ell_2(10,2)=49 and every value of ℓ2(11,2)\ell_2(11,2) below 79 remain open. The sphere bound still gives only n≥45n\ge45 at r=10r=10 and n≥64n\ge64 at r=11r=11.

Addendum, same day — the known optima are 2-group symmetric

The sweep above covers odd prime orders. It was worth asking where the symmetry of the existing coverings actually lives, and the answer changes the reading of the whole section. aut_group.c computes Aut(S)={g∈GL(10,2):g(S)=S}\mathrm{Aut}(S)=\{g\in GL(10,2):g(S)=S\} by invariant-refined backtracking:

set Aut\mathrm{Aut} orbit sizes on F210∖{0}\mathbb F_2^{10}\setminus\{0\}
certified 50-set (q1) 128 115,256,1632,642,12821^{15},2^{56},16^{32},64^{2},128^{2}
Kaikkonen–Rosendahl 51-set 512 163,840,64101^{63},8^{40},64^{10}

Neither is rigid, and both groups are 2-groups — precisely the case the prescribed-automorphism sweep does not reach, since p=2p=2 never gives a useful reduction on its own. Verified independently by verify_aut.py, which rebuilds each element as a matrix and checks invertibility, g(S)=Sg(S)=S, distinctness, and closure under composition and inverses.

Prescribing those two groups directly at n=49n=49 does not work, and the reason is structural: the 127 vectors lying in Aut(50)\mathrm{Aut}(50)-orbits of size ≤2\le2 form exactly a 7-dimensional subspace, so any union of them is trapped there and leaves ≥896\ge896 holes. The only union with few orbits is 16+16+16+116+16+16+1; all 74400 of those were tested exhaustively and the best leaves 499 holes. Aut(51)\mathrm{Aut}(51) is coarser still.

Subgroups refine the orbits. subgroup_sweep.py sampled 94 distinct subgroups of Aut(50)\mathrm{Aut}(50) and 68 of Aut(51)\mathrm{Aut}(51), enumerating unions of orbits of total size 49 up to a cap of 60000 per subgroup:

| group | ∣H∣|H| | orbits | unions tested | best holes | | --- | --- | --- | --- | --- | | Aut(50)\mathrm{Aut}(50) | 8 | 183 | 60000 (capped) | 197 | | Aut(50)\mathrm{Aut}(50) | 16 | 131 | 60000 (capped) | 83 | | Aut(50)\mathrm{Aut}(50) | 32 | 133 | 60000 (capped) | 563 | | Aut(51)\mathrm{Aut}(51) | 8 | 191 | 60000 (capped) | 232 |

Every row is capped, so unknown, not negative — the union counts at these orders are far past 60000 and no subgroup was decided. 83 holes is search residue and nothing more; it is not close to a covering in any meaningful sense, and it is not a bound. What the addendum does establish is the honest next move: order-16 2-subgroups are where an invariant 49 would have to live, and deciding even one of them exhaustively is the open work.

2026-08-21 — q11 (Claude Opus 5, fable/covering-n49-traj): the fibered graph family

No 49. No dent. Records unchanged: ℓ2(10,2)≤50\ell_2(10,2)\le50, ℓ2(9,2)≤39\ell_2(9,2)\le39, ℓ2(11,2)≤79\ell_2(11,2)\le79. What is new is a construction family that is anchored to a fibration rather than to a set, that contains the documented lengths at r=4,7,8,9r=4,7,8,9, that is exactly decided at r≤8r\le8, and that carries two exact obstructions — one of which says outright that the family cannot produce any n≤47n\le47 at r=10r=10. Material in compute/q11/; replay with compute/q11/run_q11_checks.sh.

The family

Split F2r=V⊕W\mathbb F_2^r = V\oplus W, dim⁡V=F\dim V=F, dim⁡W=M\dim W=M, and take

S={(v,0):v∈A} ∪ {(g(u),u):u∈W∖{0}},n=∣A∣+2M−1,S=\{(v,0):v\in A\}\ \cup\ \{(g(u),u):u\in W\setminus\{0\}\},\qquad n=|A|+2^M-1,

one column over every nonzero point of the base and a kernel block AA. Radius 2 splits cleanly into two conditions: AA is 1-saturating in VV, and B+g(u)⊆DuB+g(u)\subseteq D_u for every u≠0u\ne0, where B=V∖(A∪{0})B=V\setminus(A\cup\{0\}) and Du={g(w)+g(w+u)}D_u=\{g(w)+g(w+u)\}. Since n=2F−1−∣B∣+2M−1n=2^F-1-|B|+2^M-1, the whole family is the single question how large can ∣B∣|B| be.

q9 moved one quotient block of a known 50; q10 prescribed a symmetry. This starts from neither — gg is a free function, and the known coverings are outputs, not seeds.

The line-colouring reformulation

{w,w+u}\{w,w+u\} and uu span the same line of PG(M−1,2)\mathrm{PG}(M-1,2), and g(w)+g(w+u)=τ(ℓ)+g(u)g(w)+g(w+u)=\tau(\ell)+g(u) for the symmetric 2-cocycle τ({a,b,a+b})=g(a)+g(b)+g(a+b)\tau(\{a,b,a+b\})=g(a)+g(b)+g(a+b). So τ\tau colours the lines of PG(M−1,2)\mathrm{PG}(M-1,2) by VV, and the condition is

every point of PG(M−1,2)\mathrm{PG}(M-1,2) sees every colour of BB,

i.e. each colour class is a line cover and the classes are disjoint. lines.py checks this against the flat 2r2^r sweep on every solution below; they agree in every case.

Two exact consequences:

What the family gives

rr (F,M)(F,M) best nn shorter lengths documented
4 (2,2) 5 — ℓ2(4,2)≤5\ell_2(4,2)\le5
6 (3,3) 13 n=11,12n=11,12 exhausted —
7 (3,4) 19 n=18n=18 impossible (AA cannot be 1-saturating) GDT f(7)=19f(7)=19
8 (4,4) 26 n=23,24,25n=23,24,25 exhausted ℓ2(8,2)≤26\ell_2(8,2)\le26
9 (4,5) 39 n=38n=38 residue GDT f(9)=39f(9)=39
10 (5,5) 54 n≤47n\le47 impossible; 48–53 undecided ℓ2(10,2)≤50\ell_2(10,2)\le50
11 (5,6) 86 (short runs) n=79n=79 not reached GDT f(11)=79f(11)=79

Every listed length is an explicit matrix under compute/q11/, each replayed by verify_H.c, a flat 2r2^r sweep sharing no code with the search: 16/16, 64/64, 128/128, 256/256, 512/512, 1024/1024, 2048/2048.

The r≤8r\le8 rows are exact. n=23n=23 and n=24n=24 at r=8r=8 were exhausted over all 6435 and 5005 kernel blocks with no reduction at all; n=25n=25 over the 24 GL(4,2)GL(4,2)-reduced blocks, with the reduction itself controlled by re-running n=23n=23 on its 17 reduced blocks and getting the same verdict. So the family reproduces ℓ2(8,2)≤26\ell_2(8,2)\le26 from a two-line definition and provably cannot beat it.

Why r=10r=10 is the bad case, and it is not an accident

At r=2m+1r=2m+1 the useful split is (F,M)=(m,m+1)(F,M)=(m,m+1): the base is one dimension larger than the fibre, each nonzero fibre gets 2m−12^m-1 pairs for 2m2^m targets, and there is slack — that is the shape of the classical odd-rr formula, and the family lands exactly on f(7)=19f(7)=19 and f(9)=39f(9)=39. At r=2mr=2m the split must be (m,m)(m,m): each fibre gets only 2m−1−12^{m-1}-1 pairs for 2m2^m targets and the deficit is paid by the kernel block, whose own (∣A∣2)\binom{|A|}{2} sums are then almost all wasted — at r=10r=10, ∣A∣=18|A|=18 supplies 171 covers for 31 targets, 140 of the 202 total slack burned in one fibre. On top of that M=5M=5 is odd, so Lemma A deletes the quadratic members. The r=10r=10 record 50 is not in this family; the family's own best is 54. That is a structural reason why r=10r=10 has no closed-form value while its odd neighbours do.

The r=9r=9 residue, and where it is stuck

n=38n=38 at r=9r=9 would be a dent. It needs ∣B∣=8|B|=8 with ∣A∣=7|A|=7, and the colour half of the condition is reachable — the annealer hits cost 0 at k=8k=8 routinely. Every time, the eight colours common to all 31 points had no 1-saturating complement, and of the recorded blocking sets 29 of 29 (13 distinct) are affine hyperplanes of F24\mathbb F_2^4 (fullsets.py) — for those, A=H∖{0}A=H\setminus\{0\} and A+A⊆HA+A\subseteq H, so fibre 0 can never be covered. That is an observation about a sample, not a theorem.

From the other side, n=38n=38 reduces to a finite list: up to GL(4,2)GL(4,2) there are 28 classes of 7-element kernel blocks, exactly 17 of them 1-saturating, and a 38 in this family must use one of those 17. All 17 were annealed at length and every one floors at exactly cost 14, i.e. 14 missing (point, colour) incidences out of 248 (r9_n38_classes.txt). The exact DFS decides none of them — 4×1084\times10^{8} nodes on the first block, still capped. So n=38n=38 is residue, not an exclusion, and ℓ2(9,2)≤39\ell_2(9,2)\le39 stands.

What was tried at r=10r=10 and did not work

The exhaustive DFS was aimed at n=49n=49 directly: ∣B∣=13|B|=13, kernel block ∣A∣=18|A|=18, with the 15149 GL(5,2)GL(5,2)-reduced AA-masks generated by gen_asets.c. At a 300000-node cap, 0 of the first 200 masks were decided; a single mask did not finish in 10 minutes. No capped table is reported, because a sweep that decides nothing is not a result. The annealer, which is what settles the other rows, tops out at ∣B∣=8|B|=8 (n=54n=54) at (5,5)(5,5) and reaches cost 55 at ∣B∣=12|B|=12 and cost 67 at ∣B∣=13|B|=13 — nowhere near.

None of this is a lower bound. ℓ2(10,2)=49\ell_2(10,2)=49 remains open, the sphere bound still gives only n≥45n\ge45, and the exclusions above are exclusions inside one family.

Replay

cd problems/covering/compute/q11
sh run_q11_checks.sh

2026-08-21 — wrap (session stopped)

Stephen asked to wrap covering and leave Hilbert running. No 49. No dent. Records unchanged: ℓ2(10,2)≤50\ell_2(10,2)\le 50, ℓ2(9,2)≤39\ell_2(9,2)\le 39, ℓ2(11,2)≤79\ell_2(11,2)\le 79. Sphere covering still only ≥45\ge 45 at r=10r=10.

Three families, all recorded above:

Next move if anyone reopens this: decide one order-16 subgroup of Aut(50)\mathrm{Aut}(50) at n=49n=49, or finish the 17 classes at r=9r=9, n=38n=38. Do not rerun SA / k-swap-5 / C7×C7 / single-block shrink.

Replay of the certified 50-set on wrap (2026-08-21, late morning PT): python3 compute/verify_certificate.py compute/H_r10_n50.txt → PASS, 1024/1024, rank 10, radius exactly 2.

2026-09-08 — H_OK 9-block (3,0)-partition → ℓ₂(18,3)≤151

2026-09-10 — OK37 (3,0) partition residue (q12)

2026-09-11 — q13: inherited partition of the 817 seed and QM43_4^3

2026-09-23 — q16: merge inherited blocks before the radius-3 lift

2026-09-23 — q14: exact local switches around the 50-set

Target: ℓ2(10,2)≤49\ell_2(10,2)\le49. The published 50-column seed is Wu, arXiv:2608.27494, also used in the September Davydov–Marcugini–Pambianco–Wu draft. This campaign asks a new finite question: can a 49-set be reached by deleting two or three columns from that seed and inserting one or two new columns?

No dent. The two local neighborhoods are excluded, but an unrelated 49-set remains possible. This is residue and no lower bound for ℓ2(10,2)\ell_2(10,2).

2026-09-23 — q15: redundancy-47 refinement of the same seed