Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ The [independent model research](community/projects/tools/README.md#independent-
- [feelings](https://github.com/BoundaryML/feelings) - BAML `.feels()` / `.how()` / `.matches<T>()` 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).
Expand Down
1 change: 1 addition & 0 deletions community/projects/tools/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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) |
Expand Down
49 changes: 49 additions & 0 deletions community/projects/tools/canny.md
Original file line number Diff line number Diff line change
@@ -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).
Loading