@armoriq/policy-ir 0.1.4 → 0.1.6

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/dist/vectors.cjs CHANGED
@@ -719,6 +719,8 @@ var schema_hash_vectors_default = {
719
719
  var evaluate_default = [
720
720
  { id: "VE-1", name: "absent argument in when falls through to the next variant", bound: { 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-pay-hold", subject: null, conditions: [{ field: "args.amount", op: "gt", value: 5e3, schemaBinding: { schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } }], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "hold", approval: { approvers: 2, roles: ["finance_lead"] } }, { id: "st-pay-allow", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 1, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 1 }, effect: "allow" }] } }, input: { tool: "create_payment", arguments: { recipient: "acme" }, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "allow", statementId: "st-pay-allow", layer: "agent", ruleKey: "create_payment" } },
721
721
  { id: "VE-8", name: "hold carries its resolved approval", bound: { 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-pay-hold", subject: null, conditions: [{ field: "args.amount", op: "gt", value: 5e3, schemaBinding: { schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } }], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "hold", approval: { approvers: 2, roles: ["finance_lead"] } }, { id: "st-pay-allow", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 1, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 1 }, effect: "allow" }] } }, input: { tool: "create_payment", arguments: { amount: 9e3 }, timestamp: "2026-09-18T12:00:00Z", schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" }, expect: { verdict: "hold", statementId: "st-pay-hold", layer: "agent", ruleKey: "create_payment", approval: { approvers: 2, roles: ["finance_lead"] }, obligations: [] } },
722
+ { id: "VE-8b", name: "a hold from tools.default carries the document approvalDefaults", bound: { 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", approval: { approvers: 1, roles: ["registrar"] } }, capture: { arguments: true, redact: ["*token*"], maxBytesPerCall: 16384, sample: 1 }, expiresAt: "never", statements: [{ id: "st-pay-hold", subject: null, conditions: [{ field: "args.amount", op: "gt", value: 5e3, schemaBinding: { schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } }], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "hold", approval: { approvers: 2, roles: ["finance_lead"] } }, { id: "st-pay-allow", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 1, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 1 }, effect: "allow" }] } }, input: { tool: "brand_new_tool", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "hold", statementId: null, layer: "agent", ruleKey: "tools.default", approval: { approvers: 1, roles: ["registrar"] } } },
723
+ { id: "VE-8c", name: "an allow from tools.default carries no approval", 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", approval: { approvers: 1, roles: ["registrar"] } }, capture: { arguments: true, redact: ["*token*"], maxBytesPerCall: 16384, sample: 1 }, expiresAt: "never", statements: [{ id: "st-pay-hold", subject: null, conditions: [{ field: "args.amount", op: "gt", value: 5e3, schemaBinding: { schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } }], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "hold", approval: { approvers: 2, roles: ["finance_lead"] } }, { id: "st-pay-allow", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 1, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 1 }, effect: "allow" }] } }, input: { tool: "brand_new_tool", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "allow", statementId: null, layer: "agent", ruleKey: "tools.default", approval: null } },
722
724
  { id: "VE-2", name: "schema drift still evaluates by name and attaches schema_drift", bound: { 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-pay-hold", subject: null, conditions: [{ field: "args.amount", op: "gt", value: 5e3, schemaBinding: { schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } }], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "hold", approval: { approvers: 2, roles: ["finance_lead"] } }, { id: "st-pay-allow", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 1, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 1 }, effect: "allow" }] } }, input: { tool: "create_payment", arguments: { amount: 9e3 }, timestamp: "2026-09-18T12:00:00Z", schemaHash: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" }, expect: { verdict: "hold", statementId: "st-pay-hold", layer: "agent", ruleKey: "create_payment", obligations: [{ type: "schema_drift", statementId: "st-pay-hold", bound: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", observed: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" }] } },
723
725
  { id: "VE-3", name: "exact key beats glob key", bound: { 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-glob", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "mcp__github__*", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "mcp__github__*", keyTier: "glob", order: 0 }, effect: "allow" }, { id: "st-exact", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "mcp__github__create_issue", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "mcp__github__create_issue", keyTier: "exact", order: 0 }, effect: "hold" }] } }, input: { tool: "mcp__github__create_issue", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "hold", statementId: "st-exact", layer: "agent", ruleKey: "mcp__github__create_issue" } },
724
726
  { id: "VE-3b", name: "longer glob beats shorter glob", bound: { 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-short", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "mcp__*", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "mcp__*", keyTier: "glob", order: 0 }, effect: "allow" }, { id: "st-long", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "mcp__github__*", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "mcp__github__*", keyTier: "glob", order: 0 }, effect: "hold" }] } }, input: { tool: "mcp__github__delete_repo", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "hold", statementId: "st-long", layer: "agent", ruleKey: "mcp__github__*" } },
@@ -731,7 +733,13 @@ var evaluate_default = [
731
733
  { id: "VE-5d", name: "expired member rule is skipped", bound: { 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-base", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "block" }, { id: "st-alice", subject: { membershipId: "m-alice" }, conditions: [], expiresAt: "2026-01-01T00:00:00Z", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "allow" }] } }, input: { tool: "create_payment", arguments: {}, timestamp: "2026-09-18T12:00:00Z", member: { membershipId: "m-alice" } }, expect: { verdict: "block", statementId: "st-base", layer: "agent", ruleKey: "create_payment" } },
732
734
  { id: "VE-5e", name: "member key specificity: membershipId beats email beats group", bound: { 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-group", subject: { group: "finance" }, conditions: [], expiresAt: "never", provenance: { ruleKey: "x", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "x", keyTier: "exact", order: 0 }, effect: "block" }, { id: "st-email", 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: "hold" }, { id: "st-id", subject: { membershipId: "m-alice" }, 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: { membershipId: "m-alice", email: "alice@example.com", groups: ["finance"] } }, expect: { verdict: "allow", statementId: "st-id", layer: "member", ruleKey: "x" } },
733
735
  { id: "VE-5f", name: "member key specificity: email beats group when no membershipId rule exists", bound: { 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-group", subject: { group: "finance" }, conditions: [], expiresAt: "never", provenance: { ruleKey: "x", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "x", keyTier: "exact", order: 0 }, effect: "block" }, { id: "st-email", 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: "hold" }] } }, input: { tool: "x", arguments: {}, timestamp: "2026-09-18T12:00:00Z", member: { membershipId: "m-alice", email: "alice@example.com", groups: ["finance"] } }, expect: { verdict: "hold", statementId: "st-email", layer: "member", ruleKey: "x" } },
734
- { id: "VE-6", name: "unknown tool goes to the most specific tools.default, never a wildcard", 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: [] }, 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-pay-hold", subject: null, conditions: [{ field: "args.amount", op: "gt", value: 5e3, schemaBinding: { schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } }], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "hold", approval: { approvers: 2, roles: ["finance_lead"] } }, { id: "st-pay-allow", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 1, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 1 }, effect: "allow" }] } }, input: { tool: "brand_new_tool", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "hold", statementId: null, layer: "agent", ruleKey: "tools.default" } },
736
+ { id: "VE-6", name: "unknown tool goes to tools.default, never a wildcard", 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: [] }, 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-pay-hold", subject: null, conditions: [{ field: "args.amount", op: "gt", value: 5e3, schemaBinding: { schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } }], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "hold", approval: { approvers: 2, roles: ["finance_lead"] } }, { id: "st-pay-allow", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 1, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 1 }, effect: "allow" }] } }, input: { tool: "brand_new_tool", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "hold", statementId: null, layer: "agent", ruleKey: "tools.default" } },
737
+ { id: "VE-6b", name: "a floor default of block caps an agent default of allow", bound: { floor: { schemaVersion: "armor.policy.v2", policyId: "p-floor", target: { org: "*" }, layer: "floor", defaults: { tools: "block", network: "block", files: "allow", skills: "allow" }, capture: { arguments: true, redact: ["*token*"], maxBytesPerCall: 16384, sample: 1 }, expiresAt: "never", statements: [] }, 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-pay-hold", subject: null, conditions: [{ field: "args.amount", op: "gt", value: 5e3, schemaBinding: { schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } }], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "hold", approval: { approvers: 2, roles: ["finance_lead"] } }, { id: "st-pay-allow", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 1, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 1 }, effect: "allow" }] } }, input: { tool: "brand_new_tool", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "block", statementId: null, layer: "floor", ruleKey: "tools.default" } },
738
+ { id: "VE-6c", name: "a group default of block caps an agent default of allow", bound: { group: { schemaVersion: "armor.policy.v2", policyId: "p-group", target: { group: "payments" }, layer: "group", defaults: { tools: "block", network: "block", files: "allow", skills: "allow" }, capture: { arguments: true, redact: ["*token*"], maxBytesPerCall: 16384, sample: 1 }, expiresAt: "never", statements: [] }, 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-pay-hold", subject: null, conditions: [{ field: "args.amount", op: "gt", value: 5e3, schemaBinding: { schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } }], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "hold", approval: { approvers: 2, roles: ["finance_lead"] } }, { id: "st-pay-allow", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 1, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 1 }, effect: "allow" }] } }, input: { tool: "brand_new_tool", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "block", statementId: null, layer: "group", ruleKey: "tools.default" } },
739
+ { id: "VE-6d", name: "floor only: the floor default decides", bound: { floor: { schemaVersion: "armor.policy.v2", policyId: "p-floor", target: { org: "*" }, layer: "floor", defaults: { tools: "hold", network: "block", files: "allow", skills: "allow" }, capture: { arguments: true, redact: ["*token*"], maxBytesPerCall: 16384, sample: 1 }, expiresAt: "never", statements: [] } }, input: { tool: "brand_new_tool", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "hold", statementId: null, layer: "floor", ruleKey: "tools.default" } },
740
+ { id: "VE-6e", name: "agent only: the agent default decides", 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-pay-hold", subject: null, conditions: [{ field: "args.amount", op: "gt", value: 5e3, schemaBinding: { schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } }], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "hold", approval: { approvers: 2, roles: ["finance_lead"] } }, { id: "st-pay-allow", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 1, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 1 }, effect: "allow" }] } }, input: { tool: "brand_new_tool", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "allow", statementId: null, layer: "agent", ruleKey: "tools.default" } },
741
+ { id: "VE-6f", name: "the floor default sits out when a floor statement decides the call", bound: { floor: { schemaVersion: "armor.policy.v2", policyId: "p-floor", target: { org: "*" }, layer: "floor", defaults: { tools: "block", 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: "x", variant: 0, source: "yaml", layer: "floor" }, match: { tool: "x", keyTier: "exact", order: 0 }, effect: "allow" }] }, 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" } },
742
+ { id: "VE-6g", name: "floor only: a floor statement that decides the call is not overridden by the floor default", bound: { floor: { schemaVersion: "armor.policy.v2", policyId: "p-floor", target: { org: "*" }, layer: "floor", defaults: { tools: "block", 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: "x", variant: 0, source: "yaml", layer: "floor" }, match: { tool: "x", keyTier: "exact", order: 0 }, effect: "allow" }] } }, input: { tool: "x", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "allow", statementId: "st-f", layer: "floor", ruleKey: "x" } },
735
743
  { id: "VE-7", name: "variant order: first match wins", bound: { 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-rm", subject: null, conditions: [{ field: "args.command", op: "regex", value: "\\brm\\s+-rf\\b" }], expiresAt: "never", provenance: { ruleKey: "Bash", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "Bash", keyTier: "exact", order: 0 }, effect: "block" }, { id: "st-safe", subject: null, conditions: [{ field: "program", op: "in", value: ["git", "ls", "rm"] }], expiresAt: "never", provenance: { ruleKey: "Bash", variant: 1, source: "yaml", layer: "agent" }, match: { tool: "Bash", keyTier: "exact", order: 1 }, effect: "allow" }] } }, input: { tool: "Bash", arguments: { command: "rm -rf /tmp/x" }, timestamp: "2026-09-18T12:00:00Z", derived: { program: "rm" } }, expect: { verdict: "block", statementId: "st-rm", layer: "agent", ruleKey: "Bash" } },
736
744
  { id: "VE-9", name: "provenance names the deciding statement, key and variant", bound: { 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-pay-hold", subject: null, conditions: [{ field: "args.amount", op: "gt", value: 5e3, schemaBinding: { schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } }], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "hold", approval: { approvers: 2, roles: ["finance_lead"] } }, { id: "st-pay-allow", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 1, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 1 }, effect: "allow" }] } }, input: { tool: "create_payment", arguments: { amount: 1 }, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "allow", statementId: "st-pay-allow", layer: "agent", ruleKey: "create_payment" } },
737
745
  { id: "VE-11", name: "agent policy overrides group policy, loosening", 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: "never", statements: [{ id: "st-g", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "create_payment", variant: 0, source: "yaml", layer: "group" }, match: { tool: "create_payment", 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: "create_payment", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "create_payment", keyTier: "exact", order: 0 }, effect: "allow" }] } }, input: { tool: "create_payment", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "allow", statementId: "st-a", layer: "agent", ruleKey: "create_payment" } },
@@ -742,6 +750,15 @@ var evaluate_default = [
742
750
  { 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" } },
743
751
  { 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" } },
744
752
  { 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" } },
753
+ { id: "VE-15b", name: "an expired floor default does not cap a live agent default", bound: { floor: { schemaVersion: "armor.policy.v2", policyId: "p-floor", target: { org: "*" }, layer: "floor", defaults: { tools: "block", network: "block", files: "allow", skills: "allow" }, capture: { arguments: true, redact: ["*token*"], maxBytesPerCall: 16384, sample: 1 }, expiresAt: "2026-01-01T00:00:00Z", statements: [] }, 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" } },
754
+ { id: "VE-15c", name: "when every bound document has expired, the most specific default still applies", bound: { floor: { schemaVersion: "armor.policy.v2", policyId: "p-floor", target: { org: "*" }, layer: "floor", defaults: { tools: "block", network: "block", files: "allow", skills: "allow" }, capture: { arguments: true, redact: ["*token*"], maxBytesPerCall: 16384, sample: 1 }, expiresAt: "2026-01-01T00:00:00Z", statements: [] }, 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: "2026-01-01T00:00:00Z", statements: [] } }, input: { tool: "x", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "allow", statementId: null, layer: "agent", ruleKey: "tools.default" } },
755
+ { id: "VE-16", name: "a qualified rule key matches a bare-name call that carries the qualified name", bound: { 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-q", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "mcp__gt-data-mcp__share_dataset_external", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "mcp__gt-data-mcp__share_dataset_external", keyTier: "exact", order: 0 }, effect: "block" }] } }, input: { tool: "share_dataset_external", arguments: {}, timestamp: "2026-09-18T12:00:00Z", qualifiedName: "mcp__gt-data-mcp__share_dataset_external" }, expect: { verdict: "block", statementId: "st-q", layer: "agent", ruleKey: "mcp__gt-data-mcp__share_dataset_external" } },
756
+ { id: "VE-16b", name: "a qualified rule key does not match the same bare name owned by another server", bound: { 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-q", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "mcp__gt-data-mcp__share_dataset_external", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "mcp__gt-data-mcp__share_dataset_external", keyTier: "exact", order: 0 }, effect: "block" }] } }, input: { tool: "share_dataset_external", arguments: {}, timestamp: "2026-09-18T12:00:00Z", qualifiedName: "mcp__other-mcp__share_dataset_external" }, expect: { verdict: "hold", statementId: null, layer: "agent", ruleKey: "tools.default" } },
757
+ { id: "VE-16c", name: "a qualified rule key does not match a bare-name call with no qualified name", bound: { 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-q", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "mcp__gt-data-mcp__share_dataset_external", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "mcp__gt-data-mcp__share_dataset_external", keyTier: "exact", order: 0 }, effect: "block" }] } }, input: { tool: "share_dataset_external", arguments: {}, timestamp: "2026-09-18T12:00:00Z" }, expect: { verdict: "hold", statementId: null, layer: "agent", ruleKey: "tools.default" } },
758
+ { id: "VE-17", name: "an exact qualified key beats a server glob", bound: { 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-glob", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "mcp__gt-data-mcp__*", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "mcp__gt-data-mcp__*", keyTier: "glob", order: 0 }, effect: "allow" }, { id: "st-q", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "mcp__gt-data-mcp__share_dataset_external", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "mcp__gt-data-mcp__share_dataset_external", keyTier: "exact", order: 0 }, effect: "block" }] } }, input: { tool: "share_dataset_external", arguments: {}, timestamp: "2026-09-18T12:00:00Z", qualifiedName: "mcp__gt-data-mcp__share_dataset_external" }, expect: { verdict: "block", statementId: "st-q", layer: "agent", ruleKey: "mcp__gt-data-mcp__share_dataset_external" } },
759
+ { id: "VE-17b", name: "with both a bare and a qualified exact key, the qualified key wins", bound: { 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-bare", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "share_dataset_external", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "share_dataset_external", keyTier: "exact", order: 0 }, effect: "allow" }, { id: "st-q", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "mcp__gt-data-mcp__share_dataset_external", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "mcp__gt-data-mcp__share_dataset_external", keyTier: "exact", order: 0 }, effect: "block" }] } }, input: { tool: "share_dataset_external", arguments: {}, timestamp: "2026-09-18T12:00:00Z", qualifiedName: "mcp__gt-data-mcp__share_dataset_external" }, expect: { verdict: "block", statementId: "st-q", layer: "agent", ruleKey: "mcp__gt-data-mcp__share_dataset_external" } },
760
+ { id: "VE-17c", name: "a server glob matches a bare-name call that carries the qualified name", 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-glob", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "mcp__gt-data-mcp__*", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "mcp__gt-data-mcp__*", keyTier: "glob", order: 0 }, effect: "hold" }] } }, input: { tool: "share_dataset_external", arguments: {}, timestamp: "2026-09-18T12:00:00Z", qualifiedName: "mcp__gt-data-mcp__share_dataset_external" }, expect: { verdict: "hold", statementId: "st-glob", layer: "agent", ruleKey: "mcp__gt-data-mcp__*" } },
761
+ { id: "VE-17d", name: "a longer server glob beats a shorter bare-name glob", bound: { 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-short", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "share_*", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "share_*", keyTier: "glob", order: 0 }, effect: "allow" }, { id: "st-glob", subject: null, conditions: [], expiresAt: "never", provenance: { ruleKey: "mcp__gt-data-mcp__*", variant: 0, source: "yaml", layer: "agent" }, match: { tool: "mcp__gt-data-mcp__*", keyTier: "glob", order: 0 }, effect: "block" }] } }, input: { tool: "share_dataset_external", arguments: {}, timestamp: "2026-09-18T12:00:00Z", qualifiedName: "mcp__gt-data-mcp__share_dataset_external" }, expect: { verdict: "block", statementId: "st-glob", layer: "agent", ruleKey: "mcp__gt-data-mcp__*" } },
745
762
  { 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" } },
746
763
  { 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" } },
747
764
  { 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" } },
@@ -993,7 +1010,14 @@ var compile_default = [
993
1010
  { id: "VC-12", name: "a group target compiles with layer group", yaml: "apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\n orgId: 11111111-1111-4111-8111-111111111111\ntarget:\n group: payments\nspec:\n tools:\n default: hold\n rules:\n Read: allow\n approvalDefaults: {approvers: 1, roles: [admin]}\n", inventory: [{ name: "create_payment", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true }, { name: "Read", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", inputSchema: { type: "object", properties: { file_path: { type: "string" } } }, declared: true }, { name: "create_issue", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__create_issue", capabilities: ["destructive"] }, { name: "list_issues", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__list_issues", capabilities: [] }, { name: "delete_repo", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__delete_repo", capabilities: ["destructive"] }, { name: "observed_only", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: null, declared: false }], expect: { errors: [], warnings: [], statementIds: ["st-read-0"] } },
994
1011
  { id: "VC-16", name: "member rule expiry earlier than its scope wins; scope expiry bounds a rule with none", 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\nspec:\n tools:\n default: hold\n rules:\n create_payment: block\n approvalDefaults: {approvers: 1, roles: [admin]}\n members:\n "alice@armoriq.io":\n tools:\n rules:\n create_payment:\n - action: allow\n expiresAt: 2026-06-01T00:00:00Z\n Read: allow\n expiresAt: 2026-12-31T00:00:00Z\n', inventory: [{ name: "create_payment", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true }, { name: "Read", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", inputSchema: { type: "object", properties: { file_path: { type: "string" } } }, declared: true }, { name: "create_issue", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__create_issue", capabilities: ["destructive"] }, { name: "list_issues", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__list_issues", capabilities: [] }, { name: "delete_repo", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__delete_repo", capabilities: ["destructive"] }, { name: "observed_only", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: null, declared: false }], expect: { errors: [], warnings: ["loosening_grant", "loosening_grant"], statementIds: ["st-create-payment-0", "st-create-payment-alice-armoriq-io-0", "st-read-alice-armoriq-io-0"], expiries: { "st-create-payment-alice-armoriq-io-0": "2026-06-01T00:00:00.000Z", "st-read-alice-armoriq-io-0": "2026-12-31T00:00:00.000Z" } } },
995
1012
  { id: "VC-18c", name: "under device-first a products overlay may only tighten", yaml: "apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\ntarget: {device: local}\nspec:\n tools:\n default: hold\n rules:\n Bash: hold\n approvalDefaults: {approvers: 1, roles: [admin]}\n products:\n claude-code: {tools: {rules: {Bash: allow}}}\n", inventory: [], expect: { errors: ["device_first_loosening"], warnings: ["loosening_grant", "unknown_tool_key", "unknown_tool_key"] } },
996
- { id: "VC-18d", name: "under agent-first a products overlay may loosen, flagged for review", yaml: "apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\nprecedence: agent-first\ntarget: {device: local}\nspec:\n tools:\n default: hold\n rules:\n Bash: hold\n approvalDefaults: {approvers: 1, roles: [admin]}\n products:\n claude-code: {tools: {rules: {Bash: allow}}}\n", inventory: [], expect: { errors: [], warnings: ["loosening_grant", "unknown_tool_key", "unknown_tool_key"], statementIds: ["st-bash-0", "st-bash-claude-code-0"] } }
1013
+ { id: "VC-18d", name: "under agent-first a products overlay may loosen, flagged for review", yaml: "apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\nprecedence: agent-first\ntarget: {device: local}\nspec:\n tools:\n default: hold\n rules:\n Bash: hold\n approvalDefaults: {approvers: 1, roles: [admin]}\n products:\n claude-code: {tools: {rules: {Bash: allow}}}\n", inventory: [], expect: { errors: [], warnings: ["loosening_grant", "unknown_tool_key", "unknown_tool_key"], statementIds: ["st-bash-0", "st-bash-claude-code-0"] } },
1014
+ { id: "VC-18e", name: "under device-first a qualified product key may not loosen a bare base rule for the same tool", yaml: "apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\ntarget: {device: local}\nspec:\n tools:\n default: allow\n rules:\n create_issue: block\n products:\n editor: {tools: {rules: {mcp__github__create_issue: allow}}}", inventory: [{ name: "create_payment", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true }, { name: "Read", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", inputSchema: { type: "object", properties: { file_path: { type: "string" } } }, declared: true }, { name: "create_issue", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__create_issue", capabilities: ["destructive"] }, { name: "list_issues", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__list_issues", capabilities: [] }, { name: "delete_repo", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__delete_repo", capabilities: ["destructive"] }, { name: "observed_only", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: null, declared: false }], expect: { errors: ["device_first_loosening"], warnings: ["loosening_grant"] } },
1015
+ { id: "VC-18f", name: "under device-first a bare product key may not loosen a qualified base rule for the same tool", yaml: "apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\ntarget: {device: local}\nspec:\n tools:\n default: allow\n rules:\n mcp__github__create_issue: block\n products:\n editor: {tools: {rules: {create_issue: allow}}}", inventory: [{ name: "create_payment", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true }, { name: "Read", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", inputSchema: { type: "object", properties: { file_path: { type: "string" } } }, declared: true }, { name: "create_issue", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__create_issue", capabilities: ["destructive"] }, { name: "list_issues", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__list_issues", capabilities: [] }, { name: "delete_repo", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__delete_repo", capabilities: ["destructive"] }, { name: "observed_only", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: null, declared: false }], expect: { errors: ["device_first_loosening"], warnings: ["loosening_grant"] } },
1016
+ { id: "VC-18g", name: "under device-first a server glob in a product may not loosen a bare base rule it covers", yaml: 'apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\ntarget: {device: local}\nspec:\n tools:\n default: allow\n rules:\n create_issue: block\n products:\n editor: {tools: {rules: {"mcp__github__*": allow}}}', inventory: [{ name: "create_payment", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true }, { name: "Read", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", inputSchema: { type: "object", properties: { file_path: { type: "string" } } }, declared: true }, { name: "create_issue", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__create_issue", capabilities: ["destructive"] }, { name: "list_issues", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__list_issues", capabilities: [] }, { name: "delete_repo", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__delete_repo", capabilities: ["destructive"] }, { name: "observed_only", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: null, declared: false }], expect: { errors: ["device_first_loosening"], warnings: ["loosening_grant"] } },
1017
+ { id: "VC-18h", name: "under device-first a qualified product key may tighten a bare base rule", yaml: "apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\ntarget: {device: local}\nspec:\n tools:\n default: allow\n rules:\n create_issue: allow\n products:\n editor: {tools: {rules: {mcp__github__create_issue: block}}}", inventory: [{ name: "create_payment", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true }, { name: "Read", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", inputSchema: { type: "object", properties: { file_path: { type: "string" } } }, declared: true }, { name: "create_issue", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__create_issue", capabilities: ["destructive"] }, { name: "list_issues", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__list_issues", capabilities: [] }, { name: "delete_repo", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__delete_repo", capabilities: ["destructive"] }, { name: "observed_only", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: null, declared: false }], expect: { errors: [], warnings: [], statementIds: ["st-create-issue-0", "st-mcp-github-create-issue-editor-0"] } },
1018
+ { id: "VC-7c", name: "a qualified member key that loosens a bare base rule for the same tool is flagged", 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\nspec:\n tools:\n default: allow\n rules:\n create_issue: block\n members:\n "alice@armoriq.io":\n tools: {rules: {mcp__github__create_issue: allow}}\n expiresAt: 2026-12-31T00:00:00Z', inventory: [{ name: "create_payment", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true }, { name: "Read", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", inputSchema: { type: "object", properties: { file_path: { type: "string" } } }, declared: true }, { name: "create_issue", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__create_issue", capabilities: ["destructive"] }, { name: "list_issues", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__list_issues", capabilities: [] }, { name: "delete_repo", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__delete_repo", capabilities: ["destructive"] }, { name: "observed_only", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: null, declared: false }], expect: { errors: [], warnings: ["loosening_grant"], statementIds: ["st-create-issue-0", "st-mcp-github-create-issue-alice-armoriq-io-0"] } },
1019
+ { id: "VC-4b", name: "two same-length globs in a member overlay matching one tool by its two names is a compile error", 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\nspec:\n tools:\n default: allow\n rules:\n Read: allow\n members:\n "alice@armoriq.io":\n tools: {rules: {"mcp__git*": allow, "create_i*": block}}\n expiresAt: 2026-12-31T00:00:00Z', inventory: [{ name: "create_payment", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true }, { name: "Read", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", inputSchema: { type: "object", properties: { file_path: { type: "string" } } }, declared: true }, { name: "create_issue", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__create_issue", capabilities: ["destructive"] }, { name: "list_issues", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__list_issues", capabilities: [] }, { name: "delete_repo", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__delete_repo", capabilities: ["destructive"] }, { name: "observed_only", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: null, declared: false }], expect: { errors: ["ambiguous_glob"], warnings: [] } },
1020
+ { id: "VC-4c", name: "two same-length globs in a product overlay matching one tool by its two names is a compile error", yaml: 'apiVersion: armor.io/v2\nkind: Policy\nmetadata:\n name: vector\ntarget: {device: local}\nspec:\n tools:\n default: allow\n rules:\n Read: allow\n products:\n editor: {tools: {rules: {"mcp__git*": block, "create_i*": block}}}', inventory: [{ name: "create_payment", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true }, { name: "Read", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", inputSchema: { type: "object", properties: { file_path: { type: "string" } } }, declared: true }, { name: "create_issue", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__create_issue", capabilities: ["destructive"] }, { name: "list_issues", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__list_issues", capabilities: [] }, { name: "delete_repo", owner: { type: "mcp_server", id: "srv-github", name: "github" }, schemaHash: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", inputSchema: { type: "object", properties: { amount: { type: "number" }, recipient: { type: "string" } } }, declared: true, qualifiedName: "mcp__github__delete_repo", capabilities: ["destructive"] }, { name: "observed_only", owner: { type: "agent", id: "agent-1", name: "support-agent" }, schemaHash: null, declared: false }], expect: { errors: ["ambiguous_glob"], warnings: [] } }
997
1021
  ];
998
1022
 
999
1023
  // src/vectors.ts