Skip to content

legal: policy surface gaps — no ToS assent, no review disclaimers, dead legal-request channel, missing DMCA/retention/impersonation provisions #54

@glennmichael123

Description

@glennmichael123

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: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

From the 2026-06-10 production-readiness audit.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions