promptdojo_

The numbers pass — every claimed metric traced to the export — step 4 of 7

Denominators, and the list with legal teeth

Two things kill more marketing reports than bad math: percentages that don't say what they're a percentage of, and claims that were never allowed to exist in the first place.

The denominator trap

Run the editor. Both statistics are real, current, and about "AI in marketing" — and they differ by a factor of three because they count different things. Salesforce's own State of Marketing 2026 report headlines 75% of marketers having adopted AI: any use, by anyone, counts once. The CMO Survey's Spring 2026 wave reports AI in 24.2% of marketing activities, up from 13.1% — activity-weighted, so one marketer using AI for one task out of twenty barely moves it. A report that says "75% of marketing is AI now" has silently swapped denominators, and it's the kind of error that survives every read-through because the sentence sounds fine.

The rule for your own reports is the one you just built into verify_numbers, extended one level: every percentage states its denominator. "3.4% CTR (clicks / sent)." "27.8% open rate (opens / delivered)." A share of activities and a share of users are different facts; a report that can't tell them apart isn't a report, it's mood.

Three lists and a fourth category

Lesson 2's gate answered who approves. The brand-safety policy answers what needs approving. Three lists:

  • AI may draft — social posts, email subject lines, ad copy. Low blast radius, fully linted by lesson 1's pass, still gated by lesson 2's calendar before publishing.
  • Named approver required — pricing claims, press quotes, partner mentions, anything with a competitor's name in it. Draftable, but a specific human signs before it moves.
  • Human-only — crisis comms, apologies, anything responding to a customer's bad day. The model doesn't draft these because the cost of sounding synthetic exceeds the cost of writing it yourself.

And then a fourth category that's not a list, because it's not a choice: banned outright. The FTC's Consumer Reviews and Testimonials Rule — 16 CFR Part 465, effective October 21, 2024 — prohibits reviews and testimonials "by someone who does not exist, such as AI-generated fake reviews," with civil penalties in the tens of thousands of dollars per knowing violation (the figure is inflation-adjusted every year — look up the current year's amount before you ever quote a specific number). Note the unit: per violation. A batch of twelve invented five-star reviews is not one mistake. An AI-drafted testimonial from a customer the model made up goes on no list — not draftable, not approvable-with-sign-off, gone. And more broadly, the FTC's deceptive-practices standard doesn't care who wrote the sentence; "the AI drafted it" has the same legal weight as "the intern drafted it," which is none.

Where these checks live

You now hold three working checks, and none of them belongs in a notebook you remember to open. Each has a slot in a real marketing stack:

  • lint_copy runs where drafts are born: as a code step in your automation tool, sitting between "the model returns variants" and "variants land in Dana's approval queue." If your drafting workflow is a script rather than an automation-platform step, the linter is the last function that script calls. Either way, no human ferries copy to the checker — the pipeline walks every batch through it, watched or not.
  • gate is the pre-send gate: it runs over the calendar file at the last moment before rows load into the scheduling tool. Not weekly, not "when someone remembers" — it's the doorway. Rows pass through it or they don't reach the scheduler at all.
  • verify_numbers is a scheduled script: end of launch week, every campaign, pointed at that campaign's platform CSV export, before the report leaves the team. Recurring, because campaigns recur — same pass, next export, forever.

No vendor names in that list, for the same reason the batch plan carries no model names: tools churn quarterly, but the stack roles — the automation step, the pre-send gate, the scheduled report script — are stable. Whatever your team runs, each check has a slot waiting for it. A check without a slot is a check that quietly stops running by October.

The next two steps drill both halves of the policy layer: first you'll spot which drafted line can't ship at any approval level, then you'll build the router that sends every piece to its correct list.