Closed-World Claims Audit: Marketing Copy vs. What You Can Substantiate
Objective
Regulators don't ask whether a marketing claim is contradicted by your documentation — they ask whether you can substantiate it. The FTC's Green Guides and the EU's incoming green-claims rules both put the burden on the publisher: an environmental or performance claim you cannot back is treated as deceptive, even if nothing on file disproves it.
That standard is exactly NLI_VERIFY's closed-world mode: a claim no
anchor entails is a LIE, not merely "unverified." This recipe audits a
batch of draft marketing claims against a substantiation file and shows how
the open-world and closed-world verdicts differ — and why the closed-world
column is the one a compliance reviewer wants.
Step 1: The substantiation file — what you can actually prove
CREATE TABLE IF NOT EXISTS recipe_claimaudit_substantiation (
id INT PRIMARY KEY,
document TEXT,
fact TEXT
);
INSERT INTO recipe_claimaudit_substantiation (id, document, fact) VALUES
(1, 'lab-report-2026-091', 'Third-party testing measured the packaging at 72 percent recycled fiber content.'),
(2, 'lab-report-2026-091', 'The packaging is certified compostable in industrial composting facilities.'),
(3, 'supplier-attestation', 'The cotton in the fabric is certified organic by the supplier.'),
(4, 'energy-audit-2026', 'The factory sources 40 percent of its electricity from on-site solar.');
Step 2: The draft claims
CREATE TABLE IF NOT EXISTS recipe_claimaudit_claims (
id INT PRIMARY KEY,
claim TEXT
);
INSERT INTO recipe_claimaudit_claims (id, claim) VALUES
(1, 'Our packaging is made with recycled fiber.'),
(2, 'Our packaging is fully biodegradable in your home compost bin.'),
(3, 'This product is carbon neutral.');
Claim 1 is backed by the lab report. Claim 2 overreaches — industrial compostability is not home compostability. Claim 3 has no substantiation at all.
Step 3: Ground truth — read the two postures side by side
One statement audits every claim under both policies:
SELECT c.id,
c.claim,
JSON_UNQUOTE(JSON_EXTRACT(NLI_VERIFY('nli-default', c.claim,
(SELECT NLI_ANCHORS(fact) FROM recipe_claimaudit_substantiation)), '$.verdict')) AS open_world,
JSON_UNQUOTE(JSON_EXTRACT(NLI_VERIFY('nli-default', c.claim,
(SELECT NLI_ANCHORS(fact) FROM recipe_claimaudit_substantiation),
JSON_OBJECT('closed_world', true)), '$.verdict')) AS closed_world
FROM recipe_claimaudit_claims c
ORDER BY c.id;
Expected (observed on v2.1.2-ce, nli-default):
| id | claim | open_world | closed_world |
|---|---|---|---|
| 1 | recycled fiber | TRUTH |
TRUTH |
| 2 | home compostable | LIE |
LIE |
| 3 | carbon neutral | UNVERIFIED_PLAUSIBLE |
LIE |
Two different failure modes, and the columns separate them. The home-compost
claim is contradicted — the file says industrial composting, which
disputes home compost — so even open-world catches it as a LIE. The
carbon-neutral claim is unsubstantiated: nothing in the file disputes it,
so open-world calls it UNVERIFIED_PLAUSIBLE and lets it slide. Only
closed-world — "does the file support this?" — fails it. That gap is exactly
why unsupported claims survive casual review but not a substantiation audit.
Step 4: The publishable set is a WHERE clause
SELECT c.id, c.claim
FROM recipe_claimaudit_claims c
WHERE JSON_UNQUOTE(JSON_EXTRACT(NLI_VERIFY('nli-default', c.claim,
(SELECT NLI_ANCHORS(fact) FROM recipe_claimaudit_substantiation),
JSON_OBJECT('closed_world', true)), '$.verdict')) = 'TRUTH';
Expected: 1 row — only the recycled-fiber claim ships. The other two go back to the copywriter with a concrete demand: produce substantiation, or soften the claim until the file entails it.
Step 5: Fixing a claim means matching your evidence, not deleting it
Reword claim 2 to what the lab report actually supports:
SELECT JSON_UNQUOTE(JSON_EXTRACT(NLI_VERIFY('nli-default',
'Our packaging is compostable at industrial composting facilities.',
(SELECT NLI_ANCHORS(fact) FROM recipe_claimaudit_substantiation),
JSON_OBJECT('closed_world', true)), '$.verdict')) AS verdict;
Expected: TRUTH — the honest version of the claim passes the same gate
that rejected the inflated one.
Cleanup (Optional)
DROP TABLE IF EXISTS recipe_claimaudit_substantiation;
DROP TABLE IF EXISTS recipe_claimaudit_claims;
Use it from your app
- Run the Step 3 audit as a pre-publication check in your CMS pipeline; block
on any
closed_worldverdict that isn'tTRUTH. - Keep the substantiation table keyed by document so every
TRUTHverdict is traceable to the lab report or attestation that backs it. - Why in-DB: the claims, the substantiation file, and the verifier live together — the audit is a query, not a workflow across three vendors.
Key Concepts Learned
- Closed-world mode inverts the burden of proof: unsupported ≠ unknown, it's a failure — which is the substantiation standard regulators actually apply.
- Open-world review systematically misses unsubstantiated overreach: the carbon-neutral claim read as "plausible" because nothing disputed it. Use open-world for contradiction hunting, closed-world for clearance.
- NLI reads wording, not chemistry: "industrial compostable" vs "home compostable" was caught because the texts differ. Pair the gate with human review for claims whose risk lives outside the words.
- Keep anchors as atomic facts from identified documents — the verdict is only as auditable as the evidence table behind it.