a local-first evidence ledger for Claude Code sessions — what your agents actually ran, recorded as evidence on your machine. This is coreartifact.
What you're looking at:
- Verified — the session has a passing check bound to it: an exit code recorded at execution time as belonging to the session that ran it. Not a summary. Evidence.
- Failing — the session has bound evidence, and it failed. You know now, not at review.
- Unverified — the session claims whatever it claims; no evidence either way. This is where all your delegated work lives today.
Requires Node >= 22.13.
npm install -g coreartifact
cd your-repo
cart initinit registers the repo and installs two things: a capture hook that
records every Claude Code session in this repo to a local, append-only
file, and a skill that tells your agents to record proof of their work
as they go. (cart and coreartifact are the same binary — cart is
the blessed short form.)
Now delegate something real:
claude -p "fix the flaky retry test, then run the suite"The session verifies itself: the skill has the agent run its gates through coreartifact, so the passing suite lands as evidence bound to that session — no flags, no ceremony, nothing for you to remember.
cart openYour session is verified — and you can click into the exact command, output, and exit code that make it so. That's the product: delegation stays cheap, verification becomes a query.
Along the way: cart log lists every captured session; cart show <session-id> is one session in detail.
cart check test -- pnpm testcheck runs your command unchanged, records its output and exit code as
evidence, and passes the exit code through. Binding is explicit: inside
an agent session the skill binds the check to that session; from your
own terminal, pass --session <id> to attach it to a session — without
a target it records standalone, in the ledger but bound to nothing.
Other verbs: cart doctor (what can't currently be derived, and why),
cart open --port <n> --no-browser, cart uninstall.
These are not preferences. They are the product.
- Nothing leaves your machine. No code, no transcripts, no telemetry by default. The only network call in the product is an explicit opt-in ping, and it carries an install id — never your code.
- The raw capture is ground truth forever. The ledger is a pure projection: delete it and re-ingest, and you get the same answers.
- Absence is honest. When a fact can't be verified from captured evidence, it records as ABSENT — with the reason — never fabricated, never silently zero, never guessed.
- Capture never breaks the host. The capture hook appends payloads verbatim, exits 0, and knows nothing about schemas or versions. Your Claude Code session cannot be broken by it.
Pre-1.0. Interfaces may change without notice and there is no support commitment. Issues are welcome; see CONTRIBUTING.md.
A Claude Code hook appends every session event, verbatim, to a local
spool — an append-only file at .coreartifact/spool.jsonl that is never
rewritten. Ingestion (run by log/show or the dashboard) projects the
spool into a SQLite ledger: sessions, commands, file touches, test
results, checks, cost (derived from a pinned price table and labeled as
derived). The dashboard reads the ledger over a local HTTP seam and
renders the headline above.
Everything the ledger derives is verified against Claude Code
2.1.208 – 2.1.220 (dated findings in docs/recording-pass.md).
Outside that range, capture still records everything; some derived
facts may record ABSENT until the range catches up, and cart doctor
names which ones and why. Nothing is ever guessed to preserve the
appearance of support.
Proven on macOS and Linux (CI runs both). WSL counts as Linux; native
Windows is untested (out of scope until a real user asks or a Windows
contributor arrives with evidence). On Node 22.x you may see a one-line
ExperimentalWarning about node:sqlite on stderr — cosmetic, gone on
Node 24.
Apache-2.0. See LICENSE and NOTICE.
