Creative Brief From Account Data
Shared quality bar: ../references/output-standard.md. All numbers cited here
live in ../references/thresholds.md.
Input is an export, output is a brief a designer or copywriter can build from
without asking a follow-up question.
Use this skill when
A production round is about to be commissioned and the account has run enough
ads to have an opinion. Use it when a designer, editor or freelancer is waiting
for instructions, when a monthly creative batch is being scoped, or when the
last batch was briefed from opinion and nobody can say what it was answering.
Do not use it to dissect one ad into a transferable pattern; that is
winning-ad-teardown-ad-creative. Do not use it to audit coverage on its own,
and route that question by its window rather than by the word coverage: what is
live right now, and whether this week's spend can teach anybody anything, is
asset-coverage-check-ad-creative; what the account has argued across the whole
served library including everything paused is
angle-inventory-ad-creative. This skill consumes a coverage count, it does not
produce one.
Do not use it for the Monday report either. weekly-creative-readout-ad-creative
starts from the same weekly ad-level export and also states spend, delivery
share and the collapsed angle count, so the two look alike at the point of
routing. They differ on the deliverable: that skill writes the week that has
happened for a client and commissions nothing, and this skill commissions the
next production round. If nobody is waiting to build anything, it is that skill.
Required input
- An ad-level export covering at least
test.min_runtime: ad name or ID, spend,
impressions, link clicks, link CTR, conversions, cost per conversion, and the
first date the ad served.
- The creative itself, or a description of each ad's hook, offer and format.
- The objective the campaign optimises toward, and which conversion action
counts as primary.
- Any creative or budget change made inside the window, with dates.
- Production constraints: who builds it, what assets exist, what cannot be shot.
Analysis workflow
- Confirm the export is readable as creative evidence: check the date range
against
test.min_runtime and the per-ad volume against
test.volume_floor. Ads below the floor enter the brief as context, never as
proof, and every finding drawn from them is capped at low confidence.
Then check each ad against delivery.never_delivered_floor. An ad under it
did not lose, it did not run: mark it never_delivered, drop it out of the
ranking and out of any cut list, and never let it enter the brief as a failed
angle. Its angle goes back on the untested list. Then check each surviving ad
against delivery.ranking_floor. Below that share the spend is too
concentrated for a like-for-like comparison, so the ad may appear as context
but not inside the ranking the brief is built from.
- Label each ad with its angle stated as a sentence, its offer and its format.
Use the definitions of creative and angle fixed in
thresholds.md.
- Rank on the objective's own metric, not on CTR, and record which metric you
ranked on.
reporting.no_view_through_in_ctr explains why a CTR ranking can
invert a conversion ranking.
- Collapse ties, and pick the key by what the difference is measured on. A gap
in cost per acquisition, which is the metric most briefs are actually ranked
on, is judged by
money.relevance_floor and by nothing else; that key owns
every cost per acquisition comparison in this pack, so the same gap is not a
tie here and actionable in the readouts. test.material_gap stays where it
belongs, on rate differences such as link CTR. Say which of the two you
applied, collapse anything inside it into a single tie, and do not brief
against a difference you have just called a tie.
- Separate the angle effect from the execution effect. Where an angle appears
in fewer than
coverage.formats_per_angle, the result is about that one
execution and the brief says so, labelled hypothesis.
- Check supply: read the share of ad set spend riding old creatives against
coverage.stale_spend_share, and the live angle count against
coverage.angles_per_ad_set. The supply reading is on money rather than on
the launch date of the newest file, because an account shipping every month
always has a young newest asset while most of its budget can still sit on a
handful of files from the spring. A shortfall on either sets the size of the
round.
- Where any figure in the brief rests on this period's conversions against a
previous period's, either wait out the account's attribution window or state
reporting.conversion_lag_bias next to the number. The current window is
still filling in while the prior one has closed, so a flat month reads as a
falling one and the brief would commission work against a decline nobody
had.
- Write the brief. Each item names the angle, the one element it changes
against a named control (
test.one_change_rule), the format, and the result
that would make it a keeper. Cap the round at test.concurrent_variant_cap
per ad set.
- Mark every factual claim the brief asks a writer to make with
[claim: needs source] under claims.evidence_rule, and list what you
declined to brief.
Decision rules
- Angle beat its control on cost per acquisition by more than
money.relevance_floor, or on a rate by more than test.material_gap, and
cleared test.volume_floor: ship more of that angle, confidence high where
the comparison came from a real split. Where the ads simply co-existed in one ad
set, test.assignment_rule caps the row at medium and the brief says so.
- Cost per acquisition gap inside
money.relevance_floor: a tie, whatever the
rate table shows, and it is not briefed as a learning. That key owns this
comparison and test.material_gap is not read against it here, so a brief
written from this skill and a readout written from the money keys reach the
same verdict on the same gap.
- Any verdict arriving from the
early.* block: it is not a brief input. Under
blocking rule 10 in ../AGENTS.md, everything in that block is low by
definition, exists to give a decision on creatives that will never reach
test.volume_floor, and does not become evidence by being repeated. A
creative cut on early.hook_rate or early.cost_multiple may be named as
context, and its angle goes back on the untested list; it never enters the
ranking the brief is built from and never counts as an angle that failed.
- Angle won on thin volume:
test it again with a bigger share, confidence
low, and say the floor was the missing condition.
- Angle lost in one format only:
rewrite in the missing format rather than
cutting the angle.
- Live angles under
coverage.angles_per_ad_set: the round's first job is a new
angle, not a new execution.
- Ad under
delivery.never_delivered_floor: it is not a finding of any kind.
test its angle again with a share that lets it run, and say the previous
attempt never delivered.
- Ad above that floor but under
delivery.ranking_floor: it ran, so it is not
never_delivered, but it is not ranked either. Carry it as context and say
which question its spend share stopped it answering.
- Share of spend on old creatives above
coverage.stale_spend_share: size the
round on supply first. Optimisation of the current set cannot fix a budget
riding files nobody has replaced.
- Winner cannot be explained by anything in the export:
investigate, and label
the explanation hypothesis under reporting.no_causal_read_from_export.
- Any brief item touching
claims.restricted_topics: approval_needed.
Output format
No verdict line. A ranked evidence table, then the brief.
| Ad |
Angle |
Format |
Ranked metric |
Evidence label |
Confidence |
Decision |
Then one brief item per production slot: angle sentence, control it tests
against, single changed element, format, success condition. Then
What this could not see, Missing data, Approval gates.
Practical example
Illustrative made-up account data, not a real advertiser. Export covers 28 days,
11 ads. "Agency cost" angle: 62 conversions, cost per conversion 41. "Setup
speed" angle: 9 conversions, cost per conversion 38. "Founder story": 57
conversions, cost per conversion 44.
Two of the 11 ads fall under delivery.never_delivered_floor. They are marked
never_delivered, kept out of the ranking, and their angles go back on the
untested list rather than into the brief as things that failed. A third ran but
sat under delivery.ranking_floor, so it is carried as context and left out of
the ranking, which is a different exclusion for a different reason. The month against previous month conversion
comparison the client asked for is not stated at all: the current window is
still inside the account's attribution window, so reporting.conversion_lag_bias
biases it against the present, and reporting it would commission work against a
decline nobody has.
Reading: the ranked metric is cost per conversion, so the gap is judged on
money.relevance_floor and not on test.material_gap. Agency cost at 41
against founder story at 44 is a difference of 3, which is 7.3 per cent of 41,
inside money.relevance_floor, so they are a tie and no winner is named. Setup speed looks
cheapest but sits far under test.volume_floor at 9 conversions, so its
confidence is low and it is briefed as a retest, not as a finding. The claim
that agency cost wins on creative merit is refused: two budget edits fall inside
the window, which caps that row at low under the shared confidence scale.
Brief: three slots. One retest of setup speed at a larger share, one new angle
because only two live angles clear coverage.angles_per_ad_set, one format
extension of founder story into video. Declined: a "saves 37 per cent versus an
agency" line, because no source was supplied for the figure. Also declined as an
input: two further ads, both of which did deliver, were cut last week on
early.cost_multiple, and those verdicts stay out of the ranking under blocking
rule 10 in ../AGENTS.md. Their angles go back on the untested list rather than
into the brief as arguments that failed.
Guardrails
- Never brief a difference smaller than
money.relevance_floor on cost per
acquisition, or smaller than test.material_gap on a rate, as a learning.
- Never carry an
early.* verdict into the brief as evidence.
- Never rank creatives on CTR when the objective is conversions.
- Never write a number into a brief that the user did not evidence.
- Do not upload, launch or pause anything. The brief is a decision for a human.
1---2name: creative-brief-from-account-data-ad-creative3description: Creative Brief From Account Data4---56# Creative Brief From Account Data78Shared quality bar: `../references/output-standard.md`. All numbers cited here9live in `../references/thresholds.md`.10Input is an export, output is a brief a designer or copywriter can build from11without asking a follow-up question.1213## Use this skill when1415A production round is about to be commissioned and the account has run enough16ads to have an opinion. Use it when a designer, editor or freelancer is waiting17for instructions, when a monthly creative batch is being scoped, or when the18last batch was briefed from opinion and nobody can say what it was answering.19Do not use it to dissect one ad into a transferable pattern; that is20`winning-ad-teardown-ad-creative`. Do not use it to audit coverage on its own,21and route that question by its window rather than by the word coverage: what is22live right now, and whether this week's spend can teach anybody anything, is23`asset-coverage-check-ad-creative`; what the account has argued across the whole24served library including everything paused is25`angle-inventory-ad-creative`. This skill consumes a coverage count, it does not26produce one.2728Do not use it for the Monday report either. `weekly-creative-readout-ad-creative`29starts from the same weekly ad-level export and also states spend, delivery30share and the collapsed angle count, so the two look alike at the point of31routing. They differ on the deliverable: that skill writes the week that has32happened for a client and commissions nothing, and this skill commissions the33next production round. If nobody is waiting to build anything, it is that skill.3435## Required input3637- An ad-level export covering at least `test.min_runtime`: ad name or ID, spend,38 impressions, link clicks, link CTR, conversions, cost per conversion, and the39 first date the ad served.40- The creative itself, or a description of each ad's hook, offer and format.41- The objective the campaign optimises toward, and which conversion action42 counts as primary.43- Any creative or budget change made inside the window, with dates.44- Production constraints: who builds it, what assets exist, what cannot be shot.4546## Analysis workflow47481. Confirm the export is readable as creative evidence: check the date range49 against `test.min_runtime` and the per-ad volume against50 `test.volume_floor`. Ads below the floor enter the brief as context, never as51 proof, and every finding drawn from them is capped at `low` confidence.52 Then check each ad against `delivery.never_delivered_floor`. An ad under it53 did not lose, it did not run: mark it `never_delivered`, drop it out of the54 ranking and out of any cut list, and never let it enter the brief as a failed55 angle. Its angle goes back on the untested list. Then check each surviving ad56 against `delivery.ranking_floor`. Below that share the spend is too57 concentrated for a like-for-like comparison, so the ad may appear as context58 but not inside the ranking the brief is built from.592. Label each ad with its angle stated as a sentence, its offer and its format.60 Use the definitions of creative and angle fixed in `thresholds.md`.613. Rank on the objective's own metric, not on CTR, and record which metric you62 ranked on. `reporting.no_view_through_in_ctr` explains why a CTR ranking can63 invert a conversion ranking.644. Collapse ties, and pick the key by what the difference is measured on. A gap65 in cost per acquisition, which is the metric most briefs are actually ranked66 on, is judged by `money.relevance_floor` and by nothing else; that key owns67 every cost per acquisition comparison in this pack, so the same gap is not a68 tie here and actionable in the readouts. `test.material_gap` stays where it69 belongs, on rate differences such as link CTR. Say which of the two you70 applied, collapse anything inside it into a single tie, and do not brief71 against a difference you have just called a tie.725. Separate the angle effect from the execution effect. Where an angle appears73 in fewer than `coverage.formats_per_angle`, the result is about that one74 execution and the brief says so, labelled `hypothesis`.756. Check supply: read the share of ad set spend riding old creatives against76 `coverage.stale_spend_share`, and the live angle count against77 `coverage.angles_per_ad_set`. The supply reading is on money rather than on78 the launch date of the newest file, because an account shipping every month79 always has a young newest asset while most of its budget can still sit on a80 handful of files from the spring. A shortfall on either sets the size of the81 round.827. Where any figure in the brief rests on this period's conversions against a83 previous period's, either wait out the account's attribution window or state84 `reporting.conversion_lag_bias` next to the number. The current window is85 still filling in while the prior one has closed, so a flat month reads as a86 falling one and the brief would commission work against a decline nobody87 had.888. Write the brief. Each item names the angle, the one element it changes89 against a named control (`test.one_change_rule`), the format, and the result90 that would make it a keeper. Cap the round at `test.concurrent_variant_cap`91 per ad set.929. Mark every factual claim the brief asks a writer to make with93 `[claim: needs source]` under `claims.evidence_rule`, and list what you94 declined to brief.9596## Decision rules9798- Angle beat its control on cost per acquisition by more than99 `money.relevance_floor`, or on a rate by more than `test.material_gap`, and100 cleared `test.volume_floor`: `ship` more of that angle, confidence `high` where101 the comparison came from a real split. Where the ads simply co-existed in one ad102 set, `test.assignment_rule` caps the row at `medium` and the brief says so.103- Cost per acquisition gap inside `money.relevance_floor`: a tie, whatever the104 rate table shows, and it is not briefed as a learning. That key owns this105 comparison and `test.material_gap` is not read against it here, so a brief106 written from this skill and a readout written from the money keys reach the107 same verdict on the same gap.108- Any verdict arriving from the `early.*` block: it is not a brief input. Under109 blocking rule 10 in `../AGENTS.md`, everything in that block is `low` by110 definition, exists to give a decision on creatives that will never reach111 `test.volume_floor`, and does not become evidence by being repeated. A112 creative cut on `early.hook_rate` or `early.cost_multiple` may be named as113 context, and its angle goes back on the untested list; it never enters the114 ranking the brief is built from and never counts as an angle that failed.115- Angle won on thin volume: `test` it again with a bigger share, confidence116 `low`, and say the floor was the missing condition.117- Angle lost in one format only: `rewrite` in the missing format rather than118 cutting the angle.119- Live angles under `coverage.angles_per_ad_set`: the round's first job is a new120 angle, not a new execution.121- Ad under `delivery.never_delivered_floor`: it is not a finding of any kind.122 `test` its angle again with a share that lets it run, and say the previous123 attempt never delivered.124- Ad above that floor but under `delivery.ranking_floor`: it ran, so it is not125 `never_delivered`, but it is not ranked either. Carry it as context and say126 which question its spend share stopped it answering.127- Share of spend on old creatives above `coverage.stale_spend_share`: size the128 round on supply first. Optimisation of the current set cannot fix a budget129 riding files nobody has replaced.130- Winner cannot be explained by anything in the export: `investigate`, and label131 the explanation `hypothesis` under `reporting.no_causal_read_from_export`.132- Any brief item touching `claims.restricted_topics`: `approval_needed`.133134## Output format135136No verdict line. A ranked evidence table, then the brief.137138| Ad | Angle | Format | Ranked metric | Evidence label | Confidence | Decision |139|---|---|---|---|---|---|---|140141Then one brief item per production slot: angle sentence, control it tests142against, single changed element, format, success condition. Then143`What this could not see`, `Missing data`, `Approval gates`.144145## Practical example146147Illustrative made-up account data, not a real advertiser. Export covers 28 days,14811 ads. "Agency cost" angle: 62 conversions, cost per conversion 41. "Setup149speed" angle: 9 conversions, cost per conversion 38. "Founder story": 57150conversions, cost per conversion 44.151152Two of the 11 ads fall under `delivery.never_delivered_floor`. They are marked153`never_delivered`, kept out of the ranking, and their angles go back on the154untested list rather than into the brief as things that failed. A third ran but155sat under `delivery.ranking_floor`, so it is carried as context and left out of156the ranking, which is a different exclusion for a different reason. The month against previous month conversion157comparison the client asked for is not stated at all: the current window is158still inside the account's attribution window, so `reporting.conversion_lag_bias`159biases it against the present, and reporting it would commission work against a160decline nobody has.161162Reading: the ranked metric is cost per conversion, so the gap is judged on163`money.relevance_floor` and not on `test.material_gap`. Agency cost at 41164against founder story at 44 is a difference of 3, which is 7.3 per cent of 41,165inside `money.relevance_floor`, so they are a tie and no winner is named. Setup speed looks166cheapest but sits far under `test.volume_floor` at 9 conversions, so its167confidence is `low` and it is briefed as a retest, not as a finding. The claim168that agency cost wins on creative merit is refused: two budget edits fall inside169the window, which caps that row at `low` under the shared confidence scale.170171Brief: three slots. One retest of setup speed at a larger share, one new angle172because only two live angles clear `coverage.angles_per_ad_set`, one format173extension of founder story into video. Declined: a "saves 37 per cent versus an174agency" line, because no source was supplied for the figure. Also declined as an175input: two further ads, both of which did deliver, were cut last week on176`early.cost_multiple`, and those verdicts stay out of the ranking under blocking177rule 10 in `../AGENTS.md`. Their angles go back on the untested list rather than178into the brief as arguments that failed.179180## Guardrails181182- Never brief a difference smaller than `money.relevance_floor` on cost per183 acquisition, or smaller than `test.material_gap` on a rate, as a learning.184- Never carry an `early.*` verdict into the brief as evidence.185- Never rank creatives on CTR when the objective is conversions.186- Never write a number into a brief that the user did not evidence.187- Do not upload, launch or pause anything. The brief is a decision for a human.