| Member / Staff UI | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate membership and circulation policy for the exact physical/digital copy. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Catalog Search. | 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 librarians checkout same copy” 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 Member / Staff UI boundary before extracting or scaling it. |
| Catalog Search | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Conditionally transition AVAILABLE→LOANED and create loan with computed due date. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Member / Staff UI from also owning the contract and failure behavior of Membership Service. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Hold expires while member arrives” to Member / Staff UI. | 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 Catalog Search boundary before extracting or scaling it. |
| Membership Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: A hold enqueues by title/branch policy; return assigns first eligible member atomically. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Catalog Search from also owning the contract and failure behavior of Circulation 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 “Return at different branch” to Catalog Search. | 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 Service boundary before extracting or scaling it. |
| Circulation Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Renew only if policy permits and no higher-priority hold blocks the copy. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Membership Service from also owning the contract and failure behavior of Policy 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 “Renewal races new hold” to Membership 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 Circulation Service boundary before extracting or scaling it. |
| Policy Engine | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Fine calculator consumes overdue/loss transitions; notifications are asynchronous and idempotent. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Circulation Service from also owning the contract and failure behavior of Title Catalog. | Embed policy in every caller. Rules then drift by deployment version and emergency changes require fleet-wide redeployment. Here that simpler choice would couple “Digital license count exhausted” to Circulation 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 Policy Engine boundary before extracting or scaling it. |
| Title Catalog | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Validate membership and circulation policy for the exact physical/digital copy. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Policy Engine from also owning the contract and failure behavior of Copy 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 “Two librarians checkout same copy” to Policy Engine. | 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 Title Catalog boundary before extracting or scaling it. |
| Copy Inventory | Owns authoritative versioned state or immutable evidence. In this design it participates in: Conditionally transition AVAILABLE→LOANED and create loan with computed due date. | Defines the source of truth and commit boundary. It prevents Title Catalog from also owning the contract and failure behavior of Loan Aggregate. | 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 “Hold expires while member arrives” to Title 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 Copy Inventory boundary before extracting or scaling it. |
| Loan Aggregate | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: A hold enqueues by title/branch policy; return assigns first eligible member atomically. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Copy Inventory from also owning the contract and failure behavior of Hold Queue. | 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 “Return at different branch” to Copy 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 Loan Aggregate boundary before extracting or scaling it. |
| Hold Queue | Preserves durable ordering, replay, and consumer checkpoints. In this design it participates in: Renew only if policy permits and no higher-priority hold blocks the copy. | Decouples bursts and failure from user acknowledgment. It prevents Loan Aggregate from also owning the contract and failure behavior of Branch Transfer. | Call every downstream consumer synchronously. That couples user latency and availability to analytics, notification, indexing, and audit dependencies. Here that simpler choice would couple “Renewal races new hold” to Loan Aggregate. | 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 Hold Queue boundary before extracting or scaling it. |
| Branch Transfer | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Fine calculator consumes overdue/loss transitions; notifications are asynchronous and idempotent. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Hold Queue from also owning the contract and failure behavior of Fine Calculator. | 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 “Digital license count exhausted” to Hold Queue. | 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 Branch Transfer boundary before extracting or scaling it. |
| Fine Calculator | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Validate membership and circulation policy for the exact physical/digital copy. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Branch Transfer from also owning the contract and failure behavior of Payment 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 “Two librarians checkout same copy” to Branch Transfer. | 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 Fine Calculator boundary before extracting or scaling it. |
| Payment Adapter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Conditionally transition AVAILABLE→LOANED and create loan with computed due date. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Fine Calculator from also owning the contract and failure behavior of Notification 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 “Hold expires while member arrives” to Fine Calculator. | 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 Adapter boundary before extracting or scaling it. |
| Notification Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: A hold enqueues by title/branch policy; return assigns first eligible member atomically. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Payment Adapter from also owning the contract and failure behavior of Digital License 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 “Return at different branch” to Payment 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 Notification Service boundary before extracting or scaling it. |
| Digital License Adapter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Renew only if policy permits and no higher-priority hold blocks the copy. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Notification Service 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 “Renewal races new hold” to Notification 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 Digital License Adapter boundary before extracting or scaling it. |