Comments here are conversation, not a corpus. They are still not in the HTML, the sitemap, or the RSS. This version adds a second look without turning every page view into more Worker or D1 work.
A clean comment still publishes. Opening a post is still not a Worker request.
Two kinds of second look
A policy hit on write is a takedown. Too many links, or a word on a short closed list, and the row is stored hidden. The author sees it as under review. Everyone else never gets it: the public list is still approved = 1 only.
A reader flag is a vote, not a blank. The comment stays on the thread. The console gets an open flag. I hide it, or I dismiss the flag. One person cannot empty the page.
Hold-all — every new comment hidden until I click — is off. It would not save money. It would make the console the bottleneck for ordinary talk.
Stay green
The expensive mistake is teaching the public GET to know about flags.
| Choice | Why |
|---|---|
| GET stays a dumb approved list | No join. No flag counts. Same cached query as before. |
| Policy only on POST | Deterministic, fits the 10 ms CPU budget. No model on the request. |
Flag does not change approved |
The visible list did not change, so we do not drop the list cache. |
| Hidden policy rows do not drop it either | Nothing public appeared. |
| No Turnstile on flag | Session plus a per-session cap. Challenge if abuse shows up. |
| No Workers AI, no Queue | Those daily budgets are small. They were not earned. |
pe_flags in this browser |
After you flag, we remember the id. Reload does not spend a request to learn a 409. |
Workers AI would be a later batch over live rows, fail-open, never on GET or flag. Not this version.
The page may warn you before you post. The Worker still runs the same rules. A browser mark is not a verdict. Curl can invert anything the island claims.
What you might notice
Flag a live comment and that row says Flagged for you. It is still there for everyone else.
Post something the policy holds and you keep the row as under review. Refresh: it is gone from the list, which is intended.
I still hide, restore, or delete from the console. Hide and delete close open flags on that row.
What did not change
Two public comment endpoints, plus one small flag POST. Consent still gates the first fetch. Email is still never in the list. Replies still nest one level.
Search, a PWA, media uploads, a site-wide view counter, hold-all, and a model on the write path stay named absences.
Comments
Comments load when this section is visible.
To load comments we set a first-party session cookie and record that you opened this section. Name and email stay in this browser after you post.