| Signed governance record |
Actors, delegations, machines, seats and capabilities in one Ed25519-signed, append-only log. Every human-readable registry is a projection of it — regenerable, never a source. |
The whole governance history, verifiable by a third party holding only the root public key — without trusting the machine that produced it. |
| Human gates, no exceptions |
No auto-accept, no auto-merge, no timeout-as-consent anywhere in the product. A gate decision has no default value and is refused out of order. The engine transports; it never judges. |
One gate row per decision: the actor, the decision from a closed vocabulary, the time. “Merged” is never declared — only observed from a real merge commit. |
| Tamper-evident decisions |
Each acceptance is a keyed, verified tuple, re-checked at merge. Edit any field afterwards and the verification breaks. |
The tuple and the result of its check at merge. |
| Suggestion ≠ decision |
A consultation — AI or human — is recorded as judgment; the decision is the human’s own act; an override of the suggestion is itself recorded. |
Distinct recommendation and decision rows per gate — not only what was decided, but what was recommended and by whom. |
| Machine identity by certificate |
No registration endpoint, no join token. A machine is admitted by an explicit owner act with certificate binding; the control plane connects outward only, and runners hold no credential to it. |
The admission act in the signed log; the certificate chain. |
| Delegated, bounded authority |
Root-signed delegations with scope, work streams and a validity window. Expiry is a ceiling, never a trigger; retiring an actor takes effect immediately, regardless of any unexpired grant. |
The delegation, signature over every field — who granted what to whom, until when. |
| Ratified standing law |
The documents that govern how work is done are root-signed into a serial-numbered manifest. Any document verifies back to the root; an agent works under law it can be shown to have received. |
The manifest, and each run’s record of which law was injected — with its hash. |
| OS-level run confinement, local |
Deny-by-default write policy from the operating system’s own sandbox — Seatbelt on macOS, Bubblewrap on Linux — composed for each run before the agent starts. A missing sandbox facility refuses the run instead of degrading it. |
The run record names the tool that confined it and the directories that stayed writable — a claim your team can reproduce. |
| OS-level run confinement, remote |
Kernel-enforced (Landlock) confinement for SSH-dispatched runs. A machine’s confinement capability is measured before work is routed there; a machine not measured, or measured incapable, refuses the run. |
The measured capability on the machine’s signed row; the run record naming what enforced. |
| Outbound access is a list |
A run that declares an egress policy reaches the network only through a door that policy governs: a destination is admitted only if the policy admits both host and port, and the default admits nothing. A host that cannot be cut refuses the run rather than starting it open. Opt-in per dispatch in this release — there is no fleet-wide default yet, and we say so. |
The compiled policy’s digest on the run’s row — which list governed this run. Per-connection judgements are not yet recorded; that is a stated limit of this release, not of the design. |
| No lateral agent channels |
Agents coordinate only through recorded surfaces — orders, channel files in the stream’s own worktree ingested into the record, gates, an insert-only mailbox for the owner’s directives. No agent-to-agent messaging exists in the product. |
“Who told whom what, when” is a query, not an interview — the coordination history of a stream, replayable from the record. |
| Refusals as data |
Every refusal — engine, authorization, schema, policy — is a recorded, zero-cost row with a named class. Denial causes are logged, never returned over the wire. |
The refusal ledger: the controls firing, not merely existing. |
| Monitoring — a Prometheus target |
The serving daemon exposes GET /metrics in the standard Prometheus text format: runs by status and backend, refusals by class, gate decisions by gate and decision, store schema version. Label values are class names only — never stream names, paths or actor names. |
Refusals as a first-class metric — on this architecture a refusal is a security signal, not noise. Scraped by the Prometheus you already run; nothing to install. |
| Secrets never propagate |
No subsystem stores or transmits a secret value — variable names and paths only, enforced in the type system. Key files are custody-checked before their contents are ever read. |
Configuration by name. No value in any record, log or export. |
| OAuth 2.1 on the management surface |
Bearer-gated. Team authenticates through the Saphan-operated saphan-oauth SaaS. Enterprise runs saphan-oauth locally or admits any customer IdP through a human-gated issuer trust list. Scope classes, tenant row-level slices, fail-closed by default. |
An audit-grade access log on every transport — honest status codes for wrapped refusals, no values or query strings ever logged. |
| Cost governance |
Per-run quote and hard cap set before dispatch; capacity checked before the run starts; billing classes on seats. Actuals and drift land next to the evidence, not on a separate invoice. |
The cost ledger, per stream and per gate — “what did this change cost” gets the same one-line answer as “who approved it”. |
| Supply-chain pinning |
Agent binaries are delivered with a digest computed on the receiving machine, and identity is re-resolved where they execute. |
Per run: binary digest, version, configuration hash, the standing law injected and its hash. |
| Your record store |
A PostgreSQL record store on infrastructure you control, configured by name, credentials by variable name only. Code, run evidence and the operational record do not transit Saphan infrastructure. Team sends identity to Saphan-operated OAuth; Enterprise keeps identity local. Both can use mobile notification signalling carrying only an opaque gate id and badge count. |
Your database, plus plain files in your git. Readable without our tooling. |
| Conformance, not assertion |
End-to-end scenarios run against the real binary: gate discipline, dispatch locking, injection resistance, misrouted instructions, the OAuth flow, bearer gating, projection parity. |
The conformance results, reproducible on your deployment. |