Security

What an agent actually holds, where your systems' credentials live, and how to check a Tier Two signature without calling us.

What an agent holds

  • An OAuth token for Tier Two, issued to one member of your workspace and one client. Not a credential for any of your systems.
  • Nothing else. There is no key to paste, so there is no key to leak in a screen share, a config file, or a chat log.
  • Revoking the agent stops the token; the change reaches the endpoint within a minute.

Where your systems' credentials live

In an encrypted vault on the server, AEAD-encrypted at rest, with one write path and one decrypt path. A shared workspace key is decrypted only for the call that needs it and used in process to forward it. It never reaches a device. Per-person tokens are brokered and revocable.

The decision path

  • A tool with no mode is not offered and not allowed. Unknown means no.
  • A tool set to Block is hidden from the agent's tool list; calling it anyway is a refusal with a ledger row.
  • An Ask is held server-side until a person decides. Nothing is forwarded on a timeout.
  • A refusal names its reason, and both the attempt and the reason are in the ledger.

Verify a Tier Two authorization offline

Where Tier Two issues a signed authorization for a downstream system to check itself, it is an Ed25519-signed JWT (EdDSA) with iss=https://trytiertwo.com. Verify it against the published key set with any JOSE library: no API key, no callback to us, and no network call on your hot path once the keys are cached.

import { createRemoteJWKSet, jwtVerify } from "jose";

const jwks = createRemoteJWKSet(
  new URL("https://trytiertwo.com/.well-known/jwks.json"),
);

// Fails closed: expired token, unknown key, wrong issuer all throw.
const { payload } = await jwtVerify(token, jwks, {
  issuer: "https://trytiertwo.com",
});

Standard JOSE. Rotation is handled by the key set.

The keys are public: /.well-known/jwks.json.

Verification fails closed. An expired token, an unknown key id, or the wrong issuer all throw. Treat any error as a refusal rather than falling back to allowing the call.

What we have not built

Listed, and kept current, on the security page. Found a problem? jordan@trytiertwo.com.