fix(ci): declare the Lean update output the evidence guard reads - #177
Merged
Merged
Conversation
`formal evidence` skips aggregation when `needs.formal-lean-authoritative-run.outputs.update_required` is 'true', but the Lean job never declared that output. A read of an undeclared output is empty, so the guard passed on every run. When the Lean job packaged an assurance-manifest update on a pull request it still succeeded and skipped its phase-result upload, and formal evidence then failed with the misleading "Missing same-run lean evidence artifact". The Lean job now declares the output from its `formal-update` step and fails after preserving the update, as the translation job already does, so the job that found the drift is the red one. The formal-translation gate and CI qualified stay red as before; the updater keys off the update artifact, not job status. Repository preflight declared an `update_required` output from a `formal-update` step it does not have, left over from 930a74e. Nothing reads it, so it is removed. actionlint now reports no errors. `validate_ci_workflow_gates` requires the Lean job to declare the output from its own `formal-update` step and to keep the stop step bound to it, with a fixture test for each way to break that. The source closure, the 17 source-closure evidence digests in the assurance manifest, and the semantic freeze are regenerated.
`workflow_job_source` ends a job before the newline that precedes the next job marker, so the fixture's stop-step condition, as the last line of the Lean block, had no trailing newline and missed the exact-condition needle. The committed workflow was unaffected because a `run:` line follows the condition there; the fixture now matches that shape.
The generated files conflicted with #176. They take main's versions and are then regenerated for this branch: the source closure, the 17 source-closure evidence digests in the assurance manifest, and the semantic freeze, whose five entries move one version past main.
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.
Summary
actionlint .github/workflows/ci.ymlreported two expression errors on main. Both are fixed; actionlint is now clean on every workflow.formal evidenceskips aggregation whenneeds.formal-lean-authoritative-run.outputs.update_requiredis'true', butformal Lean authoritativenever declared that output. An undeclared output reads as empty, so the guard passed on every run. When the Lean job packaged an assurance-manifest update on a pull request it still succeeded and skipped its phase-result upload, andformal evidencethen failed with the misleading "Missing same-run lean evidence artifact".update_requiredfrom itsformal-updatestep.formal translationalready does, so the job that found the drift is the red one.repository preflight. It declaredupdate_requiredfrom aformal-updatestep it does not have, left over from 930a74e. Nothing readsneeds.repository-preflight.outputs.update_required, so the output is removed.Pending assurance update on a PR, before and after
auths-formal-update-<run>-<attempt>artifact and a successfulformal-update preflight, not Lean job statusValidator
validate_ci_workflow_gatesinxtask/src/formal_qualification.rsnow requires the Lean job's job-leveloutputs:to bindupdate_requiredto its ownformal-updatestep, and requires the stop step gated on that output. Fixture tests cover the output removed, the step id removed (the repository-preflight shape), and the stop step removed. The authoritative Lean job runs this validator against the committedci.yml.Generated artifacts
formal/qualification/aeneas/source-closure.json: regenerated for theformal_qualification.rschange (ci.ymlis not in the closure).formal/assurance-manifest-v1.toml: the 17source-closureevidence digests rebound to the new file's SHA-256. Per-claim semantic closures are Lean-only and unchanged.release/semantic-freeze-versions.tomlandrelease/semantic-freeze.json:freeze_version,auths.release.evolution-contract,auths.release.public-surface, and the source-closure and assurance-manifest frozen-bytes entries each move one version past main.cargo xtask semantic-freeze --updateconverged in one pass.docs/PROGRAM_BOARD.md: section 4 logs the delegated fail-explicitly decision.Overlap with #174
#174 also edits
ci.yml,formal_qualification.rs, the manifest, the source closure, the freeze files, and the board. The hand-written edits sit in different hunks; the generated files will conflict and must be regenerated on whichever PR lands second.Verification
Run locally only because the change needed them:
actionlint .github/workflows/*.yml(clean),cargo xtask semantic-freeze(passed, 63 entries), and a byte-identical reproduction of the source closure.The first hosted run failed
authoritative implementationon fourformal_qualificationfixture tests: the fixture's new stop step ended at its condition line, andworkflow_job_sourcedrops the newline before the next job, so the exact-condition needle missed. The committed workflow was never affected, because arun:line follows the condition there. The fixture now has that line (e4a32d4), and only that failing check was reproduced locally: the 20formal_qualificationtests pass.Main (#173, #176) is merged in (abae197); its generated files conflicted, so they take main's versions and are regenerated for this branch. Hosted CI on the new head is the verification.