Agent Skills › wshobson/agents › signed-audit-trails-recipe

signed-audit-trails-recipe

GitHub

提供在 Claude Code 中设置密码学签名审计轨迹的分步指南,涵盖策略评估、Ed25519收据生成及离线验证,适用于合规与监管环境。

plugins/signed-audit-trails/skills/signed-audit-trails-recipe/SKILL.md wshobson/agents

Trigger Scenarios

需要满足金融或医疗等强监管环境的审计要求 在 CI/CD 流水线中验证自动化构建步骤的策略合规性 向多方合作伙伴证明 Agent 行为且无需信任操作者

Install

npx skills add wshobson/agents --skill signed-audit-trails-recipe -g -y
More Options

Non-standard path

npx skills add https://github.com/wshobson/agents/tree/main/plugins/signed-audit-trails/skills/signed-audit-trails-recipe -g -y

Use without installing

npx skills use wshobson/agents@signed-audit-trails-recipe

指定 Agent (Claude Code)

npx skills add wshobson/agents --skill signed-audit-trails-recipe -a claude-code -g -y

安装 repo 全部 skill

npx skills add wshobson/agents --all -g -y

预览 repo 内 skill

npx skills add wshobson/agents --list

SKILL.md

Frontmatter
{
    "name": "signed-audit-trails-recipe",
    "description": "Step-by-step cookbook for setting up cryptographically signed audit trails on Claude Code tool calls. Use when explaining, evaluating, or demonstrating the pattern before committing to the protect-mcp runtime hooks. Covers Cedar policy, Ed25519 receipts, offline verification, tamper detection, CI\/CD integration, and SLSA composition."
}

Signed Audit Trails for Claude Code Tool Calls

Cookbook-style walkthrough for cryptographically signed receipts on every Claude Code tool call. This is the teaching skill. For the runtime implementation, install the protect-mcp plugin.

What this gives you

Every tool call (Bash, Edit, Write, WebFetch) is:

  1. Evaluated against a Cedar policy before execution. If the policy denies the call, the tool does not run.
  2. Signed as an Ed25519 receipt after execution. Receipts are JCS-canonical and verifiable offline by anyone with the public key.

An auditor, regulator, or counterparty can verify every receipt later (Step 5). No network call, no vendor lookup, no trust in the operator.

When to use the pattern

  • Regulated environments (finance, healthcare, critical infrastructure) where you need tamper-evident evidence of agent behavior
  • CI/CD pipelines where you want to prove that a policy gate held for every automated build step
  • Multi-party collaboration where a counterparty wants to verify your agent's behavior without trusting your operator
  • Compliance contexts (EU AI Act Article 12, SLSA provenance for agent-built software) where standard logging is not sufficient

Step 1: Install the hook configuration

Install the protect-mcp plugin with /plugin install protect-mcp. Its hooks run evaluate.sh before each tool call and sign.sh after it. Both scripts read the hook event from stdin, because Claude Code sets no TOOL_NAME or TOOL_INPUT variables. See references/hook-wiring.md for the hook configuration and what each script passes to protect-mcp.

protect-mcp 0.7.4 does not create the signing key, and without a key the receipts are unsigned. Create ./protect-mcp.key once. The command never replaces an existing key:

if [ ! -e ./protect-mcp.key ]; then
  d=$(mktemp -d) && npx protect-mcp@0.7.4 init --dir "$d" && mv "$d/keys/gateway.json" ./protect-mcp.key
fi

Give auditors the publicKey value from that file. Do not commit the file, because it also holds the private key.

Add the private key and receipt directory to .gitignore:

echo "/protect-mcp.key" >> .gitignore
echo "/receipts/" >> .gitignore

Step 2: Write a Cedar policy

Create ./protect.cedar from the example in references/cedar-policy.md. It allows read-only tools and a short list of Bash commands, denies shell chaining and destructive commands, and limits writes to the project with .. segments denied.

Step 3: Use Claude Code normally

Start Claude Code. Every tool call goes through both hooks:

You: Please read the README and summarize it.

Claude: I will read README.md.
  [PreToolUse: Read ./README.md -> allow]
  [Tool: Read executes]
  [PostToolUse: receipt rcpt-a8f3c9d2 signed to ./receipts/]

... summary of README ...

A session of 20 tool calls appends 20 receipts to ./receipts/receipts.jsonl.

Step 4: Inspect a receipt

protect-mcp 0.7.4 appends each receipt as one line of ./receipts/receipts.jsonl. Print the newest one:

