You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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:19 fetches /api/contact (topic options "report"/"legal" at :110/:114), but the framework default route (storage/framework/defaults/routes/dashboard.ts:80) only mounts when feature('dashboard') is on (storage/framework/defaults/bootstrap.ts:79), and config/features.ts:20-23 enables only core + auth. Every submission fails.
No ToS assent at registration (browsewrap only).resources/views/register.stx has no checkbox or even "by signing up you agree" line; the signUp payload (lines 38-43) sends only name/email/password/confirmation, the default RegisterAction validates nothing else, and no terms_accepted column exists. terms.stx:17 claims 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 in ReviewForm.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:24 requires it; signup collects no attestation, creating COPPA exposure.
No data-retention statement.privacy.stx:46 retains 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:62 claims consent gating; no consent UI or analytics script exists (config/analytics.ts driver is an inert stub).
Acceptance criteria
POST /api/contact verified working end-to-end: either mount/adapt the framework ContactAction in routes/api.ts with 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_at stamped 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
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
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.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.resources/views/terms.stx:58-62; judge profiles, the reviews feed, review detail pages, and the footer (resources/components/Bench/BenchFooter.stx) carry none.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.app/Actions/Reviews/FlagReviewAction.ts:25-31) lacks a copyright category, forfeiting §512 safe-harbor posture.terms.stx:24requires it; signup collects no attestation, creating COPPA exposure.privacy.stx:46retains anonymous reviewers' identities indefinitely — the site's most subpoena-attractive dataset — with no time bound or legal-process response policy.resources/components/Bench/JudgeSignup.stx:151-163,app/Actions/Me/ClaimJudgeProfileAction.ts) has no attestation or stated consequences for fraudulent claims.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 inboxterms_accepted_atstamped on the user rowFrom the 2026-06-10 production-readiness audit.