Repository navigation
Report contract for consumers: 0.4.0 frozen, verdict matrix as data, corroboration keys — and the estate's Creusot lane #67
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
c3a0810
Report contract for consumers, and the estate's Creusot lane
hyperpolymath f37d78e
Update schemas/scan-0.5.0.json
hyperpolymath 02d39ea
docs(scan): clarify exit codes, fingerprints, report counts, and vali…
coderabbitai[bot] c73d017
fix(report): share verdict gating logic and dispatch frozen schema va…
coderabbitai[bot] 6b3482c
fix(schemas): update the scan 0.5.0 BLAKE3 digest in the schema index
coderabbitai[bot] f2957a4
Refuse corroboration keys that cannot be root-relative
hyperpolymath bdc77bf
diag: formatted sources and captured toolchain output [skip ci]
95dd135
Remove the temporary diagnostic lane
hyperpolymath 0eb5651
Route every demotion through verdict.rs, and fix two documentation de…
hyperpolymath 880137f
diag: formatted sources and captured toolchain output [skip ci]
19440d8
Remove the diagnostic lane again; keep the formatting it applied
hyperpolymath File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,96 @@ | ||
| # SPDX-License-Identifier: MPL-2.0 | ||
| name: Creusot Gate | ||
|
|
||
| # Rust deductive verification, as the estate requires it: the Creusot gate in | ||
| # hyperpolymath/cicd-suite, called rather than copied. This file adds no | ||
| # steps of its own, exactly like main-estate-audit.yml — a copy would freeze | ||
| # this repository at whatever cicd-suite commit it happened to hold. | ||
| # | ||
| # Why this file exists at all: the estate audit's own `languages` job runs the | ||
| # Idris2, Zig, proof-runner and BoJ checks, not this one, so before this file | ||
| # nothing in this repository watched for a Creusot claim. The gate's checks are | ||
| # therefore new coverage here, not a duplicate of the audit's. | ||
| # | ||
| # KNOWN LIMIT OF THE PINNED GATE (reviewed, upstream fix required): the pinned | ||
| # script recognises a Creusot dependency by its literal `creusot-std` / | ||
| # `creusot-contracts` key. A crate that renames the dependency | ||
| # (`creusot = { package = "creusot-std" }`) and writes contracts would set | ||
| # `obligations=true` while leaving the selected-crate list empty, so the proof | ||
| # loop could run over nothing and still exit green. That is a gap in the gate, | ||
| # not a pass for this tree, and it cannot be fixed from here without copying | ||
| # the gate (which is what this repository refuses to do). It is recorded so the | ||
| # first aliased dependency arrives with someone looking; the honest fix is a | ||
| # cicd-suite release that resolves the alias and rejects an empty crate list | ||
| # when obligations exist. | ||
| # | ||
| # WHAT THIS GATE DOES, AND WHAT IT DOES NOT CLAIM | ||
| # ----------------------------------------------- | ||
| # Three phases, run by the reusable: | ||
| # | ||
| # detect does any crate carry a Creusot obligation (a creusot-std / | ||
| # creusot-contracts dependency, or a #[requires]/#[ensures] and | ||
| # friends)? does any prose or source header CLAIM Creusot | ||
| # verification? | ||
| # theatre T1: a claim with no obligations behind it is a hard failure — | ||
| # "verified with Creusot" without contracts is proof theatre. | ||
| # T2: a creusot-std dependency that annotates nothing is named. | ||
| # T3: every #[trusted] axiom is listed, because a proof is only as | ||
| # strong as the set it trusts. | ||
| # prove only runs when detect found obligations. It installs Creusot at | ||
| # a pinned release, proves a planted FALSE contract and REQUIRES | ||
| # the prover to refuse it, proves a planted TRUE one and requires | ||
| # success, and only then runs `cargo creusot prove` in every crate | ||
| # with obligations. A prover that cannot say no is not a prover. | ||
| # | ||
| # MEASURED ON THIS TREE (2026-10-28, cicd-suite bf7dd95 creusot-check): | ||
| # obligations=false claims=false contract_count=0 trusted_count=0 | ||
| # so the theatre phase reports, in its own words, "no Creusot obligations and | ||
| # no verification claims in this tree. Nothing was proved and nothing claims | ||
| # to be — this gate is silent, not green-as-assurance." | ||
| # | ||
| # That is the honest state, and it is the state PROOF-PROGRESS.adoc records: | ||
| # Pons has no machine-checked soundness proof. The gate exists here so that | ||
| # the first time anyone claims, in a README, a module header or a doc, that | ||
| # this code has been proved by Creusot — with no contracts behind it — the | ||
| # build goes red (T1) instead of the claim shipping. (The gate reads that | ||
| # claim phrase out of prose lines, so even quoting it here would be a mistake | ||
| # if workflows were scanned; this comment deliberately paraphrases.) It is a guard against theatre today and the | ||
| # wiring for real obligations tomorrow: the day a crate depends on | ||
| # creusot-std, detect flips obligations to true, prove runs, and the tree has | ||
| # to discharge its contracts or fail. | ||
| # | ||
| # A first obligation therefore needs, together: a creusot-std dependency, the | ||
| # nightly pin Creusot is built against (the reusable's `rust_nightly` input), | ||
| # and a crate whose contracts `cargo creusot prove` actually discharges. There | ||
| # is no way to have the third without the toolchain, and no honest way to | ||
| # claim it before it runs. | ||
| # | ||
| # Pin: the same cicd-suite commit main-estate-audit.yml uses (bf7dd95), so the | ||
| # audit's `languages` component and this job run the same gate revision. | ||
| # DE-ONBOARDED from actions.lock deliberately, like the secret-scanner and | ||
| # estate-audit callers: a reusable onboarded cross-repo startup-fails with zero | ||
| # jobs under sha_pinning_required. Do not run a full-directory `gh actions-lock` | ||
| # that re-onboards this file. | ||
|
|
||
| on: | ||
| push: | ||
| branches: [main] | ||
| pull_request: | ||
| branches: [main] | ||
|
|
||
| concurrency: | ||
| group: ${{ github.workflow }}-${{ github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: | ||
| creusot: | ||
| uses: hyperpolymath/cicd-suite/.github/workflows/creusot-gate.yml@bf7dd95cf49733019343ff485c2f45c6b261839c # cicd-suite main | ||
| # A creusot-std dependency that annotates nothing is a hollow dependency: | ||
| # this repository adds one only when it also writes the contract, so the | ||
| # warning is escalated to a failure. It costs nothing today — there is no | ||
| # such dependency — and it means the first one cannot arrive alone. | ||
| with: | ||
| enforce_hollow: true | ||
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
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
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
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
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
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
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
Oops, something went wrong.
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Script executed:
curl -sS -m 20 https://raw.githubusercontent.com/hyperpolymath/cicd-suite/bf7dd95cf49733019343ff485c2f45c6b261839c/actions/creusot-check/check.sh | head -400Repository: hyperpolymath/pons-asinorum
Length of output: 12496
Script executed:
Repository: hyperpolymath/pons-asinorum
Length of output: 9210
Handle aliased Creusot dependencies before enabling obligations.
The pinned script detects only literal
creusot-stdandcreusot-contractsdependency keys. A crate withcreusot = { package = "creusot-std", ... }and contract attributes can setobligations=truewhile leaving the selected crate list empty. The planted controls can pass, after which the proof loop has no repository crate to prove and the gate can exit successfully.This repository currently has no Creusot dependency or contract attribute, so this is a future gap rather than a current proof bypass. Pin a version that resolves dependency aliases and rejects an empty selected-crate list when obligations exist.