Engine and ledger
A deterministic auction core and a hash-chained audit trail.
The engine
An English ascending auction with ceilings and a soft close. The core is three pure functions, decide, evolve and replay, with no Node built-ins, so the same events always give the same result.
Events are real names from the code: AUCTION_CREATED, LOT_ADDED, LOT_OPENED, BID_RECORDED, BID_REJECTED, BID_STRUCK, LOT_CLOSING, LOT_HAMMERED, LOT_UNSOLD, LOT_ABORTED, LOT_PAUSED, LOT_RESUMED, LOT_EXTENDED, LOT_SETTLED, AUCTION_CLOSED. See events.
The ledger
Every event is linked to the one before it by a hash. A redacted public export and a verifier detect an edited chain. A cut tail shows as not closed, and is proven only against a head hash published elsewhere.
verifyPublicExport(entries)returns{ ok: true }or the first bad index with a reason. PassexpectedHeadto also detect truncation.verify-ledger <ledger.jsonl>inpackages/enginechecks an export without a server and exits non-zero on tampering.
The room runtime
The server is a single Node process per host. It holds the room, turns spoken and typed bids into engine commands, schedules settlement and keeps file stores for the room log, ledger, journals, holds and webhook events. A persistent store for a hosted deploy needs a persistent disk and a single instance.
Last updated on