Skip to Content
Numinance
Architecture

Authority and policy

How a policy decision point outside the model, scoped grants, a credential broker and four separate identities bound what an agent can do.

View as .mdUpdated
Under development

The decision point, broker and breaker are part of the proprietary runtime. The principal kinds and autonomy levels are public types.

Your policy decides. Not the model.

Explorer

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.

Decision point

Before any privileged action the runtime asks a policy decision point, outside the model, for a decision of allow, deny or require approval. The input names the action and its risk, the actor and its kind, the change and its state, the autonomy level and floor, residency, remaining budget, present and required evidence and the digests of the profile, policy and plan. The result carries reasons, obligations such as extra evidence or dual control, approver constraints that exclude the author, and a decision identifier recorded in evidence. Floors are evaluated first and default to deny. Policy bundles are signed and verified at load; customer floors cannot be overridden by lower scopes.

Autonomy ladder

The ladder is AUTONOMY_LEVEL_OBSERVE, _SUGGEST, _IMPLEMENT, _PR, _MERGE, _STAGE, _RELEASE and _OPERATE. A level is set per scope with inheritance and floors. Promotion is proposed from qualification statistics and accepted by a human; it is never automatic. The sandbox profile of the host also caps the effective level.

Grants

A grant derives capabilities, resource scope, budgets, residency class, environment scope and expiry from the profile, playbook step, risk and level. It is immutable. A run can request a narrower grant for a sub-step and never a wider one. Every capability call and credential handle references its grant.

Capability broker

The broker converts a grant plus a plugin's credential intent into the minimum material for one step: short-lived scoped sessions, or an injection rule for the egress proxy so the sandbox never sees bearer material. Handles expire with the step and are revoked on completion or breaker trip. The model never receives reusable credentials.

Four identities

IdentityPrincipalKindCanCannot
Author agentPRINCIPAL_KIND_AUTHOR_AGENTWrite in its sandbox, open pull requestsApprove, merge its own work, edit protected paths
Reviewer agentPRINCIPAL_KIND_REVIEWER_AGENTRead-only review on a different model vendorWrite, issue the verdict alone
Release pipelinePRINCIPAL_KIND_RELEASE_PIPELINEMerge and deploy where policy allowsAuthor the change it releases
Human approverPRINCIPAL_KIND_HUMAN_APPROVERApprove where requiredApprove their own change

The runner (PRINCIPAL_KIND_RUNNER) writes evidence and holds no customer credentials. Break-glass (PRINCIPAL_KIND_BREAK_GLASS) is a named human, time-boxed, and impossible for any agent identity to invoke.

Policy denies an approver that equals the author, or that shares the author's run, structurally. Only the release pipeline deploys; deploy credentials are absent from the coding sandbox.

Circuit breaker

The breaker has four positions: full automation, PR only, read only and stopped. It can be tripped by a human, an incident detector, budget or policy anomalies, an evidence-write failure or provider drift. Effects: revoke handles, pause at the next checkpoint, cap effective autonomy, record evidence. Reset needs a human and a reason. It runs in the customer runtime with no control plane dependency.

Boundary table

QuestionAnswer
Who decidesThe policy decision point
Who can widen a grantNo one holding it; a new grant is issued by policy
Who can approveAn authenticated human distinct from the author
Who can deployThe release pipeline only
Who can stop everythingA human, via the local breaker

Failure cases

  • Agent asks for a tool outside its grant: denied and recorded as TOOL_DENIED.
  • Budget exhausted: pause and escalate.
  • Approver equals author: decision refused.
  • Policy bundle fails signature verification: load fails closed.

On this page