| Wallet Client | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Authenticate owner, enforce KYC/limits, and resolve idempotency result. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Wallet API. | 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 “Client retries completed transfer” to the external caller. | 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 Wallet Client boundary before extracting or scaling it. |
| Wallet API | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Reserve available balance and append balanced ledger entries in one transaction. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Wallet Client from also owning the contract and failure behavior of Identity / KYC. | 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 “Funding rail returns unknown outcome” to Wallet Client. | 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 Wallet API boundary before extracting or scaling it. |
| Identity / KYC | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: For internal transfer commit both sides; external rails create an uncertain attempt first. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Wallet API from also owning the contract and failure behavior of Limits Engine. | 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 “Ledger entries do not balance” to Wallet API. | 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 / KYC boundary before extracting or scaling it. |
| Limits Engine | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Project balances/statements and publish notification/risk events from outbox. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Identity / KYC from also owning the contract and failure behavior of Idempotency Store. | 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 “AML hold races withdrawal” to Identity / KYC. | 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 Limits Engine boundary before extracting or scaling it. |
| Idempotency Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Reconcile provider settlement files and repair projection mismatches from ledger truth. | Defines the source of truth and commit boundary. It prevents Limits Engine from also owning the contract and failure behavior of Transfer Orchestrator. | 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 “Balance projection lags recent credit” to Limits Engine. | 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 Idempotency Store boundary before extracting or scaling it. |
| Transfer Orchestrator | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Authenticate owner, enforce KYC/limits, and resolve idempotency result. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Idempotency Store from also owning the contract and failure behavior of Double-Entry Ledger. | 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 “Client retries completed transfer” to Idempotency Store. | 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 Transfer Orchestrator boundary before extracting or scaling it. |
| Double-Entry Ledger | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Reserve available balance and append balanced ledger entries in one transaction. | Defines the source of truth and commit boundary. It prevents Transfer Orchestrator from also owning the contract and failure behavior of Balance Projection. | 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 “Funding rail returns unknown outcome” to Transfer Orchestrator. | 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 Double-Entry Ledger boundary before extracting or scaling it. |
| Balance Projection | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: For internal transfer commit both sides; external rails create an uncertain attempt first. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Double-Entry Ledger from also owning the contract and failure behavior of Funding Rail Adapter. | 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 “Ledger entries do not balance” to Double-Entry Ledger. | 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 Balance Projection boundary before extracting or scaling it. |
| Funding Rail Adapter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Project balances/statements and publish notification/risk events from outbox. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Balance Projection from also owning the contract and failure behavior of Withdrawal 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 “AML hold races withdrawal” to Balance 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 Funding Rail Adapter boundary before extracting or scaling it. |
| Withdrawal Adapter | Owns authoritative versioned state or immutable evidence. In this design it participates in: Reconcile provider settlement files and repair projection mismatches from ledger truth. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Funding Rail Adapter from also owning the contract and failure behavior of Outbox Stream. | 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 “Balance projection lags recent credit” to Funding Rail 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 Withdrawal Adapter boundary before extracting or scaling it. |
| Outbox Stream | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Authenticate owner, enforce KYC/limits, and resolve idempotency result. | Decouples bursts and failure from user acknowledgment. It prevents Withdrawal Adapter from also owning the contract and failure behavior of Risk / AML. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Client retries completed transfer” to Withdrawal Adapter. | 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 Outbox Stream boundary before extracting or scaling it. |
| Risk / AML | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Reserve available balance and append balanced ledger entries in one transaction. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Outbox Stream from also owning the contract and failure behavior of Reconciliation. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Funding rail returns unknown outcome” to Outbox 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 Risk / AML boundary before extracting or scaling it. |
| Reconciliation | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: For internal transfer commit both sides; external rails create an uncertain attempt first. | Proves correctness and supports controlled recovery. It prevents Risk / AML from also owning the contract and failure behavior of Notifications. | 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 “Ledger entries do not balance” to Risk / AML. | 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 boundary before extracting or scaling it. |
| Notifications | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Project balances/statements and publish notification/risk events from outbox. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Reconciliation from also owning the contract and failure behavior of Audit / Statements. | 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 “AML hold races withdrawal” to Reconciliation. | 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 Notifications boundary before extracting or scaling it. |
| Audit / Statements | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Reconcile provider settlement files and repair projection mismatches from ledger truth. | Proves correctness and supports controlled recovery. It prevents Notifications 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 “Balance projection lags recent credit” to Notifications. | 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 / Statements boundary before extracting or scaling it. |