| Bidder Client | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Authenticate bidder/deposit and route all commands for an auction to one sequencer. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Auction Gateway. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Two bids arrive at same timestamp” to the external caller. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Bidder Client boundary before extracting or scaling it. |
| Auction Gateway | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Validate state, increment, reserve, and dedupe client bid before journal append. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Bidder Client from also owning the contract and failure behavior of Identity / Deposit. | Put protocol, authentication, quotas, and business transitions in one process. Acceptable at low scale, but it couples external traffic risk to domain releases. Here that simpler choice would couple “Close timer fires before last committed bid” to Bidder Client. | Costs another hop, policy distribution, and a high-blast-radius fleet. Introduce it when many clients or services need one protocol and protection boundary. Measure the latency, saturation, lag, or mismatch at the Auction Gateway boundary before extracting or scaling it. |
| Identity / Deposit | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Run deterministic proxy-bid comparison and update highest bid/close extension atomically. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Auction Gateway from also owning the contract and failure behavior of Auction Catalog. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Hot auction exceeds one sequencer” to Auction Gateway. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Identity / Deposit boundary before extracting or scaling it. |
| Auction Catalog | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Publish bid events and schedule versioned close timer against server time. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Identity / Deposit from also owning the contract and failure behavior of Auction Router. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Winning payment fails” to Identity / Deposit. | Costs eventual consistency, schema evolution, replay tooling, idempotent consumers, and lag operations. Earn it when bursts or downstream failure must not block acknowledgment. Measure the latency, saturation, lag, or mismatch at the Auction Catalog boundary before extracting or scaling it. |
| Auction Router | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: At close freeze winner, start settlement, and preserve journal for disputes/fraud. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Auction Catalog from also owning the contract and failure behavior of Bid Sequencer. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Proxy bids reveal private maximum” to Auction Catalog. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Auction Router boundary before extracting or scaling it. |
| Bid Sequencer | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Authenticate bidder/deposit and route all commands for an auction to one sequencer. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Auction Router from also owning the contract and failure behavior of Auction State Machine. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Two bids arrive at same timestamp” to Auction Router. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Bid Sequencer boundary before extracting or scaling it. |
| Auction State Machine | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate state, increment, reserve, and dedupe client bid before journal append. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Bid Sequencer from also owning the contract and failure behavior of Bid Journal. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Close timer fires before last committed bid” to Bid Sequencer. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Auction State Machine boundary before extracting or scaling it. |
| Bid Journal | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Run deterministic proxy-bid comparison and update highest bid/close extension atomically. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Auction State Machine from also owning the contract and failure behavior of Highest-Bid Projection. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Hot auction exceeds one sequencer” to Auction State Machine. | Costs eventual consistency, schema evolution, replay tooling, idempotent consumers, and lag operations. Earn it when bursts or downstream failure must not block acknowledgment. Measure the latency, saturation, lag, or mismatch at the Bid Journal boundary before extracting or scaling it. |
| Highest-Bid Projection | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Publish bid events and schedule versioned close timer against server time. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Bid Journal from also owning the contract and failure behavior of Proxy Bid Engine. | Read authoritative storage for every request. Simpler initially, but latency and source-of-truth load scale together and a hot key becomes a database incident. Here that simpler choice would couple “Winning payment fails” to Bid Journal. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Highest-Bid Projection boundary before extracting or scaling it. |
| Proxy Bid Engine | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: At close freeze winner, start settlement, and preserve journal for disputes/fraud. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Highest-Bid Projection from also owning the contract and failure behavior of Close Timer. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Proxy bids reveal private maximum” to Highest-Bid Projection. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Proxy Bid Engine boundary before extracting or scaling it. |
| Close Timer | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Authenticate bidder/deposit and route all commands for an auction to one sequencer. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Proxy Bid Engine from also owning the contract and failure behavior of Payment / Settlement. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Two bids arrive at same timestamp” to Proxy Bid Engine. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Close Timer boundary before extracting or scaling it. |
| Payment / Settlement | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate state, increment, reserve, and dedupe client bid before journal append. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Close Timer from also owning the contract and failure behavior of Notification Stream. | Keep this behavior inside an adjacent service. Prefer that simpler option until independent scale, ownership, policy, or failure isolation is measurable. Here that simpler choice would couple “Close timer fires before last committed bid” to Close Timer. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Payment / Settlement boundary before extracting or scaling it. |
| Notification Stream | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Run deterministic proxy-bid comparison and update highest bid/close extension atomically. | Decouples bursts and failure from user acknowledgment. It prevents Payment / Settlement from also owning the contract and failure behavior of Fraud / Collusion. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Hot auction exceeds one sequencer” to Payment / Settlement. | Costs eventual consistency, schema evolution, replay tooling, idempotent consumers, and lag operations. Earn it when bursts or downstream failure must not block acknowledgment. Measure the latency, saturation, lag, or mismatch at the Notification Stream boundary before extracting or scaling it. |
| Fraud / Collusion | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Publish bid events and schedule versioned close timer against server time. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Notification Stream from also owning the contract and failure behavior of Audit / Replay. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Winning payment fails” to Notification Stream. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Fraud / Collusion boundary before extracting or scaling it. |
| Audit / Replay | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: At close freeze winner, start settlement, and preserve journal for disputes/fraud. | Proves correctness and supports controlled recovery. It prevents Fraud / Collusion from also owning the contract and failure behavior of operators and repair tooling. | Infer correctness from request logs. Logs do not prove durable business state, detect silent drift, or safely repair ambiguous outcomes. Here that simpler choice would couple “Proxy bids reveal private maximum” to Fraud / Collusion. | Costs an interface, deployment, telemetry, ownership, and failure mode. Keep it in-process first; extract when independent scale or reliability pays for the boundary. Measure the latency, saturation, lag, or mismatch at the Audit / Replay boundary before extracting or scaling it. |