Skip to content

robertjack/coreartifact

Repository files navigation

Your agent says the tests passed. Prove it.

a local-first evidence ledger for Claude Code sessions — what your agents actually ran, recorded as evidence on your machine. This is coreartifact.

Dashboard: 3 of 5 delegated sessions verified

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.

Quickstart

Requires Node >= 22.13.

npm install -g coreartifact
cd your-repo
cart init

init 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 open

Your 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.

Verify anything yourself

Along the way: cart log lists every captured session; cart show <session-id> is one session in detail.

cart check test -- pnpm test

check 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.

The laws

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.

How it works

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.

Tested range and platforms

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.

License

Apache-2.0. See LICENSE and NOTICE.

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages