J-22 — Cleaning Reveals Maintenance Issue
One-liner: During cleaning, housekeeper finds a broken fixture; raises a maintenance ticket; room moves out of inventory until fixed.
1. Purpose
During cleaning, housekeeper finds a broken fixture (e.g., shower drips, AC fault). Housekeeper raises a maintenance ticket inline; the room moves to "Out of order" until fixed; if there's an arriving guest, front desk is notified to reaccommodate. Outcome: rapid issue triage; no faulty room sold; clean coordination across HK, maintenance, front desk.
2. Persona Context
- Personas: Housekeeper (reporter); Maintenance (executor); Front Desk (reaccommodation).
- Surface: Electron Desktop.
- Primary BFF:
bff-backoffice-service. - Backing services:
maintenance-service,housekeeping-service,front-desk-service,booking-service,audit-service. - Preconditions: Maintenance team configured; reaccommodation policy set.
- Trigger: Housekeeper clicks "Report issue" inline on a task.
3. Entry Points
| # | Entry | Notes |
|---|---|---|
| 1 | "Report issue" inline on cleaning task | Default |
| 2 | Front desk-initiated "Mark out of order" | Adhoc |
4. Screen-by-Screen Flow
4.1 ReportIssueModal (Housekeeper)
- Layout: Issue type (plumbing / HVAC / electrical / furniture / other), severity (low / medium / high / critical), description, photo upload, "Mark room out of order" toggle (auto-true for high/critical).
- Components:
Form,IssueTypeSelect,SeveritySelect,PhotoUpload. - Offline: Editable; queued.
- AI: Phase 2 — issue classification from photo.
- Errors: Validation per field.
- Loading: Submit <= 500 ms.
- A11y: Field labels; severity announced.
- RTL: Mirror.
- Perf: <= 500 ms.
- Telemetry:
frontend.maintenance.issue_reported { type, severity }.
4.2 RoomStatusOutOfOrderBanner
- Layout: Room tile shows "Out of order" pill; details panel shows ticket id, ETA, technician.
- Components:
RoomStatusPill,OooDetailsPanel. - Offline: Local state.
- AI: None.
- Errors: n/a.
- Loading: Sub-second.
- A11y: Pill announced; details labelled.
- RTL: Mirror.
- Perf: SSE update <= 1 s.
- Telemetry:
frontend.room.ooo_set { roomId }.
4.3 ReaccommodationPanel (Front Desk; if guest arriving)
- Layout: Affected reservation summary; alternative room suggestions (AI in P2); upgrade / downgrade pill; "Re-assign" CTA.
- Components:
ReservationCard,RoomAlternativesList,Button. - Offline: Reaccommodation deferred until online; banner with reason.
- AI: P2 — alternative room suggestion.
- Errors: No alternatives -> escalation modal.
- Loading: <= 500 ms.
- A11y: Alternatives are tab stops; rate impact announced.
- RTL: Mirror.
- Perf: <= 500 ms.
- Telemetry:
frontend.front_desk.reaccommodate { reservationId, newRoomId }.
4.4 MaintenanceWorkOrderScreen (Maintenance)
- Layout: Ticket detail; status pipeline (New / Scheduled / In Progress / Resolved); parts ordering placeholder; resolution notes; "Resolve & return to inventory" CTA.
- Components:
WorkOrderCard,StatusPipeline,Button. - Offline: Editable; queued.
- AI: None.
- Errors: Resolution requires confirmation.
- Loading: Submit <= 500 ms.
- A11y: Pipeline states announced.
- RTL: Mirror.
- Perf: <= 500 ms.
- Telemetry:
frontend.maintenance.work_order_resolved { ticketId }.
5. State Machine
6. Data Requirements
6.1 Server state
POST /api/v1/maintenance/tickets(idempotent)PATCH /api/v1/rooms/:id/status(idempotent; status=out_of_order)POST /api/v1/front-desk/reaccommodate(idempotent)PATCH /api/v1/maintenance/tickets/:id/status(idempotent)
6.2 Local persistence
- SQLite
maintenance_tickets_local,room_status_local,outbox.
6.3 Idempotency
- All mutations carry
X-Idempotency-Key.
7. AI Behavior
n/a in P1; P2 — issue classification from photo + alternative room suggestion.
8. Offline Behavior
- Issue + OOO status local; reaccommodation deferred until online (with banner).
- Maintenance work-order updates queued.
9. Error States
| Error | Trigger | UX shown | Recovery | Telemetry |
|---|---|---|---|---|
NO_ALTERNATIVE_ROOMS | All comparable rooms occupied | Escalation modal | Front desk decides | frontend.front_desk.no_alternatives |
REACCOMMODATION_DEFERRED_OFFLINE | Offline | Banner with reason | Resolve on reconnect | frontend.front_desk.reaccom_deferred |
RESOLUTION_REQUIRES_CONFIRMATION | Validation | Confirm modal | Confirm | frontend.maintenance.resolution_confirm |
10. E2E Test Gates
- Composite gate
G-OPS-1: report -> OOO -> ticket -> work order -> resolve -> back to inventory. - Reaccommodation arrival path.
- Offline reaccommodation deferral.
11. Performance Requirements
| Metric | Target |
|---|---|
| Each action | <= 500 ms p95 |
| SSE update | <= 1 s |
12. Accessibility Requirements
- All keyboard-completable.
- Status pipeline accessible.
- Photo upload progress accessible.
13. Telemetry
Frontend events
frontend.maintenance.issue_reported { type, severity }frontend.room.ooo_set { roomId }frontend.front_desk.reaccommodate { reservationId, newRoomId }frontend.maintenance.work_order_resolved { ticketId }
Domain events emitted
melmastoon.maintenance.ticket.created.v1melmastoon.room.status.changed.v1(without_of_order)melmastoon.front_desk.reaccommodate.v1melmastoon.maintenance.ticket.resolved.v1melmastoon.audit.recorded.v1
14. Success Criteria
- No room sold while OOO.
- Reaccommodation handled gracefully online; deferred clearly offline.
- Maintenance pipeline complete; audit log records lifecycle.