open-standards/joulehook
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science 173baf05c7
Some checks failed
standards workspaces build + test / aac-rs (push) Successful in 35s
standards workspaces build + test / joule-code-rs (push) Successful in 41s
standards workspaces build + test / jouleclaw-rs (push) Failing after 2m32s
standards workspaces build + test / joulecontract-rs (push) Successful in 39s
standards workspaces build + test / map-rs (push) Successful in 33s
standards workspaces build + test / mesh-rs (push) Successful in 29s
standards workspaces build + test / openpay (push) Successful in 1m43s
standards workspaces build + test / eoc-rs (push) Successful in 1m55s
standards workspaces build + test / jcp-rs (push) Successful in 1m22s
standards workspaces build + test / proof-rs (push) Successful in 2m53s
standards workspaces build + test / sandbox-rs (push) Successful in 2m15s
standards workspaces build + test / smart-byte-rs (push) Successful in 2m35s
standards workspaces build + test / arl-rs (push) Successful in 2m33s
standards workspaces build + test / joule-ui-rs (push) Successful in 2m32s
standards workspaces build + test / jouledesk-rs (push) Successful in 2m29s
standards workspaces build + test / joulehook-rs (push) Successful in 2m22s
standards workspaces build + test / sense-rs (push) Successful in 2m10s
joulehook: read the published conformance pack, and report the stale vector
`joulehook/conformance/v1/` was the one pack in the repo that nothing read --
no test, not even a generator. Its README advertises the vectors as reproducible,
so anyone building an adapter is told to check against them, while nothing checked
that the reference gate still matched them.

Adds crates/joulehook-hook/tests/conformance.rs, which reads decisions.json from
disk -- the same bytes a third party would -- and drives the real gate binary once
per (case, host), asserting the decision the pack says every conformant adapter
MUST emit. All eight pairs pass: claude-code permissionDecision, cursor
permission, windsurf exit-code-2, antigravity allow_tool, for both a granted and
an ungranted tool. Only the decision is asserted; the pack states the reason text
is not normative, so pinning it would turn a copy-edit into a CI failure.

Falsified rather than assumed: flipping the pack's `expected` for the Read case
makes the test fail with the mismatching host named, so it is bound to the pack
and not to hardcoded values. It also asserts the pair count, so a wrong pack path
fails loudly instead of silently checking nothing.

`deny-receipt.hex` is NOT asserted, and the file says why. The pack pins it at 598
bytes "byte-identical on every run"; the gate is still byte-deterministic --
repeated runs agree exactly -- but now emits 677, because the JCR-1 payload gained
a `payload_hash` field, taking the CBOR map from 15 entries to 16. Decoding both
yields the same verdict, deny_reason, steward, subject and verified, so
receipt.json's claims still hold: this is a stale vector, not a regression.
Refreshing a published signed security vector is a normative change to a public
pack, so it is left to a maintainer rather than quietly regenerated.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-15 11:36:06 -04:00
..
conformance/v1 joulehook: conformance/v1 vectors + meter-seam wiring doc 2026-07-04 20:13:28 -04:00
joulehook-rs joulehook: read the published conformance pack, and report the stale vector 2026-09-15 11:36:06 -04:00
LICENSE joulehook: new open standard v0.1.0-draft.1 — metered/gated/attested agent work in any host 2026-07-04 05:42:45 -04:00
LICENSE-SPEC joulehook: new open standard v0.1.0-draft.1 — metered/gated/attested agent work in any host 2026-07-04 05:42:45 -04:00
README.md joulehook: the deployable meter — joulehook-proxy (OpenAI-shaped base_url proxy) 2026-07-04 20:38:32 -04:00
SPEC.md joulehook: new open standard v0.1.0-draft.1 — metered/gated/attested agent work in any host 2026-07-04 05:42:45 -04:00

JouleHook — Metered, Gated, Attested Agent Work in Any Host

Provisional name — the steward may rename; the profile string joulehook/1 and the seam names are the stable surface.

