Skip to content

missions: close the statement-package import hole (15 never-elaborated statements; verify now gates the root import list) - #617

Merged
DrMurphyIsIn merged 5 commits into
mainfrom
missions/statement-root-imports
Sep 24, 2026
Merged

DrMurphyIsIn merged 5 commits into
mainfrom
missions/statement-root-imports

Conversation

@DrMurphyIsIn

@DrMurphyIsIn DrMurphyIsIn commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

The hole

MISSIONS_DESIGN §2: "CI builds each statement package: a statement that does not elaborate cannot enter the graph." The mission-statements-compile job runs lake build in missions/<campaign>/lean, which compiles the import closure of the root Statements.lean and nothing else. mission add wrote the node file and Statements/<Slug>.lean but never touched the root, and nothing checked. Fifteen registered modules, thirteen of them status = "proved", had current provenance hashes and had never been elaborated by any job. One had no import line at all.

No status changes, no grants, no audits. conjecture1_proved = False.

The fifteen

campaign node status regen hash
rh RH_bl_closed_form_five_nonneg proved unchanged
rh RH_dbn_H0_zero_strip proved unchanged
rh RH_li_ladder_height proved unchanged
rh RH_li_ladder_height_sharp proved unchanged
rh RH_li_ladder_liLimit proved unchanged
rh RH_li_ladder_liLimit_sharp proved unchanged
rh RH_li_rungs_lt_five proved unchanged
rh RH_li_rungs_of_height_4000 proved unchanged
rh RH_li_rungs_of_height_4000_sharp proved unchanged
rh RH_zeta_zero_confined proved unchanged
rh RH_zeta_zero_im_ge proved unchanged
mirrormere MM_gaussian_positivity_small_lam_3e3 proved unchanged
mirrormere MM_leakage_composite_zero proved unchanged
mirrormere MM_satake_degree_two_rejects_delta draft unchanged
mirrormere MM_weil_positivity_window_tenth draft 7b32a808ac3e6c1c -> 453fc3f023904fb0

Hash change, why: the window-tenth file was written with no import line. It was regenerated through regenerate_statement (the write_statement path) with import Mathlib + import Statements.MMDefs prepended; the theorem text is byte-identical. Recorded as a comment block in the node file, the way #606 recorded its re-specification hash. The other fourteen regenerate byte-identically.

Vocabulary mirrors needed: none. Every one of the fifteen elaborates against the existing RHDefs / MMDefs (archSide/finiteSide via the RvMBridge15.BombieriLagarias re-export, DBN.H, LiCriterion.taylorCoeff/riemannXi, RvMBridge15.liLimit, Zeta23.IsNontrivialZero, RvMBridge6.zeroSide/gaussTest, WeilExplicit.*). The mirror drift test is untouched and green.