tail -n 1 ./receipts/receipts.jsonl | python3 -m json.tool

The receipt is a signed v2 envelope that names the tool, and it holds no public key. See references/receipt-format.md for a sample and the signed fields.

Step 5: Verify the receipts

Pass the publicKey value from ./protect-mcp.key to the verifier:

PUB=$(node -p 'JSON.parse(require("fs").readFileSync("./protect-mcp.key")).publicKey')
npx @veritasacta/verify@0.9.2 --replay-chain ./receipts/receipts.jsonl --key "$PUB"

Exit codes:

Code Meaning
0 Every receipt verified
1 A receipt failed verification (tampered, wrong key, or malformed line)
2 The receipts file could not be read

Step 6: Demonstrate tamper detection

Change the newest receipt's decision from allow to deny:

python3 -c "
import json
path = './receipts/receipts.jsonl'
lines = open(path).read().splitlines()
r = json.loads(lines[-1])
r['payload']['decision'] = 'deny'
lines[-1] = json.dumps(r)
open(path, 'w').write('\n'.join(lines) + '\n')
"

npx @veritasacta/verify@0.9.2 --replay-chain ./receipts/receipts.jsonl --key "$PUB"

The verifier exits with code 1 and reports which line failed. The Ed25519 signature no longer matches the JCS-canonical bytes of the tampered payload.

Restore the field and verification passes again.

How the cryptography works

Two invariants make receipts verifiable offline across any conformant implementation:

  1. JCS canonicalization (RFC 8785) before signing. Keys sorted by UTF-16 code units, whitespace minimized, strings not normalized. Two independent implementations produce byte-identical signing payloads for the same receipt content.
  2. Ed25519 signatures (RFC 8032) over the canonical bytes. Deterministic, fixed-size, no nonce dependency.

protect-mcp 0.7.4 receipts carry no link to the previous receipt, so a deleted receipt goes undetected.

For the formal wire format see draft-farley-acta-signed-receipts.

Cross-implementation interop

The receipt format has four independent implementations today:

Implementation Language Use case
protect-mcp TypeScript Claude Code, Cursor, MCP hosts
protect-mcp-adk Python Google Agent Development Kit
sb-runtime Rust OS-level sandbox (Landlock + seccomp)
APS governance hook Python CrewAI, LangChain

A receipt produced by any of them verifies against @veritasacta/verify. The auditor does not need to trust the operator's tooling choice: the format is the contract.

CI/CD integration

Verify receipts in CI so a tampered receipt fails the build. references/ci-cd.md has a GitHub Actions workflow that runs on pushes to the default branch. It installs the signing key from a branch-limited environment, runs the agent, verifies the receipts, and uploads them. It does not run on pull requests, because that would hand the key to unreviewed code.

Composition with SLSA provenance for agent-built software

When Claude Code builds and releases software (running npm install, npm build, npm publish as tool calls), the receipt chain is the per-step build log. SLSA Provenance v1 has an extension point for this: the byproducts field can reference the receipt chain alongside the build attestation.

The agent-commit build type documents the pattern using the ResourceDescriptor shape:

{
  "name": "decision-receipts",
  "digest": { "sha256": "..." },
  "uri": "oci://registry/org/build-xyz/receipts:sha256-...",
  "annotations": {
    "predicateType": "https://veritasacta.com/attestation/decision-receipt/v0.1",
    "signerRole": "supervisor-hook"
  }
}

The SLSA provenance is signed by the builder identity; the receipt attestation is signed by the supervisor-hook identity. Two trust domains, cross-referenced at the byproduct layer. See slsa-framework/slsa#1594 for the composition discussion.

Common pitfalls

Private key in version control. The generated ./protect-mcp.key must not be committed. The examples above add it to .gitignore. If a key is accidentally committed, rotate it immediately. Move the key and ./receipts/receipts.jsonl to an archive, then run the Step 1 command again. Verify the archived receipts with the old public key.

Hook payload on stdin. Claude Code sets no $TOOL_NAME or $TOOL_INPUT variables. A hook command that passes --tool "$TOOL_NAME" sends an empty tool name, so the policy denies every call. Read the payload from stdin as the plugin scripts do.

Receipts directory in CI. If Claude Code runs in CI, upload receipts as an artifact at the end of the job or the receipts are lost at job end.

Policy is missing. When ./protect.cedar does not exist, evaluate.sh prints a warning to stderr and allows the call. No call is gated until you create the policy in Step 2.

