product 20 Aug 2026 · 2 min read

A Report Button on Everything

If a product can generate images, video, music, speech and text, it has to be possible to report any of them. Not most of them. Any. We had the button on some surfaces. That is a different thing, and the difference is ea…

ToRun Team ToRun Team

If a product can generate images, video, music, speech and text, it has to be possible to report any of them. Not most of them. Any.

We had the button on some surfaces. That is a different thing, and the difference is easy to miss: content screening had been wired per pipeline by hand, so two studios shipped with none at all and nobody noticed until an audit went looking. The same shape would have eaten this fix one forgotten screen at a time.

Every surface, and a check that says so

There is now a report control on chat replies, images, video, music, voice, speech-to-text, text-to-speech, translation, canvas artifacts, workflow results, the in-app assistant bubble and the public shared pages — on the web and in the app.

More importantly, a check runs on every build: a file that imports a generation API must render a report control, delegate to a component that carries one, or hold an exemption with a reason a reader can verify. Its first run reported six real gaps. Those are what this work closed.

Then the owner opened the running app and found five more the check could not see, because they lived in folders it never opened. That is the worse half of the problem — a guard reporting zero while walking past code it never read — and it is why the check now names its own roots and fails when one stops resolving.

One queue, and actions on the row

The share pages had carried a report control for a while, writing to a table nothing read: no consumer, no queue item, no notification. Those reports now also open a real case, with the exact text a reviewer needs frozen beside them.

And a queue whose actions live on another page is a queue that stops being worked. Hiding content or dismissing a report now happens on the row, and the outcome is written back so nothing gets re-litigated.