open-standards/joulehook/joulehook-rs/crates/joulehook-hook/Cargo.toml
Transaction Science eeaf732c2c joulehook: refresh the published deny receipt to jcp/2, and hold it byte for byte
deny-receipt.hex was pinned to the superseded jcp/1 receipt profile (598 bytes)
while the reference gate seals jcp/2, which binds a payload_hash (677 bytes). The
gate is deterministic (three runs byte-identical) and the new envelope decodes to
every field receipt.json records, so this is a refresh, not a behaviour change.

The conformance test now seals the deny exactly as the README reproduces it and
requires the published bytes on every run, verifies them under the reference
steward against receipt.json, and requires any other key to fail. Falsified: the
old receipt back in the pack fails the byte check; a changed deny_reason in
receipt.json fails the decode check.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-30 14:16:01 -04:00

26 lines
1 KiB
TOML

[package]
name = "joulehook-hook"
version.workspace = true
edition.workspace = true
license.workspace = true
repository.workspace = true
rust-version.workspace = true
description = "JouleHook — the claude-code PreToolUse gate binding (joulehook/1 §3): a JCP capability+budget check decided outside the model, sealed, emitting Claude Code's hook decision JSON."
[[bin]]
name = "joulehook-hook"
path = "src/main.rs"
[dependencies]
# The gate itself — LocalToolGate decides a call against a content-addressed,
# joule-budgeted capability set and seals every allow/deny. Cross-workspace path
# dep into jcp-rs (the reference impl composes the sibling standard's crate).
jcp-bridge = { path = "../../../../jcp/jcp-rs/crates/jcp-bridge" }
serde_json = "1"
hex = "0.4"
[dev-dependencies]
# The conformance test decodes + verifies the sealed receipt the gate writes, under
# the reference gate's fixed dev steward, against the pack's receipt.json.
jcp-receipt = { path = "../../../../jcp/jcp-rs/crates/jcp-receipt" }
ed25519-dalek = "2"