Related in this marketplace

  • protect-mcp — the runtime hook implementation (use this plugin in production)
  • review-agent-governance — require human approval before review-surface actions; composes with protect-mcp

References

Version History

  • 0874a27 Current 2026-10-19 15:13

    修正 RFC 8785 键排序描述,将过大内容拆分至参考文件并更新指针。

  • 9b15b34 2026-09-28 06:57

    适配protect-mcp 0.7.4版本:修复钩子通过stdin传递参数、修正密钥初始化与gitignore路径、更新离线验证命令以支持新收据格式。

  • 367cb6a 2026-08-20 06:56

Same Skill Collection

plugins/accessibility-compliance/skills/screen-reader-testing/SKILL.md
plugins/accessibility-compliance/skills/wcag-audit-patterns/SKILL.md
plugins/agent-teams/skills/multi-reviewer-patterns/SKILL.md
plugins/agent-teams/skills/parallel-debugging/SKILL.md
plugins/agent-teams/skills/task-coordination-strategies/SKILL.md
plugins/api-scaffolding/skills/fastapi-templates/SKILL.md
plugins/avoid-ai-writing/skills/avoid-ai-writing/SKILL.md
plugins/backend-development/skills/api-design-principles/SKILL.md
plugins/backend-development/skills/architecture-patterns/SKILL.md
plugins/backend-development/skills/cqrs-implementation/SKILL.md
plugins/backend-development/skills/event-store-design/SKILL.md
plugins/backend-development/skills/microservices-patterns/SKILL.md
plugins/backend-development/skills/projection-patterns/SKILL.md
plugins/backend-development/skills/temporal-python-testing/SKILL.md
plugins/backend-development/skills/workflow-orchestration-patterns/SKILL.md
plugins/before-you-build/skills/before-you-build/SKILL.md
plugins/block-no-verify/skills/block-no-verify-hook/SKILL.md
plugins/blockchain-web3/skills/defi-protocol-templates/SKILL.md
plugins/blockchain-web3/skills/nft-standards/SKILL.md
plugins/blockchain-web3/skills/solidity-security/SKILL.md
plugins/blockchain-web3/skills/web3-testing/SKILL.md
plugins/business-analytics/skills/data-storytelling/SKILL.md
plugins/business-analytics/skills/kpi-dashboard-design/SKILL.md
plugins/cicd-automation/skills/deployment-pipeline-design/SKILL.md
plugins/cicd-automation/skills/github-actions-templates/SKILL.md
plugins/cicd-automation/skills/gitlab-ci-patterns/SKILL.md
plugins/cicd-automation/skills/secrets-management/SKILL.md
plugins/cloud-infrastructure/skills/cost-optimization/SKILL.md
plugins/cloud-infrastructure/skills/hybrid-cloud-networking/SKILL.md
plugins/cloud-infrastructure/skills/istio-traffic-management/SKILL.md
plugins/cloud-infrastructure/skills/linkerd-patterns/SKILL.md
plugins/cloud-infrastructure/skills/mtls-configuration/SKILL.md
plugins/cloud-infrastructure/skills/multi-cloud-architecture/SKILL.md
plugins/cloud-infrastructure/skills/service-mesh-observability/SKILL.md
plugins/cloud-infrastructure/skills/terraform-module-library/SKILL.md
plugins/conductor/skills/track-management/SKILL.md
plugins/conductor/skills/workflow-patterns/SKILL.md
plugins/content-marketing/skills/social-evidence-research/SKILL.md
plugins/data-engineering/skills/airflow-dag-patterns/SKILL.md
plugins/data-engineering/skills/data-quality-frameworks/SKILL.md
plugins/data-engineering/skills/dbt-transformation-patterns/SKILL.md
plugins/data-engineering/skills/spark-optimization/SKILL.md
plugins/database-design/skills/postgresql-table-design/SKILL.md
plugins/database-design/skills/postgresql/SKILL.md
plugins/developer-essentials/skills/auth-implementation-patterns/SKILL.md
plugins/developer-essentials/skills/bazel-build-optimization/SKILL.md
plugins/developer-essentials/skills/code-review-excellence/SKILL.md
plugins/developer-essentials/skills/debugging-strategies/SKILL.md
plugins/developer-essentials/skills/e2e-testing-patterns/SKILL.md
plugins/developer-essentials/skills/error-handling-patterns/SKILL.md

Metadata

Files
0
Version
0874a27
Hash
7a027e32
Indexed
2026-08-20 06:56

홈 - 위키
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-10-22 08:30
浙ICP备14020137号-1