| Calendar Client | Owns client protocol, request identity, retry, and resume behavior. In this design it participates in: Normalize requested local time to UTC while retaining timezone/recurrence intent. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents the external caller from also owning the contract and failure behavior of Availability 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 “Two users book same interval” 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 Calendar Client boundary before extracting or scaling it. |
| Availability API | Owns authentication, validation, quotas, deadlines, and routing. In this design it participates in: Filter candidate rooms by static constraints, then query interval availability. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Calendar Client from also owning the contract and failure behavior of Identity / Directory. | 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 “DST changes recurrence wall time” to Calendar 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 Availability API boundary before extracting or scaling it. |
| Identity / Directory | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Insert booking with exclusion constraint/serializable overlap check on room calendar. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Availability API from also owning the contract and failure behavior of Room 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 “Room equipment becomes unavailable” to Availability 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 / Directory boundary before extracting or scaling it. |
| Room Search | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Write attendee events asynchronously and preserve room booking as source of truth. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Identity / Directory from also owning the contract and failure behavior of Constraint Filter. | 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 “No-show auto-release races late check-in” to Identity / Directory. | 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 Room Search boundary before extracting or scaling it. |
| Constraint Filter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Expand recurring occurrences within a horizon; exceptions override one occurrence without rewriting series. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Room Search from also owning the contract and failure behavior of Booking 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 “Series edit conflicts with occurrence override” to Room 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 Constraint Filter boundary before extracting or scaling it. |
| Booking Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Normalize requested local time to UTC while retaining timezone/recurrence intent. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Constraint Filter from also owning the contract and failure behavior of Conflict Detector. | 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 users book same interval” to Constraint Filter. | 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 Booking Service boundary before extracting or scaling it. |
| Conflict Detector | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Filter candidate rooms by static constraints, then query interval availability. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Booking Service from also owning the contract and failure behavior of Room Calendar DB. | 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 “DST changes recurrence wall time” to Booking 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 Conflict Detector boundary before extracting or scaling it. |
| Room Calendar DB | Owns authoritative versioned state or immutable evidence. In this design it participates in: Insert booking with exclusion constraint/serializable overlap check on room calendar. | Defines the source of truth and commit boundary. It prevents Conflict Detector from also owning the contract and failure behavior of Attendee Calendar Adapter. | 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 “Room equipment becomes unavailable” to Conflict Detector. | 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 Room Calendar DB boundary before extracting or scaling it. |
| Attendee Calendar Adapter | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Write attendee events asynchronously and preserve room booking as source of truth. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Room Calendar DB from also owning the contract and failure behavior of Recurrence 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 “No-show auto-release races late check-in” to Room Calendar DB. | 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 Attendee Calendar Adapter boundary before extracting or scaling it. |
| Recurrence Engine | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Expand recurring occurrences within a horizon; exceptions override one occurrence without rewriting series. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Attendee Calendar Adapter from also owning the contract and failure behavior of Timezone 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 “Series edit conflicts with occurrence override” to Attendee Calendar 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 Recurrence Engine boundary before extracting or scaling it. |
| Timezone Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Normalize requested local time to UTC while retaining timezone/recurrence intent. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Recurrence Engine 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 “Two users book same interval” to Recurrence 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 Timezone Service boundary before extracting or scaling it. |
| Notification Service | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Filter candidate rooms by static constraints, then query interval availability. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Timezone Service from also owning the contract and failure behavior of Check-In 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 “DST changes recurrence wall time” to Timezone 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 Notification Service boundary before extracting or scaling it. |
| Check-In Sensor | Owns one bounded domain decision, transition, or operational capability. In this design it participates in: Insert booking with exclusion constraint/serializable overlap check on room calendar. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Notification Service from also owning the contract and failure behavior of Auto-Release Worker. | 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 “Room equipment becomes unavailable” 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 Check-In Sensor boundary before extracting or scaling it. |
| Auto-Release Worker | Executes idempotent asynchronous work under lease and retry policy. In this design it participates in: Write attendee events asynchronously and preserve room booking as source of truth. | Separates a distinct scale, ownership, policy, or failure boundary. It prevents Check-In Sensor from also owning the contract and failure behavior of operators and repair tooling. | Perform the work before acknowledging the caller. This gives simpler consistency but unbounded tail latency and fragile retries. Here that simpler choice would couple “No-show auto-release races late check-in” to Check-In Sensor. | Costs leases, checkpoints, retries, DLQs, and lag operations. Separate once execution time or burstiness no longer fits the request deadline. Measure the latency, saturation, lag, or mismatch at the Auto-Release Worker boundary before extracting or scaling it. |