fix(ci+missions): close the verification-gate holes found in the 2026-09-18 audit - #569
Merged
Merged
Conversation
…-09-18 audit The 2026-09-17/18 RH critical-path mathematics held up under adversarial audit. The machinery around it did not. Seven fixes, one headline. HEADLINE: two rh nodes were `proved` against Lean nothing ever compiled. ZeroFreePolylog.lean and ZeroFreeElementary.lean are terminal on the li_positivity island -- imported by nothing, absent from defaultTargets, outside the axiom guard's import closure. Their oleans are absent from all three independently built worktrees while their neighbours are present. The nodes are RH_zero_free_gamma5 and RH_zero_free_polylog. Importing ZeroFreePolylog into AxiomGuardLiPositivity (a defaultTargets lean_lib) puts both under `lake build` and prints their axioms. If they do not compile this job now goes red, which is the point. - Axiom guards (rvm_bridge, li_positivity) asserted only the absence of `sorryAx`, so a new upstream `axiom` would have passed. Both now require every printed axiom line to be exactly [propext, Classical.choice, Quot.sound], run under `set -euo pipefail` (the old `lake env lean | tee` masked a crashed run), and fail if fewer lines printed than the guard has anchors -- the check that catches a guard which silently did not run. The idiom is lifted from telperion-production.yml, which already had it right. - Nothing in CI ran the missions invariant battery. `mission verify` now runs inside the REQUIRED `unit` job: schema, acyclicity, artifact existence, statement containment, closure coherence and regen drift, across all four campaigns. Pure Python, seconds. - The grant gate proved nothing. `grant_status` checked that an artifact CONTAINS a node's statement, never that it PROVES it, and `normalize_lean` strips a trailing `:= by sorry` before comparing, so a stub matched MORE easily. Both the gate and the read-only battery now reject artifacts carrying sorry/admit/native_decide in Lean code, with comments and strings stripped so docstring prose is not a false positive. Three tests. Every existing campaign still verifies clean: nothing proved rested on a stub. - proof-lean, the daily no-`sorry` re-verification of the R3Cert layer, failed every day from 2026-09-12. The cache restore missed (0s), the cold ~2575-theorem rebuild was killed near 104 min, and because the build failed the cache POST step was skipped, so nothing was saved and the next run started cold: self-perpetuating. Split restore from save and save with `if: always()`, so partial builds accumulate. (BG layer, not RH.) - mirrormere's manifest still said no node enters as proved and grants are deferred to the branch reconcile. #506 merged; one node is proved and nine await the grant pass. Recorded but deliberately not changed, with reasons, in telperion/docs/VERIFICATION_GATES_AUDIT_2026-09-18.md: the registry DAG's dependency edges are documentary (no bridge imports another, so the critical path is three independent theorems, not a chain); `proved` covers research-grade, conditional and bookkeeping nodes without distinction; and island jobs are still not required checks, because the lean workflow is path-filtered and making them required would render every docs-only PR unmergeable. conjecture1_proved = False. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… + build target
CI proved the point of the previous commit, then rejected its mechanism.
GOOD NEWS: ZeroFreePolylog and ZeroFreeElementary DO compile (run 35383833607:
"Built ZeroFreePolylog (9.5s)", warnings only). The two zero-free-region node
artifacts were sound Lean that no build had ever elaborated.
WHY THE FIRST ATTEMPT FAILED:
error: import ZeroFreeElementary failed, environment already contains
'ZeroFreeBridge.zeta_sphere_bound' from DlvpZetaDisk
ZeroFreeBridge.zeta_sphere_bound is declared in THREE modules on this island --
DlvpZetaDisk, DlvpZetaCountStrip and ZeroFreeElementary. Nothing ever imported
ZeroFreeElementary alongside the others, so the duplication was invisible. That
duplication is worth collapsing, but it must not block getting these artifacts
under the kernel, so it is recorded as a follow-up rather than fixed here.
THIS COMMIT: a second, minimal guard AxiomGuardZeroFree.lean whose closure is
exactly ZeroFreePolylog -> ZeroFreeElementary -> StripBound plus ZetaLogBound.
Declared a lean_lib in defaultTargets, so `lake build` compiles both artifacts;
a new CI step runs the same exact-axiom assertion over it (min 2 lines).
AxiomGuardLiPositivity keeps the three anchors that were already in its closure
(zeta_repr_R1, zeta_fract_repr, norm_deriv_le_of_re_le); its threshold drops
165 -> 163 accordingly.
conjecture1_proved = False.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The drift check imports the telperion package, which pulls sympy, but the job never installed it. On any branch whose generate.py reaches that import the step dies with ModuleNotFoundError in 7s, before checking a single statement -- currently blocking #567. A drift check that cannot start cannot fail on drift, which is the worst failure mode for a gate. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…s too The stricter guard counts lines matching 'depends on axioms' and compares against the number of #print axioms anchors. LiPositivity.liLowerBounds_pos depends on NO axioms, so Lean prints 'does not depend on any axioms', which the pattern missed: 162 counted against 163 anchors and li-positivity-compiles went red on a proof that is strictly stronger than the three-axiom set. Count both phrasings. The exactly-three-axioms check is unaffected, since it still greps only the 'depends on axioms' lines. Same fix applied to the rvm_bridge counter. conjecture1_proved = False. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… axiom lists across lines rvm-bridge-compiles went red on RvMBridge.zeta_ordinates_not_uniformlyDiscrete_of_unbounded_density, whose axioms ARE the standard three: the declaration name is long enough that Lean wrapped the list, so the line-based grep saw 'depends on axioms: [propext,' and called it an unexpected axiom. Join lines first, extract each complete 'depends on axioms: [...]' group, then require it to be exactly the three. Verified both ways on fixtures: a wrapped clean list is ACCEPTED, a list carrying sorryAx is REJECTED. Applied to all three guard blocks (li_positivity axioms.out and zerofree.out, rvm_bridge axioms.out). conjecture1_proved = False. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
DrMurphyIsIn
added a commit
that referenced
this pull request
Sep 19, 2026
docs(missions): wall backlog map -- 25 unproved nodes mapped, and the grant-gate hole that #569 closes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The 2026-09-17/18 RH critical-path mathematics held up under adversarial audit. The machinery around it did not. This closes seven gate holes and records three more with reasons for leaving them.
Full findings:
telperion/docs/VERIFICATION_GATES_AUDIT_2026-09-18.md.Headline: two nodes were
provedagainst Lean nothing ever compiledZeroFreePolylog.leanandZeroFreeElementary.leanare terminal on the li_positivity island. Nothing imports them, they are not indefaultTargets, and they sat outside the axiom guard's import closure. Their oleans are absent from all three independently built worktrees while their neighbours are present. The nodes areRH_zero_free_gamma5andRH_zero_free_polylog.Importing
ZeroFreePolylogintoAxiomGuardLiPositivity.lean, which is adefaultTargetslean_lib, puts both modules underlake buildand prints their axioms. If they do not compile,li-positivity-compilesnow goes red. That is the intended outcome.The rest
sorryAx, so a new upstreamaxiomwould have passed. Both now require every printed axiom line to be exactly the three standard axioms, run underset -euo pipefailbecauselake env lean | teemasked a crashed run, and fail if fewer lines printed than the guard has anchors. The idiom comes fromtelperion-production.yml, which already had it right.mission verifynow runs inside the requiredunitjob, covering all four campaigns in seconds.normalize_leanstrips a trailing:= by sorrybefore comparing, so a stub matched more easily. Gate and battery now rejectsorry/admit/native_decidein Lean code, comments and strings stripped first. Three tests. All campaigns still verify clean, so nothing currently proved was resting on a stub.proof-leanhas been red on main since 2026-09-12. Cache restore missed, the cold rebuild was killed near 104 minutes, and the cache post step was skipped because the build failed, so the next run started cold too. Restore and save are now split, with the save onif: always(). This is the BG layer, not RH.Left open on purpose
Island jobs are still not required checks. The lean workflow is path-filtered on
telperion/**, so making them required would leave every docs-only PR permanently unmergeable, which this repo has already hit. Addingmission verifyto the already-requiredunitjob raises the floor where it can be raised today.The registry DAG's
depends_onedges are documentary rather than mechanical: no bridge imports another, so the critical path is three independent theorems, not a chain. The generated statement files are hash-locked, so this is recorded in the audit doc instead of hand-edited.This PR does not run the grant pass. After #506 all 15 linked-but-ungranted artifacts are on main, so it is unblocked, but granting is ceremonial here and is left to the owner.
conjecture1_proved = False.🤖 Generated with Claude Code