| Mobile Client | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Validate membership, currency precision, and split strategy totals. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Expense API. | 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 “Percentage split does not sum exactly” 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 Mobile Client boundary before extracting or scaling it. |
| Expense API | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Append immutable expense revision and participant shares; reverse prior revision on edit. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Mobile Client from also owning the contract and failure behavior of Group Aggregate. | 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 “Expense edit races settlement” to Mobile 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 Expense API boundary before extracting or scaling it. |
| Group Aggregate | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Consume journal to update pairwise debt projection under checkpoint. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Expense API from also owning the contract and failure behavior of Membership Policy. | 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 “Member leaves with outstanding debt” to Expense 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 Group Aggregate boundary before extracting or scaling it. |
| Membership Policy | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Optionally simplify net debt while retaining original obligations and audit. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Group Aggregate from also owning the contract and failure behavior of Split Strategy. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Currency conversion rate changes” to Group Aggregate. | 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 Membership Policy boundary before extracting or scaling it. |
| Split Strategy | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Record settlements idempotently and update balances/notifications asynchronously. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Membership Policy from also owning the contract and failure behavior of Currency / Rounding. | 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 “Simplification changes legal counterparty” to Membership 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 Split Strategy boundary before extracting or scaling it. |
| Currency / Rounding | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate membership, currency precision, and split strategy totals. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Split Strategy from also owning the contract and failure behavior of Expense 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 “Percentage split does not sum exactly” to Split 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 Currency / Rounding boundary before extracting or scaling it. |
| Expense Journal | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Append immutable expense revision and participant shares; reverse prior revision on edit. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Currency / Rounding from also owning the contract and failure behavior of Share Store. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Expense edit races settlement” to Currency / Rounding. | 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 Expense Journal boundary before extracting or scaling it. |
| Share Store | Owns authoritative versioned state or immutable evidence. In this design it participates in: Consume journal to update pairwise debt projection under checkpoint. | Defines the source of truth and commit boundary. It prevents Expense Journal from also owning the contract and failure behavior of Debt 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 “Member leaves with outstanding debt” to Expense Journal. | 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 Share Store boundary before extracting or scaling it. |
| Debt Projection | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Optionally simplify net debt while retaining original obligations and audit. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Share Store from also owning the contract and failure behavior of Simplification 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 “Currency conversion rate changes” to Share 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 Debt Projection boundary before extracting or scaling it. |
| Simplification Engine | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Record settlements idempotently and update balances/notifications asynchronously. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Debt Projection from also owning the contract and failure behavior of Settlement Service. | 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 “Simplification changes legal counterparty” to Debt 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 Simplification Engine boundary before extracting or scaling it. |
| Settlement Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate membership, currency precision, and split strategy totals. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Simplification Engine from also owning the contract and failure behavior of Payment Link 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 “Percentage split does not sum exactly” to Simplification 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 Settlement Service boundary before extracting or scaling it. |
| Payment Link Adapter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Append immutable expense revision and participant shares; reverse prior revision on edit. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Settlement Service from also owning the contract and failure behavior of Activity Feed. | 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 “Expense edit races settlement” to Settlement Service. | 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 Link Adapter boundary before extracting or scaling it. |
| Activity Feed | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Consume journal to update pairwise debt projection under checkpoint. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Payment Link Adapter from also owning the contract and failure behavior of Notification Router. | 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 “Member leaves with outstanding debt” to Payment Link 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 Activity Feed boundary before extracting or scaling it. |
| Notification Router | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Optionally simplify net debt while retaining original obligations and audit. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Activity Feed from also owning the contract and failure behavior of Audit / Export. | 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 “Currency conversion rate changes” to Activity Feed. | 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 Notification Router boundary before extracting or scaling it. |
| Audit / Export | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Record settlements idempotently and update balances/notifications asynchronously. | Proves correctness and supports controlled recovery. It prevents Notification Router 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 “Simplification changes legal counterparty” to Notification 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 Audit / Export boundary before extracting or scaling it. |