Summary
AI agents are increasingly building software (running `npm install`, `npm build`, tests, deployments via tool calls in Claude Code, Cursor, etc.). These agents produce no SLSA provenance today. The build log is mutable, unsigned, and operator-controlled.
We build protect-mcp (10K+ monthly npm downloads), which wraps every agent tool call in an Ed25519-signed receipt. The receipt chain from a build session maps structurally to SLSA provenance. Opening this issue to discuss whether this mapping is valid and whether SLSA should formally recognize agent hosts as build platforms.
Field mapping (v1.0 provenance predicate)
| SLSA field |
ScopeBlind receipt equivalent |
| `builder.id` |
`issuer_id` (MCP host / agent identity) |
| `buildType` |
`type` + `tool_name` (e.g., "protectmcp:decision" + "Bash") |
| `invocation.configSource.digest` |
`policy_digest` (SHA-256 of the Cedar policy governing the build) |
| `invocation.parameters` |
`tool_input_hash` (SHA-256 of tool call args) |
| `metadata.buildStartedOn` |
First receipt `issued_at` |
| `metadata.buildFinishedOn` |
Last receipt `issued_at` |
| Build steps (ordered) |
Receipt chain via `previousReceiptHash` |
| Input materials |
`tool_input_hash` per receipt |
| Output |
`output_hash` per receipt |
The chain IS the build log. Every step, every decision, every input/output hash.
SLSA levels achievable
| Level |
Requirement |
Agent receipt coverage |
| L1 |
Provenance exists |
Receipt chain signed by agent host |
| L2 |
Signed by hosted build service |
Receipt chain signed by protect-mcp (same key, same host session) |
| L3 |
Unforgeable provenance |
Receipt signed by ATECC608B secure element (hardware-bound key) |
L1 and L2 are achievable today. L3 requires hardware-bound signing keys (we are building this for a separate physical attestation device; the key never leaves the secure element).
What the mapping adds beyond standard SLSA
ScopeBlind receipts carry fields that standard SLSA provenance does not:
- `policy_id` + `policy_digest`: proves WHICH policy was active at each build step and its exact content hash. Not just "the build happened" but "the build was governed by this specific policy."
- `decision` (allow/deny): proves the policy gate was checked AND what the decision was, including denied steps. A deny receipt proves the policy held.
- `previousReceiptHash`: hash-chaining means insertions and deletions in the build log are detectable, not just modifications.
The gap: builder identity
SLSA expects `builder.id` to reference a recognized build platform. An MCP host running protect-mcp is not in any current builder registry. Two possible paths:
- Register agent hosts (protect-mcp, similar tools) as SLSA-recognized builders
- Extend the spec to define a "governed agent" builder type where provenance comes from the governance layer, not the CI/CD platform
Concrete scenario
An agent in Claude Code builds and publishes a package:
```
Step 1: npm install -> receipt: tool=Bash, input_hash=lockfile, decision=allow
Step 2: npm run build -> receipt: tool=Bash, input_hash=build_config, decision=allow
Step 3: npm test -> receipt: tool=Bash, output_hash=test_results, decision=allow
Step 4: npm publish -> receipt: tool=Bash, decision=DENY (policy: no publish without human)
```
Steps 1-3 are the build provenance. Step 4's deny receipt proves the governance gate held. The entire chain verifies offline.
Existing integrations
The receipt format is already used across multiple systems:
Questions
- Is the field mapping above a valid interpretation of SLSA provenance for agent-built software?
- Should agent hosts be recognized as builders, or does SLSA assume a CI/CD platform?
- Would a worked example (npm package built entirely by an AI agent with signed receipts as provenance) be useful for the spec discussion?
Happy to contribute a mapping document or PoC if this direction is in scope.
Summary
AI agents are increasingly building software (running `npm install`, `npm build`, tests, deployments via tool calls in Claude Code, Cursor, etc.). These agents produce no SLSA provenance today. The build log is mutable, unsigned, and operator-controlled.
We build protect-mcp (10K+ monthly npm downloads), which wraps every agent tool call in an Ed25519-signed receipt. The receipt chain from a build session maps structurally to SLSA provenance. Opening this issue to discuss whether this mapping is valid and whether SLSA should formally recognize agent hosts as build platforms.
Field mapping (v1.0 provenance predicate)
The chain IS the build log. Every step, every decision, every input/output hash.
SLSA levels achievable
L1 and L2 are achievable today. L3 requires hardware-bound signing keys (we are building this for a separate physical attestation device; the key never leaves the secure element).
What the mapping adds beyond standard SLSA
ScopeBlind receipts carry fields that standard SLSA provenance does not:
The gap: builder identity
SLSA expects `builder.id` to reference a recognized build platform. An MCP host running protect-mcp is not in any current builder registry. Two possible paths:
Concrete scenario
An agent in Claude Code builds and publishes a package:
```
Step 1: npm install -> receipt: tool=Bash, input_hash=lockfile, decision=allow
Step 2: npm run build -> receipt: tool=Bash, input_hash=build_config, decision=allow
Step 3: npm test -> receipt: tool=Bash, output_hash=test_results, decision=allow
Step 4: npm publish -> receipt: tool=Bash, decision=DENY (policy: no publish without human)
```
Steps 1-3 are the build provenance. Step 4's deny receipt proves the governance gate held. The entire chain verifies offline.
Existing integrations
The receipt format is already used across multiple systems:
Questions
Happy to contribute a mapping document or PoC if this direction is in scope.