Skip to content

Agent-built software: mapping decision receipts to SLSA provenance #1606

@tomjwxf

Description

@tomjwxf

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:

  1. Register agent hosts (protect-mcp, similar tools) as SLSA-recognized builders
  2. 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

  1. Is the field mapping above a valid interpretation of SLSA provenance for agent-built software?
  2. Should agent hosts be recognized as builders, or does SLSA assume a CI/CD platform?
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    ✅ Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions