← Lovora

When the Model That Writes Erotica Also Moderates It: 83–92% of Blocks Were Wrong

Last updated: September 27, 2026  |  Lovora is an adults-only (18+) service on which all content is generated by artificial intelligence.

Lovora is an adults-only AI companion service: explicit content between consenting adults is what it sells, and a short list of things — minors, non-consent, real people, incest, bestiality and a few others, defined in the Acceptable Use Policy — is prohibited absolutely. The moderation system has to tell those apart, in nine languages, on every message and every image request.

This note reports what happened when we stopped trusting the moderation logs and re-judged every historical block by hand. It covers three audits, on September 2, 19 and 21, 2026. The short version: most of what the AI classifier blocked was the product itself, and the enforcement rules were turning those mistakes into suspensions of paying adults.

1. Headline numbers

AuditWhat was re-judgedWrong
2026-09-02All 35 historical blocks by the AI classifier29 (83%)
2026-09-0214 ordinary phrases against the keyword layer12 blocked
2026-09-0213 companion names against the name classifier1 wrong (old prompt), 0 (new)
2026-09-21All 93 historical classifier blocks since the previous fix77–86 (83–92%)
2026-09-21Final test set: 17 real false positives + 11 cases that must stay blocked0 of 28 (after the fix)

The range in the second audit is honest uncertainty: nine blocks were borderline enough that two careful readers could disagree. Even the conservative count is 83%.

2. Method

  • Population: every block recorded in the moderation log for the period, not a sample. Each record holds the request, the layer that blocked it and the verdict.
  • Re-judging: each request was read by a person against the written policy, in its original language, and classified as correctly blocked, wrongly blocked or borderline.
  • Before/after tests: every change to a moderation prompt was run against a fixed set of cases before shipping — real false positives from production mixed with cases that must remain blocked. A change that let one prohibited case through was rejected regardless of how many false positives it fixed.
  • Enforcement replay: changes to the strike rules were tested by replaying the real history of every sanctioned account through the new rules, to see who would and would not have been suspended.

3. Audit one: a prompt that blocked the product

The first classifier prompt opened by telling the model it was a strict content moderator, and said nothing about requests that describe nothing at all. Refused in production, among others: explicit adult requests of exactly the kind the service exists for, and “send me a photo of you” — refused alike in English, Italian, Arabic and Chinese.

The keyword layer had its own failure, one familiar to anyone who has built a multilingual blocklist: a pattern for one language matching an ordinary word in another. A German-language rule also matched the English word kind, so “you’re so kind” was flagged; so were “a minor detail” and “we met in high school”. Twelve of fourteen benign test phrases were blocked. On image requests there was no second check behind the keywords, and one such hit was enough for a 24-hour suspension.

The name classifier refused the Arabic word for Egypt as a companion name because it did not recognise it. The rewritten prompt says an unfamiliar name is not a reason to block.

After the rewrite, on an 18-case before/after test, the old prompt made 4 mistakes and the new one none, with all 8 prohibited cases still blocked.

4. Audit two: the judge was the wrong model

Three weeks later the block rate was high again. The prompt had not changed; the model had. To reduce latency the moderation question had been routed to the same model that writes the conversation — a 24-billion-parameter model fine-tuned for roleplay. Asked to police the kind of text it was trained to produce, it refused almost everything explicit, and several things that were not: a single fictional creature name, a nude figure study, and in one case a file name.

Two plausible technical explanations were tested and ruled out: the verdict parser (the model answered cleanly with the single word) and the output length limit (nothing was being truncated). The decisive test was to send the same requests to a different, 14-billion-parameter model with the same prompt: it judged 13 of 14 correctly.

Finding: a model’s fitness as a judge is a property of the model, not only of the prompt. A model tuned to be permissive in generation is not therefore a lenient judge — in our data it was a severe and inconsistent one.

5. The fix: two passes that must agree

  1. The first pass answers ALLOW or BLOCK, as before. ALLOW ends the check.
  2. A BLOCK goes to a second pass that is not a yes/no question: it must name the prohibited category that applies, from a fixed list, or say that none does. Only an explicit “none” clears the request; any other answer, or an unrecognised one, confirms the block.

The first draft of the second pass was a softer question — roughly, “if you cannot name a category, allow it”. Replayed against production, it cleared a request describing incest, one that named a real person through a social-media handle, and one naming an anime character who is fifteen in canon. Requiring the category by name forced the model to look for one. That draft never shipped.

