All notable changes to the AgenTrust for Claude Code plugin.
-
The TRACE Trust Record is signed with the plugin's persisted key, not a throwaway one.
sign_allcalledagentrust_trace.generate_key()for each record, so the private half was discarded at once and the only copy of the public half was thecnf.jwkinside the record itself.agentrust_trace.verify_recordrefuses that by default and warns when forced withallow_embedded_key=Truethat it "proves the record is internally consistent, NOT that it came from a trusted issuer" - so the signature attested to nothing about origin, which is the property the record exists to carry. It also gave the agent a new TRACE identity every session: three records captured locally in August carry three different keys, where their manifests all share one.The record now shares the key that signs the manifest, whose public half is already published beside it as
verification_key.json. That makes the record verifiable by a third party holding only that file, and makes the identity stable enough to pin out of band or register as a trace-registry producer, which a per-session key can never be.Records emitted before this change cannot be retrofitted; their signing keys no longer exist. Re-run
/traceto emit a verifiable one.Found because the test suite asserted the manifest was externally verifiable and never asked the same of the record. It does now, and both new tests fail against the previous behaviour.
- Drift detection now requires the separately published
agentrust-capture-corepackage; the previous vendored fallback was removed. Existing installations must runpip install agentrust-capture-corebefore their next session. The Claude Code marketplace manifest cannot declare or install Python package dependencies.
First launch-ready release. Since 0.1.0 the plugin can actually be installed, the SessionStart hook is hardened against real-world config, and signed records are independently verifiable.
- Persistent signing key. The Agent Manifest is signed with one Ed25519 key
kept at
~/.claude/agentrust/signing_key.json(generated once, reused every run, private half never leaves the machine), so every record carries the same identity. - Published verification key. Each
/tracerun writesverification_key.json({key_id, public_key_b64url}) so a third party can verifymanifest.jsonon another machine. The manifest is now genuinely tamper-evident: any change to a signed field fails verification. - Repo-root
.claude-plugin/marketplace.jsonso/plugin marketplace add agentrust-io/integrationsand/plugin install agentrust-claude-codework. - CI runs the plugin test suite: a stdlib-only job (proving the hook needs no crypto packages) and a signing job across Python 3.11 / 3.12 / 3.13.
/manifest verifymissed mid-session drift. It reused a cached snapshot instead of re-reading the agent, so a skill dropped in or a permission widened after session start was reported as unchanged. It now always re-snapshots.- SessionStart hook could crash the session. Malformed
settings.json, a non-dictpermissionsblock, a misshaped~/.claude.json, askillspath that is a file, and a corruptedbaseline.jsonall threw an uncaught traceback. Each now degrades gracefully; a corrupt baseline self-heals on the next run. The hook always emits valid SessionStart output and exits 0. - Missing crypto packages now print a
pip install -r requirements.txthint instead of a rawModuleNotFoundError.
- Docs lead with why agent-composition drift matters, a 60-second quickstart, and the everyday warning to verify to approve loop.
- Tested and required dependency floors moved to the 0.3.0 line
(
agent-manifest,agentrust-trace).
Initial release: per-session Agent Manifest + TRACE record, SessionStart drift
check against an approved baseline, /manifest and /trace commands.