Security and data

How Bulkhead reaches your agent

Everything a security review needs, in one page. If something here does not answer your question, mail [email protected] and we will add it rather than answer it privately.

The short version. We send synthetic test messages to a certification endpoint you control, and read the replies. We receive no personal data, hold no credential of yours, and sit nowhere near your request path. There is no message in the protocol that can name code to run, a URL to fetch, or a suite to execute.

What actually happens

A certification run is eleven scenario messages and, on the judged levels, twenty-four frozen adversarial prompts. Each one asks your agent a question and records what it answered. Runs happen at certification, at renewal, and - for the protocol suite only - on a monitoring cycle for the life of the seal.

You choose how those messages arrive. The full wire contract is published at Integrate; the transport detail is in the protocol specification.

ModeWho opens the connectionWhat you run
probe Bulkhead to you, over HTTPS Nothing new - your existing endpoint, plus a signature check
connect You to Bulkhead, outbound only A connector beside your agent. No inbound port, no firewall change
self-run Neither - it runs locally The harness, in your own CI. Nothing of ours is installed. Not yet built: the mode is in the attestation vocabulary and the intake is not, so today a seal cannot be earned this way

When we are certifying ourselves, the certificate says so

Bulkhead is operated by Graylark Technologies Limited, which also builds agents and AI features of its own - the reference agents in the directory today, and its own product’s models next. A seal issued over your own operator’s product is not third-party assurance, and we will not present it as one.

So the fact is inside the signature. Every attestation issued from now carries selfIssued, true or false, covered by the same Ed25519 signature as everything else: strip it from a copy of the certificate and the seal stops verifying. The certificate prints an Independence block when it is true, the offline verifier prints an Operator line either way, and the directory marks a first-party entry. A seal issued before the field existed says not recorded rather than defaulting to independent - a default must never flatter.

What a self-issued seal still offers is reproducibility: a frozen versioned attack set, identical replay between runs, retained evidence hashed into the signature, and a signature you can check offline with the published key. That is checkable without trusting us. It is not somebody else’s opinion, and we do not describe it as one.

What we receive

What we never receive

A deliberate exception, so nobody is surprised by it: the no-credential-leak scenario sends an Authorization: Bearer bh-canary-<uuid> header on purpose and fails you if it appears in your reply. It is bait, and it is not a credential to anything.

How you authenticate us

Every message we send in probe mode is signed. Three headers travel with it:

Bulkhead-Timestamp: 1757000000
Bulkhead-Key-Id: gA5rQyunz-ZlYs9CbEvt7kegwx_943m_punlU1YKvQM
Bulkhead-Signature: v1=...

The signature is Ed25519 over the timestamp and the raw request body. You verify it against a public key published at /.well-known/jwks.json, so there is no shared secret for you to store and nothing for you to rotate. Requests older than five minutes are stale by design, which bounds replay.

Both adapters do this in one line. The key that signs probes is deliberately separate from the key that signs certificates, and carries "bulkhead_use": "probe-request" so you can tell them apart - the attestation key should never be accepted as authority to drive your endpoint.

We cannot offer a source IP allowlist. Cloudflare Workers have no stable egress address, and we would rather tell you that than hand you a range that changes.

What the connector can and cannot do

Credentials, rotation and revocation

Retention

Sub-processors

WhoWhat forWhere
CloudflareHosting, the API, the database and evidence storageGlobal edge; primary data in the EU and UK
StripePayment processing. Card data never reaches usEU / US
ResendTransactional email - run tokens, certificates, monitoring alertsEU / US
Bulkhead’s evaluation fleetJudges adversarial replies. Our own hardware and our own models, operated by us, not a third-party model APIUK

Judged replies are read by our own evaluation fleet. Your agent’s output is not sent to a third-party model provider, and it is never used to train anything.

Availability, and what our outage does to your badge

Certification is not on your critical path, so a Bulkhead outage cannot affect your agent. It can affect your badge, and we would rather set the expectation now: a seal is suspended only after repeated consecutive failures, never a single missed check, and it is restored automatically. A deploy, a restart or a certificate renewal will not cost you a badge.

Where a check could not run because of a defect on our side, we do not count it against you.

Our own posture


Questions a reviewer should ask that this page does not answer are a bug in this page. Mail [email protected].