Skip to content

docs(verification): honest, gated verification claims (drop "Formally Verified" overclaim) - #423

Merged
avrabe merged 1 commit into
mainfrom
docs/verification-honesty
Jul 11, 2026
Merged

docs(verification): honest, gated verification claims (drop "Formally Verified" overclaim)#423
avrabe merged 1 commit into
mainfrom
docs/verification-honesty

Conversation

@avrabe

@avrabe avrabe commented Jul 11, 2026

Copy link
Copy Markdown
Collaborator

Why

External formal-verification review (Conrad Watts, relayed via Christof Petig) flagged kiln's flat green "Formally Verified" badge + "formally verified WebAssembly toolchain" tagline as an overclaim. Audited claim vs. evidence:

  • The WebAssembly interpreter core (kiln-runtime / kiln-instructions / kiln-decoder / kiln-component) carries zero formal proofs — it is conformance-tested (spec suite) and unit-tested, not mechanically proven. (Re-verified on current main: #[kani::proof] count across those crates = 0.)
  • The Kani harnesses that do exist are on peripheral utility crates (foundation collections, arithmetic overflow, LEB128, host dispatch, wasi-nn bounds, platform).

We couldn't back "formal proof of the interpreter." This PR replaces the claim with what the evidence supports — and gates it so it can't drift back.

What changed

  • README — drop the flat Formally Verified badge and the Rocq/Z3/Verus "Formal Verification" note; add an honest Verification & correctness section. It leads with the un-spoofable file ratio (261/280, 93.2%): a file that fails to parse (custom-descriptors) contributes zero assertions to the "99.98% of executed assertions" figure and would otherwise hide exactly where a skeptic looks. States plainly that the interpreter's semantics are not formally proven.
  • Dynamic spec-suite badge — a shields.io endpoint badge re-derived by CI from the live suite result (tools/spec-badge.py), never hand-typed. Cannot drift from the evidence.
  • claims.yaml + tools/claim-check.py — gate the doc claims against source (flat badge can't return; interpreter-core proof count must stay 0; spec suite must be vendored). Falsification-verified: re-adding the badge turns the gate red.
  • .github/workflows/verification-honesty.yml — runs claim-check as a hard gate on every PR, runs the spec suite continuously, and publishes the badge JSON to the badges branch on main.

Numbers (clean main, cargo-kiln testsuite --run-wast)

Files 261 / 280 pass (93.2%)
Executed assertions 65,618 / 65,633 (99.98%)
Modules 2,370

Known gaps (stated in the README): GC-proposal validation strictness (a few should-be-invalid modules currently accepted) + custom-descriptors parse failure.

Notes for review

  • Base is current origin/main. kani-verification.yml is already re-enabled upstream, so this PR does not touch it.
  • The badges branch is already seeded, so the endpoint badge renders now (not broken-until-first-CI-run).
  • This is the kiln instance of an org-wide copy-pasted "formally verified" claim (~13 repos); follow-ups per repo will relabel each badge to what that repo actually proves.

🤖 Generated with Claude Code

… honest evidence

External formal-verification review (Conrad Watts, relayed via Christof Petig)
flagged kiln's flat green "Formally Verified" badge as an overclaim: the
WebAssembly interpreter core (kiln-runtime / kiln-instructions / kiln-decoder /
kiln-component) carries ZERO formal proofs — it is conformance-tested and
unit-tested, not mechanically proven. The Kani harnesses that DO exist are on
peripheral utility crates. The claim could not be backed as written.

This replaces the claim with what the evidence actually supports, and binds it
so it cannot drift again:

- README: drop the flat "Formally Verified" badge and the Rocq/Z3/Verus
  "Formal Verification" note; add an honest "Verification & correctness" section.
  Lead with the un-spoofable file ratio — 261/280 spec-suite files (93.2%) —
  because a file that fails to *parse* (custom-descriptors) contributes zero
  assertions to the 99.98%-of-executed-assertions figure and would otherwise
  hide. State plainly: the interpreter's semantics are not formally proven.
- Spec-suite badge is now a shields.io ENDPOINT badge re-derived by CI from the
  live suite result (tools/spec-badge.py), never hand-typed — it cannot drift.
- claims.yaml + tools/claim-check.py: gate the doc claims against source. The
  gate re-counts that the interpreter core has 0 #[kani::proof] and that the
  flat badge cannot return; re-adding it turns the gate red (falsification-
  verified). Wired into .github/workflows/verification-honesty.yml alongside a
  continuous spec-suite run that publishes the badge JSON on main.

Numbers (clean-main, cargo-kiln testsuite --run-wast): 261/280 files,
65,618/65,633 executed assertions (99.98%), 2,370 modules.

Created-By: Claude Code (Anthropic)
Model: claude-opus-4-8[1m]
Session-Id: c7e925b0-4761-45b4-95cc-97727a810844
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@avrabe
avrabe enabled auto-merge (squash) July 11, 2026 09:35
This was referenced Jul 11, 2026
@codecov

codecov Bot commented Jul 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@github-actions

Copy link
Copy Markdown

🔍 Build Diagnostics Report

Summary

Metric Base Branch This PR Change
Errors 0 0 0
Warnings 5 5 0

🎯 Impact Analysis

Issues in Files You Modified

  • 0 new errors introduced by your changes
  • 0 new warnings introduced by your changes
  • 0 total errors in modified files
  • 0 total warnings in modified files
  • 0 files you modified

Cascading Issues (Your Changes Breaking Other Files)

  • 0 new errors in unchanged files
  • 0 new warnings in unchanged files
  • 0 unchanged files now affected

Note: "Cascading issues" are errors in files you didn't modify, caused by your changes (e.g., breaking API changes, dependency issues).

✅ No Issues Detected

Perfect! Your changes don't introduce any new errors or warnings, and don't break any existing code.


📊 Full diagnostic data available in workflow artifacts

🔧 To reproduce locally:

# Install cargo-kiln
cargo install --path cargo-kiln

# Analyze your changes
cargo-kiln build --output json --filter-severity error
cargo-kiln check --output json --filter-severity warning

@avrabe
avrabe merged commit cd2886f into main Jul 11, 2026
22 checks passed
@avrabe
avrabe deleted the docs/verification-honesty branch July 11, 2026 11:48
avrabe added a commit to pulseengine/witness that referenced this pull request Jul 14, 2026
…rification dogfood) (#151)

Witness applied the claim-verification skill to kiln (pulseengine/kiln#423) and
ordeal (pulseengine/ordeal#69); this turns the same discipline on witness's own
prose. Witness is a COVERAGE tool, not a correctness prover — its integrity lives
entirely in its scope hedges, which are exactly what a formal-methods skeptic would
attack if they silently drifted into overclaims.

mark → bind → gate:
- claims.yaml marks 4 load-bearing claims and binds each to a re-derivable predicate:
  * WITNESS-NOT-A-CORRECTNESS-PROOF — README keeps "does **not** prove"; forbid
    "formally verified" / "proves correctness" ever appearing.
  * WITNESS-MCDC-STYLE-NOT-CERTIFIED — "MC/DC-style" stays; forbid flat
    "MC/DC/DO-178C certified/compliant".
  * WITNESS-CHECKER-QUALIFIABLE-NOT-QUALIFIED — "qualifiable kernel" stays; forbid
    present-tense "is/already/fully qualified" before the v1.0 DO-330 artifact ships.
  * WITNESS-SIGNATURE-SCOPE — SECURITY.md keeps enumerating what a signature does NOT
    prove.
- tools/claim-check.py re-derives every predicate from the actual docs.
- .github/workflows/claim-check.yml gates it on every PR/main push. Drift = red;
  falsification-verified (each of the 4 goes red on an injected overclaim, green on
  revert).

Also fixes a real in-prose drift: the demo scoreboard said "715 br_ifs" while the
TOTAL table two lines up (and the same paragraph, "672/716 branches") says 716.
Per the skill's boundary, the example numbers themselves stay narrative (not gated).

Created-By: Claude Code (Anthropic)
Model: claude-opus-4-8[1m]
Session-Id: c7e925b0-4761-45b4-95cc-97727a810844

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
avrabe added a commit that referenced this pull request Jul 14, 2026
…point to the CI badge (#434)

The "Verification & correctness" section hard-coded "261/280 files" and
"65,618/65,633 (99.98%)". The dynamic endpoint badge (added in #423) has since
re-derived the live rate from CI — currently 263/281 files · 99.20% asserts — so
the prose numbers drifted the moment the testsuite pin advanced. That is exactly
the anti-pattern the badge was meant to kill: a number typed in prose goes stale.

Replace the frozen figures with a pointer to the CI-re-derived badge, keeping the
durable qualitative argument (lead with the file ratio because a parse-failure
contributes zero assertions and hides in the assertion rate; the known gaps). No
number in prose can now diverge from the evidence.

Created-By: Claude Code (Anthropic)
Model: claude-opus-4-8[1m]
Session-Id: c7e925b0-4761-45b4-95cc-97727a810844

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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