Skip to content
writing
ModerationProduct24 August 2026 · 6 min read

Publish first, review after

Every moderation design starts with the same question, and almost everyone answers it backwards: does review let content up, or take it down?

Every platform where people write things has to answer one question before it writes a line of moderation code: does the review let content up, or take it down?

The answers look similar on an architecture diagram. They produce completely different products.

The default answer is the wrong one

Review-then-publish is the instinct. A member writes a post, a model reads it, and if nothing is found the post appears. It feels responsible. It is also, for a language-learning platform, quietly hostile.

Picture the person the platform exists for. They are learning German. They have spent four minutes assembling one sentence with a dative they are not sure about. They press post — and nothing happens. A spinner, maybe. Somewhere between two and thirty seconds later, depending on whether a model provider is having a good afternoon, the sentence appears.

That delay is not distributed evenly. It lands hardest on exactly the people who are already least sure they belong there. The confident poster shrugs at a spinner. The person writing their first sentence in a new language reads it as a verdict.

So D Plus+ inverts it. Everything goes live the moment it is written, and the review runs seconds later. Review takes content down. It is not what lets it up.

What that costs, honestly

It costs a window. For a second or two, a genuinely abusive post is visible. That is real and I am not going to pretend otherwise.

What buys it back is that the window is short, the volume is small, and the alternative tax is paid by every single well-meaning post forever. A platform with ten thousand honest posts and four abusive ones should not slow down the ten thousand.

One rule carries the whole thing

The temptation is to scatter the decision across the read paths — a filter here, a check there, a condition in a route. That is how a post ends up visible in the feed and invisible on the profile.

Instead there is one derived value that every read path shares. Adding a new surface means using it, and there is no second rule to remember.

"Not sure" stays visible

When the reviewer fails repeatedly, or comes back unable to decide, the post stays up, marked for a human.

This is deliberate. "Not sure" is not a finding. A model call timing out is a fact about my infrastructure, not about the person who wrote the sentence, and charging them for it would be the single easiest way to make the platform feel arbitrary. It also means a pathological post cannot burn budget in a retry loop.

The model classifies. The platform sentences.

This is the separation I would keep in any system that mixes a model with a consequence.

The reviewer returns what it found and the language the text was written in. It does not return a punishment. It has no idea what happens next. The consequence comes from a written policy, which means rewording a prompt can never change how long someone is suspended for, and tuning a penalty is a data change, not a deploy. Concurrent suspensions overlap rather than stack, so several findings in one review cannot compound into a month.

If the model both classified and sentenced, every prompt edit would be a silent change to the platform's disciplinary policy. That is not a thing anyone should be able to do by accident.

The rule with teeth

The one rule that needed real care is language. A German-learning community where everyone writes in Arabic stops being a German-learning community. But:

Asking about the Dativ in Arabic is the platform working. Match commentary in Arabic is not.

So the reviewer reports those as two independent things — what language this is, and whether it has anything to do with German or learning it — precisely so the first case is never punished as the second. A single "is this German?" flag would have got this wrong on day one.

And then appeals

Every finding comes from a model reading a few hundred characters written by someone who is still learning the language it is written in. It will misread sarcasm. It will occasionally take two weeks off someone who did nothing.

An enforcement system without an appeal path is not a strict system. It is an unfinished one.