| Card Reader | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Capture card token, authenticate PIN through bank adapter, and establish bounded session. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Keypad / Display. | 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 “Debit succeeds but cash jams” 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 Card Reader boundary before extracting or scaling it. |
| Keypad / Display | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate amount and compute a feasible denomination plan from versioned cassette counts. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Card Reader from also owning the contract and failure behavior of ATM 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 “Cash dispenses after network timeout” to Card Reader. | 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 Keypad / Display boundary before extracting or scaling it. |
| ATM Controller | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Authorize/reserve funds at bank using request ID before commanding hardware. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Keypad / Display from also owning the contract and failure behavior of Session 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 “Cassette count differs from sensors” to Keypad / Display. | 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 ATM Controller boundary before extracting or scaling it. |
| Session State Machine | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Dispense, verify sensors, then finalize debit; uncertain hardware outcome enters reconciliation. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents ATM Controller from also owning the contract and failure behavior of PIN / Auth Adapter. | 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 “Power fails mid-dispense” to ATM 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 Machine boundary before extracting or scaling it. |
| PIN / Auth Adapter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Journal every transition locally so network/power recovery can compare bank and physical cash. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Session State Machine from also owning the contract and failure behavior of Transaction Orchestrator. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Card retained during session fault” to Session State Machine. | 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 PIN / Auth Adapter boundary before extracting or scaling it. |
| Transaction Orchestrator | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Capture card token, authenticate PIN through bank adapter, and establish bounded session. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents PIN / Auth Adapter from also owning the contract and failure behavior of Bank Core Adapter. | 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 “Debit succeeds but cash jams” to PIN / Auth Adapter. | 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 Transaction Orchestrator boundary before extracting or scaling it. |
| Bank Core Adapter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate amount and compute a feasible denomination plan from versioned cassette counts. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Transaction Orchestrator 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 “Cash dispenses after network timeout” to Transaction Orchestrator. | 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 Bank Core Adapter boundary before extracting or scaling it. |
| Cash Inventory | Owns authoritative versioned state or immutable evidence. In this design it participates in: Authorize/reserve funds at bank using request ID before commanding hardware. | Defines the source of truth and commit boundary. It prevents Bank Core Adapter from also owning the contract and failure behavior of Denomination Strategy. | 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 “Cassette count differs from sensors” to Bank Core Adapter. | 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. |
| Denomination Strategy | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Dispense, verify sensors, then finalize debit; uncertain hardware outcome enters reconciliation. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Cash Inventory from also owning the contract and failure behavior of Cash Dispenser. | 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 “Power fails mid-dispense” 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 Denomination Strategy boundary before extracting or scaling it. |
| Cash Dispenser | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Journal every transition locally so network/power recovery can compare bank and physical cash. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Denomination Strategy from also owning the contract and failure behavior of Dispense Sensors. | 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 retained during session fault” to Denomination 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 Cash Dispenser boundary before extracting or scaling it. |
| Dispense Sensors | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Capture card token, authenticate PIN through bank adapter, and establish bounded session. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Cash Dispenser from also owning the contract and failure behavior of Receipt Printer. | 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 “Debit succeeds but cash jams” to Cash Dispenser. | 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 Dispense Sensors boundary before extracting or scaling it. |
| Receipt Printer | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate amount and compute a feasible denomination plan from versioned cassette counts. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Dispense Sensors from also owning the contract and failure behavior of Local 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 “Cash dispenses after network timeout” to Dispense Sensors. | 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 Receipt Printer boundary before extracting or scaling it. |
| Local Journal | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Authorize/reserve funds at bank using request ID before commanding hardware. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Receipt Printer from also owning the contract and failure behavior of Reconciliation / Operator. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Cassette count differs from sensors” to Receipt Printer. | 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 Local Journal boundary before extracting or scaling it. |
| Reconciliation / Operator | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Dispense, verify sensors, then finalize debit; uncertain hardware outcome enters reconciliation. | Proves correctness and supports controlled recovery. It prevents Local Journal 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 “Power fails mid-dispense” to Local 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 Reconciliation / Operator boundary before extracting or scaling it. |