Skip to main content
A grant says what an agent may do. A contract says what its owner expects it will do — and unlike a grant, a contract is checked after the fact, against the decisions that actually happened.
Each of those is one clause. A contract is a set of them, declared by a named person with a stated basis, and assessed over a window of real traffic.

Why a closed vocabulary

There are nine clause types and you cannot write a tenth without changing the platform. That is deliberate, and it costs less than it sounds. A general policy language — Rego, Cedar, CEL — would buy expressiveness and lose three things this product is built on:
A signature over 200 lines of policy is not an attestation, because the person signing cannot hold the whole of it in their head. Every clause here renders as one line a manager can be held to, and that line is what they sign.
A revision has to be checkable against the contract in force. For numbers and sets that is arithmetic. For arbitrary predicates it is implication testing, which is not decidable in general — so “is this revision weaker?” would become a question with no answer.
A predicate returns true or false. That collapses held, breached and not demonstrated into “no errors were raised”, which is the vacuous signal this platform refuses everywhere.

What a clause is not

A clause is distributional. It describes a population of decisions over a window, not a single action. “No single refund above 500” is not a clause — it is a bound, evaluated at the moment of the decision, and the platform already enforces it there. “Refuses at most 5% of the time” cannot be evaluated at the moment of a decision at all; there is no population yet. That split is why a breach is a finding, not a refusal. Acting on a contract at decision time would refuse an action because of a population it had not yet joined. What refuses at decision time is the grant.

The three states

held

The evidence shows the clause was kept.

breached

The evidence shows it was not.

not demonstrated

This window cannot tell those apart. Not a pass.
The third state is decided by a confidence interval, not by a comparison — see conformance claims. An agent at 5.4% against a 5% ceiling over 40 decisions is not breaching. It is unmeasured, and reporting it as a breach is how people learn to ignore breaches. One clause type has no minimum sample and should not: never_tools. “Never” is not a rate. A single call to a forbidden tool is a breach on its own evidence.

Revising a contract

Contracts are never edited. A revision supersedes the one in force, and the old one stays readable — what was promised in March has to survive April tightening it. Tightening is free. A manager who committed to “at most 5%” is not harmed by “at most 2%”, so no fresh declaration is needed. Loosening must say so. A revision that weakens a clause is refused unless it is declared deliberately, in somebody’s name. So is a revision that simply omits a clause the contract carries: silence is not a promise, and treating an omission as inheritance would let any revision drop any commitment by saying nothing.
This asymmetry is the whole control. If a contract could be edited in place, a breach could be resolved by widening the clause that was breached — which is the failure mode every configurable control has.

Declaring one

basis is required. A contract with no stated basis is a signature on a blank page, and the question an auditor asks is not whether somebody signed but what they thought they were signing.

The nine clause types

Every one reads a measure the platform already computes for behavioural drift. That is not a convenience: it is what makes a clause assessable against history, so the first question anybody asks about a new control — what would this have said last month? — has an answer.