Problem
For a judge-review platform, coverage of judges is the product — and the only user-facing way to grow that coverage is the Submit-a-Judge form. That form is promoted sitewide (footer, mobile menu, and a FAQ answer that promises new judges are added "within a few business days"), but it POSTs to an endpoint that does not exist. Every submission fails with "Could not submit — please try again," and the lead is silently discarded with no server-side trace. Users who took the time to supply a judge's name, court, bio, and source URL lose their work, and the site loses exactly the supply signal it needs most at launch.
Findings
- The form's endpoint has no backend at all.
resources/views/judges/submit.stx:37fetchesPOST /api/judges/submit, and any non-ok response throws "Could not submit — please try again" (line 42).routes/api.tshas no/judges/submitroute and no catch-all — the closest POSTs are/admin/judges/{id}/opinions(routes/api.ts:150) and/judges/{id}/follow(routes/api.ts:333). The comment at routes/api.ts:110 confirms judge POST endpoints were knowingly deferred. - No action, table, or admin queue exists either.
app/Actions/Judges/contains only Follow/Unfollow/Index/Opinions/Search actions; there is nojudge_submissionsmigration orJudgeSubmissionmodel indatabase/migrations/; andresources/views/admin/has no submissions queue (only credentials, moderation, reviews, users, etc.). - The dead form is promoted everywhere. Linked from
resources/components/Bench/BenchFooter.stx:27,resources/components/Bench/MobileMenu.stx:52, andresources/views/faq.stx:47.
Acceptance criteria
- A
judge_submissionsmigration exists with the form's fields (judge name, court, department, bio, source URL, submitter info) plus astatuscolumn (pending/approved/rejected). - A public
SubmitJudgeSubmissionActionvalidates input, is rate-limited (throttle), and is wired viaroute.post('/judges/submit', ...)inroutes/api.ts. - Submitting the form at
/judges/submitreturns success and persists apendingrow; the form's success state renders. - An admin submissions queue exists following the existing Credentials queue pattern (
routes/api.ts:258-264,resources/views/admin/credentials.stx): list pending submissions, approve (inserting intojudges/court_housesas needed), or reject. - New submissions notify moderators via the existing
app/Helpers/notifyModerators.tshelper. - A test covers the happy path (form POST → pending row) and the throttle limit.
From the 2026-06-10 production-readiness audit.