Issue & damage reporting
When the cleaner finds something broken, missing, or wrong, she taps Report issue in the sticky footer or skips an item with reason broken.
The flow
A modal opens with:
- Category — picker (broken appliance / missing supply / damage / cleaning issue / other).
- Location — apartment → room (auto-prefilled to the current cleaning's property).
- Multi-photo — camera or gallery, any number.
- Voice note — hold to record, up to 60 s.
- Description — free text in the cleaner's language.
Submit → toast Issue reported, operator notified.
What happens server-side
The report is not a bespoke "damage report" record. It's emitted as a cleaner message routed through the same LLM intent-classification pipeline guest messages use (gh#524 Slice 2 + §9.1).
The pipeline:
- Receives the cleaner message (text + media + voice transcription).
- Classifies the intent (broken appliance / missing supply / damage / etc.) against the operator's task templates.
- Matches the highest-scoring template (e.g.
maintenance_requestfor a broken appliance). - Spawns a task using that template — with the cleaner's text + photos + voice attached to the task.
This means the operator's task templates ARE the catalog. If you want a new category, add a task template — don't ask for code changes.
What the cleaner doesn't have to know
- Which template to pick.
- How the operator's routing works.
- That voice gets transcribed first.
She just describes the issue in her language; the platform routes.
Confirmation back to the cleaner
The toast says "Issue reported, operator notified." That's it — the cleaner returns to the checklist. No "your issue is now ticket #123" detail; the operator handles follow-up.
Operator side
The new task lands in Operations → Tasks with source=cleaner-app and originatingMessage linked to the cleaner's submission. The operator can:
- Open the task drawer to see photos + voice transcription + description.
- Reply via the standard task notification flow (the cleaner sees the reply in WhatsApp).
Walkthrough doesn't break
Reporting an issue does NOT lose the cleaner's checklist progress — the modal closes, the cleaner is back on the checklist with the same state. She finishes the cleaning normally; the issue task lives independently.
Implements: gh#524 Slice 2 (cleaner-message LLM routing into operator task templates). Related: gh#212 (same routing path for WA-channel cleaner messages).