claude said done. gotcha said otherwise.
A Claude Code plugin that prints receipts.
Not metaphorical ones. Actual, verifiable, hook-generated proof of what Claude did — files changed, commands run, tests executed, and every unverified claim labeled [GUESS] in plain sight.
Because Claude has a habit of saying "done!" when it isn't.
Ask Claude to fix a bug. It says:
"Done! I've patched the handler, updated the tests, and everything should be passing now."
Which files did it touch? Did it run the tests or just assume? What does "should be passing" mean?
You don't know. Claude doesn't tell you. And you won't find out until the PR review, or the deploy, or the 2am incident.
Gotcha fixes this by making Claude show its work — every time, automatically, in a format you can audit.
═══ RECEIPT ═══
TASK: patch null check in auth handler + update tests
FILES CHANGED (verified):
src/auth/handler.ts [+8 -3]
src/auth/handler.test.ts [+14 -0]
COMMANDS RUN (verified):
$ npm test -- auth → exit 0, 7 passed, 0 failed
$ npm run typecheck → exit 0
TESTS:
ran: 7 tests in handler.test.ts
result: pass
CLAIMS MADE:
✓ Null check added before token decode
✓ Existing 6 tests still pass
⚠ [GUESS] No regressions elsewhere — only ran auth suite, not full test run
NEXT IF YOU TRUST ME: merge it
NEXT IF YOU DON'T: npm run test:all
═══════════════
✓ means Claude verified it in this session. [GUESS] means it didn't. There is no third option.
For read-only sessions (no edits, no commands):
═══ RECEIPT ═══ (read-only — no files touched, no commands run)
/plugin marketplace add arsovskidev/gotcha
/plugin install gotcha@arsovskidevRestart Claude Code. No further setup. The skill loads automatically and activates on any coding task.
To skip a receipt on a specific turn, say "skip the receipt this turn."
Prefer to clone manually?
git clone https://github.com/arsovskidev/gotcha.git
claude --plugin-dir ./gotcha/gotcha:receipt
Print the last receipt from the current session. Pass a number to see the last N receipts: /gotcha:receipt 3.
/gotcha:audit
Take the last receipt and independently re-run every command listed under COMMANDS RUN. Cross-check every file against git diff --stat. Returns one of three verdicts:
✅ AUDIT PASSED — all claims reproduce
⚠️ AUDIT DRIFT — N claims no longer reproduce
❌ AUDIT FAILED — receipt was wrong about M items
The audit itself ends with a receipt. Receipts all the way down.
/gotcha:reset
Clear the session log and start fresh.
Gotcha is built around a deliberate redundancy. Claude produces a receipt in prose. The hooks produce a receipt independently in a shell script. They can be compared. That comparison is the whole point.
The skill (skills/gotcha/SKILL.md) loads at session start and instructs Claude to emit the receipt format after every task. It also enforces the [GUESS] rule: unverified claims must be labeled, not softened, not omitted.
The hooks run outside Claude's context window entirely:
| Script | Fires on | Records |
|---|---|---|
snapshot-git.sh |
SessionStart |
Git SHA at session open — diff baseline |
log-tool.sh |
PostToolUse |
Every Bash / Edit / Write / MultiEdit call → .gotcha/tool-log.jsonl |
build-receipt.sh |
Stop |
Hook-verified receipt → .gotcha/last-verified-receipt.txt |
The file at .gotcha/last-verified-receipt.txt is written by bash, reads git diff directly, and counts actual tool calls from the JSONL log. Claude does not write it and cannot influence it.
Add .gotcha/ to your .gitignore — it's session state, not source.
gotcha/
├── .claude-plugin/
│ ├── marketplace.json
│ └── plugin.json
├── commands/
│ ├── receipt.md
│ ├── audit.md
│ └── reset.md
├── hooks/
│ └── hooks.json
├── scripts/
│ ├── snapshot-git.sh
│ ├── log-tool.sh
│ └── build-receipt.sh
└── skills/
└── gotcha/
└── SKILL.md
Does this slow Claude down? No. The receipt is part of Claude's response, not a separate call. The hooks are shell scripts that run in milliseconds.
What if I'm not in a git repo?
The file diff section falls back to git status --porcelain. If git isn't available at all, it says so rather than silently omitting the section.
Does the skill auto-activate or do I have to trigger it?
Auto-activates. The description field in SKILL.md is broad enough to match any task involving editing, building, testing, or debugging.
Can Claude skip the receipt? Per session, if you explicitly ask. The skill won't fight you. But it will be back on the next turn.
Every [GUESS] in a receipt is a thing you would have found out the hard way. In code review. In a failed deploy. In a user report.
Gotcha moves that discovery to the moment Claude finishes typing — before you git push, before you close the terminal, while the context is still in your head.
If gotcha has caught Claude lying to you, leave a star. ⭐ Every star is a bug that didn't reach production.
MIT License