Atom statuses and colours¶
The minimal, informative colouring scheme for atoms: for every colour it says
where the information comes from. It covers Verus and Aeneas (Rust) projects and
Lean projects, and is the mapping the Atomizer persists and the
frontend renders from the atom verification-status field.
This scheme is VeriLib-specific (it is about how VeriLib presents atom
statuses, not about any individual probe), so this page is the canonical spec
for it. The reference implementation lives in veritooling as
colors.py,
which cites this page as its spec.
This page covers a single snapshot — what each colour means. Rolling these colours up into progress over time (summary stats, burn-up charts, the blueprint dependency graph) is a separate concern, documented in Verification progress metrics.
Two visual channels¶
An atom carries at most two independent signals:
| Channel | Where | What it means | Which atoms |
|---|---|---|---|
| Colour bar (bottom) | Verification status | is this item implemented and verified in the proof language? | Rust exec + blueprint node atoms |
| Colour dot (top-right) | Checking status | does the tool accept the artifact? | verification artifacts |
"Verification artifacts" are Verus specs and proofs, and Lean defs and theorems.
They get a dot, not a bar: the question for them is not "meets its spec" but
"does it go through". The dot is for the proof-language atoms themselves; any
atom whose status depends on Lean atoms — a Rust exec measured against its
Lean translation, a blueprint node measured against its Lean binding — gets a
bar.
The two channels split cleanly by language (per P20):
language: "rust" (kind exec) and language: "blueprint" (node atoms) →
bar; language: "verus" (Verus spec / proof) and language: "lean" (any
Lean atom) → dot.
Optional classification (scheme / construction / correctness / security) is shown by border colour. It is not a status.
Kind — the top-left label¶
The label at the top-left corner is exactly the atom's kind field from the
JSON, verbatim. Possible values:
- Rust (Verus / Aeneas):
exec,spec,proof - Lean:
def,abbrev,class,structure,inductive,instance,opaque,quot,projection,axiom,theorem - Blueprint (probe-leanblueprint node atoms):
blueprint-definition,blueprint-theorem
Colour bar¶
The status rides on a bar at the bottom of the atom. Two atom populations
carry it: Rust exec atoms (Verus and Aeneas projects) and blueprint node
atoms (language: "blueprint", one per blueprint/paper node, from
probe-leanblueprint
≥ 0.6.0). Both answer the same question — is this item implemented and verified
in the proof language? — so both use the same bar palette:

