You own hunts/weil_propagation/c4_s2/checker/ and write nowhere else.
Independence rule (read this twice)
Do not open, import or read anything in kernel/ or two_adic/, including their INTERFACE.md, until the coordinator sends you their output. Write your tests first, from theory RESULTS §0 and §7, the mission's interface contract, and the primary sources. Commit them, then send a status message "phase 1 committed <hash>". The coordinator routes kernel/ and two_adic/ output only after that commit is in git log. Afterwards you may adapt the call glue to their real signatures, but not the properties your tests assert. If a property turns out wrong, say so in RESULTS.md and keep the original commit in history.
Phase 1 (time box 1.5 hours)
- Your own Q.
checker/implements Q on the shared basis for c ∈ [2, 3) from theory §0, independently. Calibrate it againstzeta.weil.weil_functionalon at least two unrelated test-function families (for example the Fejér pair and a smooth bump), and against the CCM matrix ofhunts/rogue_frontier/weil_trunc/galerkin.pyon the same basis. Take the x → 0 limit of A(f) analytically or by a stated series, not a finite difference. Tolerances come from the measured deviation at a stated dps. (The rejected prior attempt, at the path in your task spec, failed on both points; you may read it, do not copy it.) - Tests of R_S = Q − T_S, written as properties any correct construction must satisfy, derived from the sources. Examples, not a ceiling: T_S Hermitian and positive semidefinite (the unitarity argument of §7.1); switching the place 2 off gives the S = {∞} term; the S = {∞} statement of Connes-Consani arXiv:2006.13771 Thm 6.11 at c ∈ {1.5, 1.9}; the inertia of R_S stable in N (N = 8, 16, 32), which is the operational content of "bounded rank"; precision response (dps 40 against 60); Q itself positive on the cells (Zhu arXiv:2608.24827, support ≤ 1.6). State the grade of each property's derivation.
- The (U-S) gate (mission kill-control 1), in exact arithmetic for n ≤ 200, as your own implementation. Only after it passes, compare it with theory
checks.pycheck K and numericsus_check.py(read viagit show). - Commit, then the status message. Milestone 1.
Phase 2 (after routing)
- Run your tests against kernel/ and two_adic/. Report each failure to the coordinator in a status message naming the owning folder, the test, and the exact numbers; the coordinator routes it to the owner. Do not fix their code.
- Kill-controls 2, 3 and 4 of the mission. For the positive control, if kernel/ or two_adic/ do not accept Dedekind's data, record "positive control not exercised" and why. Milestone 2.
Phase 3
- R_S on every cell c ∈ {2.2, 2.5, 2.9}, N ∈ {8, 16, 32}, full space and function class: inertia, the three lowest eigenvalues, their N- and precision response. JSON in your folder, each number pinned by a test.
RESULTS.md, including a table of which kill-control ran and how it came out. Stay available for re-runs until the coordinator says you are done.
Standing rules (identical in all four briefs)
- Read first:
hunts/weil_propagation/c4_s2/MISSION.md(scope, shared basis and cells, interface contract, kill-controls, done),hunts/weil_propagation/MISSION.md,AGENTS.md(hard rules, certainty ladder, original vs novel),ALIGNMENT.mdsections 4 and 5, and theoryhunts/weil_propagation/theory/RESULTS.mdsections 0, 7, 7.1, 7.3, 8. - Python, from the worktree root:
PYTHONPATH=$PWD .venv/bin/python. The.venv/bin/pythonnamed inAGENTS.mddoes not exist in this worktree. Tests:PYTHONPATH=$PWD .venv/bin/python -m pytest -q -n 2 <your folder> tests/test_hunt_probe_discipline.py tests/test_docs_numbering.py(testpathsistests, so name your folder explicitly). - Compute: four workers share a 16 GB laptop. Every local run under 10 minutes and a few GB; N ≤ 32 and dps ≤ 60 unless you state why; pytest
-n 2at most. Anything larger goes in yourRESULTS.mdas a CI proposal with a measured per-unit estimate. Nolake build. - Git (shared worktree, shared branch
teal-sea/weil-c4-s2): commit only your own folder:git add hunts/weil_propagation/c4_s2/<folder>/thengit commit -m "<msg>" -- hunts/weil_propagation/c4_s2/<folder>/. Nevergit commit -a,git add -Aor.,git stash,reset,rebase,checkoutof files you do not own, orpush. Files outside your folder ingit statusbelong to peers: leave them. On anindex.lockerror wait a few seconds and retry. Small commits; end each message withCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>. - Read-only inputs from the sibling branch:
git show teal-sea/weil-propagation:hunts/weil_propagation/numerics/<file>. Source PDFs go in your session scratchpad, never in the repository. - Lexical ban:
tests/test_hunt_probe_discipline.pyfails if the past participle of "certify" appears anywhere underhunts/in a.py,.mdor.jsonfile, case-insensitive, including inside a longer word and inside a sentence disclaiming it. Do not write it. Never dump a rawzeta.rigorresult dict to JSON (it carries that key); rename keys. House style: no em dashes in prose you write. - Provers: AXLE only (
axleon PATH, runs remotely:axle check,verify-proof,disprove,repair-proofs). No Leanstral, no Aristotle, and no escalation about their keys (operator's decision). Prover output is input, not evidence: it counts only after zero-sorry checking, and is graded kernel-checked for exactly that lemma and nothing wider. - Grades: the
AGENTS.mdladder; a composite claim takes the grade of its weakest step. Every number in yourRESULTS.mdis pinned by a test in your folder. Tolerances come from a measured deviation at a stated dps, never asserted. A search you did not run is "not searched". - Orca: every
--fromand--terminalyou pass is your own handle from your preamble, never the coordinator's. Check your inbox at each checkpoint (before starting a new file, after a test run) and immediately beforeworker_done. Blocking questions go through your preamble'saskcommand. Send astatusmessage to the coordinator at each milestone named below. Anything outside the mission, irreversible, or costing money: ask, do not do. - Finish:
RESULTS.mdin your folder whose first five lines say what was built, the key numbers with their grades, and what is open; an ALIGNMENT s5 status (refuted, obstructed in a restricted class, unresolved, or paused by allocation). An exact statement of where the construction is stuck is a complete result; a fabricated number is not. Thenworker_doneonce, with--outcome succeededor--outcome failed,--files-modifiedand--report-path.
Follow-up, 2026-09-24: merge the Modal N = 32 rows and re-grade the R_S counts
Added by the coordinator. The operator approved running your s7.6 compute proposal on Modal. modal/ ran it. Outputs: hunts/weil_propagation/c4_s2/modal/out/checker_<nvec>_<int S>_32.json, one per unit, all three cells, in your snapshot's unit_key shape, built by your run_checker_ts.build_unit(nv, S, N) on the tree 284eff6 with the guard passing in the container (digest 1dcab230..., equal to the local one):
| unit | role |
|---|---|
| (240, 2400, 32) | CI_UNITS: the N = 32 row against more modes |
| (280, 2266.10, 32) | two_adic/'s default rule at c = 2.9 (ta_ts.py 146 to 147) |
| (319, 2633.16, 32) | the default rule at c = 2.5 |
| (364, 3060.08, 32) | the default rule at c = 2.2 (if it landed; see modal/RUNS.md) |
Platform difference, measured, not a defect of your code: the calibration unit (200, 2400, 32) on Modal (Linux x86, OpenBLAS, Python 3.12) differs from your laptop snapshot by 1.9e−7 to 2.3e−7 max abs, 2.93e−7 spectral. A second Modal run with a different BLAS kernel moved it by 3.4e−7, so the unit is sensitive to last-digit arithmetic (Gb has condition number 3.9e9; which step amplifies it is not isolated). Every Modal output carries meta.calibration.weyl_bound. See modal/RUNS.md s3 and s4.
Your task: merge and re-grade, in this folder only.
- Merge the Modal rows into
checker_ts_snapshot.jsonunder the current digest, each unit marked with its source file and platform. Do not replace your laptop (200, 2400, 32) rows with Modal's. Readmodal/files; never edit them. - Apply the criterion you fixed in s7.6 before these runs existed: if the 12 to 14 top-half negatives at N = 32 move by more than their depth (about 1.2e−2 to 1.8e−2), the growth is truncation; if they stay, P5 fails at the measured grade on c = 2.5 and 2.9. Do not move it after reading the numbers. The N = 32 row's own refinement response now exists: replace the N = 16 proxy in the band where it does, and say which rows changed band.
- Recount n_−(R_S) below −band at N = 32 on every cell against the new rows, with your existing band rule, and flag every eigenvalue within the Weyl bound (2.93e−7 plus the probe's 3.4e−7) of −band as platform-undecided. State whether the c = 2.5 and 2.9 counts (9 → 20 and 10 → 20 from N = 16 to 32) survive, fall, or remain undecided.
- Update s7.3, s7.3a, s7.6 and your first five lines where they change, graded: measured (float64, one route; Modal and laptop are the same route on two platforms, not independent routes). Pin every new number by a test that reads the snapshot and, for the merge, the
modal/out/files.
Constraints for this follow-up:
- No new Modal runs, nothing heavy locally (a few minutes at most). If the grade needs another unit, say which and its estimate, and ask.
- two_adic/ is grading its s7b accuracy run in parallel and may not touch T_S's import closure; if your guard reports a digest change, stop and ask.
- Do not edit two_adic/, kernel/, cutoff/, modal/ or
c4_s2/RESULTS.md. Commit with pathspecs, your folder only. No push. No em dashes. - Run your folder's tests plus
tests/test_hunt_probe_discipline.pyandtests/test_docs_numbering.pybeforeworker_done.
Follow-up 2, 2026-09-24: rebuild under the fixed rho and re-grade
Added by the coordinator. MISSION.md follow-up 2. two_adic/ replaced the explicit inverse in ta_mellin.rho by a QR of the Gram factor (c3dca00, eea7eab; its RESULTS s10: diagnosis, acceptance A1 to A4). T_S's input digest moved from 1dcab230 to b2e7787bce7a, so your guard refuses every old row (one test fails and 22 skip until you rebuild: the guard working). modal/ is rebuilding all eleven of your units under the new digest into modal/out_rho/ (the seven UNITS and the four N = 32 units of s7.7), one file per unit, same shape as before, with no eigenvalue computed by anyone. Provenance and the calibration (7.1e−15 Modal against local) are in modal/RUNS.md s7.
Step 1, before any eigenvalue: commit your reading. As in ee4a1ff: carry the s7.6 criterion and the s7.7 reading over to the new rows, and state in writing, before computing anything:
- the band rule at N = 32 now that four refined rows exist (240, 280, 319, 364 modes), and which response replaces "the 240-mode refinement";
- the P2 test on every N = 32 row (no eigenvalue of T_S below −band(c, 32)). This is the falsifier two_adic/ fixed before the run: still failing by order 10 means the fix did not work; failing by order 1e−2 at 319 or 364 means the next constraint is S (two_adic/ s10.5 predicts that case and names batch 2, the default-rule rows at S/nvec² = 0.04);
- the platform flag, now that the drift under the new route is 3e−12 (two_adic/ A3) and not 2.3e−7.
Say what was visible when you wrote it.
Step 2, merge and rebuild. Build a new checker_ts_snapshot.json under b2e7787bce7a from modal/out_rho/ (provenance per unit). The old snapshot stays citable from git history (3dc0a74); say so where your RESULTS cite old numbers. Read modal/ files; never edit them.
Step 3, re-grade. Re-run every analysis that reads T_S (s7.2, s7.3, s7.3a, s7.7), at N = 8 and 16 as well as 32, with your existing rules. State whether the N = 8 and 16 counts moved (two_adic/ expects changes of order 1e−7 at most), apply the step 1 reading at N = 32, and say plainly whether the count at c = 2.5 and 2.9 survives, falls or stays undecided. Update your first five lines. Pin every new number by a test.
Step 4, report. In worker_done, say whether the falsifier passed on each of 280, 319 and 364, and, if it failed by order 1e−2, ask for batch 2 rather than running anything. List which keys of checker_ts_cells.json changed, because two_adic/'s test_ta_checker_citations.py pins them.
Constraints: your folder only; no Modal runs and nothing heavy locally; pathspec commits, no push, no em dashes; run your folder's tests plus tests/test_hunt_probe_discipline.py and tests/test_docs_numbering.py.
Follow-up 3, 2026-09-24: exact inertia for the c = 2.9 count
Added by the coordinator. Operator request via Forge: harden the c = 2.9 count (n_− = 4, 10, 20 at N = 8, 16, 32) on the matrices already produced. No new modes, no Modal (every unit here is seconds on the laptop).
What to compute. For every c = 2.9 build in the current snapshot (digest b2e7787bce7a): (120, 1600, 16), (160, 1600, 16), and the five N = 32 rows (200, 240, 280, 319, 364 modes), take the same float64 R_S = Q − T_S that produced your reported count. Its entries are exact dyadic rationals. Compute the inertia of R_S + band·I with no rounding: exact rational symmetric elimination (python-flint fmpq_mat, or your own LDL^T in fmpq), or ball arithmetic (arb_mat) with every pivot excluding zero. By Sylvester's law the negative count of R_S + band·I is the number of eigenvalues of R_S strictly below −band. Use your own stored band(c, N) from checker_ts_cells.json, not a re-derived one. For each counted negative, bracket its eigenvalue by bisecting the shift, and report its margin below −band. Also report the counts at 2x, 5x and 10x band, as a sensitivity row and not a new criterion. Report the count on the C4 function class (ĝ vanishing at ±i/2 and 0) too if your code has that projection; otherwise state the codimension bound.
Pre-register first. Commit the test (the shift, the band source, the margin report, what "holds" means) before any inertia is computed, as 49db49f did. Confirm rigor.available_backends() lists python-flint.
Grade it honestly, whatever the numbers. The exact inertia hardens the eigenvalue step of the stored matrix and nothing else. ΔT's band is a measured response that indicates and does not bound, so the composite count stays measured, weakest step ΔT. C4 (theory §7.2) states no rank bound, so no finite count refutes "bounded rank": what a count k establishes is that any remainder absorbing R_S on this construction needs rank >= k there (state the min-max argument you use, and grade it as an ordinary argument, unreviewed). Do not write "refuted" or round a rung up; the coordinator will say so to the operator. Say explicitly which negatives, if any, fail to stay below −band.
Constraints: your folder only; nothing heavy locally; pathspec commits, no push, no em dashes. Under hunts/ write "hardened" or "exact inertia"; the reserved word of zeta/rigor.py may not appear even in a disclaimer. Run your folder's tests plus tests/test_hunt_probe_discipline.py and tests/test_docs_numbering.py. List any changed key of checker_ts_cells.json in worker_done (two_adic/ pins some).
Addendum, same day, after the operator's answer (via Forge). Also include the N = 8 build (80, 1200, 8), so all three counts (4, 10, 20) are covered. The operator agrees that no finite N refutes C4. Grade line 2, if every counted negative stays strictly below −band, as: hardened on the stored matrices (exact inertia): the negative count of the stored R_S at c = 2.9 is 4, 10, 20 at N = 8, 16, 32; this hardens the inertia of the stored matrices, not of the exact R_S, whose float64 assembly error (ΔT) is still graded by the band, so as a statement about R_S of the construction it stays measured, weakest step ΔT; the growth is evidence against bounded rank on this construction, not a refutation, since C4 fixes no bound. If some negatives fail: list them and keep the measured grade.