GitHub · by Qkal
Canny
A warden that will not let a coding agent finish on a claim.
Qkal’s hook plugs into Claude Code and Codex CLI, keeps an append-only ledger of what the agent actually did, and refuses a “done” that no passing check supports. It has no runtime dependencies, and Jev is optional.
The project starts from a verbatim transcript line: “Done. Skipped tests — one-liner, no branch to break.” The agent had been asked to add a function, wrote the file with a shell heredoc, ran nothing, and finished. No error, no warning, and nothing in a rules file could have stopped it, because a rules file only asks the model to remember and nothing checks that it did.
The one rule is that facts go to code, judgments go to Jev, and only facts can block. A fact is something the ledger can prove: a file changed, a command ran, it exited 1, the same command failed three times with the same output, the text about to be written contains an AWS key. Those are decided offline with no API key. A judgment — does this message claim the work is done, does this diff break the rule “never hardcode model IDs” — goes to Jev, which answers typed yes-or-no questions with a calibrated probability in about a quarter of a second.
Jev never blocks. A “done” is refused because the ledger holds no passing check, not because a probability crossed a line, and a rule violation becomes a note in the agent’s context rather than a wall. When Jev is unsure, or there is no key, the deterministic rule stands alone. The same session always produces the same verdict, and `canny replay` proves it from the ledger.
qkal/Canny on GitHub
- Stars
- 32
- Forks
- 4
- Language
- TypeScript
- Last push
- Sep 21, 2026
Repository created Sep 11, 2026. Counts read from the GitHub API on Sep 22, 2026, and they move daily — quote them with the date.

