| Book appointment — slot becomes busy | Unit + Integration | Must |
| Book appointment — slot already busy → 409 | Unit | Must |
| Double-booking blocked (no permission) | Unit | Must |
| Double-booking allowed (scheduler role) | Unit + Integration | Must |
| Reschedule — new slot free → old slot released | Integration | Must |
| Cancel — slot released, waitlist auto-fill triggered | Integration | Must |
| No-show recording | Unit | Must |
| Check-in (arrived transition) | Unit | Must |
| Fulfil (fulfilled transition) | Unit | Must |
| All invalid transitions rejected | Unit | Must |
| Optimistic lock conflict on status update | Integration | Must |
| Waitlist entry created and fulfilled | Integration | Must |
| Availability search returns only free slots | Integration | Must |
| Schedule exception blocks slot creation | Unit | Must |
Portal bridge: portal.appointment.requested creates proposed | Integration | Must |
| Reminder dispatch — success path | Unit | Should |
| Reminder dispatch — retry on failure | Unit | Should |
| Patient deceased event cancels future appointments | Integration | Should |
| Tenant isolation for appointments | Integration (mandatory) | Must |
| FHIR Appointment read returns correct status | Unit | Must |
| HL7 SIU S12 inbound creates appointment | Integration | Should |