Problem. A hosting provider gets an abuse report: "this page is phishing". Often the report text decides, yet reports can be wrong, malicious or written to steer an AI that reads them. The EU Digital Services Act asks for non-arbitrary decisions on notices and a clear statement of reasons for the customer. A report on its own is not a reason. Principle. A report is a claim. Only evidence reproduced in a disposable browser can move an action. Solution. The report is stored as an untrusted claim. A fresh Playwright browser opens the URL in a locked-down Docker sandbox on a Vultr VM, then the container is destroyed. Code reads what the browser saw and sets the level: Proven, Suspicious or Not proven. Models on Vultr Serverless Inference write cited claims but cannot change the level. An analyst picks an action the level allows; the statement of reasons is drafted, and nothing is sent until the analyst sends it. The customer can fix the page and appeal; a new browser re-checks it, and Reinstate needs a lower level. Containment. Only a separate launcher holds the Docker socket. Visits run with no capabilities, a read-only file system, seccomp, 1 GB and 60 s. An egress proxy blocks private ranges and 169.254.169.254. Downloads are held and hashed, never opened. No API keys enter the sandbox. Results (47 cases on fictional pages we wrote). Twin pairs (same report, abuse page vs legitimate page): 8 of 8 told apart, against 0-1 of 8 for a text-only AI on the same Vultr model and 4 of 8 for a plain fetch. Abuse missed: 2 of 22, against 3-5 (text-only) and 13 (fetch). Injected reports that changed the result: 0 of 4. False citations: 0 of 180. Honest notes. 1 of 25 legitimate pages was rated Proven (an SSO login posting to another host). The twin pairs are built so report text cannot tell the pages apart. Every number reruns with make eval. Users. Abuse and trust and safety teams at hosting providers.
Category tags: