Right now only the author or an admin can act on a review. Readers have no path to surface a problematic one — no reporting flow, no admin queue for community-flagged content. This is table stakes for any public review platform; trust collapses fast without it.
Scope
- New
review_flagstable:id, judge_review_id, user_id (nullable for anonymous), reason, details, status (open/dismissed/actioned), created_at. - API:
POST /api/reviews/{id}/flag(auth-gated, rate-limited so the form can't be weaponized to spam-flag). - UI: small "Report" link in the article footer + a modal with reason picker (off-topic / harassment / spam / privacy-violation / other) and optional details.
- Admin:
/admin/reviews?flagged=1tab inReviewsTable.stx; flagged reviews bubble to the top with the flag count and most recent reason. - Email: notify moderators on new flags (best-effort, same pattern as the moderation emails already wired).
Acceptance
- Reader can flag a review and gets a confirmation toast; can't flag the same review twice.
- Admin sees the flagged review in their queue with the flag context.
- Flagging doesn't surface the reporter's identity to the author.
- Dismissed flags stay in DB for audit but drop out of the active queue.
Files to touch
database/migrations/— new SQL migrationapp/Models/ReviewFlag.ts— newapp/Actions/Reviews/FlagReviewAction.ts— newroutes/api.ts— add the flag routeresources/components/Bench/ArticleView.stx— add the Report linkresources/components/Bench/Admin/ReviewsTable.stx— flagged tab