Skip to content

Commands

Commands are RPCs in the .proto (the normative form), derived from EPP and the proven EHUB façade.

CommandEPPWhat it does
Checkcheckavailability of Unit(s) in a Bucket, or remaining count of a Bucket. Idempotent read.
Holdcreateallocates items (explicit Units or quantitative) into a Booking (the Order/cart) with a TTL. Carries a FulfillmentMode.
AddItemsadds items to a still-HELD Booking (incremental cart).
RemoveItemsremoves allocations from a still-HELD Booking.
Confirmhold → committed (buyer identity attached).
Settleconfirmed → paid (capture via Billing). Separate from Confirm.
Fulfillpaid → issues the artifact (the ticket). Idempotent. Issues all sold.
RedeemFULFILLED → USED (check-in at the gate). Validated against physical capacity; standby may return BUMPED.
Refundpaid/fulfilled → real refund (returns the Unit to the Bucket). Whole Booking or a subset of allocations (partial / per-item).
Transfertransfernominal post-sale transfer (swaps the holder of the Allocation).
Extendrenewextends the hold’s TTL.
Releasedeleteexplicitly releases hold/booking (= automatic on TTL expiry).
Getinfostate of a Booking.

The resolution axis (ANONYMOUS ↔ CONCRETE) is orthogonal to the FSM and applies only to QUALITATIVE Buckets. See Lifecycle.

CommandWhat it does
Assignconcretizes ANONYMOUS allocation(s) → a Unit chosen by the Channel. overwrite=true = reseat (same holder, releases the old Unit atomically).
AutoAssignconcretizes ANONYMOUS → the Registry chooses (best-available / strategy).
UnassignCONCRETE → ANONYMOUS (drops the Unit, keeps the slot/count).
Swapatomic exchange of Units between two CONCRETE allocations (≠ Transfer, which swaps the holder).

A multi-item Hold carries N items (each explicit or quantitative). The policy is a server-default or per-request:

  • ATOMIC — all-or-nothing (cross-Bucket = 2-phase).
  • BEST_EFFORT — reserves what it can; the response carries a per-item AllocationResult.
  • THRESHOLD — succeeds if at least min_units make it.

A cross-domain atomic Hold is just a cross-Bucket atomic Hold — there is no cross-module dance.