Docket – Per-commit evidence records for agent-written code Docket, a new tool from developer Dillonsmart, captures coding-agent session data and folds it against the commit diff to produce a per-hunk evidence record, flagging lines no human has reviewed. The tool runs as a single static binary with no account or network requirement, storing records in the repository on an orphan ref, and installs via a curl script or `go install github.com/Dillonsmart/docket/cmd/docket@latest`. Docket's demo output shows a commit where 100% of 4 added lines were attributed to a recorded edit with a mean evidence density of 0.77, and the tool reports "no recorded human contact with these lines" for the changed code. A per-commit evidence record for agent-written code. Coding agents produce code faster than anyone can verify it. The reviewer receives a finished diff with no implementation journey: no record of what the agent tried first, what it verified, or which lines nobody ever looked at. The harness already emits that journey and then throws it away at commit time. Docket captures it, folds it against the diff, and produces a per-hunk evidence record — so review attention lands where there is no evidence. bash $ docket show HEAD docket 7a9da95a2a748c2fb99706f48f2ddf64760ffab2 record sha256:046c5278e93cb516e3ba72400fd1a69648c85b93833d31d57648e9ed8e535ebf trust local claimed signed on local verified digest and signature check out ed25519:f889a26cbc34c95e 1 hunks in 1 files, 4 added lines 100% of added lines attributed to a recorded edit mean evidence density 0.77 src/auth.js:3-6 4 lines covered density 0.77 origin claude-code/main via Edit reported by the harness claude-opus-5 task Fix session fixation on login intent The raw UUID is reused across logins, so minting a prefixed id instead. attempt Stamping a creation time on the session so expiry can be checked. superseded vitest failed after this change: npx vitest run evidence coverage: 4 of 4 lines executed coverage/coverage-final.json evidence test execution: pass npx vitest run --coverage — failed before this change human no recorded human contact with these lines No account. No network. The records live in the repository, on an orphan ref. A single static binary. No Go toolchain, no runtime, nothing to compile. curl -fsSL https://raw.githubusercontent.com/Dillonsmart/docket/main/install.sh | sh Or take the archive for your platform from the releases page https://github.com/Dillonsmart/docket/releases — macOS and Linux on arm64 and x86-64, Windows on both — unpack it, and put docket on your PATH. Every release publishes SHA256SUMS ; the installer checks them for you. Building from source stays available for anyone who wants it: go install github.com/Dillonsmart/docket/cmd/docket@latest Then, in a repository: docket init scripts/demo.sh It builds a throwaway repository in a temp directory with a recorded session in it — an agent fixes a session fixation bug, gets it wrong once, watches a test fail, fixes it properly — and prints the docket for the commit. Your own repositories are not touched, and the directory is deleted on exit. Re-run the installer. It overwrites the binary in place with the newest release: curl -fsSL https://raw.githubusercontent.com/Dillonsmart/docket/main/install.sh | sh docket version says what you have; the releases page https://github.com/Dillonsmart/docket/releases says what is current. To pin, or to go back, name the tag: curl -fsSL https://raw.githubusercontent.com/Dillonsmart/docket/main/install.sh | DOCKET VERSION=v0.0.2 sh The variable goes on the sh side of the pipe. In front of curl it would be set for the download and not for the script. From source, it is go install github.com/Dillonsmart/docket/cmd/docket@latest . In CI, the action's default version: latest takes the newest release on every run; pin it to a tag if you would rather decide when that happens. Nothing needs migrating. Records already stored stay readable — each one carries the schema version it was written against — and there is no local state beyond the signing key, which upgrades never touch. You only need to re-run docket init if the binary lands somewhere new. The hooks call it by absolute path, falling back to whatever docket is on PATH, so an upgrade in place needs nothing; installing to a different directory and deleting the old copy is the case where the recorded path goes stale. That installs a prepare-commit-msg hook which writes the trailer — the audited agent never writes its own audit record , a post-commit hook which stores the record , the refs/docket/ refspec, a local signing key, and the Claude Code hooks that let docket observe edits made through the shell. From then on, every commit gets one extra line, in the trailer block where Signed-off-by and Reviewed-by live: Add the session helper The API needs a stable id per session, and the obvious place is here rather than in the middleware. Reviewed-by: Someone Else