Certification & Run Evidence
How the progress artifact decides an endpoint is certified rather than merely
present. The model lives in ab/progress/certification.py; evidence is
committed to tests/example_run_results.json.
Why the distinction exists
An earlier version of the report counted an endpoint as done when a Route
object existed, and rendered “100% Done” while a single endpoint in the
repository had ever been verified to run. Fixture files, Markdown pages, and
static references to api.<group>.<method>() were all treated as completion.
Presence and proof are now separate, and the report shows both.
The ladder
Each level is reported independently. Nothing below is collapsed into a single percentage.
Level |
Means |
Evidence |
|---|---|---|
Implemented |
A public SDK method with a |
Live registry |
Structurally complete |
Example + fixture + model test + Sphinx page present |
Files on disk |
Operator ready |
Example uses an approved shared constant, or needs no record identifier |
Static parse of the example |
Live verified |
The example completed successfully against a named environment |
Committed run evidence |
Restoration verified |
A mutating example is idempotent or restored the record |
Mutation evidence block |
Certified |
Every applicable level passes |
All of the above |
Read-only endpoints do not require restoration. Mutating ones do.
Structural completeness is not proof of execution. Only Live verified and Certified reflect a call that actually ran.
Staleness is content-derived, never clock-derived
Evidence records fixture_sha256 — the SHA-256 of the fixture it was captured
against. Evidence goes stale when the committed fixture no longer matches.
A date-based rule (“evidence older than N days”) was rejected: it would make the rendered HTML change without any code change, and the no-drift gate strips only the generation timestamp, so every stale-by-clock transition would show up as spurious drift. Content hashing also answers the question that actually matters — was this evidence captured against the fixture we ship today?
Evidence written under schema 1 has no hash and is reported as stale, not fresh. It cannot be proven current, so it is not counted as verified.
Evidence schema (version 2)
{
"schema": 2,
"results": {
"api.<group>.<method>": {
"status": "passing",
"checked": "2026-06-06",
"source": "live",
"environment": "staging",
"mutation_class": "read_only",
"fixture": "SomeModel.json",
"fixture_sha256": "0bfe9977…",
"detail": null
}
}
}
status is passing or failing. Anything else is treated as missing.
Mutation classes
Set mutation_class explicitly; otherwise a non-GET method is conservatively
assumed to be manual_cleanup.
Class |
Meaning |
Restoration evidence |
|---|---|---|
|
GET / no state change |
Not required |
|
Re-running leaves the same end state |
Self-restoring |
|
Example restores the original value before finishing |
Required |
|
Creates then deletes within the same run |
Required |
|
Cleanup exists but an operator must perform it |
Required |
|
Irreversible or customer-visible side effects |
Can never certify |
Mutation evidence block
Required for circular_restored, destructive_with_cleanup, and
manual_cleanup. All fields below must be present and
final_state_verified must be true — a filled-in narrative with nobody
re-reading the record does not count.
"evidence": {
"record_identifier": "TEST_JOB_DISPLAY_ID",
"environment": "staging",
"precondition": "job 2000000 has no note with body 'sdk-smoke'",
"mutation": "POST /job/2000000/note body='sdk-smoke'",
"expected_result": "201, note created with a new id",
"observed_result": "201, note id 8842 created",
"restoration": "DELETE /job/2000000/note/8842",
"final_state_verified": true,
"timestamp": "2026-07-26T14:02:11Z",
"evidence_ref": "tests/fixtures/JobNote.json"
}
Field |
Purpose |
|---|---|
|
The approved shared constant or record the operator sanctioned for mutation |
|
Which environment the call ran against |
|
Starting state, so the mutation is interpretable |
|
What was performed |
|
What should have happened, and what did |
|
The operation that returned the record to its original state |
|
The record was re-read after restoration |
|
When the run happened |
|
Fixture or response backing the claim |
Fixture safety
Live responses must be sanitized before they are committed. This repository is public; see the tracking issue for the mandatory deterministic sanitization requirement. Endpoints lacking operator data should remain visibly awaiting in the report rather than being unblocked with raw production responses.