| Display / Keypad | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Accept money into a session and maintain refundable balance separately from machine cash. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Machine Controller. | 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 “Motor runs but item does not drop” 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 Display / Keypad boundary before extracting or scaling it. |
| Machine Controller | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate selected slot inventory and current price; calculate feasible change from actual coins. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Display / Keypad from also owning the contract and failure behavior of Session State. | 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 “Exact change unavailable after payment” to Display / Keypad. | 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 Machine Controller boundary before extracting or scaling it. |
| Session State | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Authorize card or reserve cash, then claim one slot item with expected version. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Machine Controller from also owning the contract and failure behavior of Product 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 “Two inputs race one machine session” to Machine Controller. | 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 Session State boundary before extracting or scaling it. |
| Product Catalog | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Command dispenser and confirm drop sensor before committing inventory/payment. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Session State from also owning the contract and failure behavior of Slot Inventory. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Card authorization expires” to Session State. | 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 Product Catalog boundary before extracting or scaling it. |
| Slot Inventory | Owns authoritative versioned state or immutable evidence. In this design it participates in: On jam/timeout refund or mark uncertain vend for operator reconciliation. | Defines the source of truth and commit boundary. It prevents Product Catalog from also owning the contract and failure behavior of Selection Policy. | Let each service persist its own interpretation. That removes one clear commit boundary and makes retries, support, and reconciliation ambiguous. Here that simpler choice would couple “Refill changes inventory during vend” to Product Catalog. | Costs schema migration, replication, backup, and shard ownership. Split storage only when access patterns, retention, or compliance boundaries materially differ. Measure the latency, saturation, lag, or mismatch at the Slot Inventory boundary before extracting or scaling it. |
| Selection Policy | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Accept money into a session and maintain refundable balance separately from machine cash. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Slot Inventory from also owning the contract and failure behavior of Coin Acceptor. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Motor runs but item does not drop” to Slot Inventory. | 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 Selection Policy boundary before extracting or scaling it. |
| Coin Acceptor | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate selected slot inventory and current price; calculate feasible change from actual coins. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Selection Policy from also owning the contract and failure behavior of Cash Inventory. | 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 “Exact change unavailable after payment” to Selection Policy. | 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 Coin Acceptor boundary before extracting or scaling it. |
| Cash Inventory | Owns authoritative versioned state or immutable evidence. In this design it participates in: Authorize card or reserve cash, then claim one slot item with expected version. | Defines the source of truth and commit boundary. It prevents Coin Acceptor from also owning the contract and failure behavior of Card Terminal. | Let each service persist its own interpretation. That removes one clear commit boundary and makes retries, support, and reconciliation ambiguous. Here that simpler choice would couple “Two inputs race one machine session” to Coin Acceptor. | Costs schema migration, replication, backup, and shard ownership. Split storage only when access patterns, retention, or compliance boundaries materially differ. Measure the latency, saturation, lag, or mismatch at the Cash Inventory boundary before extracting or scaling it. |
| Card Terminal | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Command dispenser and confirm drop sensor before committing inventory/payment. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Cash Inventory from also owning the contract and failure behavior of Payment Strategy. | 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 “Card authorization expires” to Cash Inventory. | 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 Card Terminal boundary before extracting or scaling it. |
| Payment Strategy | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: On jam/timeout refund or mark uncertain vend for operator reconciliation. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Card Terminal from also owning the contract and failure behavior of Change Solver. | 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 “Refill changes inventory during vend” to Card Terminal. | 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 Strategy boundary before extracting or scaling it. |
| Change Solver | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Accept money into a session and maintain refundable balance separately from machine cash. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Payment Strategy from also owning the contract and failure behavior of Dispenser Motor. | 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 “Motor runs but item does not drop” to Payment Strategy. | 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 Change Solver boundary before extracting or scaling it. |
| Dispenser Motor | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate selected slot inventory and current price; calculate feasible change from actual coins. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Change Solver from also owning the contract and failure behavior of Drop Sensor. | 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 “Exact change unavailable after payment” to Change Solver. | 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 Dispenser Motor boundary before extracting or scaling it. |
| Drop Sensor | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Authorize card or reserve cash, then claim one slot item with expected version. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Dispenser Motor from also owning the contract and failure behavior of Fault / Refill Console. | 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 inputs race one machine session” to Dispenser Motor. | 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 Drop Sensor boundary before extracting or scaling it. |
| Fault / Refill Console | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Command dispenser and confirm drop sensor before committing inventory/payment. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Drop Sensor from also owning the contract and failure behavior of operators and repair tooling. | 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 “Card authorization expires” to Drop Sensor. | 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 Fault / Refill Console boundary before extracting or scaling it. |