Skip to main content

Qontak | Chatbot & AI | Unified Agent Quality Scorecard — Adj: Bulk-Score Keyboard Shortcuts

Template: ADJUSTMENT PRD v1.2 · Companion to PRD Section Reference v1.5 + Hierarchy v1.0 Note: Adjustment to Phase 2 (AI Auto-Scoring & In-Room Scorecard) of the Unified Agent Quality Scorecard initiative. Adds two keyboard shortcuts to the already-shipped in-room Scorecard panel — no other behavior changes.


HEADER BLOCK​

FieldValue
PMDimas Fauzi Hidayat
PRD Version1.0
StatusDRAFT
PRD TypeADJUSTMENT
EpicBOT-4573
SquadBOT — Bot, AI & Automation
RFC LinkN/A — no RFC required (FE-only interaction change, no new API or data contract)
Figma MasterN/A — no new UI elements; reuses the existing Pass/Fail icons already shipped in the panel
AnchorYes — no Confluence ANCHOR page exists for this initiative yet; see the repo-local Unified Agent Quality Scorecard — ANCHOR
Labelsepic:qontak-chatbot-ai | module:chatbot-ai | feature:unified-agent-scorecard
Last Updated2026-07-17

Status values: DRAFT → READY → BUILD → SHIPPED READY gate: Epic cannot move to In Progress in Jira without PRD Link + RFC Link populated (RFC is explicitly N/A for this adjustment — see above).


Table of Contents​


1. CONDITIONAL BLOCK: ADJUSTMENT CONTEXT​

FieldDetail
Parent Anchor PRDUnified Agent Quality Scorecard — ANCHOR (repo-local only — no Confluence ANCHOR page exists for this initiative; see the initiative README)
This adjustment coversTwo new keyboard shortcuts in the in-room Scorecard panel's edit mode (hub-chat ScorecardForm.vue): Ctrl/Cmd+Shift+↑ sets every parameter across every category to Pass (100); Ctrl/Cmd+Shift+↓ sets every parameter to Fail (0), bypassing the per-parameter reason popover. Both write only local component state — nothing is persisted until the reviewer clicks the panel's existing Submit button.
Parent PRD still ownsEverything else in Phase 2 — AI Auto-Scoring & In-Room Scorecard: individual per-parameter click-to-score, the reason-popover flow, the AI auto-scored mode + actor selector, the submit/edit/override flow, and every API contract. This adjustment adds an alternate fast-path input method alongside the existing click controls — it does not change what happens on Submit or how a score is computed.
Reason for adjustmentQA asked Dimas directly (2026-07-17) for a bulk-scoring shortcut, naming the two exact key combinations they want. Trigger: reviewing a full scorecard one parameter at a time is pure repetitive clicking once a reviewer has already reached an overall Pass/Fail verdict for the conversation — there's no fast path today.
Scope boundaryOnly ScorecardForm.vue (the parameter table) and its mount context in AgentScorecard.vue. No change to useAgentScorecard.ts, the GET/POST/PATCH agent_scorecards/{roomId} contract, or backend submit.rb validation — the shortcuts produce the exact same score_value writes (0 or 100) a manual click already produces.

2. One-liner + Problem​

One-liner: Let a QA reviewer bulk-set every parameter in the open Scorecard to Pass or Fail with one keyboard shortcut, instead of clicking each parameter individually.

Problem: Scoring a conversation today means clicking Pass or Fail on every parameter in every category one at a time. For a reviewer who has already formed an overall verdict for the conversation, that's pure repetitive clicking with no shortcut path. See Phase 2 for the full panel background.


3. Target Users + Persona Context​

Personas inherited from Phase 2 — see Phase 2 §5 for the full persona blocks. Primary: QA Lead / Supervisor.

This adjustment does not introduce or change a persona — it's a scoring-speed improvement for the same QA Lead/Supervisor who already scores conversations in this panel today. (It was requested directly by QA, who is the primary persona.)


4. Non-Goals​

  1. Does not change what happens on Submit, the reason-popover UI, or the AI auto-scored mode — those stay exactly as Phase 2 shipped them.
  2. Does not add a confirmation dialog before applying the bulk action — it's local-state-only and reversible until Submit (see §15 Key Decisions).
  3. Does not add a way to bulk-score only one category at a time — the shortcut always applies to every parameter across every category currently on the panel, matching how QA asked for it.
  4. Does not touch the backend submit.rb contract or add a new API — the shortcut writes the same score_value (0/100) fields a manual click already produces.
  5. Does not force a reason to be captured for parameters bulk-marked Fail — QA can still open any parameter's popover individually afterward to add one (see NEG scenarios in §9.2).

5. Scope Changes​

Engineering surfaces this PRD touches (controlled vocab). Kept in sync with the scope_changes frontmatter above.

  • Frontend — hub-chat: new keydown handling scoped to features/inbox/features/main-section/features/room-details/features/agent-scorecard/components/ScorecardForm.vue (or a small composable it calls). No existing shortcut/hotkey infrastructure exists anywhere in hub-chat's inbox feature tree today (confirmed by repo search for keydown/hotkey/shortcut patterns) — this is net-new plumbing for the repo, not an extension of an existing system.

6. Constraints​

FieldValue
PlatformSame as parent: Web only — Qontak omnichannel web app
PerformanceN/A — purely a client-side mutation of already-loaded scorecardData; no network call, no measurable latency
Backward compatYes — no stored data or API contract changes. Writes the identical score_value shape a manual click already produces (confirmed against the backend contract: submit.rb requires score_value to be exactly 0 or 100)
Feature flagNo new flag. Gated exactly like the existing Pass/Fail icons: only active while the panel is in edit mode (isEdit === true) and the reviewer holds inbox_scorecard_manage (Usman permission) — confirmed in AgentScorecard.vue
Rollout noteNone — no schema, migration, or backend change

7. Feature Changes​

Change ID: CHG-001 — Bulk-Pass shortcut

FieldDetail
Change TypeModified component — new keyboard interaction added
Page/inbox — conversation right panel → Scorecard tab (same surface as Phase 2 CHG-003)
Page IntentA QA reviewer who has already judged a conversation an overall Pass wants to set every parameter without clicking each one
BeforeEach parameter's Pass icon must be clicked individually; N categories × M parameters = N×M clicks
AfterPressing Ctrl/Cmd+Shift+↑ while the panel is in edit mode sets every parameter across every category to Pass (100) in one action — identical end-state to clicking every Pass icon

Change ID: CHG-002 — Bulk-Fail shortcut

FieldDetail
Change TypeModified component — new keyboard interaction added
Page/inbox — conversation right panel → Scorecard tab
Page IntentA QA reviewer who has already judged a conversation an overall Fail wants to set every parameter without clicking each one or working through each reason popover
BeforeEach parameter's Fail icon must be clicked individually; parameters with is_bad_rating_reason: true additionally require opening a popover and clicking Submit inside it before the Fail registers
AfterPressing Ctrl/Cmd+Shift+↓ sets every parameter across every category to Fail (0) in one action, without opening the reason popover — reason fields are left as-is (blank if previously unset). This is valid end-to-end: the backend contract treats reasons/bad_reason_description as optional (submit.rb), so a Fail with no reason is already a reachable state today via Submit-without-picking-a-reason inside the popover. The reviewer can still open any individual parameter's popover afterward to add a reason.
ElementBeforeAfter
Bulk PassNot possible — click each Pass iconCtrl/Cmd+Shift+↑ sets all parameters to 100
Bulk FailNot possible — click each Fail icon (+ popover for reason-flagged params)Ctrl/Cmd+Shift+↓ sets all parameters to 0, reason left blank

Figma: N/A — behavior/logic change only, no new visual element (reuses the existing Pass/Fail icon states). Confirmed against the qontak-designer prototype's agent-scorecard component: no shortcut affordance exists there either, so this is net-new for design, not just engineering. (If Design later wants a toast/flash confirming the bulk action fired, that's a Could Have — see §16 Open Questions.)


8. New Features​

N/A — this adjustment modifies existing behavior only; no new screen or UI element.


9. System Flow + User Stories + ACs​

9.1 System Flow​

