Legal disclaimers,
audited with zero guesswork.
A legal team can't
work in maybes.
A company's legal department needed every marketing page checked for the right disclaimers before it went live. This is not a place for a confidence score. A disclaimer is either legally required on a page or it is not, and getting it wrong carries real exposure. There was no room for error, no acceptable failure rate, and no appetite for an AI that answers one way today and another way tomorrow.
The catch: the audit itself is genuinely fiddly. Someone in legal had to open each page, study the imagery, read the copy, work out what the page was actually promoting, decide which disclaimers the rules demanded, and then write feedback back to the people who made it. Done by hand across a stream of pages, it was slow. Worse, it was inconsistent: two reviewers could reach two different verdicts on the same page, which is the last thing a legal function wants on record.
Great at ten pages.
Shaky at hundreds.
The first working version used a large language model. It read a screenshot of each page and returned the disclaimers it judged the rules required. On a handful of pages the results were genuinely good, good enough to make the whole job look solved.
Then we increased the number of records in each audit run, and the picture changed. At volume, the error count climbed to a level a legal function simply cannot carry: a disclaimer wrongly called, or quietly missed, with no way to see why the model decided what it did. Good on average is not good enough when every page is a compliance record. So we set out to make the audit deterministic, one moving part at a time: Amazon Rekognition for what is in the image, exact scraping for what the page says, and a similarity formula with fixed thresholds for the call itself.
Settling the final, no-LLM process took a lot of testing: we built an audit corpus of 150 records and ran more than 2,000 test passes over them, tightening one setting at a time. Then we put the two approaches head to head, the LLM against the deterministic workflow that replaced it, on 83 of those pages. The results were not what the first dashboard number suggested, and that comparison is a story of its own.
A skill first,
then scripts.
We didn't hand the legal team a black-box model and hope for the best. We hardened the workflow in three deliberate stages, taking the AI's judgment out of the live decision path a step at a time, until what shipped was ordinary, inspectable software.
Written as a skill
We started from a single skill file that captured the whole audit as explicit steps: pull the page, read the imagery, read the copy, apply the disclaimer rules, return feedback. Running it as a skill let us prove the exact sequence on real pages before writing a line of production code.
Proven on real pages
We ran the skill against pages the legal team had already judged and compared the results. Where the skill and the lawyers disagreed, we tightened the steps until the two matched. That way we knew the process itself was correct before we made it rigid.
Compiled into scripts
Then we converted the proven steps into local scripts, real software. The audit now runs 100% deterministically: the same page produces the same verdict on every run, with no model improvising in the hot path.
Here's the path we took, from an AI following a recipe to software that runs the same way every time:
flowchart TD A["Stage 1: write the audit as a skill, explicit steps an LLM can follow"] --> B["Stage 2: run it against pages the lawyers already judged, tighten until they agree"] B --> C["Verify the process is correct on real pages, end to end"] C --> D["Stage 3: compile the steps into local scripts, deterministic software the company owns"]
Two checks on
every page.
Every page gets audited on two independent tracks, and both have to line up before the workflow signs off. Each track answers a different question, and neither one asks a language model to decide.
The image against what's in it
What does the picture actually show? A product held in the hand, a car on a road, a person using the thing being sold. The objects detected in the image change which disclaimers apply, so the first track is a clean, repeatable list of what is really in the frame.
The image against the page copy
What does the surrounding text claim? A caption, a headline, a body paragraph. What the page says, sitting next to what it shows, decides the rest. The second track pulls that text out exactly and lines it up against the rules.
Put together, the two tracks answer the only thing legal cares about: given what this page shows and what it says, which disclaimers does the law require here?
No model in the
hot path.
Making the audit trustworthy meant removing the AI from the moment of decision. We got there with four pieces, and not one of them guesses.
Reading the image, in chunks
To validate what was in each image, we fed the base64-encoded image into code in multiple chunks and checked what was present piece by piece. That gave us high, repeatable detection results we could actually rely on, rather than a single opaque yes-or-no from a model we couldn't inspect.
Object detection with Amazon Rekognition
For detecting objects in imagery we moved to Amazon Rekognition, a dedicated computer-vision service. It is more deterministic than asking a language model what is in a picture, far easier to manage and cross-check, and at our volume it carried effectively no cost. That single change took a round from about $0.10 to close to zero.
Scraping the text with regex
The on-page text was the easy, fully deterministic half. We scraped it with dedicated scraping scripts built on regular expressions (regex), so extraction is exact and repeatable. The same page yields the same text every time, with no model in the loop and nothing left to interpretation.
Judging with a similarity score, not a vibe
The hard part was the judgment: does this combination of image and text require a disclaimer? Instead of asking an LLM to decide, we built a scoring formula based on similarity. We embedded the text several different ways and combined those embeddings into a single similarity score against the disclaimer rules. Fixed thresholds on that score turn a fuzzy call into a settled one.
The judgment then follows three explicit rules the legal team owns:
Definitely required
The score clears the upper threshold. The disclaimer must appear on the page. If it's missing, the auditor flags it.
Cannot be sure
The score lands in the middle band. The page is routed to a human. The workflow never guesses in this zone.
Not required
The score sits below the lower threshold. No disclaimer is needed here, so the auditor doesn't over-warn.
Because the bands are fixed numbers, the same page always lands in the same band. The lawyers can read the thresholds, challenge them, and change them, and the behavior changes with them, in the open.
flowchart TD
A["Page in"] --> B["Amazon Rekognition detects objects in the image"]
A --> C["Regex scraping extracts the on-page text"]
B --> D["Embed and score similarity against the disclaimer rules"]
C --> D
D --> E{"Score vs fixed thresholds"}
E -->|"above upper"| F["Disclaimer required, flag if missing"]
E -->|"middle band"| G["Cannot be sure, route to a human"]
E -->|"below lower"| H["Not required, no warning"]
Feedback the creators
can act on.
A page goes in, and the workflow returns legal feedback the page's creator can act on directly: which disclaimers are present, which are missing and legally required, and which cases still need a human to look at. No waiting on a reviewer's calendar, no two-reviewers-two-answers, and a clear record of why each call was made.
Because every step is deterministic software the company owns, the legal team runs the audit whenever they want and extends it themselves as the rules move: a new object to detect, a new rule to encode, a new threshold to set. The workflow doesn't drift, and nobody has to trust a model's mood on the day.
Zero guesswork,
at almost zero cost.
The legal team stopped grading pages by hand and stopped getting two answers for one page. Every verdict is repeatable, inspectable, and defensible, which is exactly what a compliance function needs on record. And because it's scripts they own, they run it on demand and adjust the rules themselves as regulations change, no vendor in the loop.
Curious how the deterministic workflow actually stacked up against the LLM it replaced? Read the full comparison, 83 pages side by side →
Common questions.
How can an AI audit be 100% deterministic?
By taking the language model out of the live decision. We used AI to design and prove the workflow, then compiled the proven steps into ordinary local scripts. Object detection runs on Amazon Rekognition, text is pulled with regex, and the disclaimer call is made by a similarity score against fixed thresholds. Same page in, same verdict out.
Why Amazon Rekognition instead of a vision LLM?
Rekognition is a dedicated computer-vision service that returns consistent, inspectable object labels, which is more deterministic than asking a language model what's in a picture. It's easier to manage and cross-check, and at our volume it took a round from about $0.10 to close to zero.
How is the disclaimer judged without an LLM?
We embed the page text several ways and combine those embeddings into a single similarity score against the disclaimer rules. Fixed thresholds turn that score into one of three outcomes: required, cannot be sure, or not required. The same page always lands in the same band.
What happens when it isn't sure?
It never guesses. A score in the middle band is routed to a human. The workflow only makes an automatic call at the clearly-required and clearly-not-required ends.
Can the legal team change the rules themselves?
Yes. The thresholds and rules are readable software the company owns. Legal can inspect the numbers, challenge them, and adjust them, and add a new object, rule, or threshold as regulations change.
Got a check you
can't get wrong?
Bring the review your team keeps doing by hand, the one with no room for error, to a Sprint. We'll harden it into deterministic software you own, together, and you'll leave running it yourself.