Skip to content

Authorization protocol

SectionWhat it defines
StatusThe protocol version and its stability posture
Trust modelWhat a signature proves, and what it does not
Trusted reviewer configurationThe config/trust.yaml entry shape
Canonical page digestThe exact bytes hashed to identify a page
Receipt pathThe deterministic location of a receipt
Unsigned receiptThe receipt fields before a signature is applied
Signing payloadThe domain-separated bytes actually signed
VerificationThe order and strictness of verification steps
Interoperability test vectorsFixtures an independent signer can check against
Rotation and revocationHow key changes are handled
External signer checklistWhat an implementer must get right
{
"schema_version": 1,
"decision": "admit",
"target_path": "knowledge/topic.md",
"content_sha256": "<canonical page SHA-256>",
"reviewer_id": "committee-chair",
"reviewed_at": "2026-08-29T21:00:00Z",
"key_id": "committee-chair-2026",
"algorithm": "ed25519",
"signature": "<detached base64 signature>"
}

The deterministic receipt path for knowledge/topic.md is authorizations/topic.md.authorization.json.

The canonical page representation uses parsed fields in a fixed order and an LF-normalized body, so the same page produces the same digest on Windows, macOS, and Linux. Review timestamps require canonical UTC ISO-8601 values. The signing payload is domain separated so a signature over one kind of object cannot be replayed as another.

Changes to signed bytes require a new protocol version rather than an in-place reinterpretation.

fixtures/authorization/receipt-vectors.json publishes interoperability vectors. An independent signer should reproduce them before being trusted with a real key. The TypeScript implementation remains the authoritative verifier.