Problem
Bench Review invites the public to rate named judges — the highest-defamation-risk category of UGC site. Our legal shields (content license, content standards, liability cap, 18+ clause) live entirely in a Terms page nobody is asked to accept, the disclaimers never appear where a judge's counsel will look, and the designated legal-intake channel 404s. These are the first things challenged when a takedown demand or suit arrives.
Findings
- Contact form — the designated "Report a review" / "Legal request" channel — POSTs to a dead route.
resources/views/contact.stx:19fetches/api/contact(topic options "report"/"legal" at :110/:114), but the framework default route (storage/framework/defaults/routes/dashboard.ts:80) only mounts whenfeature('dashboard')is on (storage/framework/defaults/bootstrap.ts:79), andconfig/features.ts:20-23enables onlycore+auth. Every submission fails. - No ToS assent at registration (browsewrap only).
resources/views/register.stxhas no checkbox or even "by signing up you agree" line; the signUp payload (lines 38-43) sends only name/email/password/confirmation, the defaultRegisterActionvalidates nothing else, and noterms_acceptedcolumn exists.terms.stx:17claims agreement-by-use, which courts routinely refuse to enforce. - No "opinions of users, not facts" disclaimer on any review surface. The only disclaimer text in the repo is
resources/views/terms.stx:58-62; judge profiles, the reviews feed, review detail pages, and the footer (resources/components/Bench/BenchFooter.stx) carry none. - Content standards not surfaced at submission; no /guidelines page. The ToS standards (
terms.stx:29-41— sealed cases, minors/victims, knowingly false statements) never appear inReviewForm.stx(only "professional tone" at :565), no attestation is required client- or server-side, and moderators have no linkable guidelines URL. - No DMCA provisions. Zero copyright language anywhere; the flag taxonomy (
app/Actions/Reviews/FlagReviewAction.ts:25-31) lacks a copyright category, forfeiting §512 safe-harbor posture. - 18+ eligibility claimed but never asserted.
terms.stx:24requires it; signup collects no attestation, creating COPPA exposure. - No data-retention statement.
privacy.stx:46retains anonymous reviewers' identities indefinitely — the site's most subpoena-attractive dataset — with no time bound or legal-process response policy. - No impersonation/false-claim policy. The judge-claim flow (
resources/components/Bench/JudgeSignup.stx:151-163,app/Actions/Me/ClaimJudgeProfileAction.ts) has no attestation or stated consequences for fraudulent claims. - Privacy Policy promises consent-gated analytics that don't exist.
privacy.stx:62claims consent gating; no consent UI or analytics script exists (config/analytics.tsdriver is an inert stub).
Acceptance criteria
POST /api/contactverified working end-to-end: either mount/adapt the frameworkContactActioninroutes/api.tswith a throttle, or replace the form; "legal" topic reaches a monitored legal inbox- Registration requires a checkbox "I am 18 or older and agree to the Terms of Service and Privacy Policy" (links to both), validated server-side, with
terms_accepted_atstamped on the user row - A reusable one-line "reviews reflect individual users' opinions, not verified statements of fact" disclaimer renders on judge profile headers, the reviews feed, and review detail pages, linking to /terms
- ToS content standards broken out into a linkable /guidelines page; a standards reminder + link appears above the ReviewForm submit button
- ToS gains a Copyright/DMCA section (notice procedure, agent contact, repeat-infringer policy) and the flag taxonomy gains a copyright category; DMCA agent registration tracked as a launch task
- Privacy Policy gains a Data Retention section (account data, anonymous-reviewer identity window, logs/IPs) plus a sentence on handling legal demands for reviewer identity
- ToS gains an impersonation clause; judge-claim flow requires an "I am this judge or authorized to act on their behalf" attestation
- Cookie section reworded to match shipped behavior (first-party auth/preference cookies only) or a consent toggle ships before any cookie-setting analytics
From the 2026-06-10 production-readiness audit.