Skip to Content
Numinance
Guides

Choose an autonomy level

Decide defaults, rules, floors and scope caps for an AutonomyPolicy, with a worked resolution of the organization example.

View as .mdUpdated
Available in public spec

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.

Autonomy is a level you choose per kind of change, and a ceiling you set per kind of risk. The highest configured level never bypasses a matching floor.

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:

LevelWhat the contract says
AUTONOMY_LEVEL_OBSERVEReads only.
AUTONOMY_LEVEL_SUGGESTProposes and writes nothing.
AUTONOMY_LEVEL_IMPLEMENTWrites in a sandbox.
AUTONOMY_LEVEL_PROpens pull requests.
AUTONOMY_LEVEL_MERGEMerges when policy allows.
AUTONOMY_LEVEL_STAGEDeploys to pre-production.
AUTONOMY_LEVEL_RELEASEDeploys to production.
AUTONOMY_LEVEL_OPERATERuns 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, 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.

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:

validate the example
go run ./cli/numi validate --files schemas/examples/AutonomyPolicy
revision: "files"
ok       file "org-ladder.yaml" AutonomyPolicy "org-ladder"
✓ verifiednumi validate --files on the AutonomyPolicy example· numinance-spec @ 3c74d59 · 2026-11-09· 0
schemas/examples/AutonomyPolicy/org-ladder.yaml
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

ChangeMatching rulesAfter rulesMatching floorsResult
Low-risk dependency-upgradeThe MERGE ruleMERGEThe production floor (a change with no environment value counts as a match in a floor) caps at MERGEMERGE
Medium-risk dependency-upgradeNone, risk is not LOWDefault PRProduction floor caps at MERGEPR
Low-risk bugfixNoneDefault PRProduction floor caps at MERGEPR
High-risk change of any playbookNoneDefault PRHigh-risk floor caps at SUGGESTSUGGEST

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?

Illustrative · simulated
Scenario
Playbook
Risk
Environment
Rule level (what-if)
  1. OPERATE
  2. RELEASE
  3. STAGE
  4. MERGErequestedeffective
  5. PR
  6. IMPLEMENT
  7. SUGGEST
  8. OBSERVE
Effective level AUTONOMY_LEVEL_MERGE

The dependency-upgrade rule matches and requests MERGE. No floor matches, so nothing lowers it.

  1. 1 · Default
    defaults.level = PR (overridden by the matching rule)
  2. 2 · Rule: dependency-upgrade, LOW → MERGEmatched
    playbook (resolver context): dependency-upgrade ✓ · risk (exact): LOW ✓
  3. 3a · Floor: risk HIGH or higher → max SUGGESTnot matched
    risk (resolver context): LOW; a floor matches that class and every higher one.
  4. 3b · Floor: environment production → max MERGEnot matched
    environment (resolver context): a different environment.
  5. 4 · Result
    min(requested MERGE, lowest matching floor none) = MERGE
schemas/examples/AutonomyPolicy/org-ladder.yamlreal example
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} (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.
✓ matched■ reachable rung✕ blocked by a floor▤ real org-ladder example
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 none for 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_ONLY is a breaker position, not a ladder level. See Circuit breaker.

Next steps

On this page