Flow: Bulk-Score via Keyboard Shortcut · Type: User Journey (single-actor decision flow)

  1. QA reviewer opens a resolved room's Scorecard panel in edit mode.
  2. Reviewer forms an overall verdict for the conversation (Pass or Fail).
  3. Reviewer presses Ctrl/Cmd+Shift+↑ (Pass) or Ctrl/Cmd+Shift+↓ (Fail).
  4. Decision — is the panel in edit mode and does the reviewer hold inbox_scorecard_manage? No → no-op. Yes → continue.
  5. Decision — is scorecardData loaded (categories/parameters present)? No → no-op. Yes → continue.
  6. System sets score_value on every parameter in every category to 100 (Pass) or 0 (Fail). Fail does not clear reasons on parameters that already had one set; Pass clears any stale reason state (mirrors today's individual-click behavior).
  7. Panel re-renders — every parameter shows the new Pass/Fail icon state and each category's computed score updates.
  8. Reviewer optionally opens any individual parameter's popover to add/edit a reason, then clicks the existing Submit button (unchanged flow) to persist.
  9. Failure branch — none at this step: it is a synchronous client-side state write with no network call, so it cannot fail. Any failure happens later, at the existing (unchanged) Submit step.

📊 System Flow — Bulk-Score Shortcut​

graph TD
A[Reviewer in Scorecard panel, edit mode] --> B{Ctrl/Cmd+Shift+Up or Down pressed?}
B -- No --> A
B -- Yes --> C{Edit mode AND inbox_scorecard_manage AND data loaded?}
C -- No --> A
C -- Yes, Up --> D[Set every parameter score_value = 100, clear stale reasons]
C -- Yes, Down --> E[Set every parameter score_value = 0, existing reasons untouched, no popover opened]
D --> F[Panel re-renders, category scores recompute]
E --> F
F --> G[Reviewer optionally edits a reason, then clicks existing Submit]

9.2 User Stories​

[SCOREADJ-S01] — Bulk-Pass all parameters via Ctrl/Cmd+Shift+↑

User StoryAs a QA Lead / Supervisor, I want to set every parameter in the open Scorecard to Pass with one keyboard shortcut, so that I can score a conversation I've already judged an overall pass without clicking every parameter individually.
Before StateEvery parameter must be clicked individually to mark Pass; no bulk action exists.
After DeltaPressing Ctrl/Cmd+Shift+↑ while the panel is in edit mode sets score_value = 100 on every parameter across every category in one action.
ImportanceMust Have — this is exactly what QA asked for; without it the adjustment delivers nothing.
Mockup / Technical NotesFigma: N/A — no new visual element.

Data Fields: none new — writes the existing score_value field on ScorecardParameter.

Technical Notes: implemented as a keydown listener scoped to ScorecardForm's mounted lifecycle (no existing shortcut infra in hub-chat — confirmed by repo search). Should clear bad_reason_description / deactivate reasons the same way the existing individual Pass click does (updateParameterValue(index, paramIndex, true)), so a parameter previously marked Fail-with-reason and then bulk-Passed doesn't retain stale reason text.
Acceptance Criteria— Happy Path —
• AC-1: Given the panel is in edit mode with scorecard data loaded, when the reviewer presses Ctrl/Cmd+Shift+↑, then every parameter in every category shows score_value = 100 and each category's score recomputes to reflect all-Pass.
• AC-2: Given a parameter was previously marked Fail with a reason selected, when the reviewer presses Ctrl/Cmd+Shift+↑, then that parameter's score_value becomes 100 and its reason state is cleared (same as an individual Pass click today).
• AC-3: Given the reviewer has not yet clicked Submit, when they press Ctrl/Cmd+Shift+↑ and then individually click one parameter's Fail icon, then only that one parameter reverts to Fail — the bulk action is a one-time state set, not a locked mode.

— Edge —
• AC-4: Given the Scorecard has multiple categories with different parameter counts, when Ctrl/Cmd+Shift+↑ is pressed, then all parameters in all categories are set, not just the first/focused category.
• AC-5: Given scorecardData has not finished loading yet (GET still in flight), when Ctrl/Cmd+Shift+↑ is pressed, then the shortcut no-ops — no error, no partial write.

— Error / Unhappy Path —
• ERR-1: N/A — purely a client-side state mutation on already-loaded data; there is no network call or failure mode for this action itself (failures only occur later, at the existing, unchanged Submit step).

— Permission Model —
• CAN: QA Lead/Supervisor with inbox_scorecard_manage, while the panel is in edit mode (same gate as the existing Pass/Fail icons).
• CANNOT: view-only (inbox_scorecard_view) users, end CS agents, or anyone viewing a submitted/non-edit scorecard.
• Unauthorized: shortcut no-ops silently — matches today's behavior where the Pass/Fail icons simply aren't rendered outside edit mode.

— UI States —
• Loading: if scorecardData isn't loaded yet, shortcut no-ops (AC-5).
• Empty: N/A — a resolved room always has categories/parameters once loaded (Phase 2 behavior unchanged).
• Error: N/A (ERR-1).
• Success: every parameter's icon flips to the filled "Pass" state; category scores update.

— Negative Scenarios — (from Non-Goals)
• NEG-1: Given the panel is NOT in edit mode (already submitted/reviewed), when Ctrl/Cmd+Shift+↑ is pressed, then nothing happens — view-only scorecards are never mutated by the shortcut.
• NEG-2: Given the reviewer is typing in the Remarks textarea, when they press Ctrl/Cmd+Shift+↑, then the shortcut still fires (this key combination is not used for text editing/selection) — confirm no collision with browser/OS bindings during implementation.

Dependencies: None — reuses Phase 2's already-shipped panel; no dependency on Phase 1 or AI-scoring work.


[SCOREADJ-S02] — Bulk-Fail all parameters via Ctrl/Cmd+Shift+↓

User StoryAs a QA Lead / Supervisor, I want to set every parameter in the open Scorecard to Fail with one keyboard shortcut, so that I can score a conversation I've already judged an overall fail without clicking every parameter individually or working through each reason popover.
Before StateEvery parameter must be clicked individually to mark Fail; parameters with is_bad_rating_reason: true additionally require opening a popover and picking a reason (or at minimum clicking Submit inside it) before the Fail registers.
After DeltaPressing Ctrl/Cmd+Shift+↓ while the panel is in edit mode sets score_value = 0 on every parameter across every category in one action, without opening any reason popover.
ImportanceMust Have — the mirror of SCOREADJ-S01 and equally named by QA; a bulk-fail shortcut that still forces a popover per reason-flagged parameter would not deliver the speed QA asked for.
Mockup / Technical NotesFigma: N/A — no new visual element.

Data Fields: none new.

Technical Notes: bypasses the MpPopover / reason-selection UI in ScorecardForm.vue entirely — calls the equivalent of updateParameterValue(index, paramIndex, false) directly for every parameter. Confirmed against the backend contract (chatbot repo submit.rb): bad_reason_description and reasons are optional fields, so submitting a Fail with no reason is already a valid, reachable state today (a reviewer can already click Submit inside the popover without picking a reason) — this shortcut does not create a new backend state, just a faster path to one that already exists.
Acceptance Criteria— Happy Path —
• AC-1: Given the panel is in edit mode with scorecard data loaded, when the reviewer presses Ctrl/Cmd+Shift+↓, then every parameter in every category shows score_value = 0 and each category's score recomputes to reflect all-Fail.
• AC-2: Given a parameter has is_bad_rating_reason: true, when the reviewer presses Ctrl/Cmd+Shift+↓, then that parameter is set to Fail WITHOUT opening its reason popover, and bad_reason_description/reasons are left as-is (blank if previously unset).
• AC-3: Given a parameter was already Fail with a reason filled in before the shortcut was pressed, when Ctrl/Cmd+Shift+↓ is pressed, then the existing reason is left untouched — the shortcut only writes score_value, it does not clear reason fields on parameters already in the Fail state.

— Edge —
• AC-4: Given the reviewer wants a reason recorded for a specific parameter after bulk-failing, when they open that parameter's popover and pick a reason, then it saves normally (unchanged existing flow) — the bulk action does not lock them out of the per-parameter reason UI.
• AC-5: Given scorecardData has not finished loading yet, when Ctrl/Cmd+Shift+↓ is pressed, then the shortcut no-ops.

— Error / Unhappy Path —
• ERR-1: N/A — same as SCOREADJ-S01; no network call at the point the shortcut fires.

— Permission Model —
• CAN: QA Lead/Supervisor with inbox_scorecard_manage, panel in edit mode.
• CANNOT: view-only users, end CS agents.
• Unauthorized: shortcut no-ops silently.

— UI States —
• Loading: no-op if data isn't loaded (AC-5).
• Empty: N/A.
• Error: N/A.
• Success: every parameter's icon flips to the filled "Fail" state; category scores update.

— Negative Scenarios —
• NEG-1: Given the panel is NOT in edit mode, when Ctrl/Cmd+Shift+↓ is pressed, then nothing happens.
• NEG-2: Given a parameter requires a reason (is_bad_rating_reason: true) and the reviewer bulk-Fails then clicks Submit without ever opening that parameter's popover, when Submit runs, then it still succeeds with a blank reason — this matches today's existing (non-shortcut) popover-Submit-without-a-reason path, so the shortcut introduces no new validation gap. (Flagged explicitly in §16 Open Questions in case QA wants this tightened.)

Dependencies: None.


10. Rollout​

FieldDetail
Rollout typeStandard staged — low risk, no data/schema change
Feature flagN/A — no new flag needed for this adjustment
RolloutStage 1 → Internal: QA team (the requesters) validates both shortcuts on a handful of resolved rooms
Stage 2 → All accounts with existing inbox_scorecard_manage access (automatic — same gate as today's panel)
Backward compatYes — existing data unaffected
MigrationNone

11. Observability​

Adds one new event on top of what the panel already tracks ([CHATBOT] - Agent Scoring, [CHATBOT] - Scoring with Bad Rating, [CHATBOT] - Scorecard_Submit — see ScorecardForm.vue / AgentScorecard.vue):

New or Modified Events:

Event NameTriggerPropertiesChange from parent
[CHATBOT] - Bulk Score Shortcut UsedReviewer presses Ctrl/Cmd+Shift+↑ or ↓ in the Scorecard panelRole, Email, Company ID, Company Name, Room ID, Direction (pass/fail), parameter count affectedNew — measures shortcut adoption

12. Success Metrics​

MetricDefinitionBaselineTarget
Bulk-shortcut adoption% of Scorecard submissions preceded by at least one Bulk Score Shortcut Used event0% — shortcut doesn't exist yet≥20% of submissions within 30 days of rollout (directional — QA specifically requested this, so early adoption should be high among the team that asked for it)

13. Launch Plan & Stage Gates​

StageAudienceDurationSuccess GateOwner
Internal QAQA team (the requesters)1 weekBoth shortcuts work correctly across categories/parameters, no state-corruption reports, 0 P0/P1PM + QA
GAAll accounts with inbox_scorecard_manageOngoing (direct deploy, no flag)No regression reports on the existing click-to-score / reason / submit flow for 1 week post-GAPM

14. Dependencies​

No new dependencies introduced by this adjustment. Existing dependencies remain governed by Phase 2.


15. Key Decisions + Alternatives Rejected​

8a — Decisions Made

DateDecisionRationale
2026-07-17Bulk-Fail bypasses the per-parameter reason popover entirelyBackend contract confirms reasons/bad_reason_description are optional (submit.rb) — forcing the popover per parameter in bulk mode would defeat the speed QA explicitly asked for; the manual per-parameter reason path stays available afterward
2026-07-17Shortcut always applies to every parameter across every category on the panel — no per-category scopingMatches QA's literal request ("score all parameter"); a full scorecard review is normally done in one sitting per room, so category-scoping would add a decision step without clear benefit
2026-07-17No confirmation dialog before applying the bulk actionPurely local state until the existing Submit button is clicked — reversible by re-clicking individual icons or the opposite shortcut; a confirm dialog would defeat the point of a power-user shortcut
2026-07-17Reuses the exact score_value semantics (0/100) a manual click produces — no new field, no new endpointKeeps the backend contract, submit validation, and the AI-scoring mode (Phase 2) completely untouched; lowest-risk implementation

8b — Alternatives Rejected

AlternativeWhy RejectedDate
Force the reason popover to open (sequentially) for every reason-flagged parameter during bulk-FailDefeats the purpose of a one-keystroke bulk action; QA asked for speed, not a guided walkthrough2026-07-17
Scope the shortcut to only the category currently in view/focusQA's request was "all parameter," and most reviewers score a whole room in one pass — per-category scoping adds friction for no clear win2026-07-17
Add a confirmation modal before applyingUnnecessary friction for a reversible, pre-submit, local-only action2026-07-17

16. Open Questions​

#TypeQuestionOwnerDeadline
1AssumptionBulk-Fail leaves the reason blank for is_bad_rating_reason parameters rather than forcing or blocking on one — confirmed valid against the backend contract, and implicitly accepted when this PRD was requested (2026-07-17). Flagging so QA can object before build if they actually want reasons enforced.Dimas + QA2026-07-24
2Open QuestionShould there be a lightweight visual confirmation (toast/flash) when the shortcut fires, given there's no confirmation dialog? Nice-to-have, not blocking.Design2026-07-24
3Open QuestionConfirm Cmd+Shift+Arrow (not just Ctrl+Shift+Arrow) is the right binding on macOS — QA's original ask named "Ctrl" specifically; verify this isn't intentional (e.g. a Windows-only QA team) before defaulting to cross-platform support.QA2026-07-24
4RiskNo automated test exists yet for this interaction. Mitigation: hub-chat's AGENTS.md requires a co-located __tests__ spec for any new composable/keydown handler as a Definition-of-Done item — enforced at build/PR time, not a gap today.Engineering (hub-chat)Before merge

PRD CHANGELOG​

VersionDateBySectionTypeSummary
1.02026-07-17ClaudeAllCREATEDADJUSTMENT PRD created for QA's bulk-score keyboard shortcuts (Ctrl/Cmd+Shift+↑ = Pass all, Ctrl/Cmd+Shift+↓ = Fail all) in the Phase 2 in-room Scorecard panel.