Skip to content

arsovskidev/gotcha

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

gotcha

claude said done. gotcha said otherwise.

Stars Last Commit License


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.


The problem

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.


What a receipt looks like

═══ 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)

Install

/plugin marketplace add arsovskidev/gotcha
/plugin install gotcha@arsovskidev

Restart 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

Commands

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


Two truth sources, on purpose

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.


Repo layout

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

FAQ

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.


Why this exists

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.

Star History Chart


MIT License

About

A Claude Code plugin that prints receipts.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors