Subagent report: stage 4d — the thin-cell even mode (2026-09-04)
Provenance: Claude Opus 5 (1M) implementation/numerics subagent, dispatched by the Fable main loop against docs/next-stage-plan-2026-09-04.md §5 item 4d, 2026-09-04. Compute: GB10 (spark), CPU only, no GPU, no ARC (no ARC acknowledgement is owed); the cited run used six BLAS/OpenMP threads. Artefacts: icemix/parity.py (new), experiments/05_thin_even/{preflight.py,run_thin_even.py,make_summary.py}, experiments/05_thin_even/results/{preflight.json,results.json,summary.md,run.log}, tests/test_stage4d.py. Every number below is traceable to experiments/05_thin_even/results/results.json, which make_summary.py renders into summary.md without arithmetic of its own. Nothing was committed; the main loop commits.
0. Headline
The registered hypotheses:
| statement | number | verdict | |
|---|---|---|---|
| H1 | v_even is dominated by degree-2 spin products (captured fraction > 0.5) |
0.85322 | TRUE |
| H2 | v_even lies in the span of products of the slowest odd eigenvectors |
0.52538 | TRUE |
| H3 | v_even is localised in a flux-resolved quantity of the thin direction (> 0.5) |
0.04538 (single cut plane), 0.18906 (all four) | FALSE |
| H4 | v_even has zero momentum in both transverse directions |
χ(T_y) = χ(T_z) = 1.000000000000 | TRUE |
The gap ratio at each cell reached (giant component, per attempt):
| cell | Δ_even/Δ_odd | slowest mode is |
|---|---|---|
| (1,1,2) | 3.71429 | odd |
| (1,1,3) | 3.81136 | odd |
| (1,2,2) | 0.62206 | even |
| (1,1,4) | 3.88035 | odd |
| (1,2,3) | not run — see §7 | — |
(1,2,3) status: NOT RUN. Its exact W = 0 count was measured (196,465,480, matching stage 1); the diagonalisation projects at 31–243 h wall against the ~4 h budget, so per the brief’s instruction it was not launched and a design is recorded instead (§7).
And one finding that was not registered and is the substantive answer to “the slow even modes at (1,2,2) are a different object and nobody has said what”:
The slowest even mode is the emergent magnetic helicity. It is a pseudoscalar — its character under the cell’s 256-element affine automorphism group is exactly
det(M_g)(max deviation 2.7e-14) — and the single observableh = Im(P_z(q_y)* P_x(q_y)) + Im(P_x(q_z)* P_y(q_z)), the transverse part ofq·(P* × P)atq_min, has overlap 0.75859 with it. The span of the eleven independent helicity columns captures 0.83456 of the mode — essentially all of its degree-2 content (0.85322). Every even member of the production panel has overlap below 1e-25 with it, i.e. exactly zero by symmetry. The practical consequence: the exacttau_expof that one helicity observable is 389.45 attempts against a true1/Δof 389.95, where the best existing panel member reaches 263.13 and the odd polarisation reaches 242.07. Adding a pseudoscalar member toicemix/panel.pycloses the parity blind spot at this cell for no extra Markov time. See §4 and §8.6.
1. Pre-flight projections
Timed before anything was launched (results/preflight.json, written by preflight.py; one unit of every computation, multiplied out).
| unit | measured | source |
|---|---|---|
DFS enumeration, (1,2,2), W=0 only |
221,628 states in 28.7 s → 7,731 states/s | enum_122 |
DFS enumeration, (1,1,4), W=0 only |
637,988 states in 21.0 s → 30,453 states/s | enum_114 |
frontier DP, (1,2,3), track_axes=(0,1,2) |
14.1 s, peak 123,432 keys | frontier_123 |
flip graph, (1,2,2) |
0.44 s, nnz 2,652,092, mean flippable 10.966 | flip_graph_122 |
one sparse mat-vec, (1,2,2) giant |
4.56 ms = 1.72 ns/nnz (vector in cache) | matvec_122 |
Lanczos k=12, deflated |
1,061 mat-vecs, 15.8 s | lanczos_122 |
searchsorted, 221 k array |
42 ns/lookup | searchsorted_small |
searchsorted, 20 M array |
1,910 ns/lookup (cache-miss bound) | searchsorted_big |
| float32 GEMM | 672 GFLOP/s | sgemm |
Part 1 projection: ~6 min (enumeration 30 s + two Lanczos runs 30 s + 256 symmetry characters 25 s + a 221,424 × 2,017 float64 Gram 13 s + 4,000 exact-rho mat-vecs 165 s + the four-cell ladder 60 s). Measured on an uncontended machine: 335 s. Inside the 10-minute foreground threshold, but close enough to it — and uncertain enough before the first pass — that every launch was detached in a named tmux session (stage4d) with the heartbeat feed; PID alive and feed advancing were verified after each.
Part 2 projection: see §7. It fails the budget by 7×–60×.
Run ledger
The run script grew through the session (the multiplet-invariant conversion of §8.4, then the helicity family of §4, then the four-cell ladder of §6 were each added and the run repeated). Every launch was detached in the stage4d tmux session with the heartbeat and the canonical exptop feed; PID and feed advance were verified after each. Only the last produced the results.json this report cites.
| # | pid | launched | threads | wall | outcome | feed card |
|---|---|---|---|---|---|---|
| 1 | 1233950 | 09:13:34 | 8 | 264 s | completed | completed |
| 2 | 1246242 | 09:19:30 | 8 | 203 s | killed while adding multiplet invariants | zombie, stamped failed |
| 3 | 1253319 | 09:22:53 | 8 | 88 s | killed while adding the helicity family | zombie, stamped failed |
| 4 | 1256599 | 09:24:22 | 8 | 335 s | completed | completed |
| 5 | 1332365 | 09:37:51 | 8 | 949 s (machine contended) | completed | completed |
| 6 | 1383783 | 09:54:43 | 6 | 888 s (14:48) | completed — the cited run | completed |
Run 6 is the one results.json, summary.md and this report cite. Its /usr/bin/time -v line: elapsed 14:48.05, 158 % CPU (1.58 cores on average against six threads requested — the machine was oversubscribed), maximum resident set size 4,667,728 KiB = 4.45 GiB, exit status 0; load average at exit 13.5. Runs 5 and 6 ran while the machine was oversubscribed (a spin-ice job from another session plus the stage 4a–4c connectivity sweep), which is why the same work took 335 s, 949 s and 888 s. Run 6 used six threads at the main loop’s instruction. From run 6 onward the script records meta.peak_rss_bytes and meta.load_average_at_exit itself.
Feed root: ~/.local/state/exptop/feeds/spark-709c/ice-mixing-stage4d-<pid> — six cards, one per launch, listed above with their final status. preflight.py opens no feed. At ~110 s it sits right on the “feeds are for runs over about a minute” boundary, so a repeat should be given one; as a one-off probe run in the foreground and watched, it was not.
The two zombie cards are a defect of mine and are recorded as such in §8.5.
Memory: free -g before each launch showed 86–94 GiB available against a 121 GiB machine holding an RSS-invisible vLLM resident, and never fell below 74 GiB free during the run. Measured peak RSS of the cited run: 4,667,728 KiB = 4.45 GiB (/usr/bin/time -v, and meta.peak_rss_bytes in results.json), dominated by the degree-2 design matrix, 221,424 × 2,017 float64 = 3.6 GiB. experiments/04_lorentzian_giant/ was never touched, and no (1,2,3) enumeration or diagonalisation was ever launched — only its 14.9 s frontier-DP count, which materialises nothing.
2. The (1,2,2) two-parity spectra
Sector: 221,628 W = 0 states, 205 components, giant 221,424, 204 singletons (reproducing stage 1 exactly). The giant component is closed under global arrow reversal R, which acts on it as a free involution (no bit-string equals its complement) with 110,712 orbits. The two parity blocks P^± [j,k] = P[r_j,r_k] ± P[r_j,p_k] are each 110,712 × 110,712, symmetric, and their spectra partition the spectrum of P (asserted in the tests against a dense eigh at (1,1,2)). Lanczos was run on each block separately, k = 14, the uniform vector deflated in the even block only: 930 and 973 mat-vecs, 26.7 s (the machine was contended; see the run ledger).
Lowest 14 per sector, 1/Δ in attempts and in sweeps (n_hex = 64 attempts per sweep):
| k | λ (even) | 1/Δ att | 1/Δ sw | λ (odd) | 1/Δ att | 1/Δ sw |
|---|---|---|---|---|---|---|
| 1 | 0.9974355642 | 389.95 | 6.0930 | 0.9958774927 | 242.57 | 3.7902 |
| 2 | 0.9962068584 | 263.63 | 4.1193 | 0.9958774927 | 242.57 | 3.7902 |
| 3 | 0.9961612083 | 260.50 | 4.0703 | 0.9958774927 | 242.57 | 3.7902 |
| 4 | 0.9943615528 | 177.35 | 2.7712 | 0.9958774927 | 242.57 | 3.7902 |
| 5 | 0.9942156099 | 172.88 | 2.7012 | 0.9954992346 | 222.18 | 3.4716 |
(the full 14-deep table is summary.md §2; the odd sector’s first two eigenvalues are 4-fold degenerate, the even sector’s first four are simple.)
Merged and ordered, the three slowest modes are even and the fourth is odd — exactly stage 2’s parity-blindness finding, now with the two sectors resolved rather than inferred from a <v, Rv> character.
Delta_even = 2.5644358e-3, Delta_odd = 4.1225073e-3 (per attempt)
Delta_even / Delta_odd = 0.622057 (not 2)
Degeneracy and splitting (tolerance 1e-9): v_even is simple; the gap to the second even mode is 1.229e-3 in λ (a million times the tolerance), so the eigenvector is canonically defined up to sign and every reading below is a property of the chain. The slowest odd eigenvalue is 4-fold degenerate, so every odd reading in this report is a multiplet invariant (trace character, or the observable’s projection onto the whole invariant subspace) — see §5.
Verification against the banked stage-2 spectrum: PASS. Max |λ − banked| over the banked top 10 = 5.44e-15; all ten parities agree; Δ per attempt banked 2.564435754e-3 vs recomputed 2.564435754e-3. Independently, the lifted eigenvectors satisfy ‖P v − λ v‖ < 1e-14 and |<v, Rv> ∓ 1| < 1e-10.
3. Characterisation of v_even
(a) Momentum
| translation | character on v_even |
trace character on the slowest odd multiplet (deg 4) |
|---|---|---|
T_y (one cell in y) |
1.000000000000 | −0.0 |
T_z (one cell in z) |
1.000000000000 | +0.0 |
T_yT_z |
1.000000000000 | −4.0 |
v_even is at zero transverse momentum — H4 TRUE.
The odd multiplet’s traces are the genuine, basis-independent characters (the individual <u, T u> are properties of an arbitrary Lanczos basis, not of the chain). Trace 0 for each generator and −4 for their product forces the four-dimensional multiplet to consist of two states with (χ_y, χ_z) = (−1,+1) and two with (+1,−1). Since b = c = 2, q_min along a transverse axis is the zone boundary and e^{iq_min·a} = −1, so those are exactly the momenta of P_z(q_y) and P_x/y(q_z): the slowest odd modes sit at the transverse zone-boundary momenta, and the slowest even mode at zero momentum.
(b) Point group — derived, not assumed
icemix.parity.lattice_automorphisms derives the cell’s affine automorphisms from the coordinates: candidates p ↦ M p + t (mod box) with M a signed axis permutation preserving the box lattice, accepted only if the map permutes the site set, carries every bond to a bond, and carries the derived hexagon set to itself. Where the map exchanges the A and B sublattices the arrow bit complements, so the induced state map is s ↦ π(s) ⊕ f with an explicit flip mask; that composition law is unit-tested against repeated application.
Two crystallographic anchors were asserted, not assumed:
- at
(1,1,1)the construction returns 192 automorphisms — exactly the number of general positions ofFd-3min one conventional cubic cell, with 96 sublattice-swapping (a test); - at
(1,2,2)it returns 256 (16 point operations preserving the (4,8,8) box × 16 FCC-coset translations), all 256 of which act on the giant component — i.e. the giant component is a union of full symmetry orbits.
Every automorphism was verified to commute with P on the sector (a test at (1,1,2)).
The result. χ(g) = <v_even, g v_even> is ±1 on every one of the 256 elements, and
max_g | chi(g) - det(M_g) | = 2.66e-14 (128 proper, 128 improper)
so v_even transforms in the determinant (pseudoscalar) representation: invariant under all 128 proper operations, sign-reversing under all 128 improper ones. Deviation from the trivial character is 2.0 (i.e. it is not totally symmetric); the stabiliser has exactly 128 elements. The second and third even modes are neither pseudoscalar nor trivial (deviation 2.0 from both) — they carry other one-dimensional characters. This is developed in §4.
(c) Degree structure
Least-squares projection onto the span of spin monomials σ_S = ∏_{b∈S}(2x_b − 1) under the uniform measure on the giant component (the monomials are not orthogonal once restricted to an ice sector, so this is a genuine Gram solve, done by symmetric eigendecomposition with an explicit rank cutoff). σ_S has parity (−1)^{|S|}, so an even vector has exactly zero overlap with every odd-degree monomial — measured 8.7e-20, asserted.
| vector | degrees | columns | rank kept | fraction (rcond 1e-10) | 1e-8 | 1e-12 |
|---|---|---|---|---|---|---|
v_even |
0 + 2 | 2,017 | 402 | 0.853223 | 0.853223 | 0.853223 |
| 2nd even | 0 + 2 | 2,017 | 402 | 0.876672 | 0.876672 | 0.876672 |
| 3rd even | 0 + 2 | 2,017 | 402 | 0.820310 | 0.820310 | 0.820310 |
v_odd (multiplet mean) |
1 | 64 | 30 | 0.597232 | 0.597232 | 0.597232 |
The fraction is identical across all three rank cutoffs, so the rank-deficiency of the Gram is not doing the work — and it is severe: the 2,017 monomials span only a 402-dimensional space of functions on the giant component, and the 64 single spins span only 30. H1 is TRUE at 0.85322.
Degree 3 (41,664 columns) and degree 4 (635,376 columns) were not run; costs and reasons in §9.
(d) Overlaps with named even observables
259 named observables were built: P_j(q) on all three axes at harmonics 1 and 2 (odd); their moduli squared (even); the flippability structure factor F(q) and the total flippable count (even); the local x-flux through each of the four cut planes resolved by transverse cell, and their staggered combinations (odd); all 136 pairwise products of those local fluxes (even); and the helicity family of §4 (even).
Largest overlaps <v, O>² / (|v|² |O|²) with v_even:
| rank | observable | overlap |
|---|---|---|
| 1 | helicity_yz |
0.75859 |
| 2–3 | helicity_qy, helicity_qz |
0.43300 |
| 4 | helicity_total |
0.42149 |
| 5–6 | helicity_totalx2, helicity_yzx2 |
0.27991 |
| 7–8 | helicity_qyx2, helicity_qzx2 |
0.14759 |
Every one of the top eight is a helicity. The best non-helicity overlap is 0.066707, attained by a set of tied local-flux pair products of the form φ(plane p, cy, cz) · φ(plane p+2, cy', cz') — products of fluxes on different cut planes and different transverse cells, which is a cross-cell twist, i.e. the same chirality seen crudely.
The panel’s even members see nothing. Overlaps with v_even, every one of them below 1e-25 (they are floating-point zero, and their last digits move between runs, which is the signature of a symmetry-enforced zero rather than a small number):
| panel even member | overlap with v_even |
|---|---|
F_qy_re, F_qy_im, F_qz_re, F_qz_im |
1.8e-30 … 7.0e-29 |
n_flippable_total |
6.3e-34 |
abs2_P⊥(q_min), all four |
4.8e-26 … 5.2e-26 |
The plan’s §4(c) expected the flippability overlaps to be tiny; they are in fact exactly zero, by symmetry — every one of these observables is a true scalar under improper operations and v_even is a pseudoscalar. That is a stronger statement than “suppressed by powers of q_min²”, and it is not a finite-size effect: no series length and no system size makes a symmetry-forbidden overlap appear.
(e) Degeneracy and splitting
v_even is simple, split from the second even mode by 1.229e-3 in λ and from the third by 1.275e-3. The even sector’s first degenerate multiplet is 4-fold at λ = 0.9942156099 (rank 5–8). The odd sector’s slowest is 4-fold at λ = 0.9958774927 and its second is 4-fold at 0.9954992346. So no near-degeneracy threatens the identification of v_even.
The pair amplitude
Since v_even is 85 % degree 2, its degree-2 content is described by the symmetric 64 × 64 matrix C_ij = <v_even, σ_i σ_j>. Its diagonal vanishes identically (σ_i² = 1 and the eigenvector is orthogonal to the constant) — measured 1.5e-18. C is not rank one: effective rank ‖C‖_F⁴/Σw⁴ = 18.35, top eigenvalue weight 0.0756, and the leading eigenvalues come in ± pairs (−0.002933, −0.002933, +0.002933, +0.002933), which is the signature of an antisymmetric bilinear pairing rather than the square of one form. The six leading eigenvectors each overlap 0.46–0.48 with a P_j(q) component and 0.24–0.47 with an odd eigenvector’s spin profile, and each puts a quarter of its weight on the bonds crossing one cut plane. That is exactly the structure of Im(P_i* P_j) — §4.
4. Unexpected: the mode is the emergent magnetic helicity
This was not registered; it fell out of the character analysis and was then tested directly.
For a divergence-free field the natural bilinear pseudoscalar is q · (P* × P): with q along axis k and (i,j,k) cyclic,
h_k(q) = Im( P_i(q)* P_j(q) )
= Re P_i · Im P_j - Im P_i · Re P_j .
It is even under R (a product of two odd factors) and changes sign under every improper lattice operation (the cross product does) — the same transformation law the character analysis found for v_even, and one that nothing in the existing panel has. In the continuum this is the magnetic helicity ∫ A·B of the emergent gauge field.
Measured overlaps with v_even, and with the second even mode as a control:
| helicity observable | overlap v_even |
overlap 2nd even mode |
|---|---|---|
h_y + h_z at q_min (helicity_yz) |
0.75859 | 1.5e-25 |
h_y at q_min |
0.43300 | 2.6e-27 |
h_z at q_min |
0.43300 | 4.0e-25 |
h_x + h_y + h_z at q_min |
0.42149 | 7.9e-26 |
h_y + h_z at 2q_min |
0.27991 | 5.5e-26 |
h_y − h_z at q_min (staggered) |
2.3e-27 | 2.7e-25 |
h_x at q_min (thin axis) |
0.03464 | 8.5e-27 |
The span of the eleven independent helicity columns captures 0.83456 of v_even — against a total degree-2 content of 0.85322. In other words the helicity family accounts for 98 % of everything degree-2 in the mode. It captures 4.7e-22 of the second even mode (which is therefore a different object entirely) and 0.81703 of the third even mode.
The symmetry bookkeeping closes on itself, which is the check that this is not a coincidence. The y ↔︎ z swap [[1,0,0],[0,0,1],[0,1,0]] has det = −1, so it must send v_even → −v_even; geometrically it exchanges h_y ↔︎ h_z and flips the helicity’s sign, so h_y + h_z → −(h_y + h_z) (odd, matches) while h_y − h_z → +(h_y − h_z) (even, must be orthogonal). Measured overlap of h_y − h_z with v_even: 2.3e-27, i.e. exactly zero. Likewise h_x, the helicity about the thin axis, is nearly decoupled (0.0346) — there is only one cell of room along x, so there is no long-wavelength helicity to be had there.
The exact autocorrelations, and the panel fix
rho(t) was computed exactly by 4,000 sparse mat-vecs for the panel and for the helicity family. tau_exp below is the relaxation time of the slowest eigenvalue the observable actually couples to; tau_int is the exact integrated time.
| observable | parity | tau_int (att) | tau_int (sw) | tau_exp (att) | couples to |
|---|---|---|---|---|---|
P⊥(q_min) (Pz_qy, Py_qz) |
odd | 181.73 | 2.840 | 242.07 | slowest odd mode |
P⊥ (Px_qy, Px_qz) |
odd | 158.92 | 2.483 | 221.68 | 2nd odd multiplet |
F(q_min) (all four) |
even | 49.78 | 0.778 | — | nothing in the top 28 |
n_flippable_total |
even | 51.69 | 0.808 | 176.85 | a fast even mode |
abs2_P⊥(q_min) |
even | 105.77–124.64 | 1.653–1.948 | 263.13 | 2nd even mode |
helicity_yz |
even | 309.02 | 4.828 | 389.45 | the slowest mode of the chain |
helicity_qy, helicity_qz |
even | 265.13 | 4.143 | 389.45 | the same |
helicity_total |
even | 193.49 | 3.023 | 389.45 | the same |
1/Δ = 389.95 attempts and tau_exp = -1/log λ = 389.45 attempts. So the helicity observable’s tau_exp is the true relaxation time, to the last digit, while the whole existing panel tops out at 263.13 (the second even mode) or 242.07 (the slowest odd mode) — short of the gap by a factor 1.61. F(q), the panel’s designated even member, couples to no mode in the top 28 of either parity: its rho(t) decays on a fast local scale (tau_int = 0.78 sweeps), exactly the “invisible slow tail” the plan’s §4(c) anticipated, but for a symmetry reason rather than an amplitude one.
What this says about the thin-cell pathology. The three slow even modes at (1,2,2) are not two-photon states of the Gaussian argument; they are long-wavelength helicity (chirality) fluctuations of the emergent field, which the plan’s §4 argument does not contain and which no member of the production panel can couple to. The ladder of §6 supports the reading that they need two thick directions: the quasi-1D cells, which have only one, put the even sector at Δ_even/Δ_odd ≈ 3.7–3.9 instead.
What it does not say. This is a statement about a 64-spin cell of thickness 1. It does not establish that a helicity mode exists, or is slow, in cubic geometry; §2 of the plan already records that exact diagonalisation cannot reach cubic cells. What it does establish is that the reason the panel missed the slow mode at (1,2,2) is a symmetry the panel does not contain, and that adding one pseudoscalar member fixes it — see §8.6.
5. The odd control
The slowest odd eigenvalue is 4-fold degenerate, so all four readings below are multiplet invariants; the per-mode degree-1 fractions agree to 1.2e-13, which is the check that the quantity is basis-independent.
- degree-1 fraction: 0.597232 (> 0.5 — asserted, PASS);
- the four largest single-observable projections onto the multiplet are
Pz_qy_re,Pz_qy_im,Py_qz_re,Py_qz_im— the transverse polarisation atq_min— each 0.597232; - the span of the eight transverse
P(q_min)components captures 0.5972318685 of each multiplet member, identical to the degree-1 fraction to 10 digits. So the entire degree-1 content of the slowest odd multiplet is the transverse polarisation atq_min, with nothing left over. That is the sharpest form of the control the brief asked for, and it passes.
The remaining 40 % of the odd mode is degree ≥ 3 and was not decomposed further (§9).
6. Δ_even/Δ_odd across the cells that are reachable
The registered reading asks whether the ratio moves toward 2 from (1,2,2) to (1,2,3). (1,2,3) does not fit (§7), so the nearest available evidence is the behaviour across every cell the enumerator can reach. All on the giant component, per attempt:
| cell | spins | W=0 |
giant | quasi-1D | R-closed | 1/Δ even (att) | 1/Δ odd (att) | Δ_even/Δ_odd | slowest is even |
|---|---|---|---|---|---|---|---|---|---|
| (1,1,2) | 32 | 388 | 160 | yes | yes | 35.67 | 132.47 | 3.71429 | no |
| (1,1,3) | 48 | 15,024 | 3,360 | yes | yes | 81.48 | 310.56 | 3.81136 | no |
| (1,2,2) | 64 | 221,628 | 221,424 | no | yes | 389.95 | 242.57 | 0.62206 | yes |
| (1,1,4) | 64 | 637,988 | 43,008 | yes | yes | 161.85 | 628.03 | 3.88035 | no |
Two cautions travel with this table, both from stage 1/2: the (1,1,c) cells are quasi-1D and stage 1 excluded them from anchoring anything, and at (1,1,4) the giant component is not the component the production chain lives in (stage-2 anomaly 2), so its numbers describe the giant component and not D.
Read structurally rather than as a trend in one parameter: the anomaly is not “thin cells” but “cells with a two-dimensional cross-section and only one cell of thickness”. The quasi-1D family sits at 3.7–3.9 and rises slowly with c; (1,2,2), the one cell in the reachable set with two thick directions, is the only one where the even sector is slowest, and §4 says why: it is the only one with a long-wavelength transverse helicity. (Inference, not measurement: a ratio near 4 is what a single quantum at 2 q_min would give under ω ∝ q², where two quanta at ±q_min would give 2; this report does not test that.)
7. (1,2,3): what was measured, the projection, and the design
Measured
enumerate.frontier_count with track_axes=(0,1,2) at (1,2,3), in 14.9 s, peak 123,432 frontier keys:
| quantity | value |
|---|---|
| ice states | 3,076,306,362 |
W = 0 states |
196,465,480 |
| winding sectors | 453 |
Both counts match stage 1 exactly (asserted in a test).
Projection — the reason it was not run
Scaled from the measured units of §1 (mean flippable / n_hex = 0.1715 at (1,2,2), so 16.46 of 96 hexagons at (1,2,3)):
| item | projection |
|---|---|
nnz of P |
3.23e9 |
| state array (2 × uint64) | 2.9 GiB |
| CSR indices (int32) | 12.0 GiB |
| CSR indptr (int64) | 1.5 GiB |
Lanczos basis, k=6, ncv=20, one sector |
14.6 GiB |
| total resident | 31.8 GiB — inside the 40 GB budget |
| Python DFS enumeration | 1.8–7.1 h (and the existing enumerator refuses > 64 spins) |
| adjacency build, 1.89e10 binary searches at the measured 1.91 µs | 10.0 h |
| one mat-vec (10–40 ns/nnz out of cache) | 32–129 s |
mat-vecs per parity sector (measured 973 at (1,2,2); assume 1×–3×) |
973–2,919 |
| eigensolve, both sectors | 18.9–226 h |
Total 31–243 h wall. The budget is ~4 h. Verdict: do not run — as instructed. Memory is not the binding constraint; the binary-search index and the unaccelerated Lanczos iteration count are.
Design for a later dedicated run
- Enumerator. A C extension in the style of
icemix/_msc.c, built through the same ctypes path: the same DFS with constraint propagation and the winding-slack pruning ofenumerate_ice_states, with the state carried in twouint64words, theSchedulepassed in from Python, and leaves written into a caller-preallocated(N, 2) uint64buffer (never a Python list — 196 M Python ints alone is ~7.8 GiB). Expect ~100× the Python rate, so minutes. Gates: (a) the leaf count must equalfrontier_count’s 196,465,480 exactly; (b) at(1,2,2)the C enumerator’s sorted output must equalenumerate_ice_states(zero_winding_only=True)bit-for-bit. - Index. Not
np.searchsorted— 1.91 µs/lookup is 24 cache misses per lookup and costs 10 h on its own. Lexsort the(N,2)array once, then build an open-addressing hash table of ~2^29 slots (2.1 GiB, int32 payload) keyed on a mix of the two words. Target ~100 ns/lookup → ~31 min for the whole adjacency build. - Adjacency. CSR with implicit uniform weight (no
dataarray): int32 indices, int64 indptr, built hexagon by hexagon in a count pass then a fill pass. 13.5 GiB. - Mat-vec. A small C/OpenMP kernel for
y = (1 − n_flip/(2 n_hex)) x + (1/(2 n_hex)) A xover that CSR. It is gather-bound on a 786 MB vector; re-measure the DRAM-scale random-gather rate before committing — the 10–40 ns/nnz bracket above is the largest uncertainty in the whole projection. - Parity. Do not materialise
P_even/P_oddat this size. Run the solver onPwith each iterate projected,x ← (x ± x[R])/2, which needs only theRindex permutation (int32, 786 MB) and one extra gather per iteration. - Eigensolver. Plain Lanczos needs O(10³) mat-vecs because the top of the spectrum is clustered within 1e-3 of 1. Use LOBPCG with a small block and a Chebyshev polynomial accelerator on
P, or a polynomial-filtered subspace iteration; shift-invert is out (no factorisation at this size). - Operations. Checkpoint the enumeration output, the CSR, and the solver basis to local NVMe — a 20 h run must survive. Submit through
expqwithmemory_limit(32 GiB) and a canonicalProgressReporterfeed carrying a per-mat-vec step counter, per the experiment conventions.
Note also that (1,2,3) still has thickness 1 in x, so — per plan §2 — it would test the thin-cell pathology, not cubic geometry. Given §4 and §6, the specific prediction a (1,2,3) run would test is whether the helicity mode stays slowest when one transverse direction is lengthened, i.e. whether the ratio moves back toward the quasi-1D value or stays below 1. That is a sharper target than the ratio-toward-2 reading as registered.
8. Defects and deviations recorded
pyrun.shis unusable in this repository. It refuses with “no.venv/found (searched from~/repo/project/ice-mixingto/)”. The project has no virtualenv; stages 1–3 were run under the system interpreter (~/.pyenv/shims/python3, 3.12.13, numpy 1.26.4, scipy 1.17.1) and this run was too. Not a defect in the project, but the brief’s instruction could not be followed as written and the deviation is recorded rather than hidden.exptopis not importable from the system interpreter. It lives in its own venv at~/repo/project/exptop/.grep -rl "class ProgressReporter" --include='*.py' . | grep -v .venvover this repository returns nothing — there is no vendored copy here, and none was created. Stages 1–3 used a hand-rolled heartbeat writingresults/progress.json, which is outside the exptop feed root and therefore invisible to exptop. Rather than vendor anything, the run appends~/repo/project/exptop/srctosys.pathand uses the canonicalexptop.progress.ProgressReporteralongside the repo-local heartbeat;results.jsonrecords which it got (meta.canonical_progress_feed = "canonical"). If exptop is absent the run degrades to the local heartbeat and says so.Per-writer temp filenames. The repo’s stage-1
Progressclass has the heartbeat thread and the main thread writing the sameprogress.json.tmp, which races onos.replaceand can kill the daemon thread silently. This run’s copy uses per-writer temp names and wraps all progress I/O intry/except. The stage-1/2/3 scripts still carry the racy version; not fixed here (they are historical artefacts of completed stages) but recorded for the main loop.Basis-dependence trap, caught. The first pass reported per-eigenvector overlaps for the slowest odd mode. That eigenvalue is 4-fold degenerate, so those numbers are properties of an arbitrary Lanczos basis, not of the chain — and indeed they moved between two runs (0.3887 → 0.3166) while the physics did not. Every odd reading was converted to a multiplet invariant (trace character; projection onto the invariant subspace) and the per-mode spread is now reported as evidence (1.2e-13).
Two zombie exptop feed cards — my defect. Runs 2 and 3 of the ledger in §1 were stopped with
tmux kill-session -t stage4dwhile the script was being extended.tmux kill-sessiondelivers SIGHUP, and the canonicalProgressReporterinstalls handlers for SIGTERM and SIGINT only, so its exit path never ran and the cardsice-mixing-stage4d-1246242andice-mixing-stage4d-1253319were left readingstatus: runningagainst dead PIDs — they show in exptop as hung jobs. Neither a SIGKILL nor a hang was involved; it was SIGHUP, which the reporter cannot catch as configured. The main loop stamped bothfailed. Corrective practice adopted for the rest of this task: stop a run withkill -TERM <pid>(ortmux send-keys C-c) and wait, neverkill-session; stamp the card by hand after any deliberate kill; and open no feed at all for sub-minute probes (preflight.pyopens none). No handler was added torun_thin_even.py— the reporter’s own SIGTERM/SIGINT handlers are correct and duplicating them would be worse. Upstream note forexptop: a SIGHUP handler on the same exit path would have prevented this entirely, sincetmux kill-sessionand terminal loss are the ordinary ways a detached run dies.Actionable for the project: the production panel (
icemix/panel.py) contains no pseudoscalar. At(1,2,2)every even member is exactly orthogonal to the slowest mode, so the panel’s “slowest of the panel” is a lower bound that misses the gap by a factor 1.61 there for a reason no amount of statistics or series length fixes. Addingh = Im(P_z(q_y)* P_x(q_y)) + Im(P_x(q_z)* P_y(q_z))— three multiplies and two subtractions on numbersmeasure_panelalready records — closes it: the exacttau_expof that observable at(1,2,2)is 389.45 attempts against a true1/Δof 389.95, where the best existing member reaches 263.13. It costs no extra Markov time (it is a function of the polarisation components already buffered) and it is even, so it complements rather than replacesP⊥. Whether the cubic panel has the same blind spot is untested — this report cannot say, and §4 is explicit about that; the cheap way to find out is to add the member and compare, since a cubictau(h)exceedingtau(P⊥)would be a finding on its own.
9. What was not run, and why
| item | cost | why not |
|---|---|---|
| degree-3 projection of the odd mode | 41,664 columns; 36.9 GiB float32 design matrix, ~7.7e14 flops blockwise (≈19 min at the measured 672 GFLOP/s) plus an ill-conditioned 41,664² solve | the registered control (“degree 1 should be large”) passes at 0.5972 without it; the brief made degree 3 conditional on cheapness |
degree-4 projection of v_even |
635,376 columns; the Gram alone is 3.2 TB in float64 | combinatorially out of reach, and no partial basis answers the registered question. §4 answers the underlying physics question directly instead |
(1,2,3) diagonalisation |
31–243 h wall, 31.8 GiB | over the 4 h budget by 7×–60× (§7); design recorded |
cubic L = 2 |
~2e11 W=0 states |
out of reach by any method (plan §2) |
10. Test count
tests/test_stage4d.py adds 26 tests: 14 that exercise icemix.parity from definitions on densely-diagonalisable cells (parity blocks reproduce the full spectrum; lifted vectors are eigenvectors of the stated parity; the derived automorphism group is 192 at (1,1,1), preserves hexagons, and commutes with P; the composition law; the projection is a projection and is scale-invariant; monomial parity (−1)^{|S|}; local fluxes sum to zero on W = 0 and are odd under R) and 12 that check the registered readings and the two unregistered findings against results.json (skipped if the run has not been made).
182 tests before stage 4 -> 238 collected, 238 passed, 0 skipped
(182 pre-existing + 30 from the parallel 4a-4c agent's
tests/test_stage4abc.py + 26 here)
verified after the cited run, so the twelve results-dependent tests ran rather than skipped.
icemix/parity.py is new; no existing icemix function’s behaviour was changed. icemix/__init__.py gained parity in its import list and a line in its docstring — note for the main loop that the parallel 4a–4c agent’s new modules (component.py, logconcave.py, signgauge.py) are not in that list, so one merge pass over __init__.py is owed before the commit. experiments/04_lorentzian_giant/ was not touched.
Artefacts left in experiments/05_thin_even/results/: preflight.json, results.json, summary.md, run.log, progress.json. Intermediate snapshots from the superseded runs were deleted; the run ledger in §1 is the record of them.