One campaign, and the rule that runs through it
Here's the situation for the next three lessons. You're the marketer at Fieldnote, a coffee-subscription brand. The fall relaunch ships in three weeks: a new subscription tier, a two-week push across email, social, and paid. You'll draft with AI at every stage — that part is settled. The CMO Survey's Spring 2026 wave puts AI in 24.2% of marketing activities and climbing. Nobody is going to pay you to type first drafts by hand.
What they will pay you for is this: nothing publishes without a named approver, and nothing gets in front of an approver that hasn't passed its checks. That's the spine of this chapter. Copy passes the voice check before Dana sees it. Calendar rows pass the approval gate before the scheduler sees them. Report numbers trace to the export before anyone upstairs sees them. The AI drafts; your scripts check; a human named in the file approves. Three distinct jobs, and the middle one is yours to build.
The brand book problem
Every brand has voice guidelines. Almost none of them are checkable. "Warm but confident." "Punchy." "Sounds like a knowledgeable friend." Try writing a script that tests whether a sentence is warm. You can't, and neither can the model — which is why pasting the brand PDF into a prompt produces copy that gestures at your voice while shipping "game-changing" in line one.
The fix is to split the guidelines into two piles:
- Testable rules. "Sentences under 20 words." "No exclamation points." "One idea per line." A script can check every one of these.
- Banned phrases. The cliches, the superlatives legal can't back, the competitor names. A list. Substring match. Done.
Run the editor on the right. That dict is a real voice pack: three testable rules, four banned phrases, a named owner, a version, a date. When Dana tightens a rule in August, the version bumps to v4 and every check downstream picks it up. That's the difference between a voice pack and a PDF nobody opens: the pack is attached to the pipeline, not filed next to it.
Why "as data" and not "in the prompt"
You'll still put the pack in the prompt — the model drafts better with it. But the prompt is a request, not an enforcement mechanism. The model complies most of the time, and "most of the time" across 40 variants means three or four violations sail through per batch. The pack-as-data gives you a second use of the same artifact: after the model drafts, a linter reads the same dict and flags every violation mechanically. Same source of truth, two jobs — brief the model going in, check the model coming out.
Where this lesson goes
You'll build that linter. First you'll read one, predict what it catches, and drill the testable-vs-mood distinction. Then you'll write lint_copy yourself and run a five-variant batch through it — the exact pass that runs before anything reaches Dana's approval queue. By the end, "on-voice" stops being a vibe and becomes a function that returns an empty list.
One placement note now, paid off in lesson 3: in a live stack this pass isn't a file you remember to run. It's a code step in your automation tool — or the last call in the drafting script — wired between the model and the approval queue, so every batch walks through it whether anyone is watching or not.