From ad76d96974f1593e9faee7da851bb4d36b7e3245 Mon Sep 17 00:00:00 2001 From: Asaf Mazuz Date: Sun, 20 Sep 2026 14:53:52 +0300 Subject: [PATCH] Add Canny listing Claude Code/Codex done-gate warden with ledger-backed blocks and optional TypeSafe Jev advice. --- README.md | 1 + community/projects/tools/README.md | 1 + community/projects/tools/canny.md | 49 ++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 community/projects/tools/canny.md diff --git a/README.md b/README.md index f6a7235a..46c74ff0 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,7 @@ The [independent model research](community/projects/tools/README.md#independent- - [feelings](https://github.com/BoundaryML/feelings) - BAML `.feels()` / `.how()` / `.matches()` typed AI-if methods powered by TypeSafe Jev; upstream licensing unspecified. [Project guide](community/projects/tools/feelings.md). - [ask-jev-skill](https://github.com/shantanugoel/ask-jev-skill) - Hermes skill that asks TypeSafe Jev for typed Choice/Score/Noul tiebreaks when paths remain plausible. [Project guide](community/projects/tools/ask-jev-skill.md). - [bitrate-advisor](https://github.com/affirmitv/bitrate-advisor) - Live-stream encoder settings from telemetry/history using TypeSafe Jev (OpenRouter) inside a deterministic safety envelope. [Project guide](community/projects/tools/bitrate-advisor.md). +- [Canny](https://github.com/qkal/Canny) - Claude Code/Codex warden: append-only ledger and deterministic done-gate; optional TypeSafe Jev advises but never alone blocks. [Project guide](community/projects/tools/canny.md). - [Cua jev-use](https://github.com/trycua/cua/tree/main/libs/cua-driver/examples/jev-use) - Composes a bounded Jev chooser with Cua Driver and an independently verified browser fixture. [Project guide](community/projects/tools/cua-jev-use.md). - [doc-router](https://github.com/misbahsy/doc-router) - Routes PDF pages between local text extraction and OCR using optional Jev judgments, with a Rust CLI and Python bindings. [Project guide](community/projects/tools/doc-router.md). - [Distill](https://github.com/samuelfaj/distill) - Lightweight coding-agent TUI with TypeSafe Jev (or OpenRouter decisions) for model/effort routing, utility tasks, and retention. [Project guide](community/projects/tools/distill.md). diff --git a/community/projects/tools/README.md b/community/projects/tools/README.md index cf371d56..a47933f9 100644 --- a/community/projects/tools/README.md +++ b/community/projects/tools/README.md @@ -46,6 +46,7 @@ See the [computer-use guide](../../../docs/computer-use.md) for a comparison, fo | --- | --- | --- | | [ask-jev-skill](ask-jev-skill.md) | Call TypeSafe Jev as a Hermes typed tiebreaker (Choice/Score/Noul) when multiple paths remain. | Python · Hermes skill + stdlib CLI | | [bitrate-advisor](bitrate-advisor.md) | Choose live-stream encoder bitrate/resolution/next-step with TypeSafe Jev via OpenRouter inside deterministic guardrails. | TypeScript · Deno/Node library (`@affirmi/bitrate-advisor` 0.2.7) | +| [Canny](canny.md) | Stop Claude Code/Codex “done” claims without ledger evidence; TypeSafe Jev advises, only facts block. | TypeScript · CLI (`canny-warden` 0.1.0), zero runtime deps | | [doc-router](doc-router.md) | Select which PDF pages need OCR using optional Jev judgments, then merge local extraction and provider results. | Rust · library and CLI, Python bindings | | [Distill](distill.md) | Route coding-agent model/effort and utility/retention choices with TypeSafe Jev (or OpenRouter decisions) inside a local TUI harness. | Rust · coding agent CLI/TUI (Distill 2.0) | | [ExcelPilot](excelpilot.md) | Drive live Excel workbooks with Qwen planning and TypeSafe Jev intent/tool gates (cascade to OpenRouter/offline). | Python · Office.js add-in + FastMCP agent (`excelpilot` 1.0.0) | diff --git a/community/projects/tools/canny.md b/community/projects/tools/canny.md new file mode 100644 index 00000000..0b189849 --- /dev/null +++ b/community/projects/tools/canny.md @@ -0,0 +1,49 @@ +# Canny + +[All projects](../README.md) · [Developer tools](README.md#developer-tools) + +Warden for Claude Code and Codex CLI: an append-only session ledger and deterministic “done” gate, with optional TypeSafe Jev judgments that advise but never alone block. + +| At a glance | Details | +| --- | --- | +| Source | [Source](https://github.com/qkal/Canny) | +| Maintainer | [qkal](https://github.com/qkal) / Kal. Independently curated; this entry is not an upstream submission or endorsement. | +| Format | TypeScript CLI **canny-warden 0.1.0** — zero runtime dependencies; compiled `dist/` committed for git-based install. | +| Requirements | Node.js ≥ 22; git. Optional `TYPESAFE_API_KEY` for Jev advice (done-gate works offline from the ledger alone). | +| License | [MIT](https://github.com/qkal/Canny/blob/74bc3487370ae6d61cef69c5642cce504a8579cb/LICENSE). | +| Disclosure | AI-assisted catalog review; no affiliation with the maintainer. Listing is not an endorsement. Source inspected; live agent hooks and live Jev were not run. | + +## When to use + +Use it when coding agents claim “done” without running checks, and you want a ledger-backed stop that only code can enforce. Prefer [jev-guard](jev-guard.md) or [toolgate](toolgate.md) for per-tool-call risk deny/ask/allow. Distinct from open PR #7 belay-style tooling: Canny’s hard blocks come from append-only facts (edits, exits, named checks), while Jev only classifies “claims done” / rule notes. + +## How it works + +Hooks record tool events into `~/.canny/sessions/`. On Stop, [`src/hook.ts`](https://github.com/qkal/Canny/blob/74bc3487370ae6d61cef69c5642cce504a8579cb/src/hook.ts) derives allow/block from the ledger (changed files without a passing check, repeated failures, secret patterns). [`src/jev.ts`](https://github.com/qkal/Canny/blob/74bc3487370ae6d61cef69c5642cce504a8579cb/src/jev.ts) posts optional Noul questions to `https://api.typesafe.ai/v1/systemone` (`jev-latest`); answers can annotate context but cannot alone refuse Stop. `canny replay` re-derives verdicts from stored facts and Jev logs. + +## Get started + +```sh +git clone https://github.com/qkal/Canny.git ~/.canny/src +cd ~/.canny/src +git checkout 74bc3487370ae6d61cef69c5642cce504a8579cb +# from a project you want guarded: +node ~/.canny/src/dist/cli.js init +``` + +Optional: `export TYPESAFE_API_KEY=…` for Jev advice. Live hooks send claim text and rule snippets to TypeSafe when a key is set. This listing did not install hooks or call live Jev. + +## Examples and demos + +- README session ledger walkthrough (math.js / `npm test` Stop sequence). +- Offline `test/hook.test.ts` and `test/jev.test.ts` — not executed on the review host. + +## Limits and data handling + +Ledger stores paths and outcomes, not file contents. With a key, judgment payloads leave the host for TypeSafe. Without a key, deterministic rules still gate Stop. Upstream latency anecdotes were not independently measured. + +## Review and maintenance + +Reviewed on **2026-09-20** at [commit 74bc348](https://github.com/qkal/Canny/tree/74bc3487370ae6d61cef69c5642cce504a8579cb): **0.1.0**, MIT. AI-assisted source review of README, LICENSE, `src/jev.ts`, `src/hook.ts`, and `package.json`. No live TypeSafe or agent-hook runs. + +Related: [jev-guard](jev-guard.md), [jev-preflight](jev-preflight.md), [toolgate](toolgate.md).