/teal-sea
teal-sea / zeta-labstate of record · compiled 02 Nov 2026 · revision b09fa4dd · source

Library · hunts/rung3_ball_production/OWNER_MEMO.md

OWNER MEMO: a production window for the rung-3 ball certificate

1,494 words · 137 lines · source

Hunt #145, 2026-10-21. To the owner, from the rung3-pilot lane. This memo asks for a decision; it launches nothing. Every measured number below comes from pilot.json (measured on the swarm box in one session); the tables are rendered from it by report.py, and the hunt test checks that they still are.

The request

A production window for the 215 sites of plan v2 (lean/cert/rung3_plan2.json), compiled by scripts/72 from scripts/60 --arith ball --shard output at Lean v4.35.0-rc2. In short:

<!-- table:headline -->

<!-- /table:headline -->

The owner chooses where, when and with how much disk; section "What binds" lists the choices. Nothing runs until then.

What the pilot established

The price

Projected from the one pilot site by the model in PILOT.md section 4, which also shows the spread across tower-cost models. These are measured rates extrapolated from K = 17 to the plan's K, not a measurement of production. The tables use the larger of the two in-situ tower models, by a rule fixed before all the data were in; section 4 of PILOT.md says why the smaller, flat-per-tower total is likely the better estimate (a tower's CPU barely grew from p = 2 to p = 1801 while its text tripled).

<!-- table:projection -->

componentcore-hours
prime towers (468,240 atoms)380.5
composites9.1
term products9.1
root and partial sums4.2
imports (4,696 modules)13.2
total, projected from this pilot416.0
atom-only, scripts/67 formula at the scripts/68 and scripts/66 rates of this box282.7
atom-only, scripts/67 formula at the in-situ rates of this site330.2
atom-only, scripts/67 as recorded (v4.33.0-rc2 rates)175.0
oleans left on disk, GB (scaled per tower, or per byte of tower text)123 to 146

<!-- /table:projection -->

<!-- table:wall -->

concurrent processeswall hours, one core per processwall hours at 1.38 cores per process (capped at 32 vCPU)
1626.018.8
2020.815.1
2417.313.0

<!-- /table:wall -->

The same totals under each tower-cost model:

<!-- table:sensitivity -->

tower cost modeltower core-hourstotal core-hourswall hours at 16wall hours at 24
in-situ shard CPU per source byte (the request uses this one)380.5416.018.813.0
in-situ shard CPU per tower, flat in the prime315.0350.515.910.9
least-squares fit, per tower plus per byte, over scripts/68 towers and the shards311.6347.115.710.8
lean -j1 shard CPU per source byte, one core per process350.6386.124.116.1

<!-- /table:sensitivity -->

What binds, and what the owner decides

  1. CPU, and where it comes from. Prime towers are most of the projected cost (the table above), and on this box CPU is the binding resource: 32 vCPU, shared with other workflows. Under Lean's default threading the pilot site's modules used anywhere from under one core to more than three, depending on the module and the load, while their CPU totals moved much less (PILOT.md section 3). So the wall clock depends on how many cores production gets more than on how many processes it runs: the wall table brackets it between one core per process and the pilot's measured cores per process, capped at the box's 32 vCPU. Decision: where, and for how long. On the swarm box, a window in which other workflows stay off it, or a longer one shared. On GitHub Actions, which CLAUDE.md makes the default compute (20 parallel jobs, 16 GB runners), sites are independent jobs; this pilot did not time an Actions runner, so the rates here do not transfer without a one-site timing there. Modal only if neither fits.
  2. Disk. Production leaves the olean estimate in the headline on disk, far above what this box has free. Decision: free space, or a volume, before the first shard. Deleting a site's oleans after it compiles would keep the kernel check of that site but forfeit the assembly, which must import them (item 4).
  3. Threads and linters per process. scripts/72 runs lean with its default threads, and the generated files trip Mathlib's style linters on every tower (the modules table in PILOT.md counts the warnings). Measured here:

<!-- table:levers -->

<!-- /table:levers -->

Neither moved the tower's CPU outside the spread of its default runs: threads only change how processes share cores, and the linters are not where the time goes. Decision: whether to run one thread per process (-j1 passed by the driver, one process per core granted), which buys predictable sharing of a busy box and no saving; it is a small, reviewable change that touches no mathematics.

  1. The assembly first, or in parallel. No script emits the module that proves davenport_heilbronn from the 215 site theorems. As the sites are generated today, a module importing all 215 site roots also loads every tower's olean, so the assembly needs the whole production output on disk at once, and its memory is untested. Lean's module system (module files with private imports, which Mathlib at this revision uses) is the candidate mechanism for importing only each root's statement; it is untested here too. Decision: whether to fund an assembly prototype on two or three sites before committing the window.

What production does not give

Production as specified gives 215 kernel-checked site theorems, one per point or box of plan v2: upper_<id> on the 110 big boxes, beta_<id> at the 104 grid points and centre_lt_centre. It does not give theorem davenport_heilbronn : davenport_heilbronn_statement. That needs an assembly module, which no script emits yet, combining the site theorems with norm_deriv_DH_le, DH_lower_on_hcell, DH_lower_on_vcell and the square criterion (lean/ZetaLean/DHZeroCriterion.lean, line 185). The pilot priced the sites, not that module, and the assembly's import closure is the largest unpriced item in this memo. Nothing here bears on RH (docs/08).