@armoriq/policy-ir 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/document-entry-CDOQVeis.d.cts +229 -0
- package/dist/document-entry-CDOQVeis.d.ts +229 -0
- package/dist/document.cjs +722 -0
- package/dist/document.cjs.map +1 -0
- package/dist/document.d.cts +1 -0
- package/dist/document.d.ts +1 -0
- package/dist/document.js +688 -0
- package/dist/document.js.map +1 -0
- package/dist/index.cjs +117 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -228
- package/dist/index.d.ts +3 -228
- package/dist/index.js +117 -14
- package/dist/index.js.map +1 -1
- package/dist/vectors.cjs +43 -1
- package/dist/vectors.cjs.map +1 -1
- package/dist/vectors.js +43 -1
- package/dist/vectors.js.map +1 -1
- package/package.json +29 -6
- package/vectors/document.json +6 -0
- package/vectors/evaluate.json +37 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@armoriq/policy-ir",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Armor Policy v2 intermediate representation: types, canonical serializer, policy hash, evaluator, compiler and the golden vectors every runtime must pass",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -13,12 +13,34 @@
|
|
|
13
13
|
"types": "./dist/index.d.ts",
|
|
14
14
|
"exports": {
|
|
15
15
|
".": {
|
|
16
|
-
"import": {
|
|
17
|
-
|
|
16
|
+
"import": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"default": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"require": {
|
|
21
|
+
"types": "./dist/index.d.cts",
|
|
22
|
+
"default": "./dist/index.cjs"
|
|
23
|
+
}
|
|
18
24
|
},
|
|
19
25
|
"./vectors": {
|
|
20
|
-
"import": {
|
|
21
|
-
|
|
26
|
+
"import": {
|
|
27
|
+
"types": "./dist/vectors.d.ts",
|
|
28
|
+
"default": "./dist/vectors.js"
|
|
29
|
+
},
|
|
30
|
+
"require": {
|
|
31
|
+
"types": "./dist/vectors.d.cts",
|
|
32
|
+
"default": "./dist/vectors.cjs"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"./document": {
|
|
36
|
+
"import": {
|
|
37
|
+
"types": "./dist/document.d.ts",
|
|
38
|
+
"default": "./dist/document.js"
|
|
39
|
+
},
|
|
40
|
+
"require": {
|
|
41
|
+
"types": "./dist/document.d.cts",
|
|
42
|
+
"default": "./dist/document.cjs"
|
|
43
|
+
}
|
|
22
44
|
}
|
|
23
45
|
},
|
|
24
46
|
"files": [
|
|
@@ -36,13 +58,14 @@
|
|
|
36
58
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
37
59
|
"lint": "eslint .",
|
|
38
60
|
"test": "vitest run",
|
|
39
|
-
"smoke": "node test/smoke/consume.mjs && node test/smoke/consume.cjs && node test/smoke/typecheck.mjs",
|
|
61
|
+
"smoke": "node test/smoke/consume.mjs && node test/smoke/consume.cjs && node test/smoke/typecheck.mjs && node test/smoke/browser.mjs",
|
|
40
62
|
"check": "npm run lint && npm run typecheck && npm test && npm run build && npm run smoke",
|
|
41
63
|
"vectors:generate": "tsx scripts/generate-vectors.ts"
|
|
42
64
|
},
|
|
43
65
|
"devDependencies": {
|
|
44
66
|
"@eslint/js": "^9.12.0",
|
|
45
67
|
"@types/node": "^20.16.0",
|
|
68
|
+
"esbuild": "^0.27.7",
|
|
46
69
|
"eslint": "^9.12.0",
|
|
47
70
|
"tsup": "^8.3.0",
|
|
48
71
|
"tsx": "^4.19.0",
|
package/vectors/document.json
CHANGED
|
@@ -15,5 +15,11 @@
|
|
|
15
15
|
{"id":"VC-11c","name":"a condition takes exactly one operator","yaml":"apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\n orgId: 11111111-1111-4111-8111-111111111111\ntarget:\n agent: aaaaaaaa-0000-4000-8000-000000000001\n mcpServers: [github]\nspec:\n tools:\n default: hold\n rules:\n create_payment:\n - when: {args.amount: {gt: 5000, lt: 9000}}\n action: block\n","expect":{"errors":["condition_operator"],"warnings":[]}},
|
|
16
16
|
{"id":"VC-11d","name":"a numeric operator rejects a string operand","yaml":"apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\n orgId: 11111111-1111-4111-8111-111111111111\ntarget:\n agent: aaaaaaaa-0000-4000-8000-000000000001\n mcpServers: [github]\nspec:\n tools:\n default: hold\n rules:\n create_payment:\n - when: {args.amount: {gt: \"5000\"}}\n action: block\n","expect":{"errors":["condition_operand"],"warnings":[]}},
|
|
17
17
|
{"id":"VC-11e","name":"matches rejects a lookaround the Rego evaluator cannot run","yaml":"apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\n orgId: 11111111-1111-4111-8111-111111111111\ntarget:\n agent: aaaaaaaa-0000-4000-8000-000000000001\n mcpServers: [github]\nspec:\n tools:\n default: hold\n rules:\n Bash:\n - when: {command: {matches: '(?=rm)'}}\n action: block\n","expect":{"errors":["condition_operand"],"warnings":[]}},
|
|
18
|
+
{"id":"VC-11f","name":"matches rejects a named group outside the portable subset","yaml":"apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\n orgId: 11111111-1111-4111-8111-111111111111\ntarget:\n agent: aaaaaaaa-0000-4000-8000-000000000001\n mcpServers: [github]\nspec:\n tools:\n default: hold\n rules:\n Bash:\n - when: {command: {matches: '(?<bin>rm) -rf'}}\n action: block\n","expect":{"errors":["condition_operand"],"warnings":[]}},
|
|
19
|
+
{"id":"VC-11g","name":"matches rejects an empty negated class","yaml":"apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\n orgId: 11111111-1111-4111-8111-111111111111\ntarget:\n agent: aaaaaaaa-0000-4000-8000-000000000001\n mcpServers: [github]\nspec:\n tools:\n default: hold\n rules:\n Bash:\n - when: {command: {matches: 'a[^]'}}\n action: block\n","expect":{"errors":["condition_operand"],"warnings":[]}},
|
|
20
|
+
{"id":"VC-11h","name":"matches rejects a brace that is not a full quantifier","yaml":"apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\n orgId: 11111111-1111-4111-8111-111111111111\ntarget:\n agent: aaaaaaaa-0000-4000-8000-000000000001\n mcpServers: [github]\nspec:\n tools:\n default: hold\n rules:\n Bash:\n - when: {command: {matches: 'a{,3}'}}\n action: block\n","expect":{"errors":["condition_operand"],"warnings":[]}},
|
|
21
|
+
{"id":"VC-11i","name":"matches rejects a backreference","yaml":"apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\n orgId: 11111111-1111-4111-8111-111111111111\ntarget:\n agent: aaaaaaaa-0000-4000-8000-000000000001\n mcpServers: [github]\nspec:\n tools:\n default: hold\n rules:\n Bash:\n - when: {command: {matches: '(a)\\1'}}\n action: block\n","expect":{"errors":["condition_operand"],"warnings":[]}},
|
|
22
|
+
{"id":"VC-11j","name":"matches rejects a Unicode property escape","yaml":"apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\n orgId: 11111111-1111-4111-8111-111111111111\ntarget:\n agent: aaaaaaaa-0000-4000-8000-000000000001\n mcpServers: [github]\nspec:\n tools:\n default: hold\n rules:\n Bash:\n - when: {command: {matches: '\\p{L}'}}\n action: block\n","expect":{"errors":["condition_operand"],"warnings":[]}},
|
|
23
|
+
{"id":"VC-11k","name":"matches accepts classes, ranges, groups, alternation and bounded quantifiers","yaml":"apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\n orgId: 11111111-1111-4111-8111-111111111111\ntarget:\n agent: aaaaaaaa-0000-4000-8000-000000000001\n mcpServers: [github]\nspec:\n tools:\n default: hold\n rules:\n Bash:\n - when: {command: {matches: '^(?:sudo\\s+)?(rm|shred)\\b[ \\t]+-[a-zA-Z0-9_]{1,4}\\.?\\x41\\u0042$'}}\n action: block\n","expect":{"errors":[],"warnings":[]}},
|
|
18
24
|
{"id":"VC-1b","name":"tools.default is required","yaml":"apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\n orgId: 11111111-1111-4111-8111-111111111111\ntarget:\n agent: aaaaaaaa-0000-4000-8000-000000000001\n mcpServers: [github]\nspec:\n tools:\n rules:\n Read: allow\n","expect":{"errors":["expected_verdict"],"warnings":[]}}
|
|
19
25
|
]
|
package/vectors/evaluate.json
CHANGED
|
@@ -23,5 +23,41 @@
|
|
|
23
23
|
{"id":"VE-13b","name":"a floor hold tightens an agent allow but yields to an agent block","bound":{"floor":{"schemaVersion":"armor.policy.v2","policyId":"p-floor","target":{"org":"*"},"layer":"floor","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-f","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"deploy","variant":0,"source":"yaml","layer":"floor"},"match":{"tool":"deploy","keyTier":"exact","order":0},"effect":"hold"}]},"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"hold","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-a","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"deploy","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"deploy","keyTier":"exact","order":0},"effect":"allow"}]}},"input":{"tool":"deploy","arguments":{},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"hold","statementId":"st-f","layer":"floor","ruleKey":"deploy"}},
|
|
24
24
|
{"id":"VE-14","name":"capability rule binds by tag only: tagged tool holds","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-destructive","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"destructive","variant":0,"source":"yaml","layer":"agent"},"match":{"capability":"destructive"},"effect":"hold"}]}},"input":{"tool":"mcp__jira__delete_issue","arguments":{},"timestamp":"2026-09-18T12:00:00Z","capabilities":["destructive"]},"expect":{"verdict":"hold","statementId":"st-destructive","layer":"agent","ruleKey":"destructive"}},
|
|
25
25
|
{"id":"VE-14b","name":"capability rule binds by tag only: untagged tool on the same server gets tools.default","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-destructive","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"destructive","variant":0,"source":"yaml","layer":"agent"},"match":{"capability":"destructive"},"effect":"hold"}]}},"input":{"tool":"mcp__jira__list_issues","arguments":{},"timestamp":"2026-09-18T12:00:00Z","capabilities":[]},"expect":{"verdict":"allow","statementId":null,"layer":"agent","ruleKey":"tools.default"}},
|
|
26
|
-
{"id":"VE-15","name":"an expired document contributes nothing","bound":{"group":{"schemaVersion":"armor.policy.v2","policyId":"p-group","target":{"group":"payments"},"layer":"group","defaults":{"tools":"hold","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"2026-01-01T00:00:00Z","statements":[{"id":"st-g","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"group"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"}]},"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"allow","statementId":null,"layer":"agent","ruleKey":"tools.default"}}
|
|
26
|
+
{"id":"VE-15","name":"an expired document contributes nothing","bound":{"group":{"schemaVersion":"armor.policy.v2","policyId":"p-group","target":{"group":"payments"},"layer":"group","defaults":{"tools":"hold","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"2026-01-01T00:00:00Z","statements":[{"id":"st-g","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"group"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"}]},"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"allow","statementId":null,"layer":"agent","ruleKey":"tools.default"}},
|
|
27
|
+
{"id":"VX-1","name":"eq never equates true and 1","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-eq","subject":null,"conditions":[{"field":"args.flag","op":"eq","value":1}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"flag":true},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"allow","statementId":"st-else","layer":"agent","ruleKey":"x"}},
|
|
28
|
+
{"id":"VX-2","name":"in compares by strict equality","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-in","subject":null,"conditions":[{"field":"args.n","op":"in","value":[1,2]}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"n":true},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"allow","statementId":"st-else","layer":"agent","ruleKey":"x"}},
|
|
29
|
+
{"id":"VX-3","name":"exists false matches an absent argument","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-ex","subject":null,"conditions":[{"field":"args.note","op":"exists","value":false}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-ex","layer":"agent","ruleKey":"x"}},
|
|
30
|
+
{"id":"VX-4","name":"a null argument is present","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-null","subject":null,"conditions":[{"field":"args.note","op":"exists","value":true}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"note":null},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-null","layer":"agent","ruleKey":"x"}},
|
|
31
|
+
{"id":"VX-5","name":"regex searches anywhere in the value","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-re","subject":null,"conditions":[{"field":"args.cmd","op":"regex","value":"rm -rf"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"cmd":"sudo rm -rf /"},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-re","layer":"agent","ruleKey":"x"}},
|
|
32
|
+
{"id":"VX-6","name":"regex \\d matches ASCII digits only","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-d","subject":null,"conditions":[{"field":"args.code","op":"regex","value":"^\\d+$"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"code":"١٢٣"},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"allow","statementId":"st-else","layer":"agent","ruleKey":"x"}},
|
|
33
|
+
{"id":"VX-7","name":"glob * stops at a slash","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-g","subject":null,"conditions":[{"field":"path","op":"glob","value":"~/docs/*"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z","derived":{"path":"~/docs/a/b"}},"expect":{"verdict":"allow","statementId":"st-else","layer":"agent","ruleKey":"x"}},
|
|
34
|
+
{"id":"VX-8","name":"glob ** crosses slashes and ? is one character","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-gg","subject":null,"conditions":[{"field":"path","op":"glob","value":"~/d?cs/**"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z","derived":{"path":"~/docs/a/b"}},"expect":{"verdict":"block","statementId":"st-gg","layer":"agent","ruleKey":"x"}},
|
|
35
|
+
{"id":"VX-9","name":"a numeric comparison never matches a string","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-gt","subject":null,"conditions":[{"field":"args.amount","op":"gt","value":500}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"amount":"900"},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"allow","statementId":"st-else","layer":"agent","ruleKey":"x"}},
|
|
36
|
+
{"id":"VX-10","name":"ne on an absent argument does not match","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-ne","subject":null,"conditions":[{"field":"args.a","op":"ne","value":"v"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"allow","statementId":"st-else","layer":"agent","ruleKey":"x"}},
|
|
37
|
+
{"id":"VX-11","name":"a dotpath indexes into an array","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-idx","subject":null,"conditions":[{"field":"args.items.0","op":"eq","value":"a"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"items":["a","b"]},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-idx","layer":"agent","ruleKey":"x"}},
|
|
38
|
+
{"id":"VX-12","name":"length reads an array length","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-len","subject":null,"conditions":[{"field":"args.items.length","op":"gt","value":2}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"items":[1,2,3]},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-len","layer":"agent","ruleKey":"x"}},
|
|
39
|
+
{"id":"VX-13","name":"length of a string is absent","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-slen","subject":null,"conditions":[{"field":"args.name.length","op":"gt","value":2}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"name":"abcdef"},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"allow","statementId":"st-else","layer":"agent","ruleKey":"x"}},
|
|
40
|
+
{"id":"VX-14","name":"startsWith on a string","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-sw","subject":null,"conditions":[{"field":"args.url","op":"startsWith","value":"https://internal."}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"url":"https://internal.example/x"},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-sw","layer":"agent","ruleKey":"x"}},
|
|
41
|
+
{"id":"VX-15","name":"two capability statements of equal effect: the later wins","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-cap-a","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"a","variant":0,"source":"yaml","layer":"agent"},"match":{"capability":"a"},"effect":"hold"},{"id":"st-cap-b","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"b","variant":0,"source":"yaml","layer":"agent"},"match":{"capability":"b"},"effect":"hold"}]}},"input":{"tool":"y","arguments":{},"timestamp":"2026-09-18T12:00:00Z","capabilities":["a","b"]},"expect":{"verdict":"hold","statementId":"st-cap-b","layer":"agent","ruleKey":"b"}},
|
|
42
|
+
{"id":"VX-16","name":"a rule and a capability of equal effect: the rule wins","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-rule","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"y","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"y","keyTier":"exact","order":0},"effect":"hold"},{"id":"st-cap","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"c","variant":0,"source":"yaml","layer":"agent"},"match":{"capability":"c"},"effect":"hold"}]}},"input":{"tool":"y","arguments":{},"timestamp":"2026-09-18T12:00:00Z","capabilities":["c"]},"expect":{"verdict":"hold","statementId":"st-rule","layer":"agent","ruleKey":"y"}},
|
|
43
|
+
{"id":"VX-17","name":"a statement expiry with fractional seconds is still live","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-ms","subject":null,"conditions":[],"expiresAt":"2026-09-18T12:00:00.500Z","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-ms","layer":"agent","ruleKey":"x"}},
|
|
44
|
+
{"id":"VX-18","name":"a statement expiry with an offset is compared in UTC","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-off","subject":null,"conditions":[],"expiresAt":"2026-09-18T17:00:00+05:30","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"allow","statementId":null,"layer":"agent","ruleKey":"tools.default"}},
|
|
45
|
+
{"id":"VX-19","name":"member email matches case-insensitively","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-alice","subject":{"email":"Alice@Example.com"},"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-base","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"allow"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z","member":{"email":"alice@example.com"}},"expect":{"verdict":"block","statementId":"st-alice","layer":"member","ruleKey":"x"}},
|
|
46
|
+
{"id":"VX-20","name":"schema drift is reported with a null observed hash","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-bound","subject":null,"conditions":[{"field":"args.a","op":"exists","value":true,"schemaBinding":{"schemaHash":"sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"hold"}]}},"input":{"tool":"x","arguments":{"a":1},"timestamp":"2026-09-18T12:00:00Z","schemaHash":null},"expect":{"verdict":"hold","statementId":"st-bound","layer":"agent","ruleKey":"x","obligations":[{"type":"schema_drift","statementId":"st-bound","bound":"sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","observed":null}]}},
|
|
47
|
+
{"id":"VX-21","name":"regex \\s matches a no-break space","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-ws","subject":null,"conditions":[{"field":"args.cmd","op":"regex","value":"rm\\s+-rf"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"cmd":"rm -rf /"},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-ws","layer":"agent","ruleKey":"x"}},
|
|
48
|
+
{"id":"VX-22","name":"regex $ is the end of the input, not before a final newline","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-end","subject":null,"conditions":[{"field":"args.v","op":"notRegex","value":"^safe$"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"v":"safe\n"},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-end","layer":"agent","ruleKey":"x"}},
|
|
49
|
+
{"id":"VX-23","name":"regex . does not match a carriage return","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-dot","subject":null,"conditions":[{"field":"args.v","op":"notRegex","value":"^.$"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"v":"\r"},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-dot","layer":"agent","ruleKey":"x"}},
|
|
50
|
+
{"id":"VX-24","name":"regex . matches one UTF-16 unit","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-unit","subject":null,"conditions":[{"field":"args.v","op":"regex","value":"^..$"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"v":"😀"},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-unit","layer":"agent","ruleKey":"x"}},
|
|
51
|
+
{"id":"VX-25","name":"glob ? matches one UTF-16 unit","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-gq","subject":null,"conditions":[{"field":"path","op":"glob","value":"/private/??"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z","derived":{"path":"/private/😀"}},"expect":{"verdict":"block","statementId":"st-gq","layer":"agent","ruleKey":"x"}},
|
|
52
|
+
{"id":"VX-26","name":"glob key length counts UTF-16 units","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-long","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"😀😀*","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"😀😀*","keyTier":"glob","order":0},"effect":"block"},{"id":"st-short","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"???*","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"???*","keyTier":"glob","order":0},"effect":"allow"}]}},"input":{"tool":"😀😀x","arguments":{},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-long","layer":"agent","ruleKey":"😀😀*"}},
|
|
53
|
+
{"id":"VX-27","name":"a dotpath reads own keys only","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-own","subject":null,"conditions":[{"field":"args.constructor","op":"exists","value":true}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"allow","statementId":"st-else","layer":"agent","ruleKey":"x"}},
|
|
54
|
+
{"id":"VX-28","name":"a derived root reads own keys only","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-own-d","subject":null,"conditions":[{"field":"toString","op":"exists","value":true}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z","derived":{}},"expect":{"verdict":"allow","statementId":"st-else","layer":"agent","ruleKey":"x"}},
|
|
55
|
+
{"id":"VX-29","name":"an array index is ASCII digits","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-ascii","subject":null,"conditions":[{"field":"args.items.Ù¡","op":"exists","value":false}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"items":["a","b"]},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-ascii","layer":"agent","ruleKey":"x"}},
|
|
56
|
+
{"id":"VX-30","name":"an array index has no leading zero","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-lead","subject":null,"conditions":[{"field":"args.items.01","op":"exists","value":false}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"items":["a","b"]},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-lead","layer":"agent","ruleKey":"x"}},
|
|
57
|
+
{"id":"VX-31","name":"an expiry with an expanded year is live","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-y6","subject":null,"conditions":[],"expiresAt":"+010000-01-01T00:00:00.000Z","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-y6","layer":"agent","ruleKey":"x"}},
|
|
58
|
+
{"id":"VX-33","name":"a date-only expiry is midnight UTC","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-day","subject":null,"conditions":[],"expiresAt":"2026-09-19","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-day","layer":"agent","ruleKey":"x"}},
|
|
59
|
+
{"id":"VX-34","name":"an out-of-range month makes the expiry unreadable, so the statement is not live","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-bad","subject":null,"conditions":[],"expiresAt":"2026-13-01T00:00:00.000Z","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"allow","statementId":null,"layer":"agent","ruleKey":"tools.default"}},
|
|
60
|
+
{"id":"VX-35","name":"day 31 of a 30-day month rolls into the next month","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-roll","subject":null,"conditions":[],"expiresAt":"2026-09-31T00:00:00.000Z","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-30T23:00:00Z"},"expect":{"verdict":"block","statementId":"st-roll","layer":"agent","ruleKey":"x"}},
|
|
61
|
+
{"id":"VX-38","name":"regex \\B matches an empty value","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-nb","subject":null,"conditions":[{"field":"args.v","op":"regex","value":"^\\B$"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{"v":""},"timestamp":"2026-09-18T12:00:00Z"},"expect":{"verdict":"block","statementId":"st-nb","layer":"agent","ruleKey":"x"}},
|
|
62
|
+
{"id":"VX-37","name":"glob ** does not cross a line break","bound":{"agent":{"schemaVersion":"armor.policy.v2","policyId":"p-agent","target":{"agent":"aaaaaaaa-0000-4000-8000-000000000001"},"layer":"agent","defaults":{"tools":"allow","network":"block","files":"allow","skills":"allow"},"capture":{"arguments":true,"redact":["*token*"],"maxBytesPerCall":16384,"sample":1},"expiresAt":"never","statements":[{"id":"st-gnl","subject":null,"conditions":[{"field":"path","op":"glob","value":"/tmp/**"}],"expiresAt":"never","provenance":{"ruleKey":"x","variant":0,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":0},"effect":"block"},{"id":"st-else","subject":null,"conditions":[],"expiresAt":"never","provenance":{"ruleKey":"x","variant":1,"source":"yaml","layer":"agent"},"match":{"tool":"x","keyTier":"exact","order":1},"effect":"allow"}]}},"input":{"tool":"x","arguments":{},"timestamp":"2026-09-18T12:00:00Z","derived":{"path":"/tmp/a\nb"}},"expect":{"verdict":"allow","statementId":"st-else","layer":"agent","ruleKey":"x"}}
|
|
27
63
|
]
|