Skip to content
Registry StackDocsDevelopment (unreleased)

Prove a Registry Evidence project

For the assertion provider and operator

View as Markdown

You are in adult-status, the project from Your first assertion. Before anyone packages it for a real host, prove that every assertion definition gives the answer it should, including at the edges where a wrong answer would hurt. Fixtures run offline, so the source and Registry Evidence can keep running in the background; nothing here uses them.

Outcome
Four assertion definitions proved offline, with the trace of one case read.
Time
About 10 minutes
Level
Offline proof with synthetic data
Prerequisites
The adult-status project from Your first assertion

Each assertion definition in evidence.yaml names its fixture, the file of synthetic cases that proves it. The project holds one fixture for each of its four definitions:

Terminal window
ls fixtures
adult-status.yaml
legal-parent-relationship.yaml
professional-licence-status.yaml
residence-region.yaml

The adult-status definition ends by naming its fixture:

evidence.yaml
observationTimezone: Asia/Bangkok
fixtures: fixtures/adult-status.yaml

A case intercepts the pack’s register endpoint, supplies the synthetic exchange it answers with, and states the result it must produce. These two cases hold the same birth date and sit one second apart, on either side of midnight in Bangkok on the eighteenth birthday:

fixtures/adult-status.yaml
expectedValue: false
expectedLookup: match
derivationRuns: true
signedSuccess: true
observedAt: '2026-10-13T16:59:59Z'
- id: boundary-at-bangkok-midnight
source:
intercepts:
- type: endpoint
endpoint: register
exchanges:
- request:
endpoint: register
method: GET
path: "/people/adult"
response:
status: 200
body:
total: 1
record:
record_id: adult
birth_date: '2008-10-14'

The first expects false, the second true. A definition that compared dates in UTC would fail one of them. A fixture states inputs and expected outcomes only; the definition keeps its source, function, outputs, and grant ceiling.

Run all four fixtures, and treat a warning as a failure, the way a build should:

Terminal window
rstack evidence test . --target local-target.yaml --deny-warnings
PASS: check
PASS: fixtures/adult-status.yaml (10 cases)
PASS: fixtures/legal-parent-relationship.yaml (9 cases)
PASS: fixtures/professional-licence-status.yaml (10 cases)
PASS: fixtures/residence-region.yaml (9 cases)
5 passed, 0 failed (38 cases evaluated)
Proof: offline synthetic fixture evaluation; no live dependency readiness was checked

Each case runs through the matching evidence binary, from source extraction to an offline-verified signature. The Proof: line states what passing means: every case supplies its own source response, so no live source, credential, or token issuer took part. Whether the real source and issuer answer is a separate check, made on the host that serves.

The fixture grammar is closed, so an unknown key, an unsupported expectation, or a real-data marker refuses evaluation; the fixture contract lists the case forms. Treat a failed case, warning, or unknown field as a failed build input, and never turn a real failure into an ignored case. For CI, --format json prints the same report as one JSON document.

When a case fails, the trace shows where. Ask for the trace of the midnight case:

Terminal window
rstack evidence test . --target local-target.yaml \
--fixture fixtures/adult-status.yaml \
--case boundary-at-bangkok-midnight \
--explain --deny-warnings

The trace lists every stage the case reached. Two of them read:

{
"note": "fact keys [\"birth-date\", \"residence-region\"]",
"stage": "extract",
"status": "ok"
},
{
"note": "the derivation script produced 1 value(s)",
"stage": "derive",
"status": "ok"
},

The trace names fact keys and counts, never a response, fact, derived value, or selector value. A failed case stops at the stage that ended it and adds its finding codes, so read the last stage first.

Build and deploy a Registry Evidence project