Commits (one per deliverable)

  1. Gate (69cb4fe): statements.py gains root_imports / ensure_root_import / missing_root_imports / import_header_error / regenerate_statement; write_statement appends the module to the root, so mission add (which did not do this) now wires new nodes; regen_diff reports a statement the root does not import alongside a stale hash; verify_campaign fails on an un-imported node statement, a stray Statements/*.lean no root names, a root import with no file, and a statement without the standard header (Mathlib or a campaign *Defs import). On this commit alone the live rh and mirrormere campaigns fail the battery, which is the point.

  2. Fix (7d54bfe): the fifteen regenerated and imported from both roots; live-campaign root-import test added.

  3. Staleness at the CLI (c46410b): mission verify exits 1 on a well-formed, current-hash statement the root does not name; scaffold_package (root regenerated from disk) and missing_root_imports agree.

  4. Docs (41115a2): MISSIONS_DESIGN §6 row for add, §7 item 5, new §11 naming the fifteen and the date.

  5. Sorted roots, merge discipline (93c8a34, after the team lead's heads-up on anduril: all zeta zeros to height 1000 on the critical line, kernel-checked with NO hypotheses (AND_ladder_h1000_kernel PROVED) #613/Route C: M1 PROVED (parametric de Bruijn, up-set, RH <=> all H_t real for t >= 0); P15 criterion wired; M6 gaps; M5 bricks + P15 eq (76) erratum #614/mirrormere: the full prime-free window (2L <= log 2) proved kernel-native, hypothesis-free, no Arb seam (draft; includes #606; grant after #607) #615): ensure_root_import inserts in sorted position, sort_root_imports re-sorts, and the four live roots are sorted (same import sets, verified). mission verify only WARNS on an unsorted root, so a held branch that appended by hand still passes.

MERGE NOTE for anyone touching lean/Statements.lean

Held PRs #613 (anduril), #614 (rh, 3 M1 nodes) and #615 (mirrormere) add root imports by hand and WILL conflict with this PR on the root files. Resolve by re-sorting the import list (one import per line, alphabetical), never by union-merge:

PYTHONPATH=telperion/src python -c "from telperion.missions.statements import sort_root_imports; sort_root_imports('telperion/missions/<campaign>')"

After resolving, mission verify must say OK for the campaign with no "not sorted" warning, and lake build in the package must be green.

Builds and tests

check result
lake build rh statement package green, 8765 jobs (was 8754, +11)
lake build mirrormere statement package green, 8700 jobs (was 8696, +4)
non-sorry warnings/errors in either build none
mission verify (anduril, bg, mirrormere, rh) OK x4
pytest tests/test_missions_*.py 217 passed, 1 skipped (was 190 + 1; 27 new)
lake build anduril after re-sort green, 8671 jobs

Builds were run locally on reflinked Mathlib caches at the campaigns' pinned toolchains (rh v4.34.0-rc1, mirrormere v4.32.0); the mission-statements-compile matrix on this PR is the CI confirmation.

Not done / caveats

  • The header check accepts import Mathlib alone (23 live statements are self-contained that way); it does not require the campaign Defs module.
  • bg and anduril were already fully wired; nothing changed there.

🤖 Generated with Claude Code

https://claude.ai/code/session_017icTazCuXLgRx61VNRAZWU

Dr. Murphy and others added 5 commits September 24, 2026 08:07
…borates fails verify)

The `mission-statements-compile` job runs `lake build` in missions/<campaign>/lean,
which compiles exactly the import closure of the root Statements.lean. `write_statement`
wrote the module file but nothing appended the import line, so fifteen registered
statements (eleven rh, four mirrormere, most of them status=proved) had never been
elaborated by any CI job; one (MM_weil_positivity_window_tenth) has no `import` at all.
The design invariant "a statement that does not elaborate cannot enter the graph"
(MISSIONS_DESIGN section 2) was not enforced for them.

- statements.py: root_imports / ensure_root_import / missing_root_imports /
  import_header_error / regenerate_statement. write_statement now appends the module
  to the root, so `mission add` (which did not touch the root) wires new nodes.
- regen_diff reports a statement whose module the root does not import, so every
  staleness caller sees it, not only verify.
- verify_campaign: fails on an un-imported statement (via regen_diff), on a stray
  Statements/*.lean no root names, on a root import with no file, and on a statement
  lacking the standard header (Mathlib or a campaign *Defs module).
- tests/test_missions_root_imports.py: 21 tests, negatives for each case, plus
  `mission add` wiring the root.

On this commit the live rh and mirrormere campaigns FAIL the battery (the fifteen);
the next commit repairs them. No status changes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017icTazCuXLgRx61VNRAZWU
…nts from the package roots

Regenerated each through `regenerate_statement` (write_statement path, so the provenance
sha256 stays honest) and appended the import to the campaign root Statements.lean:

  rh (11): RH_bl_closed_form_five_nonneg, RH_dbn_H0_zero_strip, RH_li_ladder_height,
    RH_li_ladder_height_sharp, RH_li_ladder_liLimit, RH_li_ladder_liLimit_sharp,
    RH_li_rungs_lt_five, RH_li_rungs_of_height_4000, RH_li_rungs_of_height_4000_sharp,
    RH_zeta_zero_confined, RH_zeta_zero_im_ge
  mirrormere (4): MM_gaussian_positivity_small_lam_3e3, MM_leakage_composite_zero,
    MM_satake_degree_two_rejects_delta, MM_weil_positivity_window_tenth

Fourteen regenerations are byte-identical (hash unchanged). MM_weil_positivity_window_tenth
had no `import` line at all; regenerated with `import Mathlib` + `import Statements.MMDefs`
prepended, hash 7b32a808ac3e6c1c -> 453fc3f023904fb0, theorem text unchanged, recorded in
the node file (same convention as #606). No vocabulary mirror was needed: every statement
elaborates against the existing RHDefs / MMDefs.

lake build: rh 8765 jobs (was 8754), mirrormere 8700 jobs (was 8696), both green, the
only warnings are `declaration uses sorry` on the statements themselves. `mission verify`
OK on all four campaigns; the live-campaign root-import test is added here.
No status changes. conjecture1_proved = False.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017icTazCuXLgRx61VNRAZWU
… coherence

`mission verify` exits 1 on a node whose statement the package root does not import
(current hash, well-formed file: the exact state of the fifteen), and prints the
regen_diff line naming the module; `scaffold_package` (the generate.py --check idiom,
root regenerated from disk) and `missing_root_imports` (the verify-side check) agree.
Run on all four live campaigns: OK.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017icTazCuXLgRx61VNRAZWU
…teen, 2026-09-24)

`mission add` appends the root import and `mission verify` enforces the import list
(§6 row, §7 item 5, new §11 naming the fifteen nodes and the date). conjecture1_proved = False.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017icTazCuXLgRx61VNRAZWU
…mission add`)

Parallel branches add nodes to the same root Statements.lean, so `ensure_root_import`
now inserts in sorted position (appends, and leaves the file as found, when the root is
already unsorted), `sort_root_imports` re-sorts, and the four live roots are sorted here
(same import sets, verified; anduril/mirrormere/rh reordered, bg was already sorted).
Order is not a gate condition: `verify_campaign` only WARNS on an unsorted root, so a
held branch that appended by hand still passes. Conflicts in a root are resolved by
re-sorting, never by union-merge. lake build after the re-sort: rh 8765, mirrormere
8700, anduril 8671 jobs, all green.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017icTazCuXLgRx61VNRAZWU
@DrMurphyIsIn
DrMurphyIsIn marked this pull request as ready for review September 24, 2026 13:30
@DrMurphyIsIn
DrMurphyIsIn merged commit a0c69ec into main Sep 24, 2026
116 checks passed
DrMurphyIsIn pushed a commit that referenced this pull request Sep 24, 2026
…grant-provenance

Two test-side reconciliations, no gate weakened:
- tests/test_missions_root_imports.py (#617): `mission add` now records
  [author] from `git config user.email` + $CLAUDE_SESSION_ID, which a CI
  runner lacks, so the test names --identity/--session explicitly (the
  documented fallback order is unchanged).
- tests/test_missions_provenance.py: #617's battery requires every statement
  file to open with an `import` line; the fixtures wrote bare declarations.
  They now write `import Mathlib` first, as the live registry does.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017icTazCuXLgRx61VNRAZWU
DrMurphyIsIn pushed a commit that referenced this pull request Sep 24, 2026
…st labels) + judge bundle

- merge main (#607, #617); re-sort anduril root imports (sort_root_imports)
- read-back relabeled: auditors were same-session subagents of the author, so
  independence = "unverified" (provenance-migrate) and the '(independent' label removed
- status reopened and re-granted via `mission grant` -> [grant] artifact/statement sha256,
  gate 2026-09-23.1 (owner ruling 2026-09-24: grant with honest labels, Comparator-judged)
- zeta_reflection judge bundle regenerated (--check OK, 10 challenges incl. h1000)
conjecture1_proved = False.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LMeoWeTz2Q3iSeLfqxfYo6
DrMurphyIsIn pushed a commit that referenced this pull request Sep 24, 2026
…a warning; daily bot rebuild

- build.py derives each readback's independence label from the registry (missions PR #607):
  "self-attested" for independence "" / "unverified", "judge-verified" when a Comparator
  record exists; each card carries the grant digest, judge run and required-CI record.
  Identities and session ids are never published.
- test_explorer_build: the hard-coded "every readback is self-attested" check becomes
  "labels equal what the registry records"; the committed-build staleness check is a
  WARNING, because a hard gate forced rebuild pushes onto grant PRs that cancelled their
  running judge and ladder jobs (2026-09-24).
- .github/workflows/explorer-rebuild.yml: daily + on registry pushes to main, rebuilds and
  opens/updates a bot PR when stale.
- Rebuilt against main at a8bcca0 (post #607/#617): 347 KB registry.json, 475 KB page.

conjecture1_proved = False.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017icTazCuXLgRx61VNRAZWU
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant