Files
halobestie-clone/requirement/phase3.6.md
ramadhan sjamsani a560b0936c PRDs: phase3.5 (mitra chat request history) + phase3.6 (force-close re-enable)
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>
2026-04-27 14:09:19 +08:00

58 lines
3.0 KiB
Markdown

# 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](backend/src/services/closure.service.js#L88-L137)) which moves an `active`/`extending` session to `closing` (with the 5-min grace + goodbye composer flow), guarded by the `early_end_mitra_enabled` flag.
- The mitra app previously surfaced an **"Akhiri"** button on the **Sesi Aktif** screen ([mitra_app/lib/features/chat/screens/active_sessions_screen.dart](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 — `initiateEarlyEnd` already 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_enabled` flag, 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?