Tutorials · Lesson 6 of 7
6 · Keep the evidence honest
You'll grade the trace, watch a proof go stale when code
changes, and record counter-evidence with a defeater. You need: your governed
trace.json.
Grade — the hygiene floor
Grading scores the trace on structure, rationale coverage, negative space, reproducibility, verification evidence, and lineage. Treat it as a floor to clear, not a number to game — a thin trace (no artifacts, no residuals) grades low because it's hard to review.
ponens trace grade trace.json Freshness — evidence expires
A formal result — a proof, a state-space decomposition, a conformance check — is only as current as the model it ran on. ponens computes a dependency-closure fingerprint of the target, so it can tell you when a result no longer reflects the code:
- Fresh — the target (and everything it uses) is unchanged since the result.
- Stale — the target, or something in its dependency closure, changed after the result. The verdict no longer applies.
- Detached — the target was removed from the model entirely.
Stale/detached results surface as derived residuals, and a goal never resolves "done" over non-fresh evidence. Edit the modelled code, re-enrich, and watch a proved criterion flip to "at risk":
ponens trace enrich trace.json # recomputes freshness
ponens trace residuals trace.json --derived # declared gaps + computed stale/detached proofs The fix is simple: re-run the affected result against the current model — a fresh result heals it.
Defeaters — counter-evidence
A residual gap says "we didn't check this." A defeater is stronger: it's evidence
against a claim — a counterexample, a model that doesn't match the code, a test that
doesn't actually establish the property. An open defeater blocks the claim it targets: a
Property over that result reads blocked, not done.
ponens trace residual add trace.json --kind defeater \
--defeater-kind rebuts --target-id fr3-result \
--statement "Counterexample at amount=0 violates the non-negative invariant" \
--severity high --defeater-kind is rebuts (contradicts the conclusion),
undermines (attacks the evidence, e.g. model ≠ code), or undercuts
(breaks the inference). Traces are immutable — you close a defeater in a successor trace
by fixing the code and re-verifying, not by editing this one.
What you learned
trace gradeis a reviewability floor to clear.- Results are Fresh / Stale / Detached vs. the current model; goals never resolve done over stale evidence.
- A defeater is counter-evidence that blocks a claim — stronger than a gap.