open-standards/jcp/jcp-rs
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science 022ac1e086
Some checks failed
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (push) Has been cancelled
jcp §8.1: a hold through a chain counts on every link; check 9's refusal under a hold stated exactly
Review of the live-hold change found the chained two-phase path could not
place a hold. §8.1 counts a hold against every grant it names, a chained
hold's chain_ids included, but Runtime::hold takes one grant, and
authorize_chained / charge_chained placed none, so a point deciding
chained calls concurrently still decided each against the whole remainder.

jcp-runtime: Runtime::hold_chained authorizes as authorize_chained does
and places one hold naming every link in the same step. Its held_uj is
the most any link has left, since charge_chained saturates each link at
its own ceiling, and it counts against every link, so a sibling
delegate's call through a held root is refused as the holder's own next
call is. Runtime::settle_chained replaces it with each link's own debit.
authorize_chained, authorize_chained_for and charge_chained now say they
place and settle no hold. hold_bound says that sealing its figure beside
an allow from authorize or authorize_flow, rather than through hold, is
not counted live and breaks §8.1 wherever another decision can come
before the charge.

jcp-receipt: ReceiptLog::append_hold_chained and append_settle_chained
seal a chained hold with chain_ids and held_uj, and its settle naming the
hold. The replay already read held_uj over chain_ids.

SPEC: §8.1 no longer says every other call under a hold is refused. Check
9 refuses every other two-phase call and every one-shot call that would
debit anything, where no earlier check refuses it first; a one-shot call
costing 0 is still allowed. It states the chained figure and that a
sibling through a held ancestor is refused. §4.5's Statement.spent_uj is
cumulative µJ debited, never a hold, and "tunable" now covers only the
settled part of the exposure: work in flight under a hold at a point is
bounded by what that point's own decision left, which no cadence shortens.
The C14 bullet says a hold counts from the step that allows its call. The
C16 bullet covers a chained hold.

Tests: a runtime test holds through a chain and refuses a sibling
delegate, the delegate's next call and the root's holder, then settles to
each link's own debit. A receipt test seals a chained hold and its
settle, and checks the replay restores held_uj on every link, and then
each link's debit. C16 checks the same live and on replay.

Changelog: none
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-07 10:46:50 -05:00
..
conformance/v1 jcp: JCR-1 receipts bind their payload — jcp/2 + version dispatch (SPEC §8, C23) 2026-07-18 03:04:19 -04:00
crates jcp §8.1: a hold through a chain counts on every link; check 9's refusal under a hold stated exactly 2026-11-07 10:46:50 -05:00
Cargo.lock jcp-wire: a caller-signed challenge, and endpoint evidence bound to the answer 2026-10-21 10:26:42 -04:00
Cargo.toml Cargo: no minimum-supported-version floor, because the policy is latest stable 2026-11-03 17:42:20 -05:00