Aeneas evidence details
This page is a reference for the Aeneas adapter's recorded evidence and implementation. For setup and publishing, see Record with Aeneas and Lean.
Recorded formal evidence
SARIF stores version 1 formal evidence on each contract: the complete
pretty-printed TheoremVal.type, typed binders, conclusion, target expression
(including specialized arguments such as f 0), source range, audited axioms,
and mapping provenance. Manifest records include its SHA-256, reported translator
versions and the matched entry. At most 100 direct definition references are
included, with links for local definitions; bodies and recursive closures are
not copied. Expressions over 1,000,000 UTF-8 bytes, more than 1,000 binders, or
SARIF over 8 MiB fail explicitly instead of silently truncating statements.
New Claims carry evidence_ref: {run_id, harness} saved with each Claim revision.
The service checks that the reference belongs to that report revision, resolves
exactly one audited contract, and matches the API and theorem. Invalid explicit
references never fall back to text matching. Old records retain their old path.
The statement is stored only in SARIF, never in editable Claim prose or the DB.
Claim detail shows a Readable Lean view with for all, assume, instance,
and then rows, plus an expandable/copyable full proposition. New recordings
optionally include type_segments on binders and conclusion_segments, produced
by Lean's tagged pretty-printer. Each segment contains text and optionally a
Lean constant name in ref; concatenation must equal the corresponding plain
text. At most 10,000 segments and 1,000,000 UTF-8 bytes are accepted per expression.
Tagging failure falls back to plain text without affecting the checked statement.
Only references with recorded local sources become commit-pinned links; external
or unresolved definitions remain text. Older recordings use the same layout
without inline definition links. The author-stated Preconditions remain separate
from the extracted Lean hypotheses. Source and recorded-check links are retained. Publishing and previewing use the
selected recording, without extracting from the current working tree. The report's reproduction commands include both build and audit.
Claim identity across revisions
When publishing revisions, the CLI matches claims by API and theorem name, so reordering specifications or recording a new run preserves each claim's ID and prose. Adding a theorem creates a claim; removing one follows the usual claim deletion confirmation. If an API has exactly one old and one new claim, its ID can also be retained across a theorem rename or migration from a legacy recording. With multiple claims, unmatched theorems get new IDs rather than inheriting another theorem's text. Locally saved publication state can restore a removed theorem's ID.
Tested adapter and implementation
The adapter is tested with Lean 4.35.0 and Aeneas
be86ab0f1989d04944292b345b24c435be3ad10a. Other Lean/Aeneas API versions are
not yet verified. The generated cli/tests/fixtures/aeneas-formal model and
manifest were produced using this Aeneas version and Charon 0.1.291
(pin 08d7c9d50144bd84848212c24701253585e90d1f), then checked with real Lean.
Resolution reuses Aeneas Utils.normalizeLetBindings and
Step.getStepSpecFunArgsExpr; extraction uses Lean forallTelescope, ppExpr,
findDeclarationRanges?, and collectAxioms. The probe-aeneas manifest reader
was reviewed at 55db428974f6f0fca0cd22553d17436753d6398b; its broader inventory
and enrichment dependencies are unnecessary for this small JSON adapter.
MachineChecked's ProofLensProbe.lean (telescope, ppJson, linkRecord,
declRecord) and Python run_simple_probe path were reviewed at
9e713006b48e4b736e71e5e7fb38488f39ad60ee (Apache-2.0). Its probe includes
paper-link requests, definition closure, navigation segments and hashing that
this recorder does not need. No MachineChecked code or Python runtime is
vendored: the small adapter uses Lean's public Meta APIs directly, preserving
the original forall prefix and leaving existentials in the conclusion. Upstream
Lean is Apache-2.0; Aeneas is used through the project's pinned dependency.
Patched source records
[tool].patch opts into the single cumulative Aeneas patch workflow described in
the guide. version and SARIF driver
version remain the registered official 40-character base. The driver full name
and UI identify Aeneas <base12> + patch <sha256-prefix12>.
properties.proofs.toolchain is a strict version-1 descriptor. Sources are tagged
git {repository, commit}, git_patch {repository, base_commit, patch: {path, sha256}}, or release {release_id}. Materialized Git sources additionally record
materialized.git_tree. SHA values are full-length; patch paths are normalized
relative to the proof repository root, unlike package-relative config paths.
The current adapter requires exactly Aeneas, Charon and Lean components and four
uses: Aeneas lean_library/dependency_resolved, Aeneas translator/not_run, Charon
rust_frontend/not_run, Lean proof_checker/process_executed. Missing uses are
not inferred. Invalid descriptors never fall back to legacy handling. Generic
source types allow later adapters without implementing a generic build executor;
patching Charon, Lean or other tools is currently rejected.