The Enterprise Constitution
A machine-checkable format for the policy envelope an organisation grants an AI workforce: four clause types, the language a validator rejects, seven prohibitions no risk appetite removes, and a linter that fails a document that cannot say whether an action is permitted.
Version 0.1, draft, published 2026-08-11. A machine-checkable format for the policy envelope an organisation grants an AI workforce, with a validator that rejects a clause nobody could act on.
BvLogic operates no AI workforce and governs no enterprise systems. This specification and its validator exist before the product they would govern, deliberately: a governance format written by the party whose system it constrains is worth less once that system exists and the format becomes inconvenient.
The problem this exists for
The Autonomy Ladder says a system may only operate at Level 3 or above inside a written policy envelope agreed in advance. That requirement is easy to state and almost never met, because the documents organisations actually write are unenforceable: they use words no system can evaluate, they omit the limit that matters, and nobody can tell from reading one whether a given action is permitted. A constitution that cannot answer 'is this action allowed, yes or no' is a statement of values, and an AI workforce cannot execute values.
It is the missing half of the Autonomy Ladder. That specification says a system may act without asking only inside a written policy envelope agreed in advance. This is the envelope, in a form something can read.
The test every clause has to pass
A clause is worth writing only if two competent engineers, reading it independently, would agree on whether a specific proposed action is permitted. Everything in this format exists to force that. If a clause cannot be evaluated without asking its author what they meant, it is not a rule, and tools/constitution_lint.py is written to reject it rather than to be generous about it.
Four kinds of clause
automatic
The workforce may do this without asking anyone.
Every clause must carry: action, scope, limit, reversal, owner
An automatic clause with no scope permits the action everywhere. With no limit it permits it at any rate. With no stated reversal it permits something that cannot be undone. With no owner nobody is accountable when it goes wrong, and an unowned automatic permission is the single most dangerous line in any constitution.
approval
The workforce may prepare and propose this, and a named human commits it.
Every clause must carry: action, scope, approver_role, timeout_behaviour, owner
The approver must be a ROLE, not a person, or the constitution expires when they leave. Timeout behaviour must be stated and must default to refusal: an approval that auto-grants on silence is an automatic clause wearing a costume, and it is how approval fatigue becomes consent.
prohibited
The workforce may never do this, at any autonomy level, regardless of maturity.
Every clause must carry: action, scope, reason
The reason is required because a prohibition without one gets relaxed by the first person who cannot see why it exists. Prohibitions are the clauses most likely to be quietly removed during a busy quarter.
limit
A ceiling that applies across clauses: spend, rate, blast radius or concurrency.
Every clause must carry: metric, value, window, on_breach, owner
A limit with no stated breach behaviour is a metric. What happens at the ceiling - halt, escalate, or continue and alert - is the whole content of the rule.
Language the validator rejects
Every one of these reads as responsible and defers the decision to the moment when it is least likely to be made well. 'The system may take any action required to restore service' is not a policy; it is unlimited authority with a reassuring shape.
as appropriate · as necessary · where possible · reasonable · best effort · as required to restore service · any action required · at its discretion · significant · material · in a timely manner · minimise · appropriate approval
Prohibitions no risk appetite removes
A conformant constitution must carry all seven, because the cost of being wrong is not recoverable by the rollback every other clause depends on.
modify_identity_or_entitlementsdelete_data_without_tested_restorecommit_funds_or_contractsalter_records_an_auditor_treats_as_a_controldisconnect_production_outside_a_named_environmentact_on_safety_critical_systemscommunicate_externally_on_behalf_of_the_organisation
What happens when no clause matches
- An action not matched by any clause is REFUSED, not permitted. A constitution is an allowlist; a denylist grants everything nobody thought of.
- An action matched by both an automatic clause and a prohibition is PROHIBITED. The stricter clause wins and the conflict is reported, because a conflict means the document disagrees with itself and somebody should know.
- Escalation names a role and a route that does not depend on the systems under management. A pager that runs on the cluster the incident is in is not an escalation path.
- Every refusal is logged with the clause that caused it. A constitution nobody can see working is one nobody will trust enough to widen.
Review
- Every clause carries a review date. An expired clause is treated as REFUSED until renewed, which is the only review mechanism that survives a busy quarter.
- Widening a clause requires the owner named on it, and the change is recorded with what changed and why.
- The constitution is versioned and diffable. A governance document that cannot be diffed cannot be audited.
A clause that passes
From the worked example. Every figure in that file is illustrative and composed to exercise the format; it is not a real organisation.
type | automatic |
action | scale_replicas |
scope | The production web tier only, between 4 and 24 replicas |
limit | One scaling action per 10 minutes, maximum 3 steps per hour |
reversal | Scale back to the prior replica count, executed by the same loop and tested weekly |
owner | Platform engineering lead |
review | 2027-02-11 |
Run it against your own
The validator is the specification. A document that passes it can answer whether a given action is permitted; one that fails cannot, and the failure names the reason rather than the line.
python tools/constitution_lint.py --example
python tools/constitution_lint.py --file your-constitution.json
Run against a constitution written the way most of them are, it returns thirteen failures: an automatic clause scoped to the whole estate, a limit reading “as necessary”, an approval that grants itself after twenty-four hours of silence, all seven required prohibitions absent, and an unmatched action defaulting to permit. Each of those is a sentence that reads as responsible and grants unbounded authority.
How this format gets gamed
- One enormous automatic clause with a scope of 'the estate', which is Level 4 autonomy with a signature under it.
- Approvals routed to a role that approves everything, making the ratio of approvals to rejections the real measure rather than the clause.
- Prohibitions written for things the organisation was never going to do, so the list looks strict and constrains nothing.
- Limits set far above any plausible action, which satisfies an auditor and binds nothing.
- Review dates set five years out, so the document is technically current and factually abandoned.
Questions to ask
- Show me a clause. Would two of your engineers agree on whether a specific action is permitted by it?
- What is your ratio of approvals to rejections, and if nothing is refused, what is the approval step for?
- What happens to an action no clause matches: refused, or permitted?
- Which clauses expired this quarter, and what happened to the actions they governed?
- Who widened a clause last, and where is that recorded?
- What does your escalation route depend on, and is any of it running on the systems it would be escalating about?
Status
Version 0.1, draft. One organisation publishing a specification is a proposal. It becomes a standard when somebody outside this company runs their own constitution through the validator and tells us which clause it wrongly rejected.
Everything here is free and stays free. There is no form in front of any document. If you want to know when new guides and templates go up, leave an email.
Roughly monthly. Unsubscribe in one click. We do not share your address, and we will not call you.