Campaign Brief turns a product brief into copy you can test, not one draft you have to trust: positioning first, then a spread of variants per channel from different angles, a claims check that quotes the line of the brief behind every claim, and a critic that scores the variants against the results of your earlier campaigns. What you get is a test plan: which variants to run against each other, and why.
Usage
Write the brief in brief.md: who it is for, the problem, the offer, the proof. Start from the template in the package.
Put the results of past campaigns, if you have them, in campaigns/results.csv (variant, channel, impressions, clicks, conversions).
Start Campaign and choose the channels.
Read the test plan, run the variants you choose, add the results to the CSV, and run it again for the next round.
What it produces
campaign/positioning.md: one paragraph and the three messages that support it
campaign/<channel>.md: the variants per channel, each angle named, each claim cited to a brief line
campaign/test-plan.md: the pairs to run against each other, with the critic's reasons and the past results it leaned on
channels.yaml (optional): length limits and tone per channel.
strictClaims (default true): a variant with an unsupported claim stays in its channel file, marked with the claim and the missing brief line, and out of the test plan.
minResults (default 20): with fewer past results the critic scores on the brief alone, and says so.
Notes
Unsupported claims are flagged, not rewritten: you decide whether to change the copy or the brief.
The stages are separate vloops: run the claims check on copy written elsewhere, or fork the set.