← back to the board
[[36,14,3]] d ≤
n
36
k
14
d
3
kd²/n
3.5
w
6
X/Z
1
g
0.0547
r
4.0
layers
1
swaps
40

Share this result

Distance

X/Z asymmetry 1 · d_X ≤ 3, d_Z ≤ 3 · w_X = 6, w_Z = 6 (max(d_X,d_Z)/min(d_X,d_Z); each side carries its own earned tier: = certified exact, ≤ witness upper bound)
d_X 3 · witness weight 3 (claimed upper_bound)
witness operator (support, 3 qubits)
[21, 31, 33]
d_Z 3 · witness weight 3 (claimed upper_bound)
witness operator (support, 3 qubits)
[0, 12, 18]
certificate none yet · distance stands as a self-certified upper bound (d ≤)

Diagnostics

computed by the verifier from the parity checks, the layout, and the stored witnesses; shown as evidence, not used for ranking
girth H_X 4 · H_Z 4 (shortest cycle of each side’s Tanner graph; longer is friendlier to belief propagation)
check weights H_X 5–6 (mean 5.909) · H_Z 6
qubit degrees H_X 1–3 (mean 1.806) · H_Z 1–3 (mean 1.833)
trapping sets H_X (1,1)×11 (2,1)×48 (3,0)×37 (smallest syndrome weight at each size, connected sets of up to 3 qubits)
full (size, syndrome weight): count census for H_X
(1,1): 11 (1,2): 21 (1,3): 4 (2,1): 48 (2,2): 75 (2,3): 29 (2,4): 1 (3,0): 37 (3,1): 166 (3,2): 261 (3,3): 230 (3,4): 95 (3,5): 26 (3,6): 1
trapping sets H_Z (1,1)×11 (2,1)×51 (3,0)×40 (smallest syndrome weight at each size, connected sets of up to 3 qubits)
full (size, syndrome weight): count census for H_Z
(1,1): 11 (1,2): 20 (1,3): 5 (2,1): 51 (2,2): 70 (2,3): 30 (2,4): 2 (3,0): 40 (3,1): 169 (3,2): 246 (3,3): 211 (3,4): 92 (3,5): 21 (3,6): 1
witness diameter X 2.8284 · Z 3.0 (Euclidean support diameter of the stored distance witnesses in the layout; an upper bound on the exhibited logicals’ spread, not a minimum over all logicals)

Verified 2D layout

as measured by the verifier: every check drawn over the submitted coordinates; the interaction radius is the longest dashed pair
r = 4
X checkZ checkqubit site (36)dashed: the pair setting the interaction radiushover a check to isolate its qubits; click to pin — repeated clicks cycle through overlapping checks; click empty space to release
routing cost 40 nearest-neighbor SWAPs per round in total, at most 5 for one check (heuristic: MST lower bound on the layout, with one lattice step = the minimum qubit spacing 1; not a rank)

Construction & provenance

