#307 deleted the two dead vault-broker edges because nothing ever emitted the route. This issue builds the road that should have carried them — with a delivery model that survives our own trace architecture.
Why plain delivery is impossible here: the colony journals every message body (message_log, blob offload). A plaintext credential on a normal message would be journaled forever. So delivery is sealed end-to-end:
- The consumer cell (proxy, llm) generates an ephemeral X25519 keypair per request and sends the public half with its policy-gated request.
- The vault answers with a sealed box (X25519 + XChaCha20-Poly1305 — the same cipher family it already speaks at rest) over the normal reply edge.
- The consumer unseals in RAM only, uses the credential (bearer header), never persists it. Forward secrecy: the ephemeral private half is gone before anyone can read the log.
- No long-lived vault keypair is needed: topology + policy decide who may ask, and the reply rides the established edge — the topology is the authenticity. A vault signature can be retrofitted later.
Scope: the `deliver sealed` vault op (behaviour-changing on a sealed cell → regression lock per the sealed-substrate taxonomy), the broker request path in `invoke` plus the two edges back, the consumer side in the proxy and llm cells, and the migration of the shipped credential knobs onto vault-backed delivery so `.env` shrinks toward the vault passphrase.
Acceptance pin: at no point does a plaintext secret appear in the message_log or in any blob — asserted by test over a full E2E round.
#307 deleted the two dead vault-broker edges because nothing ever emitted the route. This issue builds the road that should have carried them — with a delivery model that survives our own trace architecture.
Why plain delivery is impossible here: the colony journals every message body (message_log, blob offload). A plaintext credential on a normal message would be journaled forever. So delivery is sealed end-to-end:
Scope: the `deliver sealed` vault op (behaviour-changing on a sealed cell → regression lock per the sealed-substrate taxonomy), the broker request path in `invoke` plus the two edges back, the consumer side in the proxy and llm cells, and the migration of the shipped credential knobs onto vault-backed delivery so `.env` shrinks toward the vault passphrase.
Acceptance pin: at no point does a plaintext secret appear in the message_log or in any blob — asserted by test over a full E2E round.