Publish a gate policy
const url = 'https://example.com/v1/gate-policies';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"id":"example","version":"example","agentId":"example","scope":{"kind":"tenant"},"spec":{"comparison":{"maxAgeHours":1,"suite":{"id":"example","version":"example"}},"evidence":{"minCases":1,"minWeight":1},"metrics":[{"name":"weightedYesShare","k":1,"minCandidate":1,"maxDrop":1}],"replay":{"maxDiverged":1,"maxErrors":1,"maxRefusedWrites":1,"maxStopped":1},"approvals":{"role":"standard","separateApprover":true},"onlyRestrictedClasses":true},"description":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/v1/gate-policies \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "id": "example", "version": "example", "agentId": "example", "scope": { "kind": "tenant" }, "spec": { "comparison": { "maxAgeHours": 1, "suite": { "id": "example", "version": "example" } }, "evidence": { "minCases": 1, "minWeight": 1 }, "metrics": [ { "name": "weightedYesShare", "k": 1, "minCandidate": 1, "maxDrop": 1 } ], "replay": { "maxDiverged": 1, "maxErrors": 1, "maxRefusedWrites": 1, "maxStopped": 1 }, "approvals": { "role": "standard", "separateApprover": true }, "onlyRestrictedClasses": true }, "description": "example" }'Registers a gate policy, or a new version of one: what a promotion of agentId for scope must show. One policy per agent and scope: another policy id for a scope that has one is refused with 409 gate-policy-scope-taken (details.heldBy names it; publish a new version of that one instead), and a new version can’t change the agent or scope (409 gate-policy-scope-changed). The spec is checked strictly: an unknown key is refused (400 validation-failed, details.issues). Needs admin on the tenant: whoever may promote can’t loosen their own gate.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Caller-supplied idempotency key, scoped to the caller: the same key from someone else in the tenant is their own request (from 0.1.5). Retries with the same key return the original response byte-identical (per docs/API-ROUTE-CONVENTIONS.md §3.1). A retry sent while the first request still runs is answered 409 idempotency-key-in-flight with Retry-After, on a runtime whose store holds keys (from 0.1.5); retry after it, and you get the first request’s answer. An answer that carries a secret (a new API key or public run token, a session token, a generated signing secret) isn’t kept: a retry gets 409 idempotency-key-replay-withheld, with the first request’s status and when it succeeded (from 0.1.5).
Request Bodyrequired
Section titled “Request Bodyrequired”object
Yours to choose, e.g. acme.drafting-prod.
The agent’s default for the whole tenant.
object
An org’s projects.
object
One project.
object
A segment path within a project: it covers every run whose path starts with it.
object
object
Lowercase, like an identifier: company, contact-role.
What a promotion must show. Every part is optional; an empty spec checks nothing. A promotion must name a comparison (evalRunId) exactly when the spec has comparison, evidence, metrics, replay or onlyRestrictedClasses. Unknown keys are refused.
object
object
object
The judged evidence behind each gated metric; for a metric with maxDrop, the baseline’s too.
object
object
weightedPrecisionAtK only: the summary’s k must be this.
How far the candidate may fall below the baseline (the live version).
Each knob left out of the block is 0. No block: no replay checks.
object
A passing promotion waits for a reviewer.
object
Default senior.
Default true.
Only restricted judge classes count: the comparison must be weighted restricted-only, so a class anyone may assert can’t move the gate.
Responses
Section titled “Responses”Gate policy published.
object
The agent’s default for the whole tenant.
object
An org’s projects.
object
One project.
object
A segment path within a project: it covers every run whose path starts with it.
object
object
Lowercase, like an identifier: company, contact-role.
What a promotion must show. Every part is optional; an empty spec checks nothing. A promotion must name a comparison (evalRunId) exactly when the spec has comparison, evidence, metrics, replay or onlyRestrictedClasses. Unknown keys are refused.
object
object
object
The judged evidence behind each gated metric; for a metric with maxDrop, the baseline’s too.
object
object
weightedPrecisionAtK only: the summary’s k must be this.
How far the candidate may fall below the baseline (the live version).
Each knob left out of the block is 0. No block: no replay checks.
object
A passing promotion waits for a reviewer.
object
Default senior.
Default true.
Only restricted judge classes count: the comparison must be weighted restricted-only, so a class anyone may assert can’t move the gate.
Example
{ "scope": { "kind": "tenant" }, "spec": { "metrics": [ { "name": "weightedYesShare" } ], "approvals": { "role": "standard" } }}Validation failed (see details.issues).
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Missing / malformed / expired / revoked bearer token.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}gate-policy-already-registered: that (id, version) exists. gate-policy-scope-taken: another policy gates the agent for the scope (details.heldBy). gate-policy-scope-changed: the version would change the agent or scope. gate-policy-scope-unpinned: the scope has no live version of its own; a gated scope holds its own pin (a pin above it is not enough, since a promotion there would change this scope ungated), so pin a version for the scope first.
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}Server error (unmapped domain code or framework crash).
object
object
Stable machine-readable discriminant. Values match domain error codes (see docs/API-ROUTE-CONVENTIONS.md §4.3).
Optional, kind-specific.
object
Server-assigned request id; also echoed via X-Request-Id header.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": {}, "requestId": "example" }}