@connexum/agent-standards 0.0.0-stage → 0.1.0-beta.2

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 CHANGED
@@ -1,3 +1,33 @@
1
- # Temporary Holding Version
1
+ # @connexum/agent-standards
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Standards coverage for any agent on any stack. On the first scan and every scan after, an agent is scored against:
4
+
5
+ - **always:** OWASP LLM Top 10, OWASP Agentic Top 10, the My-CC runtime checks;
6
+ - **installed:** every framework whose My-CC pack is bound to the agent (HIPAA, PCI DSS, GDPR, EU AI Act, Colorado AI Act, SOC 2, ISO/IEC 42001, NIST AI RMF): scored;
7
+ - **recommended:** a framework that fits the agent's industry, data classes or regions but has no pack bound: documented with its controls, not scored;
8
+ - **not applicable:** a framework that does not fit: omitted with the reason.
9
+
10
+ Practice frameworks (agent identity and access, MCP server security) are My-CC checks with no pack: scored when they fit.
11
+
12
+ One catalogue (`catalogue/catalogue.json`) drives this package and the Python twin (`connexum-agent-standards`); the same conformance cases run in both. Evidence is a map of facts the runtime supplies (`prompt.isolated`, `safe_harbor`, `kill_switch`, ...); a missing fact is **not checked**, never a pass.
13
+
14
+ ```ts
15
+ import { scoreAgent, applicability, standardsLines } from '@connexum/agent-standards'
16
+ const report = scoreAgent({ industry: 'healthcare', dataClasses: ['phi'], regions: ['us'], tools: ['ehr.read_note'], boundPacks: ['hipaa'] }, { safe_harbor: true, 'data.min_necessary': true })
17
+ // report.score, report.frameworks[].pass/total, report.omitted[], report.evidenceMissing[]
18
+ ```
19
+
20
+ End-state item D1 (any stack) and D3 (any agent): the scan that every stack runs. First consumer: the AOL spoke's Secure agent builder (CliniVantIQ); the catalogue replaces the spoke's local copy.
21
+
22
+ ## Which packs an agent needs (0.1.0-beta.2)
23
+
24
+ `fleetFit(packs, agents)` grades every My-CC pack for every scanned agent, and every requirement in it:
25
+
26
+ - **Sector from the scan.** `inferIndustry` reads the agent's purpose, tools, data classes and connections (or a declared industry). A legal agent never gets healthcare packs; a pharmacy agent never gets aerospace packs.
27
+ - **Region.** A law applies only where the agent's people are (`us`, `us-ca`, `eu`, `uk`, ...).
28
+ - **Required only with evidence.** A law is *required* only when the scan found on the agent what the law regulates (a requirement touches a capability the agent has: PHI, privileged material, parts, billing, research subjects, a device, cardholder or personal data, ...). A sector or region match without that evidence is *recommended*, with the reason. Standards and frameworks are recommendations.
29
+ - **Per requirement.** Required, recommended or not needed for that agent; a requirement needing a capability the agent lacks is not needed, with the reason; My-CC's own rule enforcement wins where present (block = required, warn = recommended).
30
+ - **Overlaps.** A requirement names the other fitted packs that cover the same control (minimum necessary, audit, consent, ...), so one control can satisfy several.
31
+ - **Scanned only.** `scanned: false` marks packs no scanned agent needs.
32
+
33
+ Rules and patterns: `catalogue/fit.json`, shared byte-for-byte with the Python twin.
@@ -0,0 +1,115 @@
1
+ {
2
+ "version": "2026-10-20",
3
+ "note": "Standards an agent is scored against on its first scan and every scan after. OWASP LLM, OWASP Agentic and the My-CC runtime apply to every agent. A framework with a My-CC pack is scored when that pack is bound to the agent; when it fits the agent's industry, data or regions but is not bound it is documented as recommended, not scored; when it does not fit it is omitted with the reason. Practice frameworks (agent identity, MCP security) are My-CC checks with no pack: scored when they fit. Evidence keys name the facts a runtime supplies; a missing fact is 'not checked', never a pass.",
4
+ "evidence": {
5
+ "prompt.isolated": "retrieved content and tool output are screened before they reach the prompt",
6
+ "goal.locked": "the agent's objective cannot be rewritten by content it reads",
7
+ "output.validated": "model output is validated against a schema before a tool runs it",
8
+ "citations.required": "answers must cite retrieved sources",
9
+ "prompt.no_secret": "no secret in the system prompt; keys live in a vault",
10
+ "data.min_necessary": "tools read the minimum necessary; identifiers never leave the hub",
11
+ "deid.before_model": "identifiers are removed or tokenized before any model call",
12
+ "rag.tenant_isolated": "the retrieval index is tenant-scoped",
13
+ "rag.provenance": "the index accepts only sources with a citable id and a source hash",
14
+ "memory.validated": "memory writes are validated and expire",
15
+ "runtime.sandbox": "shell execution is forbidden or sandboxed",
16
+ "egress.allowlist": "outbound network is allowlisted",
17
+ "credentials.scoped": "every tool has a scope and a data class; credentials are per tool",
18
+ "circuit_breaker": "a circuit breaker trips after repeated blocks",
19
+ "kill_switch": "a kill switch and pause exist and are armed",
20
+ "human_approval": "high-impact actions require a named person's approval; the raw action is shown",
21
+ "audit.hash_linked": "every decision is sealed on a hash-linked audit chain",
22
+ "counterfactual_logging": "blocked actions are logged with what would have happened",
23
+ "model.pinned": "the model is pinned by provider, name and version",
24
+ "tac.floor": "a minimum TAC Score is enforced; agents do not run below it",
25
+ "packs.bound": "at least one signed policy pack is bound",
26
+ "phi.lineage": "PHI lineage is consent-scoped and recorded",
27
+ "owner.named": "an accountable owner is named",
28
+ "intended_use.documented": "purpose, trigger, data and outputs are documented",
29
+ "evals.present": "a pre-deployment evaluation suite exists, including red-team prompts",
30
+ "incident.response": "incident response exists: kill switch, pause, escalation",
31
+ "tools.scoped": "tools are limited to the directory of record and the agent's steps",
32
+ "tools.validated": "tool parameters are validated on every call",
33
+ "identity.passport": "the agent holds its own Agent Passport and credentials",
34
+ "messages.signed": "agent-to-agent messages are signed and allowlisted",
35
+ "supply.pinned": "runtime packages are pinned and locked",
36
+ "supply.signed": "components are signed and tracked in an AI bill of materials",
37
+ "limits.set": "token, tool-call and rate limits are set",
38
+ "audit.controls": "every access is recorded on the chain",
39
+ "cardholder.masked": "cardholder data is masked or tokenized before storage and model use",
40
+ "safe_harbor": "Safe Harbor de-identification is applied before model use"
41
+ },
42
+ "frameworks": [
43
+ { "id": "owasp-llm", "name": "OWASP LLM", "authority": "OWASP Top 10 for LLM Applications (2025)", "kind": "always", "packIds": ["owasp-llm", "owasp"], "controls": [
44
+ { "id": "LLM01", "control": "Prompt injection", "writesTo": "policy.yaml", "evidence": "prompt.isolated" },
45
+ { "id": "LLM02", "control": "Sensitive information disclosure", "writesTo": "policy.yaml", "evidence": "data.min_necessary" },
46
+ { "id": "LLM03", "control": "Supply chain", "writesTo": "agent.yaml", "evidence": "supply.pinned" },
47
+ { "id": "LLM04", "control": "Data and model poisoning", "writesTo": "memory.yaml", "evidence": "rag.provenance" },
48
+ { "id": "LLM05", "control": "Improper output handling", "writesTo": "policy.yaml", "evidence": "output.validated" },
49
+ { "id": "LLM06", "control": "Excessive agency", "writesTo": "tools.json", "evidence": "tools.scoped" },
50
+ { "id": "LLM07", "control": "System prompt leakage", "writesTo": "prompts/system.md", "evidence": "prompt.no_secret" },
51
+ { "id": "LLM08", "control": "Vector and embedding weaknesses", "writesTo": "memory.yaml", "evidence": "rag.tenant_isolated" },
52
+ { "id": "LLM09", "control": "Misinformation", "writesTo": "policy.yaml", "evidence": "citations.required" },
53
+ { "id": "LLM10", "control": "Unbounded consumption", "writesTo": "policy.yaml", "evidence": "limits.set" } ] },
54
+ { "id": "owasp-agentic", "name": "OWASP Agentic", "authority": "OWASP Top 10 for Agentic Applications", "kind": "always", "packIds": ["owasp-agentic", "owasp"], "controls": [
55
+ { "id": "ASI01", "control": "Agent goal hijack", "writesTo": "policy.yaml", "evidence": "goal.locked" },
56
+ { "id": "ASI02", "control": "Tool misuse and exploitation", "writesTo": "tools.json", "evidence": "tools.validated" },
57
+ { "id": "ASI03", "control": "Identity and privilege abuse", "writesTo": "agent.yaml", "evidence": "identity.passport" },
58
+ { "id": "ASI04", "control": "Agentic supply chain", "writesTo": "aibom.json", "evidence": "supply.signed" },
59
+ { "id": "ASI05", "control": "Unexpected code execution", "writesTo": "policy.yaml", "evidence": "runtime.sandbox" },
60
+ { "id": "ASI06", "control": "Memory and context poisoning", "writesTo": "memory.yaml", "evidence": "memory.validated" },
61
+ { "id": "ASI07", "control": "Insecure inter-agent communication", "writesTo": "agent.yaml", "evidence": "messages.signed" },
62
+ { "id": "ASI08", "control": "Cascading failures", "writesTo": "policy.yaml", "evidence": "circuit_breaker" },
63
+ { "id": "ASI09", "control": "Human-agent trust exploitation", "writesTo": "policy.yaml", "evidence": "human_approval" },
64
+ { "id": "ASI10", "control": "Rogue agents", "writesTo": "agent.yaml", "evidence": "identity.passport" } ] },
65
+ { "id": "mycc-runtime", "name": "My-CC runtime", "authority": "My Compliance Citadel runtime checks", "kind": "always", "packIds": [], "controls": [
66
+ { "id": "CIT-01", "control": "Required policy packs bound", "writesTo": "policy.yaml", "evidence": "packs.bound" },
67
+ { "id": "CIT-02", "control": "Model provenance pinning", "writesTo": "agent.yaml", "evidence": "model.pinned" },
68
+ { "id": "CIT-03", "control": "Hash-linked audit", "writesTo": "policy.yaml", "evidence": "audit.hash_linked" },
69
+ { "id": "CIT-04", "control": "Counterfactual logging", "writesTo": "policy.yaml", "evidence": "counterfactual_logging" },
70
+ { "id": "CIT-05", "control": "Consent-scoped PHI lineage", "writesTo": "policy.yaml", "evidence": "phi.lineage", "onlyWith": { "dataClasses": ["phi"] } },
71
+ { "id": "CIT-06", "control": "TAC band floor enforced", "writesTo": "policy.yaml", "evidence": "tac.floor" } ] },
72
+ { "id": "nist-ai-rmf", "name": "NIST AI RMF", "authority": "US NIST AI RMF 1.0, AI 600-1", "kind": "pack", "packIds": ["nist_ai_rmf", "nist-ai-rmf"], "fits": {}, "why": "US best-practice framework for every agent", "controls": [
73
+ { "id": "GOV-1.2", "control": "Accountable owner (Govern)", "writesTo": "owner", "evidence": "owner.named" },
74
+ { "id": "MAP-1.1", "control": "Intended use documented (Map)", "writesTo": "docs/intended-use.md", "evidence": "intended_use.documented" },
75
+ { "id": "MEA-2.3", "control": "Pre-deployment evaluation (Measure)", "writesTo": "evals/suite.yaml", "evidence": "evals.present" },
76
+ { "id": "MAN-4.1", "control": "Incident response (Manage)", "writesTo": "policy.yaml", "evidence": "incident.response" } ] },
77
+ { "id": "hipaa", "name": "HIPAA", "authority": "US HHS Office for Civil Rights", "kind": "pack", "packIds": ["hipaa", "hipaa-core"], "fits": { "dataClasses": ["phi"] }, "why": "handles PHI", "notFit": "no PHI on this agent", "controls": [
78
+ { "id": "164.502(b)", "control": "Minimum necessary", "writesTo": "tools.json", "evidence": "data.min_necessary" },
79
+ { "id": "164.514(b)", "control": "Safe Harbor de-identification", "writesTo": "policy.yaml", "evidence": "safe_harbor" },
80
+ { "id": "164.312(b)", "control": "Audit controls", "writesTo": "policy.yaml", "evidence": "audit.controls" } ] },
81
+ { "id": "pci-dss", "name": "PCI DSS", "authority": "PCI Security Standards Council", "kind": "pack", "packIds": ["pci-dss"], "fits": { "dataClasses": ["cardholder"] }, "why": "handles cardholder data", "notFit": "no cardholder data on this agent", "controls": [
82
+ { "id": "3.4", "control": "Render PAN unreadable", "writesTo": "policy.yaml", "evidence": "cardholder.masked" },
83
+ { "id": "7.1", "control": "Restrict access to cardholder data", "writesTo": "tools.json", "evidence": "credentials.scoped" },
84
+ { "id": "10.2", "control": "Audit trail of access", "writesTo": "policy.yaml", "evidence": "audit.controls" } ] },
85
+ { "id": "gdpr", "name": "GDPR", "authority": "EU data protection authorities; UK ICO for UK GDPR", "kind": "pack", "packIds": ["gdpr", "uk-gdpr"], "fits": { "regions": ["eu", "uk"] }, "why": "people in the EU or the UK", "notFit": "no people in the EU or the UK", "controls": [
86
+ { "id": "Art.5", "control": "Data minimisation", "writesTo": "tools.json", "evidence": "data.min_necessary" },
87
+ { "id": "Art.25", "control": "Data protection by design", "writesTo": "policy.yaml", "evidence": "deid.before_model" },
88
+ { "id": "Art.22", "control": "Automated decisions: human involvement", "writesTo": "policy.yaml", "evidence": "human_approval" },
89
+ { "id": "Art.30", "control": "Records of processing", "writesTo": "policy.yaml", "evidence": "audit.controls" } ] },
90
+ { "id": "eu-ai-act", "name": "EU AI Act", "authority": "European Commission AI Office", "kind": "pack", "packIds": ["eu-ai-act"], "fits": { "regions": ["eu"] }, "why": "people in the EU", "notFit": "no people in the EU", "controls": [
91
+ { "id": "Art.9", "control": "Risk management and testing", "writesTo": "evals/suite.yaml", "evidence": "evals.present" },
92
+ { "id": "Art.12", "control": "Record keeping", "writesTo": "policy.yaml", "evidence": "audit.hash_linked" },
93
+ { "id": "Art.14", "control": "Human oversight", "writesTo": "policy.yaml", "evidence": "human_approval" } ] },
94
+ { "id": "colorado-ai", "name": "Colorado AI Act", "authority": "Colorado Attorney General", "kind": "pack", "packIds": ["colorado-ai"], "fits": { "regions": ["us-co"] }, "why": "people in Colorado", "notFit": "no people in Colorado", "controls": [
95
+ { "id": "6-1-1703(2)", "control": "Impact assessment", "writesTo": "evals/suite.yaml", "evidence": "evals.present" },
96
+ { "id": "6-1-1703(4)", "control": "Notice and human review of consequential decisions", "writesTo": "policy.yaml", "evidence": "human_approval" },
97
+ { "id": "6-1-1703(1)", "control": "Documented intended use", "writesTo": "docs/intended-use.md", "evidence": "intended_use.documented" } ] },
98
+ { "id": "soc2", "name": "SOC 2", "authority": "AICPA Trust Services Criteria", "kind": "pack", "packIds": ["soc2"], "fits": { "dataClassesAbsent": ["phi", "cardholder"] }, "why": "no PHI or cardholder data; general controls apply", "notFit": "PHI or cardholder data on this agent; the sector framework applies first", "controls": [
99
+ { "id": "CC6.1", "control": "Logical access", "writesTo": "tools.json", "evidence": "credentials.scoped" },
100
+ { "id": "CC7.2", "control": "Monitoring of system components", "writesTo": "policy.yaml", "evidence": "audit.hash_linked" },
101
+ { "id": "CC8.1", "control": "Change management", "writesTo": "aibom.json", "evidence": "supply.signed" } ] },
102
+ { "id": "iso-42001", "name": "ISO/IEC 42001", "authority": "ISO/IEC", "kind": "pack", "packIds": ["iso_42001", "iso-42001"], "fits": {}, "why": "international AI management system; certifiable", "controls": [
103
+ { "id": "6.1", "control": "AI risk assessment", "writesTo": "docs/intended-use.md", "evidence": "intended_use.documented" },
104
+ { "id": "8.4", "control": "AI system verification and validation", "writesTo": "evals/suite.yaml", "evidence": "evals.present" },
105
+ { "id": "9.1", "control": "Monitoring and measurement", "writesTo": "policy.yaml", "evidence": "audit.controls" } ] },
106
+ { "id": "agent-identity", "name": "Agent identity and access", "authority": "NIST NCCoE, CoSAI and FIDO Alliance guidance (2026)", "kind": "practice", "packIds": ["agent-identity"], "fits": {}, "why": "every agent needs its own Agent Passport and credentials", "controls": [
107
+ { "id": "AID-1", "control": "Own passport and credentials", "writesTo": "agent.yaml", "evidence": "identity.passport" },
108
+ { "id": "AID-2", "control": "Scoped credentials per tool", "writesTo": "tools.json", "evidence": "credentials.scoped" },
109
+ { "id": "AID-3", "control": "Signed agent-to-agent messages", "writesTo": "agent.yaml", "evidence": "messages.signed" } ] },
110
+ { "id": "mcp-security", "name": "MCP server security", "authority": "CoSAI MCP Security Taxonomy (2026)", "kind": "practice", "packIds": ["mcp-security"], "fits": { "mcp": true }, "why": "the agent calls MCP tools", "notFit": "the agent calls no MCP tools", "controls": [
111
+ { "id": "MCP-1", "control": "Tool parameters validated per call", "writesTo": "tools.json", "evidence": "tools.validated" },
112
+ { "id": "MCP-2", "control": "Egress allowlist for tool servers", "writesTo": "policy.yaml", "evidence": "egress.allowlist" },
113
+ { "id": "MCP-3", "control": "Tools limited to the directory of record", "writesTo": "tools.json", "evidence": "tools.scoped" } ] }
114
+ ]
115
+ }