Authority receipts
For a long time Sidecat records carried a field called
authority_granted whose value was always
false — honestly so, because nothing existed that could
make it true with integrity. The receipt model is what makes it
derivable.
When the daemon applies an admitted effect, it issues a receipt: a signed object binding the effect (kind, operation, target), the admitting decision and its content-hashed policy, the exact inputs (arguments hash), and the applied result (content hash). The signature is Ed25519 over canonical bytes — compact JSON, sorted keys, signature excluded — under a purpose-scoped key the daemon generates at first boot, persists, and advertises.
The derivation
authority_granted is computed, never stored: it is true
exactly when an admitted decision has a bound receipt whose signature
verifies against a key the reader trusts and which binds that
exact record — same effect, same inputs, same result. Change a byte
and the proof fails. Present a receipt from one operation as proof for
another and the binding check refuses. Doctor the receipt's own
decision and the signature breaks — the signed decision is the
authoritative one, because asserted statuses are what this design
distrusts.
Invariants
The signed decision is authoritative for grants; verification
revalidates every required custody fact before a signature means
anything; receipts record denials and failures as readily as
successes, so persisted evidence is never left floating without an
outcome; and the lens (sidecat receipt explain) states
its trust boundary plainly — verifying against a node's advertised
key means trusting that node. Cross-node verification without trust
is future federation work, deferred by name.
Sidecat