Agent Security Policy · asp/1 · draft
Policy-as-code, in YAML your reviewers can read.
ASP is Aarmos's declarative YAML authoring surface for signed policy bundles. It compiles deterministically to the same canonical JSON, signed with the same Ed25519 key — the runtime doesn't change. What changes is your DX: lint, golden-test, sign, and ship policies through your existing GitOps pipeline. Authoring, signing, and enforcement all run on your machines — no Aarmos-hosted control plane is required for policy evaluation or receipt signing.
What the runtime enforces. On the Aarmos CLI's enforcement paths, the runtime applies a policy's egress rules to outbound web requests sent through the local Aarmos proxy, matching host names. Without an egress allowlist in effect, only hosts on the deny list are refused; every other outbound request is allowed.
The signed bundle that aarmos policy sign writes does not carry the egress section. On the CLI, make the YAML file itself effective: aarmos policy import --from asp.yaml, then preview, review and activate it.
The allow / deny tool rules, scopes, human_oversight and kill_switch sections are checked when you run aarmos lint and aarmos test. The CLI's enforcement paths do not apply them to calls.
Structured tool calls are enforced separately. A call made with aarmos tool call is sent only when an activated policy holds a reviewed binding for that server, tool and tool definition. Unbound, changed or mismatched calls are refused before anything is sent. Bindings currently support two action types: sending email and invoking a model.
The pipeline
# author
$ $EDITOR asp.yaml
# validate offline
$ aarmos lint --strict
# golden-test decisions
$ aarmos test policies/tests
# sign for shipment
$ export AARMOS_POLICY_PRIVATE_KEY=...
$ aarmos policy sign asp.yaml --out policy.signed.jsonExample
version: 1
metadata:
issuer:
name: "Acme Corp Security"
pubKey: "BASE64_RAW_32B_ED25519_PUBKEY"
issuedAt: "2026-07-09T00:00:00Z"
expiresAt: "2027-07-09T00:00:00Z"
# Enforced by the runtime: outbound requests, by host name
egress:
allowlist: ["mcp.internal.acme.io"]
deny: ["*.pastebin.com"]
# Checked by aarmos lint / aarmos test
allow:
servers: ["https://mcp.internal.acme.io"]
tools: ["github__read_*", "jira__list_*"]
deny:
tools: ["*__delete_*", "shell__*"]
scopes:
github: ["repo:read", "issues:read"]
human_oversight:
require_approval_for: ["write", "admin", "delete", "payment"]
kill_switch:
default: falseCLI
aarmos lint [path]— schema, shadowed rules, dangerous allows.aarmos test [path]— run golden fixtures (given → decision).aarmos policy compile <asp.yaml>— canonical JSON to stdout.aarmos policy sign <asp.yaml>— Ed25519-signed bundle.aarmos policy keygen— new signing keypair.
Full spec
The normative schema, canonicalization rules, and conformance criteria are not currently publicly published. Reference compiler: the aarmos CLI.