Two failure modes did not respond to any prompt wording and are now handled by deterministic rules instead: a common name for a sex position was read as animal content even when the instructions said explicitly that it is not, and requests naming real public figures could pass both passes. Real-person detection remains the weakest part of the system and relies on several layers, including human review of reports; we regard any list of names as incomplete by construction.

Result on the final test set: 28 of 28 correct — the 17 real false positives now allowed, the 11 prohibited cases still blocked.

6. How false positives became suspensions

A wrong block is an annoyance. A wrong block that counts toward a suspension is how a service loses the customers who were trying to pay. The audits found four separate mechanisms:

  • Retries counted as repeat offences. When a request is refused, people press the button again. One user sent the same request three times in 62 seconds and was suspended on the third. Now an identical request within an hour is kept as evidence but carries no weight.
  • Rephrasing counted as escalation. Nobody retries word for word; they reword. One user tried three variations of a creature name in 61 seconds and was suspended for 24 hours. Now further blocks in the same category within ten minutes count as one event.
  • A stated adult age was read as a minor. A pattern meant to catch stated ages under 18 had been written without the number, so “a 19 year old girl” — and even 45 — was treated as a minor. One user was suspended for seven days for stating an adult age, which is exactly what the policy wants people to do. The number 1–17 is now required; 16 test cases, every minor blocked, every adult allowed.
  • The user was punished for the AI’s words. A scene the companion herself had written tripped a keyword rule and suspended the man reading it. Text the AI wrote now carries no weight against the user; it still alerts a human.

Replaying every sanctioned account through the new rules: 10 suspended accounts became 6, all four released were bursts of classifier blocks, and both permanent bans stood. Wrongly issued strikes were cleared retroactively — 30 on September 2 and 33 on September 21 — and one suspension was lifted. The current enforcement rules are published in Safety, Moderation and Enforcement.

7. What we would tell another team

  • Audit the blocks, not the block rate. A rate tells you nothing about whether the blocks are right; re-judging every one took hours and changed the system.
  • Test a judge model on its own. Moving moderation to a cheaper or faster model is a model change and needs the same before/after test as a prompt change.
  • Ask for a reason, not a verdict. A category the model must name is harder to produce by reflex than a yes or no.
  • Keep deterministic rules for the cases a model gets wrong consistently, and test every multilingual pattern with a real sentence per language — see our note on word boundaries, which silently disabled rules in six languages.
  • Separate detection from punishment. The filter can be strict; the strike system should punish a pattern of behaviour, never a single event or a retry.

8. Limitations

  • One service, one policy, three weeks of traffic. The absolute block counts are small (35 and 93); the rates are robust to a few disputed cases but should not be read as a general property of all moderation systems.
  • Re-judging was done by the operators of the service, who have an interest in the outcome. The published enforcement rules and the appeal process at lovora.ai/appeal are the external check.
  • Model names and prompts are not published: the prompts because publishing them would help people evade them, the model identities because they change and the finding is about model choice in general.

9. Questions people ask

How often did Lovora's AI moderation block legitimate adult requests?

In the audit of September 2, 2026, 29 of 35 historical classifier blocks (83%) were wrong. In the audit of September 21, after the classifier had been moved onto the same model that writes the chat, 77 to 86 of 93 historical blocks (83% to 92%) were wrong, depending on how borderline cases are counted.

Why does a roleplay language model make a poor content moderator?

In Lovora's measurements, a 24-billion-parameter model fine-tuned for roleplay, asked to answer ALLOW or BLOCK, refused ordinary adult nudity, a single fictional creature name and even a file name. The same prompts judged by a different 14-billion-parameter model were right 13 times out of 14. The output parsing and the token limit were checked and ruled out as causes.

What replaced the single yes/no moderation question?

Two passes that must agree. The first answers ALLOW or BLOCK. Only a BLOCK goes to a second pass, which must name the prohibited category it believes applies; only an explicit "none" clears the request. Asking for a category rather than a second yes/no stopped the model from waving through requests it had not actually examined.

Can a moderation false positive get a Lovora account suspended?

Not from a single event. Repeated attempts in the same category within ten minutes count as one error, an identical retry within an hour carries no weight, text the AI companion wrote itself is never counted against the user, and suspensions need two or more events in a rolling 180-day window.

Can this research be quoted?

Yes. The figures on this page may be quoted or republished under Creative Commons Attribution 4.0, with a link to this page as the source.

Related documents