Choose an autonomy level
Decide defaults, rules, floors and scope caps for an AutonomyPolicy, with a worked resolution of the organization example.
The AutonomyPolicy document and its schema are public and validate with the open CLI. Resolving a level for a live change is performed by the proprietary engine, which is not generally available.
When to use this
Use this guide before you raise any repository above the pull-request level, and again when you add a new playbook. The decision is policy, written as a reviewed document. "Your policy decides. Not the model."
The ladder
AutonomyLevel has eight values, in this order:
| Level | What the contract says |
|---|---|
AUTONOMY_LEVEL_OBSERVE | Reads only. |
AUTONOMY_LEVEL_SUGGEST | Proposes and writes nothing. |
AUTONOMY_LEVEL_IMPLEMENT | Writes in a sandbox. |
AUTONOMY_LEVEL_PR | Opens pull requests. |
AUTONOMY_LEVEL_MERGE | Merges when policy allows. |
AUTONOMY_LEVEL_STAGE | Deploys to pre-production. |
AUTONOMY_LEVEL_RELEASE | Deploys to production. |
AUTONOMY_LEVEL_OPERATE | Runs operations against production. |
A level is a ceiling on what a change may do. It is not a grant on its own: a grant is derived per step from the profile, the playbook step, the risk class and the level, and an agent cannot widen it. See Autonomy levels.
Defaults, rules and floors
An AutonomyPolicy spec has three parts, and they play different roles.
Prop
Type
A match has three optional keys: playbook, risk and environment. An absent key matches every value. The semantics differ between the two uses:
- In a rule,
riskmatches exactly, and a key the change has no value for does not match. - In a floor,
riskmatches that class and every higher one, and a key the change has no value for counts as a match.
Resolution is two steps. The level is the lowest level among the matching rules, else the default. Then no level may exceed the lowest max_level among the matching floors. That ordering is the whole safety argument: the highest configured level never bypasses a matching floor.
Org, repository and component scope
Resolution loads org, then repository, then component. Two properties follow from the contract.
- Rules narrow or replace. A narrower scope's rule list replaces the wider one. A repository can therefore lower its own level, or choose a different level than the org rule, for its own changes.
- Floors only come from above. A floor set below the org scope is refused. No rule of any scope, including a component, resolves a change above the org floors or any control pack's floors. If the org sets none, the engine's shipped floor applies: Suggest for HIGH and PRIVILEGED, PR for the rest. Pack floors only add caps.
The practical rule: put ceilings in the organization policy repository, put aspirations in repository or component rules, and let the floors arbitrate.
Validate the organization example
The spec ships an organization-scoped ladder. Validate it with the open CLI:
go run ./cli/numi validate --files schemas/examples/AutonomyPolicyrevision: "files"
ok file "org-ladder.yaml" AutonomyPolicy "org-ladder"apiVersion: numinance.dev/v1
kind: AutonomyPolicy
metadata: {name: org-ladder, scope: SCOPE_ORG}
spec:
defaults: {level: AUTONOMY_LEVEL_PR}
rules:
- {match: {playbook: dependency-upgrade, risk: RISK_CLASS_LOW}, level: AUTONOMY_LEVEL_MERGE}
floors:
rules:
- {match: {risk: RISK_CLASS_HIGH}, max_level: AUTONOMY_LEVEL_SUGGEST}
- {match: {environment: production}, max_level: AUTONOMY_LEVEL_MERGE}--files checks the schema and the loader only. It does not resolve levels for a change, so the table below is derived by reading the rules above under the match semantics, not by running a resolver.
Worked resolution
| Change | Matching rules | After rules | Matching floors | Result |
|---|---|---|---|---|
Low-risk dependency-upgrade | The MERGE rule | MERGE | The production floor (a change with no environment value counts as a match in a floor) caps at MERGE | MERGE |
Medium-risk dependency-upgrade | None, risk is not LOW | Default PR | Production floor caps at MERGE | PR |
Low-risk bugfix | None | Default PR | Production floor caps at MERGE | PR |
| High-risk change of any playbook | None | Default PR | High-risk floor caps at SUGGEST | SUGGEST |
Low-risk examples are reversible, narrowly scoped changes with strong automated checks: a lockfile bump, a documentation fix. High-risk examples affect production or are hard to reverse. The ladder lets you be generous in the first group and strict in the second without writing exceptions into agent behavior.
Explore the policy
Autonomy policy explorer
Given defaults, rules and floors, what is the highest level this change may reach?
- OPERATEoperations against production
- RELEASEdeploys to production
- STAGEdeploys to pre-production
- MERGEmerges when policy allowsrequestedeffective
- PRopens pull requests
- IMPLEMENTwrites in a sandbox
- SUGGESTproposes, writes nothing
- OBSERVEreads only
The dependency-upgrade rule matches and requests MERGE. No floor matches, so nothing lowers it.
- 1 · Defaultdefaults.level = PR (overridden by the matching rule)
- 2 · Rule: dependency-upgrade, LOW → MERGEmatchedplaybook (resolver context): dependency-upgrade ✓ · risk (exact): LOW ✓
- 3a · Floor: risk HIGH or higher → max SUGGESTnot matchedrisk (resolver context): LOW; a floor matches that class and every higher one.
- 3b · Floor: environment production → max MERGEnot matchedenvironment (resolver context): a different environment.
- 4 · Resultmin(requested MERGE, lowest matching floor none) = MERGE
apiVersion: numinance.dev/v1kind: AutonomyPolicymetadata: {name: org-ladder, scope: SCOPE_ORG}spec:defaults: {level: AUTONOMY_LEVEL_PR}rules:- {match: {playbook: dependency-upgrade, risk: RISK_CLASS_LOW}, level: AUTONOMY_LEVEL_MERGE}(matched)floors:rules:- {match: {risk: RISK_CLASS_HIGH}, max_level: AUTONOMY_LEVEL_SUGGEST}- {match: {environment: production}, max_level: AUTONOMY_LEVEL_MERGE}
- Kernel floors are always on. They sit under every policy and no rule or default removes them.
- The highest configured level never bypasses a matching floor. Floors cap; they are not suggestions.
- Promotion is proposed, then accepted. Evaluation may propose a higher level; a human accepts it. An agent never grants itself a rung.
Text description
The ladder is the AutonomyLevel enum, lowest to highest: OBSERVE (reads only), SUGGEST (proposes, writes nothing), IMPLEMENT (writes in a sandbox), PR (opens pull requests), MERGE (merges when policy allows), STAGE (deploys to pre-production), RELEASE (deploys to production), OPERATE (operations against production).
Resolution follows AutonomyPolicySpec: the level is the lowest level among matching rules, else defaults.level; then no level above the lowest max_level among the matching floors. The example policy is org-ladder: default PR; one rule (playbook dependency-upgrade and risk LOW sets MERGE); two floors (risk HIGH or higher caps at SUGGEST; environment production caps at MERGE).
- In a rule, risk matches exactly and a key the change has no value for does not match.
- In a floor, risk matches that class and every higher one, and a key the change has no value for counts as a match, which is why the toggle
nonefor environment still matches the production floor. - The playbook, risk and environment values are the resolver context of the change. They are not extra fields on a rule. The what-if rule level only changes the simulation; the YAML shown is the real example text.
- Kernel floors are always on. Promotion to a higher level is proposed by evaluation and accepted by a human, and is never self-granted.
- An org with no floors gets the shipped floor (SUGGEST for HIGH and PRIVILEGED, PR for the rest); control-pack floors can only add caps.
Everything here is simulated in the browser from the example policy. Nothing is connected to a running engine.
Promotion is human-accepted
Raising a playbook's level is a promotion. The design is that qualification statistics from past runs propose it, thresholds come from the playbook's qualification block, and a human accepts it by approving a policy change. An agent cannot promote its own autonomy, cannot edit .numinance/policy/, and cannot lower a floor. See Qualify autonomy.
Failure modes and safeguards
- A floor in a repository document. Refused at load. Move it to the org policy repository.
- A rule above the floor. Not an error: the rule is simply capped. Check the floors when a level is lower than expected.
- An empty floor match. A floor match may not be empty, so to cap everything name the lowest risk class, as the generated org policy does with
RISK_CLASS_READ. - Level versus breaker.
PR_ONLYis a breaker position, not a ladder level. See Circuit breaker.
Next steps
Onboard a repository
Generate, validate and protect a Numinance configuration for a Python repository with the open numi CLI, then see how the engine would consume it.
Connect source control and CI
Bind the GitHub and GitHub Actions providers to a repository, understand how credentials stay out of the plugin, and know what a green validate does and does not prove.