Rust exec (Verus and Aeneas projects)¶
The bar uses the seven colours of the table below (white = an empty bar:
unspecified, no spec yet), a pure function of whether the Rust exec atom is
tracked and its verification-status (exactly what
colors.py counts):
| Bar | JSON condition | Meaning |
|---|---|---|
| grey | untracked: true |
untracked — out of verification scope (see below) |
| white | no verification-status |
unspecified — in scope, no spec yet (empty bar = intent to verify) |
| red | verification-status: "failed" |
error — verification failed |
| yellow | verification-status: "unverified" |
incomplete proof: a Lean sorry or a Verus assume() |
| light green | verification-status: "verified" |
locally verified — meets its spec |
| dark green | verification-status: "transitively-verified" |
verified, and so are all its dependencies |
| purple | verification-status: "trusted" |
assumed correct (Verus #[verifier::external_body] / admit(), Lean axiom / *External.lean) |
The bar is what makes white unambiguous: a white bar means an unspecified (in-scope, not-yet-specified) Rust function; no bar at all means a pure-Rust project atom with no verification intent, for Rust projects alone.
Blueprint node atoms¶
A blueprint node atom's verification-status is derived from its evidence —
aggregated from the machine statuses of the Lean decls bound to the node, or
capped at trusted for attested claims without checkable code (normative
semantics: probe-leanblueprint
SCHEMA.md).
The bar is a pure function of verification-status and blueprint-node-class
(the node's binding state, playing the role untracked plays for Rust):
| Bar | JSON condition | Meaning |
|---|---|---|
| grey | untracked: true |
untracked — the node is deliberately outside the formalization effort (see below) |
| white | verification-status: "unverified" and blueprint-node-class: "planned-only" / "decl-missing" |
planned — no Lean decls linked yet (the formalization backlog) |
| red | verification-status: "failed" |
error — a bound Lean decl fails to check |
| yellow | verification-status: "unverified" and blueprint-node-class: "bound" |
in progress — bound to Lean decls with incomplete proofs (a sorry) |
| light green | verification-status: "verified" |
all bound Lean decls locally verified |
| dark green | verification-status: "transitively-verified" |
all bound Lean decls verified, and so are all their dependencies |
| purple | verification-status: "trusted" |
attested, not machine-verified — trusted-reason: "upstream-proved" (Verso renderer proved the binding in a dependency) or "declared" (a human \leanok claim) |
Grey follows the same rule as Rust: tracked by default, out of scope only by
explicit declaration. Every blueprint node is tracked — appearing in the
blueprint is the default declaration of intent — and leaves the tracked set only
when the project explicitly marks it out of the formalization effort: prose-only
background material, results consumed from the literature, statements whose
formalization deliberately takes a different route (FLT's nolean-* nodes are
the pattern). Neither blueprint format has a native marker yet, so the
declaration comes from curation (as with Aeneas's config out-of-scope
entries), and no emitter sets untracked: true on node atoms as of
probe-leanblueprint 0.6.0 — greys appear once that support lands. The
denominator mirrors Rust: #tracked = all node atoms − grey. Two more rules for
this population:
- Count the Lean and blueprint layers separately. A bound node atom's bar
mirrors Lean decls that already carry their own dots (
dependenciesnames them; the Lean atoms point back viablueprint-label) — summing across the layers double-counts. - Purple keeps its bar-channel meaning — the trust base: the claim is
attested (by the Verso renderer or a human) rather than machine-verified, and
trusted-reasonsays which.
Colour dot — verification artifacts¶
The status rides on a dot at the top-right corner of the artifact, a pure
function of verification-status:

| Dot | JSON condition | Meaning |
|---|---|---|
| red | verification-status: "failed" |
fails to check |
| yellow | verification-status: "unverified" |
checks, with an incompleteness warning (sorry / assume) |
| green | anything else ("verified" / "transitively-verified" / "trusted" / none) |
accepted by the tool |
red/green are always from the build/verify command. Yellow is from the command for Lean, but from the probe's source scan for Verus.
Legend (Verus / Aeneas)¶
What a Rust function's bar colour means, in plain words:
- grey — not tracked. Deliberately outside the verification effort; ignored in every count.
- white — unspecified. In scope, no spec yet — the work backlog.
- red — broken. Has a spec; verification errors out.
- yellow — in progress. Has a spec; the verification is incomplete (a
sorry/assume()). - light green — verified. Verified against its spec.
- dark green — verified end-to-end. Verified, and so is every dependency.
- purple — trusted. Deliberately assumed, not verified — the trust base.
Tracked = every Rust function that is in verification scope = all bar colours
except grey. Every Rust function is tracked by default; one leaves the tracked
set only when the code explicitly marks it out of scope (Verus
#[verifier::external]; Aeneas untranslated or @[out_of_scope]). Progress is
#verified / #tracked, and a project is done when every tracked function is
green or purple (verified/transitively-verified, or trusted).
Tracking and the denominator¶
Every Rust function is tracked by default (white bar). Out-of-scope is stated explicitly in the code and read by the probes:
- Verus —
#[verifier::external], cfg-inactive code, or an external-crate stub →untracked: true→ grey. - Aeneas — cfg-inactive code, a non-library target (
build.rs,tests/,examples/,benches/), a Lean-side@[out_of_scope]annotation on the translation, or a curated configout-of-scopeentry →untracked: true→ grey. Absence fromfunctions.jsonalone is not out of scope: a compiled function Aeneas has not yet translated is white backlog, not grey (P25).
This gives a well-defined denominator, so we can report
Excluded from every count (both channels), before any colouring: external-crate
stubs (empty code-path) and editorial/auto-generated exclusions
(is-hidden / is-ignored / is-extraction-artifact). These are not atoms the
project owes work on, so they never enter the bar or dot totals.
Counting: colors.py¶
The scheme above is implemented by veritooling's
colors.py,
the reference colour counter. It reads a probe extract JSON (probe-verus,
probe-lean, or probe-aeneas — auto-detected from the schema field) and
emits the per-colour counts for both channels plus the progress summary and
chart frontiers:
colors.py <extract.json> # metric record as JSON
colors.py <extract.json> --table # human-readable table
colors.py is a straight implementation of the tables above (same two channels,
same seven bar / three dot colours, same exclusions) and cites this page as its
spec; this page stays the canonical definition of the scheme.
colors.py does not yet read probe-leanblueprint/extract files; when it (or
any counter) does, blueprint node atoms form their own bar population (same
seven colours and the same tracked = all − grey denominator as Rust — see
Blueprint node atoms), never merged into the Rust bar
or Lean dot totals.
Related¶
- Verification progress metrics — rolls these colours up into summary stats and burn-up charts over time
- JSON mapping — the atom fields (
verification-status,untracked,kind,language) this scheme reads - Atomizer — persists atom statuses to MySQL
- Languages and plugins — the probes that emit these statuses
- probe-leanblueprint
SCHEMA.md— normative semantics of blueprint node atoms and their derivedverification-status - Customization — the frontend Appearance Rules engine that renders (and can override) this scheme
verification-progress-history— the veritooling CLI that renders the burn-up, blueprint dependency graph, and cross-project dashboard in this vocabulary