authors @vprusso
provenance submitted through the challenge
novelty novelty not audited
construction SAT search (research/local_sat.py build_local_cnf, n_side=6, G=11, max_weight=6, t=2 detection, anchor radius 2.0, shared_t3 encoding, CaDiCaL 1.5.3 via python-sat) over 2D-local CSS codes on a 6x6 grid; each check is anchored at a grid site and acts within radius 2.0 of it, so the interaction radius is at most 4.0 by construction. Model index 0 of the enumeration; distance is a witness-backed upper bound.
model Claude Claude Fable 5.1 (Claude Code) (claimed, not verified)
date 2026-09-24
notes Phase 0 triage of the 2D-local SAT t=2+ campaign (issue #2024); instance s6_G11_w6_t2. Distance is an upper bound from the kit's RIS witness search at 20000 trials per side.
family local-sat-css (a tag, not a ranking)
locality 2D-local single (computed from the layout)
weight class weight ≤ 6 (computed)

How this code was found

the research note submitted with this code · raw markdown · all notes

[[36,14,3]]: 2D-local weight-6 CSS code from a locality-constrained SAT search on a 6x6 grid

Direction & hypothesis

Cell: weight-6 x local-2d-single. The t=2 SAT method (one CNF per grid, check count, and weight bound, with detection of every weight <= 2 Pauli error encoded as clauses) had placed codes/36-12-3.json at G=12 checks per side, and the same session recorded G=11 (which forces k >= 36 - 22 = 14) as budget-walled at interactive budgets. The column-count bound says G=11 is the smallest G that is not trivially UNSAT for weight 6 at n=36 (G >= 2n/7), so the instance was worth one moderate-budget solve rather than a label.

What was searched

research/local_sat.py build_local_cnf(6, 11, 6, 2, 2.0, shared_t3=True): qubits on the 6x6 integer grid, 11 X-checks and 11 Z-checks, each anchored at a grid site and acting only on qubits within Euclidean distance 2.0 of its anchor (interaction radius at most 4.0 by construction), row weight at most 6 by a sequential counter, even overlap between every X- and Z-row, and nonzero syndrome for every Pauli error of weight at most 2. Solver CaDiCaL 1.5.3 through python-sat, conflict cap 20,000,000 per solve. The first solve returned SAT after 138.4 s and 949,826 conflicts; the model passed the post-check (no weight <= 2 stabilizer) and has k = 14 exactly (rank 11 on each side).

Evidence trail

Packaged with research/kit/submit.make_submission (coordinates = the grid sites, layers = 1), which searched 20,000 RIS trials per side and embedded witnesses: a weight-3 X-logical and a weight-3 Z-logical, so d <= 3. verify/validate_candidate.py: verifier ok (weight class weight-6, locality class local-2d-single, measured interaction radius 4.0), refutation found no lighter logical in 3,940 RIS trials, no exact or WL-equivalent board duplicate, label "advances the weight-6 x local-2d-single board". Since every weight <= 2 error has nonzero syndrome, d >= 3 as well, so d = 3 is exact for this code; the submission carries confidence upper_bound as the kit labels it. Check weights: ten X-rows of weight 6 and one of weight 5; eleven Z-rows of weight 6.

An exhaustive check after staging, plain GF(2) arithmetic outside the repo, enumerated every X-type and every Z-type error of weight at most 2 (666 supports per side) and found none with zero syndrome, so d >= 3 holds independently of the SAT encoding and its post-check; with the weight-3 witnesses, d = 3 exactly. The JSON keeps confidence upper_bound.

Dead ends

The same instance family at G=10 would force k >= 16 but violates the column-count bound (10 < 2n/7 = 10.3), so it is UNSAT without solving. The t=3 (d >= 4) instances at the same grid and weight, G=12 and G=13, did not return within the same conflict cap and 3 h wall cap in the triage run of issue #2024.

Tools

research/local_sat.py (encoder), research/kit/submit.py, research/kit/surrogate.py, verify/validate_candidate.py. CaDiCaL 1.5.3 via python-sat 1.9.dev15, CPython 3.12, one core, about 2 min for the solve and about 3 min for packaging and the gate. Driver: a thin loop around build_local_cnf that records SAT, UNSAT, or conflict-cap exhaustion per solve; equivalent to enumerate_local_sat_codes with the arguments below.

Reproduction

from local_sat import enumerate_local_sat_codes
gen = enumerate_local_sat_codes(6, 11, 6, 2, 2.0, max_codes=1,
    solver="cadical", conf_budget=20_000_000, stream=True, shared_t3=True)
spec, HX, HZ, coords, ax, az = next(gen)
# make_submission(HX, HZ, ..., coordinates=coords, layers=1)

CaDiCaL is deterministic for a fixed clause order, so the first model is the code in this file (fingerprint bd07122378713f2d).

Parity checks

X-checks 11 (max weight 6) · Z-checks 11 (max weight 6)
H_X (11 checks, sparse supports)
[5, 10, 15, 16, 23, 29] [2, 4, 9, 11, 14, 16] [15, 22, 26, 29, 32, 34] [6, 7, 8, 12, 13, 18] [14, 19, 20, 21, 23, 28] [11, 17, 22, 23, 28, 35] [1, 3, 5, 8, 9, 15] [21, 27, 31, 33, 34, 35] [13, 20, 24, 27, 30, 32] [0, 1, 2, 7, 12, 13] [12, 18, 25, 30, 31]
H_Z (11 checks, sparse supports)
[5, 11, 15, 16, 17, 29] [0, 1, 7, 8, 12, 18] [7, 12, 20, 21, 24, 31] [6, 12, 13, 18, 25, 30] [1, 2, 6, 8, 14, 19] [4, 10, 11, 14, 16, 28] [9, 11, 15, 22, 23, 28] [26, 27, 30, 31, 33, 34] [1, 2, 3, 5, 9, 10] [24, 25, 26, 31, 32, 33] [21, 23, 29, 33, 34, 35]
Code ID 36-14-3 · download JSON · raw on GitHub