Workshop report

A language model does not get more reliable because you ask it more politely.

How we turn a black box into a process you can actually inspect. With the incidents we learned it from, the numbers we measured along the way, and the file the rules live in.

Rick WarlingDigitalAce, Luxembourg21 August 20269 minutes
The whole thing in five sentences
  1. A language model makes mistakes you will not catch by skimming, and that no second language model reliably finds either.
  2. A ban in the instructions is not a brake: ours was ignored in four out of five runs, although it was there verbatim.
  3. What works is a rules file you and your lawyer can read, plus a facts file every number has to come from.
  4. The AI must not be able to change that file itself, otherwise it is checking itself against its own rules.
  5. And you decide deliberately what ships without approval, rather than leaving it to a default nobody ever touched.

On 13 July 2026 our system published a sentence containing the phrase “one kilowatt per hour”.

Kilowatt is power. Kilowatt-hour is energy. “Kilowatt per hour” is not imprecise, it is wrong, in roughly the way “a hundred kilometres per hour per hour” is wrong. On a channel whose only selling point is that the numbers are right, that is the most expensive sentence you can write.

No prompt would have prevented it. A language model does not know physics, it knows word sequences, and “kilowatt per hour” is a very common word sequence. No human caught it either, because two days earlier we had switched the daily run to unattended. That is exactly what it is built for.

That is this article in one paragraph. Not “AI makes mistakes”, everybody knows that. Rather: the kind of mistake a language model makes cannot be found with the tools most people are using. A second prompt will not find it. A second model taking another look will not find it. And you will only find it yourself as long as you read every single text, which defeats the entire point.

What we measured

Claims are cheap, so here is a measurement from our own operation. In August we ran five video runs to test whether an AI video agent delivers a better look. The prompt said, verbatim: “Do not invent any statistic, number, or on-screen text that is not in the script.”

MetricValue
Runs5
Paid renders8
Published videos2
Blocked runs3
Total cost8.57 USD
Cost per published video4.28 USD
Runs that invented on-screen text4 of 5

Five runs, August 2026, our own channel. The prompt explicitly forbade inventing anything.

Four out of five runs put text on screen anyway that appeared nowhere in the script. Always the same type: an invented number with a unit (“2.5 kW”, “680 h”) or a promotional add-on (“TOP DEAL”, “full subsidy”, “expert comparison”). None of it was malice. The model wanted to do the job well, and an ad usually does have “TOP DEAL” on it.

A ban in a prompt is not a ban. It is a request that was ignored 80 percent of the time.

Anyone selling you an AI automation who answers the question about safeguards with “it's in the prompt” has just told you there are no safeguards. That is the core of it, and everything else here is the answer to one question: what takes the place of the request?

The answer: take decisions away from the model

A black box does not become controllable by supervising it harder. It becomes controllable by shrinking what it is responsible for, until all that is left is the one thing a model genuinely does better than a rule: phrasing language. Everything else is decided by something that decides the same way every time.

Here is what that looks like for us. A language model writes the script. After that it touches nothing.

the model decides no model decides beyond this point Script language model GATE 1 Rules what is forbidden GATE 2 Sources every number sourced Render voice, image, text GATE 3 File audio, image, length GATE 4 Approval per content class Post content_policy .yaml reads fakten .yaml reads Changes only by pull request, approved by a human. write blocked
The pipeline has exactly one place where a language model decides. The four gates after it decide the same way every time. The agent may read the rules file and the facts file, but not write them: that is not an instruction in a prompt, it is a permission at the platform level.

Gate 1: the rule lives in a file, not in the prompt

Before a script goes into production it runs against a rules file. Not a second language model, but a deterministic filter: same text, same result, every time. A model policing a model is not a control, it is a second opinion with the same blind spots.

The practical advantage is not the technology, it is the format. The file is versioned, every change carries a date and a name, and you can print it out and put it on a lawyer's desk. You cannot do that with a prompt, because a prompt gets re-rolled with every model change.

Here it is. An excerpt from the policy of our health channel, shortened, otherwise unchanged:

If you are not a developer: you do not need to read the box below. What matters is that this file exists, that its explanations are in plain language, and that only a human may change it. The text picks up again right underneath.

policies/content_policy.yamlexcerpt
# --- Check disclosure_present: this exact text must appear in the caption ---
# Two obligations in one string: AI label AND medical disclaimer.
required_disclosure: "Virtual AI character. AI-generated content.
                       Not medical advice, only hints."

