An admin or cycle lead works through filed issues — one card at a time,
across cycles or per-cycle — and decides each one: approve (commits
a payout), reject (no payout), request info (parking lot, pings
the reporter), or reclassify severity inline (recomputes payout
amount). The reporter is notified of every decision.
AC-1 — Given a pending issue, when admin clicks Approve, then
payout_status flips to approved and the reporter gets a bell ping.
AC-2 — Given an approved issue, when the gate is active and
status is notverified, then the "Mark paid" CTA is disabled
with a hint explaining why (see F-10).
AC-3 — Given an admin clicks Reject, then payout_status='rejected'
AND status='rejected'. Pending payouts cannot be silently overwritten;
paid issues require explicit void.
AC-4 — Given an admin requests info, then a comment is posted, the
issue moves to info_requested, and the reporter is notified.
AC-5 — Given the reporter replies on an info_requested issue,
then the comment POST automatically flips payout_status back to
pending and notifies leads + admins.
AC-6 — Given a severity reclassification, then payout_amount_cents
is recomputed from the cycle's effective rates (effectiveRatesFor)
for the new severity — same source as the file-issue path.
AC-7 — Given the admin opens an issue detail and presses j /
k, then the page navigates to next / previous issue in the cycle's
list (preserving from=… query so back-nav restores list scroll).
AC-8 — Given the admin is on mobile, when they open the triage
queue, then a card opens as a fullscreen overlay with Prev/Next icon
buttons in the top strip and the action bar pinned to the bottom.
AC-9 — Given a non-admin/non-lead caller, when they call
POST /api/admin/triage/decide, then 403.
AC-10 — Given the issue is closed-negative (duplicate /
cant_reproduce / wont_fix), then any pending or approved payout
auto-rejects via payoutSideEffectForStatusChange. Paid payouts
are NOT auto-flipped (require explicit void).
No "bulk approve" — every decision is per-issue (intentional for v1).
Triage queue scope = ADMIN only currently. Cycle leads triage via the
per-issue detail page, not the cross-cycle /app/admin/triage. Confirm
this is intentional.
No "undo last decision" within 5s.
Lightbox only handles images + video, not PDFs (verify on prod).