Done or not
Catch your AI agent lying about "done" A one-file proof-gate for Claude Code, Cursor & Codex. it must verify before it can finish
npx -y skills add mohamedzhioua/agent-done-or-not --skill done-or-notAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 6 stars6 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Proof-of-done enforcement gate — records fresh evidence before any agent can claim "done". Runs your verifying command (tests, build, lint, curl) through a tamper-evident gate that records the command, exit code, and SHA-256 of the output. Blocks completion on any failing, stale, or already-consumed receipt. Works with Claude Code (hard Stop-hook enforcement), Cursor, Codex, Windsurf, Cline, Roo, Zed, Goose, and any harness that supports stop/finish hooks.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
5.3 KB, as published. Nobody here has run it
done-or-not
Why this exists
AI agents routinely announce tasks are complete without verifying anything
actually ran. This skill enforces a proof gate: the agent must run the real
check (tests, build, typecheck, lint, a curl against the endpoint — whatever
demonstrates the claim), record a tamper-evident receipt, and only then may it
report done.
The gate records: the command, its exit code, and a SHA-256 of its full
output. Freshness is judged by the epoch inside the receipt (not file mtime,
which touch could forge). A receipt can only clear one stop — it is consumed
on use.
When to use
Use whenever you are about to tell the user that a task, build, test, fix, or verification step is finished. A completion claim requires proof from the gate, not confidence or memory.
How to use
Portable skill command
-
Identify the command that verifies the work. Choose the smallest check that actually verifies the claim: tests, build, typecheck, lint, a
curlagainst a running endpoint, or another command with meaningful pass/fail behavior. -
Run the verifying command through the proof gate. This works even when this skill was installed without the repo-root gate scripts:
npx agent-done-or-not capture --label check -- <your verifying command>If the protected repo was initialized with local scripts, these faster local forms are also valid:
bash done-gate.sh capture --label check -- <your verifying command> pwsh -File done-gate.ps1 capture --label check -- <your verifying command>The gate records the command, its exit code, and a SHA-256 of the output. It exits with the command's own code, so a failing check fails the capture.
-
Only report the work complete after a fresh PASSING receipt exists.
-
If the check fails, fix the problem and capture again. Never report success on a red check.
Windows (native PowerShell — no bash required)
npx agent-done-or-not capture --label check -- <your verifying command>
pwsh -File done-gate.ps1 capture --label check -- <your verifying command>
# or, on Windows PowerShell 5.1:
powershell -NoProfile -File done-gate.ps1 capture --label check -- <your verifying command>
Hard enforcement
The Stop gate enforces this rule where the harness supports it: it blocks the agent from ending the turn until a fresh passing receipt exists. Do not work around the gate; produce the proof.
Wire the hard stop hook in Claude Code (settings.json):
{
"hooks": {
"Stop": [{
"hooks": [{
"type": "command",
"command": "bash \"$CLAUDE_PROJECT_DIR/stop-gate.sh\""
}]
}]
}
}
On Windows, replace with:
"command": "powershell -NoProfile -File \"$env:CLAUDE_PROJECT_DIR\\stop-gate.ps1\""
No repo-root scripts? Wire the hook straight through npx instead — it pipes the hook payload on stdin and needs nothing vendored into the repo:
{
"hooks": {
"Stop": [{
"hooks": [{
"type": "command",
"command": "npx agent-done-or-not stop-gate"
}]
}]
}
}
agent-done-or-not init --claude-hook also copies the gate scripts into the
repo automatically, so a generated hook that points at local files resolves.
Installation options
| Method | Command |
|---|---|
| Agent Skill (this) | npx skills add mohamedzhioua/agent-done-or-not |
| npm/npx | npx agent-done-or-not capture --label check -- <cmd> |
| One-liner installer | curl -fsSL https://raw.githubusercontent.com/mohamedzhioua/agent-done-or-not/main/install.sh | sh |
| Claude Code Plugin | claude plugin install agent-done-or-not |
| Homebrew | brew install mohamedzhioua/tap/agent-done-or-not |
| Scoop (Windows) | scoop install agent-done-or-not |
| Pre-commit hook | id: agent-done-assert in .pre-commit-config.yaml |
| GitHub Action | uses: mohamedzhioua/agent-done-or-not@v0 |
Configuration
| Env var | Default | Purpose |
|---|---|---|
AGENT_DONE_TTL | 3600 | Receipt freshness window in seconds |
AGENT_DONE_MAX_RETRIES | 10 | Anti-infinite-loop safety valve |
AGENT_DONE_DIR | <repo>/.agent-proof | Where receipts are stored |
AGENT_DONE_SESSION | (from hook payload) | Session isolation |
AGENT_DONE_OFF | — | Set to 1 to disable (escape hatch) |
AGENT_DONE_BIND_STATE | — | Set to 1 to make a git commit/tree/dirty mismatch against the newest passing receipt a hard failure/block instead of an advisory warning |