The energy-accounting and methodology-gating you build for one coding agent is worth little if it's trapped in that one agent. JouleHook carries it into the editors developers already use — Claude Code, Cursor, Windsurf, Antigravity, Zed, JetBrains, OpenCode — without forking any of them.

It rests on one finding: no host lets an extension observe its agent's tokens or intercept its native tools — but every host exposes the same three seams, and JouleHook is the normative contract over them:

A per-action gate, a model-call meter, and a receipt surface. Bind those three to a decide-outside-the-model grant check, an honest energy meter, and a sealed receipt, and any agent's work becomes a metered, gated transaction — from one core.

JouleHook does not replace the host's agent. It is the host-binding layer for the sibling standards: JCP decides and grants, Mesh meters at the model front door, jcp-efficiency is the receipt. JouleHook adds the seam contract and the per-host conformance profiles that make them portable.

  • Licence: Apache-2.0 for reference code (LICENSE); CC-BY-4.0 for specification text (LICENSE-SPEC).
  • Status: v0.1.0 draft. Specification published (SPEC.md); reference workspace joulehook-rs/ ships the gate binding (joulehook-hook) for the claude-code and hooks-family profiles — one PreToolUse hook that gates by JCP capability (decided outside the model, every decision sealed) and speaks the native decision format of Claude Code, Cursor, Windsurf, and Antigravity behind a --host selector; joulehook-statusline, the in-editor joule meter (honest est from Claude Code's own tokens); and joulehook-mcp, an MCP server that surfaces the sealed decisions as verified, human-readable resources in any MCP-speaking editor. The claude-code full profile installs today (joulehook-rs/INSTALL.md); the enforcing Mesh-proxy meter + a site land next.

The three seams

Seam Host mechanisms What rides it
Gate PreToolUse-hook family; ACP request_permission allow / deny / rewrite, decided outside the model, sealed
Meter base_url proxy; OTel gen_ai.* tokens→joules, honest provenance, enforceable joule ceiling
Receipt MCP resources; status line; panel hash-chained, verifiable efficiency/1 + decision receipts

Conformance profiles

claude-code (reference) · hooks-family (Cursor / Windsurf / Antigravity) · acp (Zed / JetBrains / Neovim) · opencode · cline · vscode (Open-VSX) · meter-only (Continue, any OTel host). See SPEC.md §6.

The honest limit

A host-side adapter alone cannot meter the host agent's own tokens; a complete energy figure requires the Meter seam (proxy or OTel). An adapter that claims whole-session energy without a bound meter is non-conformant (SPEC.md §7).

What's here

joulehook/
├── SPEC.md          — the normative standard (§1–§9)
├── README.md        — this file
├── joulehook-rs/    — reference implementation
│   └── crates/
│       ├── joulehook-hook      — ✅ the PreToolUse gate CLI for the hook family
│       │                          (Claude Code / Cursor / Windsurf / Antigravity via --host;
│       │                          wraps jcp-bridge::LocalToolGate for the JCP check + seal)
│       │                          + joulehook-statusline — ✅ the in-editor joule meter
│       ├── joulehook-mcp       — ✅ the receipt-surface MCP server (sealed decisions →
│       │                          verified MCP resources, any MCP-speaking editor)
│       ├── joulehook-meter     — ✅ the meter-seam binding: inject a grant's budget as
│       │                          the Mesh joule ceiling (enforce) + bridge Mesh's
│       │                          usage.energy into an efficiency/1 receipt
│       └── joulehook-proxy     — ✅ the deployable meter: an OpenAI-shaped base_url
│                                  proxy that caps + seals every model call
└── conformance/v1/  — ✅ reproducible vectors: per-host decision encodings
                        (decisions.json) + a byte-deterministic sealed deny receipt
                        (deny-receipt.hex + receipt.json, verified-decode)

JouleHook is one of the Transaction Science open standards. Transaction Science is the steward, not the proprietor.