Architecture

Four layers, meeting only at the Verdict struct — frozen in packages/seam.

Truth

The Graph

The Graph

@bonded/standardized

Live — every proposal through /api/v1/proposals

Re-derives every claimed premise from Messari-standardized subgraphs through the Graph Gateway, at a single pinned block. cache: no-store on the enforcement path — a stale premise is a correctness bug, not a latency optimisation.

Enforcer

— (non-generative core)

@bonded/enforcer

Live — 44 unit tests, the same function the API calls

Zero LLM calls, never sees prompt text. Six-step fail-closed algorithm: policy hash -> forbidden action -> premises -> budget -> irreversible threshold -> clear. This is the product.

Authority

Chainlink CRE

Chainlink CRE

@bonded/authority

Deployed and invoked — enclave verdict pending Chainlink provisioning

A handlerInTee workflow reads irreversible_above as a Vault DON secret inside an AWS Nitro enclave and returns only a boolean, so the threshold cannot be binary-searched by probing the enforcer. Deployed and ACTIVE on the CRE DON as bonded-stepup-threshold-staging (id 00771462…, registered in the Workflow Registry on Ethereum mainnet), and the enforcer calls it: every proposal over the line issues a JWT signed by the enrolled key to the CRE gateway, and those invocations appear in cre execution list. Chainlink currently returns the execution asynchronously and its confidential-workflow DON reports "DON members not set" — private beta provisioning on their side — so the enclave cannot yet return a verdict in time to decide. requiresStepUp then falls back to comparing the policy artifact, and every response says which path decided it. The seam fails closed by design: set CRE_REQUIRE_ENCLAVE=true and an unreachable enclave holds instead.

Settlement

Arc

Arc

contracts/BondedVault.sol

Live — real verdicts settled on Arc testnet, see /log

Holds USDC. settle() accepts only a signed Verdict, in strict mark -> check -> call -> settle -> emit order. HELD_FOR_STEPUP cannot execute via settle() alone — confirmStepUp() requires a separate, independently verified confirmation.

The seam

interface Verdict {
  proposalHash: Hash32;
  policyHash:   Hash32;
  outcome:      0 | 1 | 2;   // CLEARED | REFUSED | HELD_FOR_STEPUP
  reasonCode:   ReasonCode;  // enumerated, never a free string
  blockChecked: bigint;
  logRef:       Hash32;
}

reasonCode is an enum, never a free string — free strings are how injected text reaches a UI. Defined in packages/seam/src/types.ts, frozen after the seam-v1 tag.