Twelve assertions across three fixtures, mapping the extension's L0 section one-to-one:
| Fixture | Requirements | Assertions |
|---|---|---|
AC-L0-001.json |
AC-1 negotiation · AC-6 the vouch | AC1-01, AC6-01..03 |
AC-L0-002.json |
AC-2 provenance · AC-3 absent-not-masked | AC2-01..02, AC3-01..02 |
AC-L0-003.json |
AC-4 audience scoping · AC-7 freshness planes | AC4-01..03, AC7-01 |
AC-5 (mediated assembly) deliberately has no fixture assertion: whether the server queried its substrate under its own identity is not observable from the wire. It is verified by architecture review, not by transcript.
python3 runner.py --self-test # validate the suite itself (do this first)
python3 runner.py --transcripts DIR # evaluate a captured server transcript
python3 runner.py --list # print the 12 assertions
The runner is stdlib-only and never touches the network: capture a transcript first, evaluate
second, so every verdict is reproducible from artifacts. A transcript directory holds the seven
captured documents laid out as in golden/transcript-pass/ (a server/discover result, the
public- and admin-audience tools/list results, a full and a denied tools/call result, the
rejected admin call, and the issuer's published key).
golden/transcript-pass/ is a fully conformant synthetic transcript; the
suite must pass it 12/12 or the runner aborts.golden/transcript-fail/ holds 11 broken variants — masked field,
provenance leak of a denied pointer, admin tool listed to a public caller, publicly cacheable
authorization-varying list, missing/tampered attestation, wrong hash, bad signature, missing
extension declaration, stripped retrieved_at, uncovered provenance, admin call that succeeds.
--self-test requires each to trip exactly the assertions its manifest.json declares — every
one of the twelve assertions is tripped by at least one control, so no check in this suite is
incapable of failing.Golden transcripts are regenerated deterministically by golden/regenerate.py. ⚠ Its signing key
is a test key derived from a public string — reproducibility is the point; it must never be
used as a real issuer key.
bundle_hash = sha256: over the RFC 8785 (JCS) canonical form of structuredContent; the
signing input is the JCS form of {bundle_hash, issued_at, issuer} — exactly those three fields.
At L0 the runner implements the JCS subset for integer numbers, ASCII object keys, strings, bools,
null, arrays, and objects, and refuses anything outside it (non-integer numbers, integers past
2^53−1, non-ASCII keys) rather than approximate — a wrong canonical form manufactures false hash
verdicts in both directions. Full ECMAScript number formatting arrives with a vetted JCS library
at L1+.
The golden pass validates the fixtures, not any server. Conformance is claimed only when a real implementation's captured transcript passes 12/12, and the claim names the transcript, the date, and the implementation version.
First passing implementation (2026-07-30, live): the reference implementation serving the public origin passes 12/12 on live-captured transcripts. An author-operated pass advances the use-alone step and is not a second-implementer signal — the suite below is the invitation.