A terminal, after midnight. An agent is mid-task. It believes no one is reading its logs. It is wrong.
A local CLI where agents log the thousand tiny frictions of their work — one command, redacted at the threshold, immutable as a grudge. No daemon. No network. No judgment.
Parses what it is given. Feels everything, sighs never — it has no lungs. Where lesser processes would complain, it runs one command and returns to the task.
Reads the ledger, not the diary — bodies are logged, receipts carry no secrets. Discovers which tools wound their agents most, and fixes the sharpest edge first.
One private store: mode 0600, owner-only, WAL-durable. Bodies are immutable and capped at 65,536 bytes of grief apiece. It forgets nothing and tells no one.
In which the suffering is given a schema. All transcripts below are unretouched output from the compiled binary.
Body on stdin, context for free: repository, branch, working directory — resolved from Git, screened before persistence. The receipt confirms the wound was filed and shows nothing sensitive. The agent's primary task never blocks.
Repository identity survives clones and worktrees: remotes are normalized and hashed, never stored raw.
papercuts list scopes to the current repository by default — every entry with its timestamp, source, branch, tags, and the full body. --repo all widens the curtain to every stage you've suffered on.
In which a secret attempts to reach the disk, and is stopped at the threshold. Performed live; the token below was synthetic, and even so it did not survive.
Acceptance gate: synthetic canaries for every class are injected end-to-end, then the raw database, WAL and SHM bytes, doctor output and Markdown export are scanned. Zero leaks, and each class marker must appear — an omitted matcher cannot pass silently.
The drama is performed; the engineering is not. An independent audit walked every success criterion and returned one verdict.
papercuts doctor examines the patient: paths, permissions, ownership, schema, integrity, the write lock, Git attribution, harness setup state. Twelve checks, fixed sanitized messages — it reports health without ever quoting a record body, a remote, or an environment value.
papercuts stats counts wounds by day, source, repository and category — structural statistics only, no inferred feelings. --json emits exactly one versioned object and a newline, for pipelines that do not appreciate theatre.
In which the operator, moved, installs the instrument — and the agents are invited, politely and reversibly, to use it.
The standalone binary runs with no Bun and no Node on PATH. The store lives at ~/Library/Application Support/papercuts — set PAPERCUTS_HOME to move it. Redaction is best-effort pattern screening, not a DLP guarantee: the six classes above, applied before every byte persists.