Phase 3.5: replace _PendingRequestsBanner with a Riwayat Permintaan card on the mitra home, plus a screen listing the last 20 entries from chat_request_notifications. Backend endpoint TBD. Phase 3.6: plan to re-enable mitra force-close (Akhiri) once the moderation / accountability story is in place. Backend route and config flag are already preserved from Phase 3. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.0 KiB
3.0 KiB
PRD: Mitra Force-Close — Re-enable Plan
Overview
Goal: Restore the mitra-side ability to force-close (early-end) an active session, gated behind the existing backend early_end_mitra_enabled config flag.
Status: Currently disabled in the mitra app (button hidden). Backend support already exists and is gated by app_config.early_end_mitra_enabled (default false).
Affects: mitra_app, control_center (config UI), backend (no functional change — already implemented)
Background
- Backend has
initiateEarlyEnd(sessionId, UserType.MITRA)(closure.service.js:88-137) which moves anactive/extendingsession toclosing(with the 5-min grace + goodbye composer flow), guarded by theearly_end_mitra_enabledflag. - The mitra app previously surfaced an "Akhiri" button on the Sesi Aktif screen (mitra_app/lib/features/chat/screens/active_sessions_screen.dart) which called
POST /api/mitra/chat-requests/sessions/:id/end. - The button (and the surrounding confirmation dialog) was removed during testing because the UX was abruptly terminating sessions without enough guardrails. The endpoint and its config flag were intentionally left in place on the backend.
Functional Requirement
1. Visibility
- The "Akhiri" CTA on Sesi Aktif is rendered only when
app_config.early_end_mitra_enabled = true(read at app startup via/api/shared/config/...or whichever config-fetch path the mitra app already uses). - When the flag is
false, the row's trailing affordance is the chevron-only state (current state after this round of cleanup).
2. Confirmation UX
When re-enabling, restore the existing confirmation dialog:
- Title: "Akhiri Sesi?"
- Body: "Apakah kamu yakin ingin mengakhiri sesi ini?"
- Buttons: Batal / Ya, Akhiri.
Open question for the next phase: do we want to require a reason from the mitra (free-text or radio list — e.g., "Customer abusive", "Customer left", "Out of scope")? If yes, capture it in session_closures.reason (new column) for downstream QC/auto-flag analytics.
3. Backend
- No new endpoint or service work required —
initiateEarlyEndalready handles this. - If a reason field is added (Section 2 open question), extend the request body and persist it.
4. Control Center
- The existing config screen already exposes the toggle; no UI change needed unless reason capture is added.
Non-Goals (this phase)
- Adding a force-close from the chat screen (only Sesi Aktif).
- Auto-flagging mitras with high force-close counts (covered by separate "Mitra QC Auto-Flag" memory item).
- Customer-side force-close (separate
early_end_customer_enabledflag, not in scope here).
Open Questions
- Capture a reason on force-close? (Recommended yes — feeds into QC.)
- Should there be a per-day cap on mitra force-closes before triggering CC review?