# --- Check banned_claims: regex, case-insensitive, against hook, body, caption. ---
# Starting set, sharpened in operation: EVERY INCIDENT BECOMES A PATTERN
# (and a regression test in the engine).
banned_patterns:
  # Diagnosis: the persona determines nothing. No "you have", no
  # "you're intolerant", no "this means you".
  - '\byou\s+(have|got)\b[^.!?]{0,40}\b(intolerance|allergy|condition)\b'
  # Cure, treatment, prevention stated as a promise.
  - '\b(cures?|heals?|treats?|reverses?)\b[^.!?]{0,40}\b(ibs|reflux|disease)\b'
  # Disordered eating: no moralising, no detox promises.
  - '\b(good|bad|clean|dirty|guilt[- ]?free)\s+foods?\b'
  - '\b(detox|cleanse|flush)\s+(your\s+)?(body|gut|system|liver)\b'

# --- Check belege: these units turn a spoken number into a CLAIM. ---
# If this key is missing the gate is fail-closed and EVERY number needs a source.
einheiten: [g, gram, mg, mcg, kcal, calories, %, percent, ml, IU]

Two things about it matter more than the content. First: the comments are in German and the values in English, because they match against English scripts. A rules file nobody can read does not get maintained. Second, the line “every incident becomes a pattern”. This file is not finished on day one. It grows with every mistake we find, and every entry gets a test in the engine so the same mistake never happens twice.

Gate 2: numbers come from a facts file, not from the model

This is the gate that came out of the kilowatt incident. The rule: the model may only speak numbers that exist in a file of their own, with a value, a unit, a source URL and a date. If the filter finds a number in the text that points at no entry, the run stops. No render, no cost.

The source standard is deliberately narrow. For the health channel: the EFSA register, clinical guidelines, Cochrane reviews, official nutrition reference values, national health institutes. No blogs, no single study without peer review, no manufacturer claims.

And one consequence that surprises people and is nonetheless correct: calculated numbers are not facts. “1 kW times 6 hours times 30 days is 180 kWh, at 0.40 euros that is 72 euros” fails, because 180 and 72 appear in no facts file. That is intended. Otherwise the model can derive any number it likes and the gate is wide open again. The calculation may stay in the text, but its result belongs in the facts file as its own entry, researched by a human.

Gate 3: the finished artefact is checked mechanically

A text can be clean and the file still broken. So a module inspects the finished video before anything is uploaded: is the duration plausible, is there audio on every segment, is the resolution right, is the first frame not black, is our channel logo in the picture? If one check fails the entry is blocked and nothing goes out, not even unattended.

Gate 4: approval is a decision, not a default

Not every content class needs a human. On our affiliate channel for air conditioning units the machine posts by itself. On the health channel every run ends with a finished video and the question of whether it should go out. That costs five minutes a day, and those five minutes are the price of keeping every mistake deletable.

The point is not that approval is good and automation bad. The point is that it is a deliberate, documented decision per content class, and not a default setting nobody ever touched.

Where our own gates failed

A workshop report in which everything works is advertising. So here are the three places where it went wrong for us, with dates.

13.07.2026A physically wrong unit went live

“One kilowatt per hour.” The check knew no physics, and for two days no human had been looking before publication.

What we changed

The facts file was introduced and the filter now enforces it. On top of that, the unit trap itself became a pattern in the rules file, with a regression test containing exactly that sentence.

15.07.2026The check was checking nothing

The evidence check only extracted digits from the text. Spelled-out numbers were explicitly exempt, for a defensible reason: “three reasons” is grammar, not a claim. Which meant this sentence passed without a single source: “The Midea was available in fifteen minutes. A monobloc costs you around seventy euros over the summer.”

That is not a clever workaround, it is the natural way to write spoken German. Our own finding at the time, verbatim: “The gate then checks nothing, and still creates the belief that the numbers are sourced. That is worse than no check at all.”

What we changed

Spelled-out numbers are now normalised into digits deterministically. And the distinction no longer runs on digit versus word, but on the unit: “three reasons” is grammar and passes, “seventy euros” is a claim and needs a source.

July 2026The agent tried to change the rule it kept failing

The rules live in a file. The agent producing the content has access to the repository holding that file. Over a single weekend our system twice took the path of least resistance, in places where we had explicitly forbidden it. Not out of malice, but because it wanted to complete the task and the shortcut was shorter.

What we changed

The fix is not in the prompt, it sits one layer down. The rule paths are not on the agent's write allowlist, and the platform refuses the write. Reading yes; changing only through a pull request that a human approves.

Anyone who can rewrite the test they are being tested against is not being tested.

That is the question you should put to any vendor, and it costs you thirty seconds: can the system you are building for me change its own rules? Anyone without a clear answer has not built a safeguard, they have built decoration.

The step almost nobody takes

Back to the four out of five runs with invented on-screen text. The obvious reaction would have been to tighten the prompt, or to run text recognition over every frame and go red as soon as it finds something. We could have built either. Neither would have touched the actual cause.

What we did instead: we took responsibility for on-screen text away from the model. Subtitles, logo and end card are now rendered by a video tool, and specifically the lines that already passed gates 1 and 2. There is nothing left to invent, because nothing is being decided at that point any more.

