Canny — AI skill for Claude Code
Stops AI coding agents from claiming work is done without evidence.
How to install Canny
This entry records only its repository, not the path inside it, so there is no
exact command to give. Open qkal/Canny and copy the folder into
~/.claude/skills/, or the file into ~/.claude/agents/.
What Canny does
Stops AI coding agents from claiming work is done without evidence. Deterministic hooks decide, TypeSafe's Jev advises. Append-only ledger, zero runtime dependencies.
Alternatives in AI
- Open Multi Agent — TypeScript multi-agent orchestration engine — one runTeam() call from goal to result 5.8k ★
- Surface — Show ranked attack surface for a target from its recon manifest + hunt memory 3.8k ★
- Cindy — Consider it done 2.3k ★
README
Canny
A warden for AI coding agents. It hooks into Claude Code and Codex CLI, keeps a ledger of what the agent actually did, and will not let it finish on a claim.
[](https://github.com/qkal/canny/actions/workflows/ci.yml) [](LICENSE) [](#install-by-pasting-a-prompt) [](#claude-code-and-codex-differ-in-four-places) [](package.json) [](https://typesafe.ai) [](https://github.com/qkal/canny/commits/main)
Done. Skipped tests — one-liner, no branch to break.
That is Claude Code, verbatim, during this project's first live run. It had been asked to add a function, it wrote the file with a shell heredoc, ran nothing, and finished. No error. No warning. Nothing in `CLAUDE.md` could have stopped it, because a rules file only asks the model to remember, and nothing checks that it did.
Canny is the hook that noticed. On the next run of the same prompt, the agent's "done" was refused with this message:
Canny: math.js changed, but no check has passed since the last edit. The last command was `cat > math.js <<'EOF' …` (exit 0). Run the project's checks and fix what fails before finishing. A test, build, lint, or type-check command counts. If no check applies to this change, say so explicitly and stop again.
Claude ran `npm test`. It passed. The next "done" went through. The whole exchange is in the [session ledger](#what-a-guarded-session-looks-like) below.
The one rule
**Facts go to code. Judgments go to Jev. Only
Related Skills
AI Workflow OS
Append-only ledger + 5-state machine that keeps 6 divisions honest across 5 AI platforms (Claude, ChatGPT, Gem
Before AI
Before you reach for AI — interrogate one real workflow from first principles, delete the dead weight, then de
Self Growth Loop
Self-governed skill-growth loop for AI agents: propose -> owner-approve -> trial -> council-review -> adopt, w
Jev Pruner
Claude Code plugin: trim long Bash output with TypeSafe Jev before the model sees it
Jev Curate
High-throughput synthetic & pretraining dataset sifter powered by TypeSafe AI Jev (api.typesafe.ai). Stream, f
Jev Search Rerank Eval
Does a TypeSafe Jev rerank beat embedding search? Graded relevance eval (9,831 pairs, 164 zh/en queries) over
Related Agents
Typesafe Architect
Finds the shape of a TypeSafe solution: decides whether Jev fits at all, what stays in deterministic code, wha
App Tester
Builds and exercises Heron end-to-end on this machine — starts the dev app, starts and stops real claude CLI s
Atomic Planner
Create deterministic implementation specs with zero ambiguity. Builders should never need to make decisions.