Repository navigation
Releases: gravit-open-network-foundation/verifier
Release list
v0.7.0
Fixes from an external review of v0.6.0: one integrity_hash per Verified Fact; excluded Records never count; decision_id over RFC 8785 (JCS); theta never coerced. 54 golden vectors, Python and Rust agree. Details in README (v0.7 changes).
v0.6.0 — The signed result is applied (CANON-RES-012)
Fix. Up to v0.5.0 the kernel ignored the signed result field of an Evidence Record. Records signed with result=false or null counted towards a Verified Fact like result=true. Reported and reproduced on 12 Oct 2026 by Iman Schrock (EMILIA Protocol) against the SAFR v1.1 reference adapter; he confirmed the fix on 13 Oct 2026.
result:true= supports,false= contradicts (blocks Verified Fact, even when outvoted),null= no verdict (not support).- Only admissible records count when a registry is loaded, so an unsigned
falsecannot block. - The decision keeps
contradicting_records,no_verdict_records,supporting_sources. - 47 golden vectors (7 new), reproduced by Python and Rust including
decision_id. The 40 earlier vectors keep their outcomes and reasons; theirdecision_ids change because every decision lists one more rule. CONFORMANCE.mditem 3 corrected; details indocs/signed-result.md.
v0.5.0 is unchanged and remains available.
v0.5.0 — Registry signed by a 3-of-5 trust root
What changed
- Registry root signatures. The verifier registry loads only if at least
thresholddistinct root keys of a pinned trust root have signed its exact bytes. Signatures are read from<registry>.sig; the CLI takes--trust-root.- A trust root whose threshold is half of its keys or fewer is rejected.
- Procedure:
docs/root-key-custody.md. Holders:registry/ROOT_KEYS.md.
- Freshness Bound (CANON-FRS-005). When the request context contains
evaluation_timeandfreshness_max_age_seconds, the age of every Record is checked. The kernel never reads the clock. - Reproducible
decision_id. It is now a SHA3-256 content hash, identical in Python and Rust. DecisionRecord gainsartifact_idandtrust_root_digest. - CLI exit codes:
0SUCCESS,3DEGRADED (previously0),1REJECTED,2usage error. - Stricter registry parsing. Python and Rust now reject
registry_version: 1.0/trueandrevoked: nullin the same way.
Evidence
- 40 golden vectors, reproduced by both Python and Rust,
decision_idincluded. - pytest 34/34, Rust 5/5.
- The date parser was cross-checked against Python
datetimeon 200,000 timestamps.
Breaking
- A registry without
.sigand--trust-rootno longer loads. - Scripts that treated exit code
0on DEGRADED as success now receive3.
Limits
- The trust root contains test keys only. Real root keys follow the ceremony; see
docs/ceremony-dry-run.md, available onmainafter this release. - No claim of Sybil resistance is made until real operators are admitted under
registry/POLICY.md.
v0.4.0 — Signed evidence and verifier registry
What changed
- New Binding
CANON-SIG-011. A Verified Fact now requires convergence on Records signed (Ed25519) by keys in a verifier registry that are not revoked. Keys of one operator count as one source. - Without a registry, the result is capped at Probabilistic Assessment.
- Excluded Records are listed in the DecisionRecord with a reason:
unsigned,unknown_key,revoked_key,malformedorbad_signature. Excluding a Record never rejects the whole artifact. - DecisionRecord gains
excluded_evidenceandregistry_digest. - CLI gains
--registry. - Rust port mirrors all of it.
Evidence
- 33 golden vectors, reproduced by both Python and Rust.
- pytest 27/27.
- A mutation check confirms that the Rust port really verifies signatures.
Breaking
Unsigned artifacts can no longer reach Verified Fact. See examples/artifact_signed.json for the signed form.
Limits
- The registry is trusted input and contains test keys only.
- This release does not claim Sybil resistance. See
docs/sybil-design.md§7.
Design document: docs/sybil-design.md.