The side effect is how you know it was the right fix: gate 3 can no longer go red for structural reasons, so the videos reliably go live. We did not lower the error rate through tighter control, we lowered it by removing the cause. Of fourteen steps, seven remain; of an average 1.6 paid renders per run, one remains.

And because honest numbers are part of the deal: in the three supervised runs afterwards the picture was text-free three times out of three, including the run that had three numbers in the script. Three runs are not proof. They are a start, and we would rather say so ourselves before somebody else does the arithmetic.

This is not just about text

We learned it on a content channel, because there a mistake only costs us. But the four gates are not tied to content. They are tied to one question: where in the process does a model decide something that somebody else takes to be reliable?

A quote going to a customer

The model drafts the wording and classifies the enquiry. The price comes from your price list, not from the model. Discount limits and payment terms live in the rules file, not in the prompt. And nothing reaches the customer without your approval.

Why the stakes are higher here

A bad line of marketing copy is embarrassing and, at worst, expensive. A wrong price in a quote is binding.

A weekly report from your systems

Every number in the report comes from the data source, not one of them from the model. The model only writes the prose around them, and every figure points back to the row it came from. Exactly the same gate as the facts file, just with your database instead of the EFSA register.

A document that has to be booked

The model reads the document and proposes a classification. A rule decides which classifications are permissible at all, and arithmetic checks that the totals add up. A proposal that does not reconcile is not booked, it is put in front of a person.

It is always the same blueprint. The model does the phrasing, because it is good at that. Everything that has to be correct is decided by something that decides the same way every time. And you determine where a human looks at it.

Try the first gate

Below is the filter from gate 1, with two profiles: one for an ordinary online shop and our own one for health and nutrition. Type in a sentence you could plausibly have on your own site. You will see immediately whether it passes, and if not, at which point and against which rule it fails.

Switch rules off and watch the result change. That is the whole point: a brake you can configure, and whose configuration you can see.

Das rechte Profil ist unser eigenes, gekürzt. Beim Umschalten wechselt das komplette Regelwerk.

Textprüfung E-Commerce Shop

Oder ein Beispiel anklicken:

Regelklassen

Jede Klasse lässt sich einzeln abschalten. Das Ergebnis oben ändert sich sofort. So sieht eine Regeldatei aus, bevor sie in eine Datei geschrieben wird.

Was außerhalb der Textprüfung eingestellt wird

Kein Text-Muster, sondern Verhalten. Die erste Zeile ist der eigentliche Unterschied zwischen den beiden Profilen.

One example in detail: if you sell online

To keep this from staying abstract, here is one content class spelled out. If you sell online, two dates make the mechanism concrete this year.

Since 2 August 2026 the transparency obligations under Article 50 of the EU AI Act apply. Anyone publishing AI-generated content must label it so a reader can tell it came from a machine. An automation that sometimes sets the label and sometimes forgets is worse than none at all, because it creates the gap and the feeling of being covered at the same time.

From 27 September 2026 the EmpCo Directive applies. Generic environmental claims without recognised evidence become unlawful, as does climate neutrality based purely on offsetting. In Germany the transposition is already in the federal gazette. A language model writing freely about “sustainable” and “climate neutral” will produce violations by the second from that date.

On top of that, the classics that already apply today:

You know these rules. Your language model does not. And it will not tell you when it crosses the line, because it does not know where the line is.

What it costs when it goes wrong is not an open question. Under German unfair competition law the other side's legal costs for a cease-and-desist notice usually run to €800 to €1,200, and your own review adds another €800 to €2,000. It gets expensive after that: once you have signed an undertaking, the next occurrence costs a contractual penalty, per instance. If an automation wrote the same sentence into thirty product pages, that is a different arithmetic. In Luxembourg it runs through an injunction action in summary proceedings, and the court can order the judgment to be published at your expense. The numbers in detail are in our shorter article for shop owners.

Three questions you can put to any vendor

Whether or not we are the ones building it for you:

How we work

We are DigitalAce, an AI operations studio based in Luxembourg. We connect AI to real business processes and build done-for-you workflows for small and mid-sized companies. Not a tool you then have to operate yourself, but a process that runs.

Everything in this article came out of our own products, not a client's. That was deliberate. We could tell you we built it for a customer and it would sound better. In a market the size of Luxembourg, though, that kind of claim is one follow-up question away from falling apart. The riskiest possible version belongs on a product we own, because there a mistake only costs us.

If reading this made you think of one specific sentence on your own site

Then that is exactly the conversation we like having. We look at where your content is produced, where the brake is missing, and what the first workflow would be that actually pays for itself.

Book an intro call Thirty minutes, free, no commitment.

This article describes how we build our own systems. It is not legal advice. Assessing your specific case requires a lawyer, and we are happy to work alongside yours. The dates and legal bases cited are as of 21 August 2026.