Closes the four items v0.2 left open:
- Configured trust roots (SPEC §7, enforced): Runtime::trust_root(resource,
issuer) — an enforcement point honors only the root-issuer keys it was
configured with, authorized_keys shape, no CA. Unconfigured resources stay
open; once configured, a validly-signed grant or chain from an unlisted
root is denied with the new reason `untrusted-root`, on both decision paths.
- Self-contained chained receipts (SPEC §8.1): a receipt sealed for a
multi-hop chain records chain_ids — every grant id the decision debited,
root first — so replay_spend() re-applies leaf AND ancestor debits with no
external index. One-link receipts are byte-identical to before; published
vectors unchanged. The restored runtime provably keeps conserving.
- jcp-channel (11th crate, SPEC §4.5 OPTIONAL profile): receipt-settled
budget channels. N enforcement points spend optimistically against one
grant and settle by exchanging signed Statements of cumulative spend
(monotonic seq, non-decreasing spend, signature verified — forged, stale,
and regressing statements refused). Between settlements the exposure is
bounded by the window; after settlement the merged ledger binds and any
overdraft is provable from the signed statements rather than suspected.
Sharding remains the zero-overdraft baseline.
- FROST DKG (SPEC §2.2): ThresholdActor::dkg_keygen — distributed key
generation, so the group's private key never exists anywhere, not even
momentarily at a dealer. Same ordinary Ed25519 group key; different quorums
produce signatures under the same did:key.
Conformance grows to C1–C18. SPEC bumped to v0.3.0 draft (decision order now
includes the trust-root check; §4.5 specifies the Statement object). 62
tests, clippy clean, vectors byte-identical.
Co-Authored-By: Claude Opus 4.8 <[email protected]>