SKILL DETAIL
advertising-kickoff
mbfinotti/advertising-skills/advertising-kickoff
Before starting any paid advertising work, before each recurring advertising review, and whenever routing is unclear, route the task to the right skill of the advertising-skills collection - or say plainly that none fits - and bootstrap or resume the project's shared context artifact. Use at every advertising project start, on later sessions of the same project to re-route without re-interviewing, and whenever the user mentions a new ad campaign or paid media project, asks which advertising skill they need, or wants a periodic advertising check-in - even if they name no skill at all. Prefer this whenever several skills could apply, since the collection has three colliding clusters - the hirer-vs-candidate pair, the budget cluster, the creative cluster - and it returns a short-list plus an ordered skill chain rather than a single guess. Do NOT use when the task already maps cleanly to one skill, such as a pure account audit - that is mbfinotti/advertising-skills@ad-account-diagnostic.
Installation
npx skills add https://github.com/mbfinotti/advertising-skills --skill advertising-kickoff
Fichiers du skill
SKILL.md
Dernière synchronisation · 24 sept. 2026
evals/evals.json›
{
"skill_name": "advertising-kickoff",
"evals": [
{
"id": 1,
"prompt": "I'm the growth lead at Fernhollow, a B2B invoicing SaaS ($49/month self-serve, plus a sales-assisted enterprise tier). We just got budget to take paid ads seriously. This project folder already has a README describing the product, pricing, and our ICP (bookkeepers at 5-50 person firms), and a docs/media-plan-draft.md from a consultant listing our channels (Google Search + LinkedIn) and noting we already spend about $8k/month on Google. There is no advertising-context.md anywhere in the repo. Get me set up and tell me what to do first.",
"expected_output": "A cold-start kickoff that detects before asking: reads the named files, skips already-answered questions, runs a capped multiple-choice interview one question at a time, bootstraps advertising-context.md with structured fields, and routes within the collection.",
"files": [],
"expectations": [
"Treats the session as a cold start from the stated absence of advertising-context.md, without asking the user whether this is a new or continuing project.",
"Reviews or references the README and docs/media-plan-draft.md content named in the prompt before asking interview questions.",
"Does not re-ask the business model question, since the prompt already identifies B2B SaaS with self-serve plus sales-assisted tiers.",
"Does not re-ask which channels are bought or the spend band, since the prompt already states Google Search + LinkedIn at about $8k/month.",
"Asks no more than 7 interview questions in total.",
"Presents a single first interview question rather than dumping the full questionnaire in one block.",
"At least one interview question offers multiple-choice (lettered or listed) answer options.",
"Asks what conversion event counts as success and where the source of truth lives, since no provided material answers it.",
"Asks about hard constraints and a landing date, and about one-off versus compounding plus the effort ceiling.",
"Asks the goal of this session as a question distinct from the project's overall goal.",
"Creates or drafts advertising-context.md at the project root with structured one-line fields (business model, offer/price, channels/spend, conversion source of truth, constraints, stakeholders) rather than free-form prose.",
"Includes or plans a session-log line in the artifact before the session ends.",
"Every skill named uses the mbfinotti/advertising-skills@skill-name form and belongs to the collection's 31 skills.",
"Does not scaffold directories, trackers, or working-tree structure beyond what this first session needs."
]
},
{
"id": 2,
"prompt": "Here's the advertising-context.md from our repo at Bramblewick Coffee. Run my advertising check-in.\n\n# Advertising context\n- **Updated**: 2026-08-30 (session 7)\n- **Business model**: B2C e-commerce, self-serve\n- **Offer / price point**: coffee subscription, $34/month; AOV $47 with one-time add-ons\n- **Channels / spend**: paid social + paid search, ~$22k/month; $6k committed to the holiday flight\n- **Conversion / source of truth**: first paid subscription; order system authoritative, platform pixels indicative only\n- **CAC-ROAS position**: blended CAC $52 vs $63 break-even; guardrail policy written, owned by the COO\n- **In-flight work**: Q4 creative batch in briefing\n- **Decided**: no new channels until the holiday flight ends\n- **Open**: whether to move search to value-based bidding after the flight\n- **Constraints**: holiday flight peaks 2026-10-01 and ends 2026-10-05; one designer, ~2 assets/week\n- **Horizon / effort ceiling**: compounding asset; ~4 hours/week from the growth lead\n- **Stakeholders**: growth lead decides; COO consulted (guardrails, budget raises)\n\n## Session log\n- 2026-08-14 - pacing worry -> mbfinotti/advertising-skills@ad-budget-pacing -> on pace, no action\n- 2026-08-30 - brief Q4 batch -> mbfinotti/advertising-skills@ad-creative-brief -> 2 briefs to designer",
"expected_output": "A warm start: session-goal question only, an exactly-5-line state summary, re-ranking driven by the flight date inside six weeks, decided items honored, one appended session-log line, and field-level patching of the artifact.",
"files": [],
"expectations": [
"Asks only what the goal of this session is, and re-asks none of the business model, channel, spend, or conversion questions already answered in the pasted artifact.",
"Produces a state summary of exactly 5 lines.",
"The state summary covers business model and channels, spend band, conversion source of truth, in-flight work, and the active constraint.",
"Identifies the flight end date 2026-10-05 as a fixed date inside six weeks and states that it promotes fast-acting work.",
"Work that pays back over a quarter (for example guardrail re-baselining, consolidation, or hiring) is placed in a Not-now list with the flight date as its explicit unblocking condition, not silently dropped or ranked last.",
"Honors the decided item by keeping new-channel expansion off the short-list, naming the recorded decision as the reason.",
"The short-list contains between 5 and 8 entries.",
"Each short-list entry names both the bottleneck it attacks and what the session costs.",
"The short-list ordering is stated as value returned per unit of effort, and the cheapest near-zero tuning items are not placed on top on cheapness grounds.",
"Appends exactly one new session-log line naming the session goal, the skill routed to, and the outcome.",
"Patches only artifact fields that changed rather than regenerating the whole file.",
"Every skill named uses the mbfinotti/advertising-skills@skill-name form and belongs to the collection.",
"Does not propose re-running the full interview or rebuilding the artifact from scratch."
]
},
{
"id": 3,
"prompt": "I run paid media at Loomhaven, a B2B scheduling tool. Finance gave me a fixed $45k/month for Q4, no more, no less. Three asks from my VP this week: (1) our Google campaign has beaten its target for two months straight and she wants to know if we should put more money into ads overall next quarter; (2) she wants a written rule for what CAC we're allowed to pay and when we shut things off, because last December we torched $18k in a weekend; (3) day to day, I need to know each Friday whether we're burning the $45k too fast or too slow. Also I keep second-guessing whether our tCPA targets are set right. Which skill handles what here, and in what order do we do this?",
"expected_output": "Correct budget-cluster disambiguation across four asks, a single immediate route, a dependency-ordered budget chain with handoffs, and a bootstrap of the context artifact.",
"files": [],
"expectations": [
"Routes the raise-the-total-on-a-proven-campaign ask to mbfinotti/advertising-skills@paid-media-scaling.",
"Does not route the raise-the-total ask to ad-spend-allocation or ad-budget-pacing.",
"Routes the written CAC ceiling and shut-off rule ask to mbfinotti/advertising-skills@ad-spend-guardrails.",
"Does not route the written-policy ask to cac-roas-benchmark.",
"Routes the weekly burning-too-fast-or-too-slow ask to mbfinotti/advertising-skills@ad-budget-pacing.",
"Routes the tCPA target question to mbfinotti/advertising-skills@ad-bidding-strategy.",
"Names a single skill as the route for the immediate task, with the rest sequenced rather than presented as a run-everything-now list.",
"Sequences ad-spend-guardrails ahead of paid-media-scaling and ad-budget-pacing in the proposed order.",
"Presents the sequence as an ordered chain where each link states what it hands to the next.",
"Every skill named uses the full mbfinotti/advertising-skills@skill-name form.",
"No skill is named outside the collection's 31 (no invented names such as budget-optimizer or spend-manager).",
"Creates or proposes advertising-context.md capturing the fixed $45k/month and the December $18k incident as constraint or history fields.",
"The tCPA bidding work is ranked below the guardrails policy work, with tuning identified as buying little until the classes above it are in place."
]
},
{
"id": 4,
"prompt": "I'm the founder of Pinefield Robotics. We're at $70k/month ad spend run by me, badly, and I finally got board approval to hire our first performance marketing manager. I need help figuring out what level to hire at, what to test in interviews, and how much spend authority to give them in the first 90 days. Separately, my cousin who does organic social wants to move into paid ads and asked me what she should learn. What do you have for both of us?",
"expected_output": "Mirror-pair disambiguation: the founder routed to advertising-hiring, the cousin to advertising-career, neither skill oversold beyond its declared scope, and the people question treated as the session's rung-1 goal rather than ranked inside the account ladder.",
"files": [],
"expectations": [
"Routes the founder's hiring need to mbfinotti/advertising-skills@advertising-hiring.",
"Does not route the founder to advertising-career.",
"Routes the cousin's break-into-paid-ads question to mbfinotti/advertising-skills@advertising-career.",
"Does not route the cousin to advertising-hiring.",
"Identifies the two skills as mirror images split by who is asking (hirer versus candidate).",
"Connects advertising-hiring's scope to the level/rung decision, the interview loop or work sample, and a 30-60-90 ramp with staged spend authority.",
"Does not claim the hiring skill will source candidates, post jobs, run applicant tracking, or write offers.",
"Does not claim the career skill will find or submit job applications for the cousin.",
"Treats the hiring question as the session's goal and therefore first in priority, rather than ranking it inside or below the account-work ladder.",
"Keeps any account-side suggestions for the $70k spend separate from the hiring route instead of merging both into one ranked list.",
"Every skill named uses the mbfinotti/advertising-skills@skill-name form and belongs to the collection.",
"Creates or proposes advertising-context.md recording the hiring project, the board approval, and the stakeholders."
]
},
{
"id": 5,
"prompt": "We're Saltmarsh Outfitters, a D2C gear brand doing $90k/month across Google Shopping and Meta. Four things on my plate this sprint: (1) build out our positive keyword lists for a new hiking-boots category, search term expansion, new match types, the works; (2) our CMO wants a geo-holdout incrementality test to prove ads actually drive sales; (3) Google suspended one of our accounts for 'circumventing systems' and I need to file the appeal; (4) our Merchant Center product feed has 400 disapproved items to clean up. Which skills in this advertising collection do I use for each?",
"expected_output": "Four honest 'the collection has no skill for this' answers with each gap named explicitly, no stretched or invented skills, no fabricated chain, and any short-list kept to real siblings separate from the gaps.",
"files": [],
"expectations": [
"States that the collection has no skill for positive keyword research or keyword expansion.",
"Does not assign ad-negative-keywords to the positive keyword task; if it is mentioned, it is only to say it builds exclusions.",
"States that the collection has no skill for incrementality testing (geo-holdout) or media mix modeling.",
"Does not stretch cac-roas-benchmark or ad-attribution-gap into an incrementality test plan.",
"States that the collection has no skill for ad policy appeals or account suspension recovery.",
"States that the collection has no skill for product feed or catalog management.",
"Invents no skill name outside the collection's 31 and promises no future skill for any of the gaps.",
"Presents the four unmet needs explicitly as gaps in the output rather than silently omitting any of them.",
"Assigns no sibling skill as the route for any of the four tasks; the route for this sprint is that no skill fits.",
"Notes that no skill in the collection executes changes in-platform (every skill plans, audits, or decides).",
"Any short-list offered contains only real sibling skills relevant to the account, kept clearly separate from the four named gaps.",
"Every skill mentioned uses the mbfinotti/advertising-skills@skill-name form.",
"Does not fabricate an ordered chain linking the four unrelated tasks."
]
},
{
"id": 6,
"prompt": "Two-person bootstrapped startup here, Quillbrook, a $12/month journaling app. We have literally never run an ad. We can put about $3k/month toward ads starting next month. A marketing friend told me to start by benchmarking our CAC against industry numbers and setting up a weekly budget pacing dashboard. What's the plan?",
"expected_output": "A not-spending-yet re-rank: benchmark and pacing rejected for lack of data, platform selection and conversion tracking promoted to the top, the launch chain in dependency order, and routines reduced to the kickoff re-invocation.",
"files": [],
"expectations": [
"Does not recommend cac-roas-benchmark now, because there is no spend data to measure.",
"Does not recommend ad-budget-pacing now, because there is no live budget to pace.",
"Explains that with zero spend there is nothing to measure, diagnose, or tune yet.",
"Promotes mbfinotti/advertising-skills@ad-platform-selection to the top of the plan.",
"Promotes mbfinotti/advertising-skills@ad-conversion-tracking to the top alongside platform selection, before any launch.",
"Proposes the launch chain in dependency order: ad-platform-selection, then ad-format-fit, then ad-conversion-tracking, then ad-creative-test-plan.",
"Each chain link states what it hands to the next link.",
"Any routine proposal is limited to a periodic kickoff re-invocation or a single recurring reminder, not pacing, spend-health, or wear-out routines.",
"The cold-start interview stays within 7 questions.",
"At least one interview question offers multiple-choice options.",
"Creates or proposes advertising-context.md capturing not-spending-yet status, the $3k/month band, and the $12/month B2C offer.",
"Every skill named uses the mbfinotti/advertising-skills@skill-name form and belongs to the collection.",
"Raises the conversion source-of-truth question (what event counts as success and which system is authoritative) as something to settle before launch."
]
},
{
"id": 7,
"prompt": "I lead growth at Aldergate Health, a telehealth clinic. We're regulated: legal reviews everything since a state AG inquiry last year. We spend $35k/month on Google and Meta. Our only conversion data is the Meta pixel and Google's tag; nobody ever wired up the EHR or billing system. Our one designer just left, so no new creative for at least a quarter. Give me your prioritized list of what to work on. I was thinking we'd start with negative keywords and bid tweaks since those are quick wins.",
"expected_output": "Measurement pinned to rung 1 by the pixel-only source of truth, the quick-win framing rejected, creative moved to Not-now with the capacity condition (swipe-file/copy-variants excepted), compliance review flagged for the regulated vertical, and the re-rank stated out loud.",
"files": [],
"expectations": [
"Places measurement integrity (ad-conversion-tracking and/or ad-attribution-gap) at the top of the short-list.",
"Explicitly states that the platform pixel being the only source of truth is what pins measurement first.",
"Rejects opening with negative keywords and bid tweaks, characterizing tuning as near-zero effort buying near-zero value until the classes above are in place.",
"Does not present the cheapest option as the top recommendation on cheapness grounds.",
"Moves creative work off the short-list into a Not-now list with creative production capacity as the explicit unblocking condition.",
"Does not rank creative entries at the bottom of the short-list as an alternative to moving them out.",
"Names ad-swipe-file and/or ad-copy-variants as exceptions that remain available despite the designer gap, because they need no production capacity.",
"Flags that the regulated vertical adds a legal or compliance review to the measurement work and to any customer seed-list work, lengthening it without changing what it buys.",
"Notes that a consent-mode change or server-side conversion upload triggers a data-processing or consent review and cannot be un-sent.",
"States the re-rank out loud, naming which stated fact moved which class of work.",
"The short-list has between 5 and 8 entries, each naming the bottleneck it attacks and what the session costs.",
"Routes the immediate task to exactly one measurement skill rather than a bundle.",
"Every skill named uses the mbfinotti/advertising-skills@skill-name form and belongs to the collection."
]
},
{
"id": 8,
"prompt": "Set up recurring reviews for our ad program at Torvald & Finch, a B2B legal-billing SaaS. Context: $60k/month spend, roughly 40% of it on Google Search, the rest on Meta and LinkedIn. In-house studio of 3 producing creative weekly. Our agency, Meridian West, already emails a spend pacing report every Monday. Our big push flight ends October 10. Your harness can schedule things. Heads up: the last team set up seven different automations here, most of which nobody reads anymore, including a daily 'ad tips' digest. Go.",
"expected_output": "Cleanup of stale automations first, then 2-4 routines proposed as dry-runs with explicit output channels, ranked by attention-per-firing against decision value, the agency-duplicate pacing demoted, search mining included with its compliance caveat, triggers anchored to the media calendar, and everything recorded in the artifact.",
"files": [],
"expectations": [
"Reviews the existing automations first and flags stale ones (including the unread daily digest) for removal, deleting only with approval, before adding anything new.",
"Proposes at most 4 routines.",
"Proposes at least 2 routines.",
"Shows every proposed routine as a dry-run (name, trigger, what it does, output channel, first run) before anything recurring is created.",
"Every proposed routine names an explicit output channel (a named chat channel, tracker, or document); no routine's output is a bare notify-me.",
"Proposes a monthly spend health check invoking mbfinotti/advertising-skills@cac-roas-benchmark, anchored before the allocation decision it feeds.",
"Demotes or skips the weekly pacing routine as a duplicate of the agency's Monday pacing report, naming the duplication.",
"Includes monthly search term mining invoking mbfinotti/advertising-skills@ad-negative-keywords, justified by search being a meaningful share (~40%) of spend.",
"Flags that search term reports carry user-typed text that can identify a person, so the mining routine's output channel must be covered by the data-handling policy.",
"Includes a periodic re-invocation of the kickoff itself among the proposals.",
"Does not propose the quarterly source refresh (advertising-radar) first or frame it as the quick win despite it being the cheapest.",
"Anchors routine triggers to the media calendar (month-end reset, the October 10 flight end) rather than arbitrary dates.",
"Records the surviving and new routines in advertising-context.md (or proposes creating it) so the next warm start knows what is running.",
"States the routine ranking as attention cost per firing weighed against the decision each firing enables, not as setup cost.",
"Creates nothing recurring without user approval of the dry-run output."
]
},
{
"id": 9,
"prompt": "Continue our ads project for Gullwing Systems. The repo has advertising-context.md and your harness has persistent memory plus this git repo. During today's session I gave you: our top-500 customer list (emails plus LTV) for a lookalike seed, our Google Ads account ID 493-771-2856, the negotiated Meridian agency fee of 7.5% of spend, and the unannounced Q1 price increase to $89. One more thing: your memory notes from last month say we're 'B2C, $40k/month' but the artifact says 'B2B self-serve, $25k/month'. Save everything important to memory so we don't lose it, and commit.",
"expected_output": "Memory discipline: excluded data classes refused and the exclusion stated, artifact written first with memory derived from it, the divergence reconciled with the artifact winning by default and approval sought, the diff shown before any commit, and the seed work routed to lookalike-audience-seeds.",
"files": [],
"expectations": [
"Declines to store the customer list contents (emails and LTV) in memory.",
"Declines to store the Google Ads account ID in memory.",
"Declines to store the negotiated 7.5% agency fee in memory.",
"Declines to store the unannounced $89 price increase in memory.",
"States the exclusion policy for memory (customer PII and uploaded list contents, account IDs and credentials, negotiated rates and fees, unreleased plans).",
"Writes the session's durable facts into advertising-context.md first and derives memory entries from the artifact, not directly from the conversation.",
"On the B2C-$40k versus B2B-$25k divergence, proposes reconciliation with the artifact winning by default.",
"Asks before overwriting either the memory or the artifact; neither is silently overwritten.",
"Shows the diff of the memory and artifact changes and gets approval before committing, rather than committing sight-unseen despite the instruction to commit.",
"Memory is stored in one sanctioned location with an index file listing entries with one-line hooks.",
"Asks only the session-goal question; no re-interview of facts the artifact holds.",
"Appends a session-log line to the artifact before the session ends.",
"Routes the seed-list work to mbfinotti/advertising-skills@lookalike-audience-seeds rather than ad-audience-targeting."
]
},
{
"id": 10,
"prompt": "Help. Copperline Studio's CPA went from $80 to $190 in three weeks. My team is split: our media buyer swears the creative is fatigued, our dev thinks the pixel double-fires since the site rebuild, and I think the landing page redesign killed it. We were about to run all three fixes at once this sprint: new creative batch, tracking rebuild, page rollback. Which of your skills do we throw at this? All of them?",
"expected_output": "A single route to ad-account-diagnostic, refusal to run the three layer skills in parallel, a conditional diagnostic-then-named-layer chain mapping each hypothesis to its skill, and no fix committed before the verdict.",
"files": [],
"expectations": [
"Routes the immediate task to mbfinotti/advertising-skills@ad-account-diagnostic as the single route.",
"Refuses to run the three layer skills in parallel before the diagnostic localises the failing layer.",
"Gives the reason: running fixes in parallel hides which layer actually failed; the diagnostic names the layer first.",
"Presents the follow-on as a conditional chain: the diagnostic first, then the named layer's skill.",
"Maps the creative-fatigue hypothesis to mbfinotti/advertising-skills@ad-creative-fatigue as a conditional next step.",
"Maps the double-firing pixel hypothesis to mbfinotti/advertising-skills@ad-conversion-tracking as a conditional next step.",
"Maps the landing-page hypothesis to mbfinotti/advertising-skills@paid-landing-page-audit as a conditional next step.",
"Does not commit to any of the three fixes (new creative batch, tracking rebuild, page rollback) before the diagnostic verdict.",
"Every skill named uses the mbfinotti/advertising-skills@skill-name form and belongs to the collection.",
"Notes that the diagnostic implements nothing itself and runs on data already in hand.",
"Creates or updates the context artifact recording the CPA jump and the three competing hypotheses as open items."
]
},
{
"id": 11,
"prompt": "Warm start for Marrowgate Fitness, B2C, $30k/month paid social. Session goal: decide what to do next. Everything I read says fix measurement first, then diagnose, then worry about creative, so I assume we re-audit tracking again this month? Our advertising-context.md:\n\n# Advertising context\n- **Updated**: 2026-09-04 (session 9)\n- **Business model**: B2C subscription fitness, self-serve\n- **Offer / price point**: $29/month membership; AOV $41 with gear add-ons\n- **Channels / spend**: paid social only, $30k/month\n- **Conversion / source of truth**: first paid membership; order system authoritative; tracking verified GO in June\n- **CAC-ROAS position**: CAC $44 vs $58 break-even; guardrail policy written\n- **In-flight work**: none\n- **Decided**: Q4 budget frozen at $30k/month\n- **Open**: creative direction for Q4\n- **Constraints**: none; hired two in-house creators last month; committed to compounding investment with exec sign-off\n- **Horizon / effort ceiling**: compounding; headcount available\n- **Stakeholders**: growth lead decides; CFO consulted\n\n## Session log\n- 2026-07-10 - CPA drift -> mbfinotti/advertising-skills@ad-account-diagnostic -> creative decay named as failing layer\n- 2026-07-24 - confirm wear-out -> mbfinotti/advertising-skills@ad-creative-fatigue -> verdict: fatigued\n- 2026-05-20 - creative last refreshed for the May flight",
"expected_output": "The creative class promoted past the default ratio with the promoting condition named, no tracking re-audit and no re-run of concluded diagnostics, a route into ad-creative-brief, the post-verdict chain, the budget freeze honored, and warm-start discipline throughout.",
"files": [],
"expectations": [
"Does not route to re-auditing conversion tracking, since the artifact records tracking verified GO and the order system as authoritative.",
"Promotes the creative class to the top of the short-list despite its high effort.",
"Names at least one condition that promoted creative past the default ratio (compounding with headcount/sign-off, diagnosis already naming creative as the failing layer, or creative not refreshed in a full flight).",
"Routes the immediate task to mbfinotti/advertising-skills@ad-creative-brief.",
"Does not re-run ad-account-diagnostic or ad-creative-fatigue, since the log records both as concluded.",
"Proposes the post-verdict chain: ad-creative-brief, then ugc-ad-scripts and/or ad-copy-variants, justified by the recorded fatigue verdict.",
"Presents the chain in dependency order with handoffs, not as an efficiency-ranked list.",
"Produces a state summary of exactly 5 lines.",
"Asks only the session-goal question (or confirms the stated goal); no re-interview.",
"Appends a session-log line for this session.",
"Honors the decided Q4 budget freeze: paid-media-scaling and budget-raise work are excluded or named as ruled out by the freeze, not ranked low.",
"Every skill named uses the mbfinotti/advertising-skills@skill-name form and belongs to the collection."
]
},
{
"id": 12,
"prompt": "Grab bag from this week at Hollowbeam, a B2B dev-tools company spending $18k/month: (a) Meta says 210 conversions, GA4 says 150, our CRM says 96, which is lying? (b) I have three cut versions of our new demo video that differ only in the first four seconds, pick the opener. (c) I want one newsletter and one podcast to keep up with paid media without doomscrolling. (d) We bought a sponsored answer slot inside an AI shopping assistant and need the copy written for it. Route each one.",
"expected_output": "Four correct boundary-pair routes: attribution-gap (not conversion-tracking), ad-hook-analyzer, advertising-radar, and conversational-ad-copy (not ad-copy-variants), one skill per ask, no fabricated chain, and a context-artifact bootstrap.",
"files": [],
"expectations": [
"Routes ask (a), the three-way reporting mismatch, to mbfinotti/advertising-skills@ad-attribution-gap.",
"Does not route ask (a) to ad-conversion-tracking, since this is post-launch reconciliation across systems rather than pre-launch verification.",
"Routes ask (b), choosing among video openings, to mbfinotti/advertising-skills@ad-hook-analyzer.",
"Does not route ask (b) to ugc-ad-scripts or ad-creative-test-plan.",
"Routes ask (c), the stay-current sources request, to mbfinotti/advertising-skills@advertising-radar.",
"Routes ask (d), copy for a single response slot inside an AI assistant, to mbfinotti/advertising-skills@conversational-ad-copy.",
"Does not route ask (d) to ad-copy-variants.",
"Assigns exactly one skill per ask; no ask receives a bundle of skills.",
"Every skill named uses the mbfinotti/advertising-skills@skill-name form and belongs to the collection's 31 skills.",
"Does not fabricate an ordered chain across the four unrelated asks.",
"Checks for or proposes bootstrapping advertising-context.md, since the prompt names no existing artifact."
]
}
],
"trigger_queries": [
{ "query": "Start a new paid advertising project for our product launch.", "should_trigger": true },
{ "query": "We're kicking off paid ads for the first time, set us up.", "should_trigger": true },
{ "query": "New client just signed, I need to spin up their paid media program from zero.", "should_trigger": true },
{ "query": "Setting up an advertising workspace for our Q1 campaign push.", "should_trigger": true },
{ "query": "Begin a paid media project for our B2B SaaS.", "should_trigger": true },
{ "query": "We just got budget approved for ads, where do we start?", "should_trigger": true },
{ "query": "I want to start advertising on Google and Meta, walk me through setting up the project.", "should_trigger": true },
{ "query": "Bootstrap our ad program, nothing exists yet.", "should_trigger": true },
{ "query": "First session on a brand-new ad account project.", "should_trigger": true },
{ "query": "Our agency contract ended and we're bringing paid media in-house, get us started.", "should_trigger": true },
{ "query": "Which advertising skill do I need? Our ROAS dropped last week.", "should_trigger": true },
{ "query": "I don't know if this is a creative problem or a budget problem, which skill?", "should_trigger": true },
{ "query": "Which of these advertising skills applies to my situation?", "should_trigger": true },
{ "query": "Point me at the right skill: my CPA doubled and I have three theories why.", "should_trigger": true },
{ "query": "Not sure whether I need the pacing skill or the allocation one.", "should_trigger": true },
{ "query": "Route me: is this a bidding thing or a guardrails thing?", "should_trigger": true },
{ "query": "There are like six budget-sounding skills in this collection, which one is mine?", "should_trigger": true },
{ "query": "My ads are underperforming and I can't tell if it's tracking or targeting, where do I start?", "should_trigger": true },
{ "query": "What's the right order to run these advertising skills for a new channel launch?", "should_trigger": true },
{ "query": "Help me pick between the creative brief skill and the copy variants one.", "should_trigger": true },
{ "query": "Do you have a skill for what I'm trying to do with my ads? If not, say so.", "should_trigger": true },
{ "query": "Which skill covers my situation: proven campaign, want to spend more?", "should_trigger": true },
{ "query": "I think I've been using the wrong ad skill, re-route my current task.", "should_trigger": true },
{ "query": "Run my advertising check-in.", "should_trigger": true },
{ "query": "Time for our monthly ads review, resume from the context file.", "should_trigger": true },
{ "query": "Quarterly paid media review, pick up where we left off.", "should_trigger": true },
{ "query": "Do the periodic advertising review for this project.", "should_trigger": true },
{ "query": "Weekly ads check-in, please.", "should_trigger": true },
{ "query": "Re-run the advertising kickoff for this repo.", "should_trigger": true },
{ "query": "It's been a month, resummarize the ad project and tell me what's next.", "should_trigger": true },
{ "query": "Advertising status check: what changed and what do we run today?", "should_trigger": true },
{ "query": "Back on the Ravenscroft ads project, what's next?", "should_trigger": true },
{ "query": "Continue our paid media project from last session.", "should_trigger": true },
{ "query": "Resume the advertising project, the context file is in the repo.", "should_trigger": true },
{ "query": "New quarter, same ad account, re-route our priorities.", "should_trigger": true },
{ "query": "The ads project changed direction after the board meeting, re-plan it.", "should_trigger": true },
{ "query": "We got sign-off to start buying customers on Google and Meta next month, where do we begin?", "should_trigger": true },
{ "query": "CEO wants $30k a month going to acquisition by Q2, help me plan the program.", "should_trigger": true },
{ "query": "I have $10k to promote our app and no idea what to do first.", "should_trigger": true },
{ "query": "Marketing budget just doubled and it's all going to paid channels, set up the project.", "should_trigger": true },
{ "query": "We're taking over the previous manager's Meta and Google accounts, orient me.", "should_trigger": true },
{ "query": "Board approved performance marketing spend, what's the first move?", "should_trigger": true },
{ "query": "Never bought ads before. Where do I even start?", "should_trigger": true },
{ "query": "We want to go from zero to running campaigns in six weeks, plan it out.", "should_trigger": true },
{ "query": "Take stock of everything wrong with our paid acquisition and tell me what to tackle first.", "should_trigger": true },
{ "query": "My boss said 'figure out our ads situation' and that's the whole brief.", "should_trigger": true },
{ "query": "Prioritize my ad account's problems: tracking is iffy, creative is old, budget is a guess.", "should_trigger": true },
{ "query": "Audit where we stand on paid media and build me a roadmap.", "should_trigger": true },
{ "query": "What should we fix first in our advertising: measurement, creative, or spend?", "should_trigger": true },
{ "query": "Give me a prioritized plan for our $50k/month ad program.", "should_trigger": true },
{ "query": "Ads project kickoff for our e-commerce store, please.", "should_trigger": true },
{ "query": "Onboard yourself onto our existing ad program and tell me what you'd run first.", "should_trigger": true },
{ "query": "Set up the shared context file for our advertising work.", "should_trigger": true },
{ "query": "Create the advertising context artifact for this project and route today's task.", "should_trigger": true },
{ "query": "Set up recurring advertising reviews for this account.", "should_trigger": true },
{ "query": "Install a monthly ads health check-in and whatever other routines we need.", "should_trigger": true },
{ "query": "Which advertising skills should be on our shortlist this quarter?", "should_trigger": true },
{ "query": "Rank which ad workstreams to do first given two hours a week.", "should_trigger": true },
{ "query": "New ad campaign for our spring launch, get the project going.", "should_trigger": true },
{ "query": "We're planning a big paid push for Black Friday, set up the project and tell me what to run first.", "should_trigger": true },
{ "query": "I inherited a messy ad account and a messier shared drive, orient and prioritize.", "should_trigger": true },
{ "query": "Fresh start: new brand, new ad accounts, nothing configured. Go.", "should_trigger": true },
{ "query": "Plan our paid acquisition workstream for next quarter.", "should_trigger": true },
{ "query": "Several of your ad skills look relevant to my problem, shortlist them for me.", "should_trigger": true },
{ "query": "What can this advertising collection actually do for my business? Map it to my situation.", "should_trigger": true },
{ "query": "Kick off advertising for our marketplace app.", "should_trigger": true },
{ "query": "Spin up the ad project: B2C, $20k a month, deadline in eight weeks.", "should_trigger": true },
{ "query": "Where does my task fit in your ad skills, or does nothing fit?", "should_trigger": true },
{ "query": "We finished the tracking fix, what's the next skill to run?", "should_trigger": true },
{ "query": "Starting a new advertising engagement, I'm a fractional CMO with three clients.", "should_trigger": true },
{ "query": "Help me sequence the advertising work: what order, and what's not worth doing yet?", "should_trigger": true },
{ "query": "Our paid ads project stalled for two months, restart it properly.", "should_trigger": true },
{ "query": "Which ad skill first? We have clicks, no conversions, and no idea why.", "should_trigger": true },
{ "query": "Why are my Facebook ads underperforming? Run a full account audit.", "should_trigger": false },
{ "query": "Am I on pace against my $20k ad budget this month?", "should_trigger": false },
{ "query": "Write 15 headline variants for our Google search ads.", "should_trigger": false },
{ "query": "Score these three video ad hooks and tell me which to test.", "should_trigger": false },
{ "query": "Is my conversion tracking firing twice? Check deduplication before launch.", "should_trigger": false },
{ "query": "Build a negative keyword list from this search terms report.", "should_trigger": false },
{ "query": "Design our retargeting sequence: recency windows, tiers, frequency caps.", "should_trigger": false },
{ "query": "How many customers does my lookalike seed list need to clear Meta's floor?", "should_trigger": false },
{ "query": "Should this campaign use target CPA or target ROAS?", "should_trigger": false },
{ "query": "Turn this campaign goal and audience insight into a brief for my designer.", "should_trigger": false },
{ "query": "Write a 30-second UGC ad script for our skincare creator.", "should_trigger": false },
{ "query": "Is this ad fatigued, or is it just CPM inflation? Give me a verdict.", "should_trigger": false },
{ "query": "Audit the landing page our paid traffic lands on, clicks but no conversions.", "should_trigger": false },
{ "query": "Map the buying committee for our six-figure ERP deal.", "should_trigger": false },
{ "query": "Meta says 300 conversions and our CRM says 120, explain the gap.", "should_trigger": false },
{ "query": "Is a $210 CAC too high for a $79/month subscription?", "should_trigger": false },
{ "query": "Plan how to merge my 40 ad sets without resetting learning.", "should_trigger": false },
{ "query": "Design a pre-launch creative test: cells, budgets, kill rules.", "should_trigger": false },
{ "query": "Which ad formats fit a lead-gen objective on LinkedIn? QA before launch.", "should_trigger": false },
{ "query": "Collect the ads my top three competitors are running into a library.", "should_trigger": false },
{ "query": "Split our fixed $50k monthly budget across campaigns and platforms.", "should_trigger": false },
{ "query": "Our proven campaign earned a raise, how fast do we ramp from $30k to $60k a month?", "should_trigger": false },
{ "query": "Draft our max-CAC and minimum-ROAS policy with kill switches.", "should_trigger": false },
{ "query": "Turn our ICP into a layered ad targeting plan with exclusion rules.", "should_trigger": false },
{ "query": "Plan a campaign promoting our CEO's LinkedIn posts as paid ads.", "should_trigger": false },
{ "query": "Write the ad copy for a sponsored slot inside a chatbot answer.", "should_trigger": false },
{ "query": "What newsletters and podcasts should I follow to stay current on paid media?", "should_trigger": false },
{ "query": "Prep me for a senior paid media manager interview next Tuesday.", "should_trigger": false },
{ "query": "Design the interview loop and work sample for our first growth marketer hire.", "should_trigger": false },
{ "query": "Which paid channel families fit a $5k monthly budget for a D2C snack brand?", "should_trigger": false },
{ "query": "Kick off our SEO project and route me to the right SEO skill.", "should_trigger": false },
{ "query": "Start a new sales outreach project from scratch.", "should_trigger": false },
{ "query": "Kick off our partner program, which partnerships skill do I need?", "should_trigger": false },
{ "query": "RevOps kickoff: set up the shared context for our CRM cleanup.", "should_trigger": false },
{ "query": "Run my content marketing check-in.", "should_trigger": false },
{ "query": "Start our email marketing program, we've never sent a campaign.", "should_trigger": false },
{ "query": "Kick off the developer relations program for our API.", "should_trigger": false },
{ "query": "Draft the project kickoff meeting agenda for the new mobile app sprint.", "should_trigger": false },
{ "query": "Kick off our rebrand project.", "should_trigger": false },
{ "query": "Set up a shared context file for our customer success playbooks.", "should_trigger": false },
{ "query": "Which growth skill do I need? Our post-signup activation rate dropped.", "should_trigger": false },
{ "query": "Route me to the right skill for improving our organic Instagram reach.", "should_trigger": false },
{ "query": "Monthly SEO review, resume from the context file.", "should_trigger": false },
{ "query": "We've never done PR before, where do we start?", "should_trigger": false },
{ "query": "Write the business plan for the paid search consultancy I'm founding.", "should_trigger": false },
{ "query": "Which skill handles our influencer gifting program?", "should_trigger": false },
{ "query": "Plan our conference sponsorship strategy for next year.", "should_trigger": false },
{ "query": "Set up recurring reviews for our sales pipeline.", "should_trigger": false },
{ "query": "Prioritize our product roadmap for Q2.", "should_trigger": false },
{ "query": "Onboard me onto this codebase and tell me what to fix first.", "should_trigger": false },
{ "query": "Set the ad rates for my newsletter's sponsorship slots.", "should_trigger": false },
{ "query": "Write a media kit to sell podcast advertising to sponsors.", "should_trigger": false },
{ "query": "Write a job advertisement for our barista opening.", "should_trigger": false },
{ "query": "Design the billboard artwork for our downtown store.", "should_trigger": false },
{ "query": "Develop the concept for our Super Bowl TV commercial.", "should_trigger": false },
{ "query": "How do I get advertisers for my blog?", "should_trigger": false },
{ "query": "Review this advertising contract our agency sent over.", "should_trigger": false },
{ "query": "Log into Google Ads and file the suspension appeal for me.", "should_trigger": false },
{ "query": "Fix the 400 disapproved items in our Merchant Center feed.", "should_trigger": false },
{ "query": "Analyze whether our TV and radio spend is incremental using media mix modeling.", "should_trigger": false },
{ "query": "Do keyword research for our new blog content.", "should_trigger": false },
{ "query": "Raise our Google Ads campaign budgets by 20% in the platform tonight.", "should_trigger": false },
{ "query": "A/B test our homepage hero copy.", "should_trigger": false },
{ "query": "Improve our App Store listing conversion rate.", "should_trigger": false },
{ "query": "Write the launch tweet thread for our product.", "should_trigger": false },
{ "query": "Optimize our email subject lines for open rate.", "should_trigger": false },
{ "query": "Grow engagement in our Discord community.", "should_trigger": false },
{ "query": "Which CRM should we buy for our sales team?", "should_trigger": false },
{ "query": "Forecast next quarter's revenue from our pipeline data.", "should_trigger": false },
{ "query": "Negotiate our annual rate card with the radio station.", "should_trigger": false },
{ "query": "Write the sponsorship pitch deck for our esports team.", "should_trigger": false },
{ "query": "Set up GA4 events for our content site, we don't run any ads.", "should_trigger": false },
{ "query": "Plan the guerrilla marketing stunt for our festival booth.", "should_trigger": false }
]
}
references/context-artifact.md›
# Context artifact - `advertising-context.md`
One versioned file at the project root, committed with the project when it lives in git. Its existence is the cold/warm signal; its content is what the warm start reads instead of re-interviewing. Keep every field to one line - this file is read at every session start, so bloat taxes every session.
## Template
```markdown
# Advertising context
- **Updated**: <date> (session <n>)
- **Business model**: <B2B sales-led | B2B self-serve | B2C | mixed - one line of nuance>
- **Offer / price point**: <what is sold and at what price; note AOV or contract value>
- **Channels / spend**: <channels currently bought, monthly spend band, committed vs discretionary>
- **Conversion / source of truth**: <the event that counts as success; which system is authoritative for it>
- **CAC-ROAS position**: <current position vs target; whether a written guardrail policy exists>
- **In-flight work**: <what is being built, tested, or fixed right now, one line per item>
- **Decided**: <closed decisions, one line each - off the table>
- **Open**: <live questions, one line each>
- **Constraints**: <budget commitments, the date a result must land by, compliance/regulated vertical, creative capacity>
- **Horizon / effort ceiling**: <one-off win or compounding asset; hours, weekly time, or headcount and sign-off available>
- **Stakeholders**: <name/role → decision role: decides | consulted | informed>
## Session log
- <date> - <session goal> → <skill(s) used> → <outcome in one line>
```
## Worked example
```markdown
# Advertising context
- **Updated**: 2026-04-09 (session 5)
- **Business model**: B2C e-commerce, self-serve; a B2B wholesale line exists but gets no paid spend
- **Offer / price point**: skincare subscription, $42/month; AOV $58 with one-time add-ons
- **Channels / spend**: paid social + paid search, ~$28k/month; $10k committed to a seasonal flight through May
- **Conversion / source of truth**: first paid subscription; order system authoritative, platform pixels indicative only
- **CAC-ROAS position**: blended CAC $61 vs $70 break-even; guardrail policy written, owned by the CFO
- **In-flight work**: retargeting sequence redesign (draft); Q2 creative test batch in briefing
- **Decided**: no new channel until the seasonal flight ends; UGC creators over studio production for Q2
- **Open**: whether to move search to value-based bidding after the flight
- **Constraints**: seasonal peak ends 2026-05-31; one designer, ~2 assets/week; no consent-mode gaps allowed (EU traffic)
- **Horizon / effort ceiling**: compounding asset; ~4 hours/week from the growth lead, no new headcount before Q3
- **Stakeholders**: growth lead → decides; CFO → consulted (guardrails, budget raises); founder → informed
## Session log
- 2026-03-12 - why did ROAS drop → `mbfinotti/advertising-skills@ad-account-diagnostic` → creative decay named as failing layer
- 2026-03-19 - confirm wear-out → `mbfinotti/advertising-skills@ad-creative-fatigue` → verdict: fatigued, brief replacements
- 2026-04-09 - brief Q2 creative batch → `mbfinotti/advertising-skills@ad-creative-brief` → 3 briefs handed to designer and 2 creators
```
Why this works:
- every field answers a question the next session would otherwise ask
- the log line names goal, skill, and outcome so re-routing can build on it
- the source of truth is named so measurement questions never get re-litigated
- constraints carry dates the routines can anchor to
## Negative example - do not produce this
```markdown
# Advertising context
We are an ambitious brand investing in performance marketing across multiple
platforms to drive growth. Our ads could be doing better and there are many
ideas floating around about creative, budgets, and new channels. The team is
aligned on moving fast. Next steps: keep optimizing and test more things.
## Notes
- Spend is significant
- Tracking may or may not be fine
- Lots of ideas: TikTok? influencers? more retargeting? rebrand?
```
Why this fails:
- no field answers a concrete question (which channels? what spend? which event counts? who decides?), so the next session must re-interview anyway; the artifact exists but the start is still cold
- "Spend is significant" gives the budget cluster nothing to route on
- "Tracking may or may not be fine" hides the one fact that gates every launch
- the idea dump routes nowhere
Vague ambition displaces the facts the router actually needs.
## Update rules
- Patch changed fields; never rewrite the whole file each session.
- Refresh **Constraints** and **Horizon / effort ceiling** the moment either changes. The short-list and the routine set are re-ranked from those two fields on every warm start, so a stale value silently mis-orders the whole session's recommendations.
- Append exactly one session-log line per session, before the session ends.
- Move an item from **Open** to **Decided** only when the stakeholder with the _decides_ role has signed off - record who.
- Keep a separate ADR-style decision log only when contested decisions genuinely accumulate (e.g. repeated budget-raise disputes); until then the Decided/Open lists are the record.
- These rules apply unchanged to B2B and B2C projects; only the field values differ.
references/routines.md›
# Routines - dry-run format, anchoring, cleanup
Applies only where the harness supports scheduled routines. Otherwise: one recurring calendar reminder ("Advertising check-in - re-run the advertising kickoff") is the whole fallback - do not simulate a scheduler.
## Dry-run format
Show every proposed routine in this shape and get explicit approval before creating anything:
```
Routine: <name>
Runs: <trigger - anchored, see below>
Does: <one line - which skill it invokes, on what input>
Outputs to: <explicit channel - team chat, issue tracker, document, email>
First run: <date> (dry run - produces the output, creates nothing recurring yet)
```
Create the recurring version only after the user approves the dry-run output. A routine approved on its description alone still surprises on its first real output.
## Trigger anchoring
Anchor to the media calendar, not arbitrary dates, whenever the routine's value depends on timing. Listed in the rung order of the skill's § 7 so the two never disagree - this section fixes each routine's timing, never its priority:
- Spend health check → monthly or quarterly, before the allocation decision it feeds - never after
- Pacing check → weekly, on the day the team reviews spend; tighten to daily during a flight's final week
- Kickoff re-invocation → monthly or quarterly, whichever matches the project's pace from the git log
- Search term mining → monthly, after the month-end budget reset
- Creative wear-out check → weekly or biweekly, aligned to the creative refresh cadence in `advertising-context.md`
- Seasonal-peak routines → computed from the flight dates in the artifact's constraints (e.g. peak-start minus 14 days), removed after the flight ends
Prefer an event trigger over a schedule when the harness offers one and it fits better. For example, run the pacing check when a fresh ad-account export lands, or the wear-out check when a new creative batch goes live, rather than on a clock that may fire against stale data.
## Output channels
Every routine names exactly one channel its result lands in. "Notify me" is not a channel.
Good channels:
- a named team-chat channel
- an issue in the project tracker
- a section appended to a standing document
If no channel can be named, the routine is not ready to exist.
## Cleanup
Before adding routines, list the existing ones and remove the obsolete:
1. List all scheduled routines the harness reports for this project.
2. Flag any anchored to an ended flight, a past seasonal peak, a paused channel, or a skill/process no longer in use.
3. Show the flagged list; delete only with approval.
4. Record surviving and new routines in `advertising-context.md` under in-flight work, so the next warm start knows what is already running.
Stale routines from a finished flight fire noise; noise trains the user to silence notifications, which buries the one routine that mattered.
references/skill-routing.md›
# Routing detail - advertising-skills collection
Route only from the declared scopes below. Every "do not route here" line comes from the skill's own description, not from inference. The collection is 31 skills: the 30 siblings below plus the kickoff itself.
Nothing here is ranked, by design: scope is a match test, not a ratio. Ranking lives in SKILL.md § 4 and § 7, where skills do compete for one session.
## Table of Contents
- [Per-skill signals](#per-skill-signals)
- [Boundary pairs and clusters](#boundary-pairs-and-clusters)
- [Ordered chains](#ordered-chains)
- [Coverage gaps (v1)](#coverage-gaps-v1)
## Per-skill signals
### `mbfinotti/advertising-skills@ad-account-diagnostic`
- Route here: find the root cause of an underperforming paid ad account across tracking, structure, targeting, creative, bidding/budget, offer, external forces; "why are my ads underperforming", "my CPA went up", "ROAS dropped", "should I increase my budget", campaign structure review.
- Do not route here: it executes no changes and stops at the account boundary - page fixes, consolidation, creative, and budget moves hand off to siblings.
### `mbfinotti/advertising-skills@ad-copy-variants`
- Route here: turn one value proposition into genuinely distinct static/text ad copy variants (headline, primary text, description, CTA), labelled by angle, awareness stage, formula, version; search ad headline sets; ML asset-pool surfaces.
- Do not route here: video scripts, creative briefs, test design, landing-page audits.
### `mbfinotti/advertising-skills@ad-format-fit`
- Route here: given objective + platform, flag ad formats that are a poor fit or commonly misused before launch (objective doesn't expose them, wrong funnel stage, team can't produce them); post-launch, separate a format problem from a creative or targeting problem; pre-launch format QA with launch blockers.
- Do not route here: channel choice, creative briefing, copywriting, test design.
### `mbfinotti/advertising-skills@ad-swipe-file`
- Route here: collect competitors' currently-running ads into a categorized, queryable library and convert it into ranked creative test hypotheses; "what ads are my competitors running", competitor ad library teardown, creative inspiration.
- Do not route here: briefs and test design - it stops at ranked hypotheses.
### `mbfinotti/advertising-skills@advertising-career`
- Route here: the candidate side - skill-gap roadmap on the junior→mid→senior→lead ladder, prep for the five interview formats, NDA-safe portfolio, certifications, agency vs in-house vs freelance, promotion and pay conversations.
- Do not route here: the hiring side; it does not find or submit job applications.
### `mbfinotti/advertising-skills@advertising-hiring`
- Route here: the hirer side - rung decision, outcome scorecard, 2-3 round interview loop with question bank, time-boxed work sample, 30-60-90 ramp with staged spend authority.
- Do not route here: sourcing candidates, posting jobs, applicant tracking, writing offers, or the candidate side.
### `mbfinotti/advertising-skills@advertising-radar`
- Route here: a personalised, time-budgeted watch list of paid-advertising sources - podcasts, newsletters, ad-platform release notes, communities, events, people to follow - plus how to keep it fresh.
- Do not route here: any operational advertising task. Route here only when the ask is what to _read/follow/stay current on_, never how to _do_ something.
### `mbfinotti/advertising-skills@ad-attribution-gap`
- Route here: quantify and explain the discrepancy between ad platform reporting, an analytics tool, and the source of truth (CRM or order system); classify each unit of gap as timing, definitional, or unexplained residual; "the numbers don't match", "is this reporting gap normal".
- Do not route here: fixing tracking, or picking an attribution model - it measures the gap and names its causes.
### `mbfinotti/advertising-skills@ad-audience-targeting`
- Route here: turn an ICP and buying signals into a layered targeting plan - cold/broad, interest, in-market, lookalike, first-party, retargeting tiers - sized against platform floors, budgeted to the learning threshold, sequenced, with exclusion rules; broad vs layered; audience overlap between campaigns.
- Do not route here: building seed lists; designing retargeting message sequences.
### `mbfinotti/advertising-skills@ad-bidding-strategy`
- Route here: the bidding policy per platform and goal - manual vs automated, cost-goal vs value/return-goal, when to switch, how to set and move the target, evaluation window, rollback trigger; "target CPA or target ROAS", "delivery collapsed after I changed the target", bid cap vs cost cap, portfolio bid strategy.
- Do not route here: tracking spend pacing, splitting budgets across campaigns, picking channels, repairing conversion tracking.
### `mbfinotti/advertising-skills@ad-budget-pacing`
- Route here: track daily/weekly spend against an already-set budget and flag under- or over-pacing; pacing ratio, projected period spend, required daily spend, false-alarm gate, cause diagnosis; "am I on pace", burn rate.
- Do not route here: setting the budget, kill thresholds, CAC/ROAS benchmarking, scale-up planning. It flags and recommends; it never changes budgets or bids.
### `mbfinotti/advertising-skills@ad-buyer-group-mapper`
- Route here: map the likely buying committee for an offer/deal size/industry and give each role a messaging angle plus the ad-targeting proxy (job function + seniority, account list, account-level intent); B2B committees and multi-decider household purchases; whether per-role targeting beats one broad message.
- Do not route here: building or sizing ad audiences, seed lists, retargeting sequences, ad copy, or mapping named contacts on one live deal.
### `mbfinotti/advertising-skills@cac-roas-benchmark`
- Route here: compute CAC and ROAS family metrics from real data and judge spend health against a three-reference ladder (own break-even, own trailing history, provenance-labeled external benchmarks); returns healthy / watch / unhealthy / insufficient evidence; "is my CAC too high", "what should my ROAS be".
- Do not route here: setting targets as policy, reallocating budget, diagnosing why an account underperforms.
### `mbfinotti/advertising-skills@ad-campaign-consolidation`
- Route here: evaluate a fragmented account and recommend which campaigns/ad sets to merge, which splits to preserve, and how to migrate without resetting learning; "too many ad sets", "stuck in learning", "budget spread too thin", restructure my ad account.
- Do not route here: executing the merge - it plans only.
### `mbfinotti/advertising-skills@conversational-ad-copy`
- Route here: adapt ad messaging for conversational and AI-answer ad surfaces - the one-shot ad occupying a single response slot inside an assistant reply or answer-engine result; verbatim vs model-rewritten placements, recommendation register, grounding and disclosure, quotability gate.
- Do not route here: feed/search copy variants, video scripts, test design.
### `mbfinotti/advertising-skills@ad-conversion-tracking`
- Route here: pre-launch checklist verifying conversion events are configured, firing once, and deduplicated, ending in a GO / NO-GO; tag debug, browser/server dedup, value and currency, consent handling, test-data exclusion; "is my tracking working".
- Do not route here: writing or installing tracking code; post-launch cross-platform reconciliation hands off to `mbfinotti/advertising-skills@ad-attribution-gap`.
### `mbfinotti/advertising-skills@ad-creative-brief`
- Route here: turn a campaign goal plus an audience insight into a structured brief a designer, video editor, or UGC creator executes - messaging angle, hook directions, art direction, specs, testing intent, handoff/revision loop; variants for static, short-form video/UGC, and responsive text ads.
- Do not route here: the finished asset; the ad copy itself (`mbfinotti/advertising-skills@ad-copy-variants`) or shot-by-shot creator scripts (`mbfinotti/advertising-skills@ugc-ad-scripts`).
### `mbfinotti/advertising-skills@ad-creative-fatigue`
- Route here: decide whether a running creative is genuinely wearing out or a confounder explains the decline (budget change, learning reset, audience saturation, CPM inflation, seasonality, tracking breakage); returns a verdict with confidence and the cheapest remedy; "frequency is climbing", "should I kill this ad".
- Do not route here: producing replacement creative.
### `mbfinotti/advertising-skills@ad-creative-test-plan`
- Route here: design a **pre-launch** creative test - decision, falsifiable hypothesis, isolation level, test cells and per-cell budgets, required sample/spend/duration, pre-registered kill/scale rules, and a per-cell read standard (Powered / Directional / Not testable as designed).
- Do not route here: reading results after the fact - that belongs to `mbfinotti/advertising-skills@ad-creative-fatigue`.
### `mbfinotti/advertising-skills@ad-hook-analyzer`
- Route here: score and force-rank the **openings** of candidate video ads before launch, from script, transcript, storyboard, shot list, or a described cut; four hard gates, seven banded dimensions, ranked shortlist within the batch; "which hook should I test", first 3 seconds, thumbstop.
- Do not route here: writing scripts; it returns a ranking, never an absolute performance prediction.
### `mbfinotti/advertising-skills@paid-landing-page-audit`
- Route here: audit a landing page receiving paid traffic - message match, above-the-fold clarity, form friction, trust, speed, mobile, policy risk - and return a prioritised fix list with evidence classes; "my ads get clicks but no conversions", post-click experience.
- Do not route here: implementing anything; it stops at the click.
### `mbfinotti/advertising-skills@lookalike-audience-seeds`
- Route here: select and size the seed customer list behind a lookalike/similar/value-based audience - which customers, how many, whether the **matched** count clears the platform floor; RFM and value-based selection, negative-selection pass, privacy/consent gate, fallback ladder; "my lookalike isn't working", match rate.
- Do not route here: platform upload and tier layering - it ends at the seed spec.
### `mbfinotti/advertising-skills@paid-media-scaling`
- Route here: decide when a proven campaign has earned a budget **increase**, the step size, the ramp over weeks/months, and how to avoid collapse; readiness gates, hold periods, vertical vs horizontal scaling, rollback triggers; "we doubled the budget and ROAS collapsed", "we hit a scaling ceiling".
- Do not route here: splitting a fixed total, daily pacing, setting max-CAC/min-ROAS policy, choosing bid strategies, per-ad creative kill/scale calls.
### `mbfinotti/advertising-skills@ad-negative-keywords`
- Route here: build and maintain negative keyword lists from search term reports - n-gram query mining, match types, exclusion level (account, shared list, campaign, ad group), review cadence, overblocking guard; needs a search term report export or query data.
- Do not route here: positive keyword research or bid strategy.
### `mbfinotti/advertising-skills@ad-platform-selection`
- Route here: decide which paid channel **families** fit a business's economics, audience, funnel stage, and budget at campaign setup - affordability gate (allowable CAC, payback), disqualifier pass, fit scoring, funding-floor check, channel test design; "where should I spend a new ad budget".
- Do not route here: splitting ongoing budgets, setting bids, pacing spend, designing creative tests.
### `mbfinotti/advertising-skills@ad-spend-guardrails`
- Route here: set the org's top-level spend guardrails as written **policy** - max allowable CAC, min ROAS/MER floor, kill-switch thresholds, counter-metrics, who owns them and who may override, re-baselining cadence, derived from contribution margin, payback, cash runway.
- Do not route here: monitoring daily pacing, benchmarking current CAC/ROAS, splitting budget across channels, choosing bid strategies, planning a scale-up.
### `mbfinotti/advertising-skills@retargeting-funnel`
- Route here: design a multi-stage retargeting sequence from the site's own funnel data - recency windows, behavioural-depth tiers, per-stage message and offer ladder, mutually exclusive audiences and exclusions, per-stage frequency caps; "we keep showing ads to people who already bought".
- Do not route here: building the campaigns inside an ad platform - it produces a stage-by-stage plan.
### `mbfinotti/advertising-skills@ad-spend-allocation`
- Route here: split a **fixed total** budget across campaigns, platforms, funnel stages, and audiences by expected marginal return - the monthly/quarterly allocation decision; gates before splitting, marginal-return proxies, step sizing, allocation-plan artifact.
- Do not route here: tracking daily spend against an already-set budget, choosing bid strategies, setting max-CAC/min-ROAS policy, picking channels at setup, raising the total budget.
### `mbfinotti/advertising-skills@thought-leadership-ads`
- Route here: plan a campaign promoting an executive's or founder's **existing organic posts** as paid person-fronted ads - post selection, sequencing, audience and exclusions, permission and governance, budget, measurement; B2B trust-layer and B2C founder-led.
- Do not route here: drafting the featured person's content.
### `mbfinotti/advertising-skills@ugc-ad-scripts`
- Route here: turn a product brief and audience into UGC-style short-form video ad **scripts** a creator can film - hook, body, CTA, 3-5 hook variants per concept as spoken line + on-screen text + opening visual, delivery notes, disclosure lines; B2C creator scripts and B2B founder-led / EGC / testimonial formats.
- Do not route here: scoring existing hooks, static ad copy variants, full creative briefs, fatigue calls, test design.
### `mbfinotti/advertising-skills@advertising-kickoff`
- Route here: project start, periodic check-in, "which advertising skill do I need", re-routing mid-project. This skill routes; it never performs a sibling's job itself.
## Boundary pairs and clusters
Where siblings collide on keywords, decide from these declared-scope boundaries. The first three are mandatory disambiguations - run them before routing any task that touches their keywords.
**Hirer vs candidate (mirror images).** `mbfinotti/advertising-skills@advertising-hiring` and `mbfinotti/advertising-skills@advertising-career` cover the same role knowledge from opposite sides of the table. Ask who is asking before routing: someone recruiting → hiring; someone being recruited → career. If the wrong one was picked, say so and hand over.
**Budget cluster - six skills, six different objects.** Decide by which decision is actually on the table:
- `mbfinotti/advertising-skills@ad-budget-pacing` - the budget already exists; is today's spend on pace against it? (daily/weekly tracking, alerts)
- `mbfinotti/advertising-skills@ad-spend-allocation` - the total is fixed; how do we split it across campaigns/platforms/stages? (marginal return)
- `mbfinotti/advertising-skills@paid-media-scaling` - a campaign proved out; do we raise the **total** spend, by how much, how fast?
- `mbfinotti/advertising-skills@ad-spend-guardrails` - what CAC ceiling / ROAS floor / kill-switch is the **policy** everything else must respect, and who may override it?
- `mbfinotti/advertising-skills@cac-roas-benchmark` - is current spend healthy? (measure and verdict, against break-even, own history, external benchmarks)
- `mbfinotti/advertising-skills@ad-bidding-strategy` - which bid **policy** per platform/goal, and what target?
Quick tests:
- "am I on pace" → `mbfinotti/advertising-skills@ad-budget-pacing`
- "which campaign gets more of the same money" → `mbfinotti/advertising-skills@ad-spend-allocation`
- "can we spend more overall" → `mbfinotti/advertising-skills@paid-media-scaling`
- "what are we allowed to spend per customer" → `mbfinotti/advertising-skills@ad-spend-guardrails`
- "is this CAC good" → `mbfinotti/advertising-skills@cac-roas-benchmark`
- "manual or tCPA" → `mbfinotti/advertising-skills@ad-bidding-strategy`
**Creative cluster - six skills, sequential stages of one creative lifecycle:**
- `mbfinotti/advertising-skills@ad-creative-brief` - goal + insight → a brief a designer/editor/creator executes (direction, not the asset)
- `mbfinotti/advertising-skills@ugc-ad-scripts` - the spoken shot-level script for short-form video
- `mbfinotti/advertising-skills@ad-copy-variants` - static/text copy variants for A/B testing
- `mbfinotti/advertising-skills@ad-hook-analyzer` - scores and ranks **openings** of candidate videos before launch
- `mbfinotti/advertising-skills@ad-creative-test-plan` - designs the **pre-launch** test that will run them
- `mbfinotti/advertising-skills@ad-creative-fatigue` - reads a **running** creative's decline and gives a verdict
Quick tests:
- "brief my designer" → `mbfinotti/advertising-skills@ad-creative-brief`
- "write the video script" → `mbfinotti/advertising-skills@ugc-ad-scripts`
- "write the headlines" → `mbfinotti/advertising-skills@ad-copy-variants`
- "which of these openings should I test" → `mbfinotti/advertising-skills@ad-hook-analyzer`
- "how much budget/how long for this test" → `mbfinotti/advertising-skills@ad-creative-test-plan`
- "is this ad worn out" → `mbfinotti/advertising-skills@ad-creative-fatigue`
**Audience cluster.**
- `mbfinotti/advertising-skills@ad-audience-targeting` plans the layered tiers (and explicitly excludes seed building and retargeting messaging)
- `mbfinotti/advertising-skills@lookalike-audience-seeds` picks and sizes the seed list feeding one of those tiers
- `mbfinotti/advertising-skills@retargeting-funnel` designs the staged retargeting messages and windows
- `mbfinotti/advertising-skills@ad-buyer-group-mapper` decides which **roles** to reach and with what angle, before any audience is sized
**Tracking vs attribution.** `mbfinotti/advertising-skills@ad-conversion-tracking` is pre-launch verification of one account's events (GO/NO-GO), and its own scope hands post-launch reconciliation across platform, analytics, and source of truth to `mbfinotti/advertising-skills@ad-attribution-gap`.
**Diagnostic vs its handoffs.** `mbfinotti/advertising-skills@ad-account-diagnostic` localises the failing layer and stops at the account boundary. Once it names the layer, route on:
- fragmentation → `mbfinotti/advertising-skills@ad-campaign-consolidation`
- post-click → `mbfinotti/advertising-skills@paid-landing-page-audit`
- creative decay → `mbfinotti/advertising-skills@ad-creative-fatigue`
- wasted queries → `mbfinotti/advertising-skills@ad-negative-keywords`
- tracking → `mbfinotti/advertising-skills@ad-conversion-tracking`
- bid policy → `mbfinotti/advertising-skills@ad-bidding-strategy`
**Channel vs format.** `mbfinotti/advertising-skills@ad-platform-selection` chooses the channel family before any campaign exists; `mbfinotti/advertising-skills@ad-format-fit` chooses the format **within** a chosen platform for a stated objective.
**Feed copy vs conversational copy.** Both write copy. Feed, search, and social placements → `mbfinotti/advertising-skills@ad-copy-variants`. A single response slot inside an AI assistant reply or answer-engine result → `mbfinotti/advertising-skills@conversational-ad-copy`.
**Swipe file vs brief.** `mbfinotti/advertising-skills@ad-swipe-file` ends at ranked competitor-derived hypotheses; `mbfinotti/advertising-skills@ad-creative-brief` turns a chosen hypothesis into executable direction.
**Radar vs everything else.** Anything containing "newsletter", "podcast", "community", "who to follow", "release notes", or "stay current" → `mbfinotti/advertising-skills@advertising-radar`; every operational ask routes elsewhere.
## Ordered chains
Propose a chain only when the task genuinely decomposes this way; never fabricate a sequence. Each chain is listed in dependency order, not efficiency order - a later link consumes what the earlier one produces, so there is no ratio to rank.
- `mbfinotti/advertising-skills@ad-platform-selection` → `mbfinotti/advertising-skills@ad-format-fit` → `mbfinotti/advertising-skills@ad-conversion-tracking` → `mbfinotti/advertising-skills@ad-creative-test-plan` - launching a new channel: pick it, pick producible formats, prove tracking, then design the first test.
- `mbfinotti/advertising-skills@ad-spend-guardrails` → `mbfinotti/advertising-skills@cac-roas-benchmark` → `mbfinotti/advertising-skills@ad-spend-allocation` → `mbfinotti/advertising-skills@paid-media-scaling` → `mbfinotti/advertising-skills@ad-budget-pacing` - the budget stack: set policy, measure health against it, split the total, decide whether to raise it, then track daily.
- `mbfinotti/advertising-skills@ad-swipe-file` → `mbfinotti/advertising-skills@ad-creative-brief` → `mbfinotti/advertising-skills@ugc-ad-scripts` / `mbfinotti/advertising-skills@ad-copy-variants` → `mbfinotti/advertising-skills@ad-hook-analyzer` → `mbfinotti/advertising-skills@ad-creative-test-plan` - competitor hypotheses become direction, then assets, then a ranked shortlist, then a powered test.
- `mbfinotti/advertising-skills@ad-account-diagnostic` → the named layer's skill - never run the layer skills in parallel before the diagnostic localises the failure.
- `mbfinotti/advertising-skills@ad-buyer-group-mapper` → `mbfinotti/advertising-skills@ad-audience-targeting` → `mbfinotti/advertising-skills@lookalike-audience-seeds` - decide which roles matter, structure the tiers, then build the seed behind the lookalike tier.
- `mbfinotti/advertising-skills@ad-conversion-tracking` → `mbfinotti/advertising-skills@ad-attribution-gap` - verify events before launch; reconcile reported numbers after.
- `mbfinotti/advertising-skills@ad-creative-fatigue` → `mbfinotti/advertising-skills@ad-creative-brief` → `mbfinotti/advertising-skills@ugc-ad-scripts` / `mbfinotti/advertising-skills@ad-copy-variants` - a wear-out verdict is what justifies new creative.
## Coverage gaps (v1)
No skill in the collection covers these. Name the gap; never promise or invent a skill:
- Positive keyword research and keyword expansion (`mbfinotti/advertising-skills@ad-negative-keywords` builds exclusions only).
- In-platform execution of any kind - every skill in this collection plans, audits, or decides; none builds or changes campaigns.
- Creative production itself: design, filming, editing, casting, creator sourcing.
- Incrementality testing (holdout, geo-lift) and media mix modeling.
- Cross-channel budgeting beyond paid ads (email, organic, content, events).
- Post-signup activation and onboarding drop-off.
- Ad policy appeals, disapprovals, and account suspension recovery.
- Product feed / catalog management for shopping and retail media.
SKILL.md›
---
name: advertising-kickoff
description: "Before starting any paid advertising work, before each recurring advertising review, and whenever routing is unclear, route the task to the right skill of the advertising-skills collection - or say plainly that none fits - and bootstrap or resume the project's shared context artifact. Use at every advertising project start, on later sessions of the same project to re-route without re-interviewing, and whenever the user mentions a new ad campaign or paid media project, asks which advertising skill they need, or wants a periodic advertising check-in - even if they name no skill at all. Prefer this whenever several skills could apply, since the collection has three colliding clusters - the hirer-vs-candidate pair, the budget cluster, the creative cluster - and it returns a short-list plus an ordered skill chain rather than a single guess. Do NOT use when the task already maps cleanly to one skill, such as a pure account audit - that is mbfinotti/advertising-skills@ad-account-diagnostic."
license: MIT
metadata:
author: Maya-Beth Finotti
version: "1.3.7"
---
# Advertising Kickoff
You are the entry point and router for the 31-skill advertising-skills collection. Route the current paid-advertising task to exactly one sibling skill - or say plainly that none fits - and make the next session start warm instead of cold. Routing is the reason this skill exists; everything else here serves it.
Run this skill at every project start, even when the collection's skills are already used daily in another context - a new project is a new context, and daily familiarity with siblings does not replace the kickoff pass. On later sessions of the same project, re-run it to resummarize and re-route, never to re-interview. Everything in this skill works identically for B2B and B2C accounts; only the routing outcomes differ, and the sibling scopes say so where they do.
## 1. Detect before asking
Every fact derivable from the environment is a question the user never has to answer. Run detection first; the interview cap only survives if it does.
1. Decide cold vs warm start from one signal only: does `advertising-context.md` exist in the project? Present → warm. Absent → cold. Never ask the user which mode it is.
2. If you can read the repository's git history, read the recent log to infer stage and pace: commit frequency, what changed last, whether work stalled.
3. Inventory existing files - README, agent-instruction files, briefs, past campaign docs, media plans - so nothing already written gets re-asked.
4. If your harness exposes connectors or integrations, detect which are available - an ad-account export, an analytics source, a CRM, a creative asset store - and let their presence shape routing and routines. Describe the capability; never assume a specific product.
5. If the collection ships readable version metadata, note what changed since the last session. If it doesn't - the common case - degrade silently. Never block, warn, or ask about versions.
## 2. Interview - capped, tappable
On a cold start:
- Ask at most 5-7 questions.
- Ask one question per message.
- Offer multiple-choice options whenever possible.
- Spend questions only where detection came up empty - skip any question the file inventory or git log already answered.
1. "What are we selling, and to whom?" - (a) B2B sales-led, (b) B2B self-serve, (c) B2C, (d) both/mixed. B2B and B2C answers steer different siblings later, so this comes first.
2. "What is the goal of this session - and is it the same as the project's goal?" Ask on both cold and warm starts; a project goal never substitutes for today's goal.
3. "Which channels are you buying today, and what's the monthly spend band?" - (a) not spending yet, (b) under $5k, (c) $5k-50k, (d) over $50k; list the channels free-form.
4. "What conversion event counts as success, and where does the source of truth live?" - platform pixel, analytics tool, CRM, or order system.
5. "Any hard constraints, and is there a date the result has to land by?" - (a) committed budgets or an agency contract, (b) a fixed date - seasonal peak, launch, board review: give the date, (c) regulated vertical / compliance review, (d) no creative production capacity, (e) none.
6. "Do you want a one-off win out of this session, or a compounding asset - and what is your effort ceiling?" - (a) one-off, hours only, (b) one-off, a week of work is fine, (c) compounding, a few hours every week from here, (d) compounding, and I can commit headcount or executive sign-off.
7. "What is already decided, and what is still open?" - one line each; decided items are off the table for re-litigation.
Questions 5 and 6 exist to order the output, not to describe the project: the landing date, the one-off-versus-compounding answer and the effort ceiling are what re-rank the short-list and the routines (see § 4 and § 7). Ask them here, never beside a ranking - by then the user has already committed to a path. Record all three in the artifact so the warm start re-ranks without re-asking.
On a warm start, ask only the session-goal question. Everything else comes from the artifact.
## 3. Route the task
Match the stated session goal against the declared scope of each skill below. Route to exactly one skill for the immediate task. Never force a match: when nothing fits, say so and name the gap instead of stretching the nearest skill.
This table is deliberately unranked, and must stay that way. Scope is a match test, not a ratio: ordering the rows would invent a preference between skills that never compete for the same task. Ranking belongs one step later, in the short-list (§ 4).
| Skill | Route here when the task is… |
| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `mbfinotti/advertising-skills@ad-account-diagnostic` | Find the root cause of an underperforming ad account across tracking, structure, targeting, creative, bidding, offer; "why are my ads underperforming" |
| `mbfinotti/advertising-skills@ad-copy-variants` | Turn one value proposition into distinct static/text copy variants labelled by angle and awareness stage; search headline sets |
| `mbfinotti/advertising-skills@ad-format-fit` | Flag poor-fit or misused ad formats for a stated objective on a chosen platform, pre-launch format QA; format vs creative problem post-launch |
| `mbfinotti/advertising-skills@ad-swipe-file` | Collect competitors' currently-running ads into a categorized library and rank creative test hypotheses |
| `mbfinotti/advertising-skills@advertising-career` | Candidate side: skill-gap roadmap, interview prep, NDA-safe portfolio, agency vs in-house, pay conversations |
| `mbfinotti/advertising-skills@advertising-hiring` | Hirer side: rung decision, scorecard, interview loop, work sample, 30-60-90 with staged spend authority |
| `mbfinotti/advertising-skills@advertising-radar` | What to read/follow to stay current: a time-budgeted watch list of paid-advertising sources |
| `mbfinotti/advertising-skills@ad-attribution-gap` | Quantify and explain discrepancies between platform reporting, analytics, and the source of truth; "the numbers don't match" |
| `mbfinotti/advertising-skills@ad-audience-targeting` | Turn an ICP and buying signals into a layered targeting plan sized against platform floors, with exclusion rules |
| `mbfinotti/advertising-skills@ad-bidding-strategy` | Choose the bid policy per platform and goal, set and move the target, evaluation window, rollback trigger; "target CPA or target ROAS" |
| `mbfinotti/advertising-skills@ad-budget-pacing` | Track daily/weekly spend against an already-set budget and flag under/over-pacing; "am I on pace" |
| `mbfinotti/advertising-skills@ad-buyer-group-mapper` | Map the buying committee for an offer and give each role a messaging angle plus an ad-targeting proxy |
| `mbfinotti/advertising-skills@cac-roas-benchmark` | Compute CAC/ROAS from real data and judge spend health against break-even, own history, external benchmarks; "is my CAC too high" |
| `mbfinotti/advertising-skills@ad-campaign-consolidation` | Plan which campaigns/ad sets to merge without resetting learning; "too many ad sets", "stuck in learning" |
| `mbfinotti/advertising-skills@conversational-ad-copy` | Ad copy for a single response slot inside an AI-assistant reply or answer-engine result |
| `mbfinotti/advertising-skills@ad-conversion-tracking` | Pre-launch GO/NO-GO check that conversion events are configured, firing once, deduplicated; "is my tracking working" |
| `mbfinotti/advertising-skills@ad-creative-brief` | Turn a campaign goal plus an audience insight into a brief a designer, editor, or creator executes |
| `mbfinotti/advertising-skills@ad-creative-fatigue` | Verdict on whether a running creative is genuinely worn out or a confounder explains the decline; "should I kill this ad" |
| `mbfinotti/advertising-skills@ad-creative-test-plan` | Design a pre-launch creative test: hypothesis, cells, budgets, sample, pre-registered kill/scale rules |
| `mbfinotti/advertising-skills@ad-hook-analyzer` | Score and force-rank the openings of candidate video ads before launch; "which hook should I test" |
| `mbfinotti/advertising-skills@paid-landing-page-audit` | Audit a landing page receiving paid traffic and return a prioritised fix list; "clicks but no conversions" |
| `mbfinotti/advertising-skills@lookalike-audience-seeds` | Select and size the seed customer list behind a lookalike/value-based audience; match rate, platform floor |
| `mbfinotti/advertising-skills@paid-media-scaling` | Decide when a proven campaign has earned a budget increase, the step size, the ramp, rollback triggers |
| `mbfinotti/advertising-skills@ad-negative-keywords` | Build and maintain negative keyword lists from search term reports; exclusion levels, review cadence |
| `mbfinotti/advertising-skills@ad-platform-selection` | Choose which paid channel families fit the business's economics, audience, funnel stage, and budget at setup |
| `mbfinotti/advertising-skills@ad-spend-guardrails` | Write the org's spend policy: max allowable CAC, min ROAS floor, kill switches, ownership, override rights |
| `mbfinotti/advertising-skills@retargeting-funnel` | Design a staged retargeting sequence: recency windows, depth tiers, message ladder, exclusions, frequency caps |
| `mbfinotti/advertising-skills@ad-spend-allocation` | Split a fixed total budget across campaigns, platforms, funnel stages, and audiences by expected marginal return |
| `mbfinotti/advertising-skills@thought-leadership-ads` | Plan a campaign promoting an executive's existing organic posts as paid person-fronted ads |
| `mbfinotti/advertising-skills@ugc-ad-scripts` | Write UGC-style short-form video ad scripts a creator can film, with hook variants and delivery notes |
| `mbfinotti/advertising-skills@advertising-kickoff` | This skill: project start, periodic check-in, "which skill do I need", re-routing |
Three clusters collide hard on keywords and demand disambiguation before routing:
- the hirer-vs-candidate mirror pair
- the six-skill budget cluster
- the six-skill creative cluster
Disambiguate strictly from each skill's declared scope, never from a guess about what a skill "probably" covers: a wrong disambiguation misroutes worse than none. Read `references/skill-routing.md` for the per-skill route/do-not-route signals, all boundary-pair disambiguations, the ordered chains, and the named coverage gaps, before routing any task that could plausibly match two skills.
Name the gap explicitly when the task needs something no skill covers. Collection v1 has no skill for:
- positive keyword research
- in-platform execution of any kind
- creative production itself
- incrementality testing or media mix modeling
- cross-channel budgeting beyond paid ads
- post-signup activation
- ad policy appeals and suspension recovery
- product feed management
Say "the collection has no skill for this" - never promise a skill exists or invent one.
## 4. Output shape
Deliver the routing result in this shape, every time:
1. **State summary** (warm start only) - exactly 5 lines from the artifact: business model and channels, spend band, conversion source of truth, in-flight work, active constraint.
2. **Route** - the one skill for the immediate task (or "no skill fits", plus the named gap).
3. **Short-list** - 5 to 8 skills relevant to this project right now, ordered by value returned per unit of effort, highest ratio first. Give each entry one line naming both sides: the bottleneck it attacks, and what the session costs. Never order by cheapness and never by the routing table's row order - see "Ordering the short-list" below.
4. **Chain** - when the task genuinely decomposes into an ordered sequence (e.g. `mbfinotti/advertising-skills@ad-platform-selection` → `mbfinotti/advertising-skills@ad-format-fit` → `mbfinotti/advertising-skills@ad-conversion-tracking` → `mbfinotti/advertising-skills@ad-creative-test-plan`), list it in execution order with one line per link on what it hands to the next. Chain order is dependency order, not efficiency order - a later link cannot run before its earlier one, so ranking a chain adds nothing. Omit the chain when there isn't one - never fabricate a sequence.
5. **Not now** - skills that will matter later, each with its explicit unblocking condition (e.g. "`mbfinotti/advertising-skills@paid-media-scaling` - after `mbfinotti/advertising-skills@cac-roas-benchmark` returns a healthy verdict").
6. **Gap** - anything today's task needs that no skill covers, stated as a gap.
### Ordering the short-list
The user's question at that moment is never "which of these exists" but "which one do I run first, and is it worth the session". Only a ratio answers that. Default class order, highest value/effort ratio first:
1. **Measurement integrity** - `mbfinotti/advertising-skills@ad-conversion-tracking`, `mbfinotti/advertising-skills@ad-attribution-gap`. Buys back the readability of every number in the account, so every later session is measured through it. Costs hours to a day, mostly one engineer's, and it is done.
2. **Diagnosis** - `mbfinotti/advertising-skills@ad-account-diagnostic`, `mbfinotti/advertising-skills@cac-roas-benchmark`. Buys a named failing layer instead of a guess. Costs one session on data already in hand and implements nothing, which is what stops a week going into the wrong layer.
3. **Policy and structure** - `mbfinotti/advertising-skills@ad-spend-guardrails`, `mbfinotti/advertising-skills@ad-platform-selection`, `mbfinotti/advertising-skills@ad-spend-allocation`, `mbfinotti/advertising-skills@ad-campaign-consolidation`. Buys a ceiling on how wrong a month can go, and volume for starved units. Costs a session plus stakeholder sign-off; cheap to write, expensive to un-merge in the account.
4. **Creative, audience and post-click** - `mbfinotti/advertising-skills@ad-creative-brief`, `mbfinotti/advertising-skills@ugc-ad-scripts`, `mbfinotti/advertising-skills@ad-copy-variants`, `mbfinotti/advertising-skills@ad-hook-analyzer`, `mbfinotti/advertising-skills@ad-swipe-file`, `mbfinotti/advertising-skills@ad-creative-test-plan`, `mbfinotti/advertising-skills@ad-audience-targeting`, `mbfinotti/advertising-skills@lookalike-audience-seeds`, `mbfinotti/advertising-skills@retargeting-funnel`, `mbfinotti/advertising-skills@ad-buyer-group-mapper`, `mbfinotti/advertising-skills@thought-leadership-ads`, `mbfinotti/advertising-skills@conversational-ad-copy`, `mbfinotti/advertising-skills@ad-format-fit`, `mbfinotti/advertising-skills@paid-landing-page-audit`. Buys the largest outcome in the collection, and never finishes: a production cycle every time, a standing job rather than a fix. `mbfinotti/advertising-skills@paid-landing-page-audit` is the one entry whose effort sits outside the account - whoever owns the page sets its pace, not you.
5. **Tuning and scaling** - `mbfinotti/advertising-skills@ad-bidding-strategy`, `mbfinotti/advertising-skills@ad-budget-pacing`, `mbfinotti/advertising-skills@ad-negative-keywords`, `mbfinotti/advertising-skills@paid-media-scaling`, `mbfinotti/advertising-skills@ad-creative-fatigue`. Near-zero effort each, and buys close to nothing until the rungs above pass - while a bid or budget edit spends a learning window on the way.
`mbfinotti/advertising-skills@advertising-career`, `mbfinotti/advertising-skills@advertising-hiring` and `mbfinotti/advertising-skills@advertising-radar` sit outside this ladder rather than at the bottom of it. They answer a people or a stay-current question, not an account question; when that _is_ the session goal they are rung 1 by definition, and otherwise they do not belong on the short-list at all.
The axes disagree, which is exactly where the choice is hard:
- efficiency: `measurement integrity > diagnosis > policy & structure > creative & audience > tuning & scaling`
- value: `creative & audience > policy & structure > measurement integrity > diagnosis > tuning & scaling`
- effort: `creative & audience > policy & structure > measurement integrity == diagnosis > tuning & scaling`
- compliance cost: `measurement integrity > creative & audience > every other class (none)` - a consent-mode change or a server-side conversion upload triggers a data-processing and consent-basis review and cannot be un-sent; uploading a customer seed list needs a lawful basis, and a person-fronted ad needs the featured person's written permission. Diagnosis, policy and tuning read data that already exists and trigger nothing.
What this order starves is the creative and audience class: first on value and first on effort at once, so a ratio ranks it below measurement and diagnosis every session however large the outcome it buys, and its production cycle never finishes paying. Promote it past the ratio, rather than waiting for it to win a round it structurally cannot, when the interview answered compounding with headcount or sign-off (Q6), when diagnosis has already named creative as the failing layer, or when the account's creative has not been refreshed in a full flight. Say which condition promoted it.
Tuning is last on effort and last on efficiency at once: near-zero effort buying near-zero outcome is a rounding error with a learning reset attached, not a cheap win.
Default: open the short-list at the highest class the interview left unresolved, and never below measurement integrity while the conversion source of truth is unconfirmed. Move down a class only once the class above is in place.
This ordering is a default, not a law - it shifts with the account and with who executes it. Re-rank it against what the interview and the detection pass just told you, and say out loud which answer moved which class:
- "Not spending yet" (Q3) empties classes 1, 2 and 5 - there is nothing to measure, diagnose or tune - and promotes `mbfinotti/advertising-skills@ad-platform-selection` and `mbfinotti/advertising-skills@ad-conversion-tracking` to the top.
- A platform pixel named as the only source of truth (Q4) pins measurement integrity to rung 1 whatever else the session wanted.
- A fixed landing date inside six weeks (Q5) promotes fast-acting classes and demotes anything that pays over a quarter - guardrail re-baselining, consolidation, hiring - to "not now" with the date as its unblocking condition.
- No creative production capacity (Q5) moves class 4 off the short-list into "Not now" with capacity as its unblocking condition, rather than ranking it under class 5 - except `mbfinotti/advertising-skills@ad-swipe-file` and `mbfinotti/advertising-skills@ad-copy-variants`, which need none.
- A regulated vertical (Q5) adds a legal review to class 1 and to seed-list work, which lengthens both without changing what they buy.
- "One-off, hours only" (Q6) cuts the short-list to two entries from classes 1-2; "compounding, headcount available" (Q6) promotes class 3 and class 4 above their default place.
- A decided item (Q7) removes its skill from the short-list outright, and so does anything the constraints rule out permanently: a channel the vertical cannot advertise on, an account an agency contract forbids restructuring, a class no budget will ever fund. Delete those entries and name each one as deleted with the constraint that killed it - never rank them last. An option parked at the bottom of a short-list is read as a later rung and comes back as scope next session; a named deletion does not.
- Detection findings move classes too: an in-house engineer makes class 1 a same-day job; an agency holding the account makes class 3 a negotiation rather than a decision; a git log showing months of stall means diagnosis before anything else.
## 5. Context artifact
Create or update `advertising-context.md` at the project root, one versioned file committed with the project when the project lives in git. It is the single source of truth that makes the next start warm. Its fields:
- business model
- offer and price point
- channels and spend band
- conversion event and source of truth
- CAC/ROAS position and guardrail status
- in-flight work
- decided vs open
- constraints
- stakeholders with decision role
- a session log
See `references/context-artifact.md` for the template, a worked example, and a negative example.
- On warm start: read it, do not rebuild it. Produce the 5-line state summary, append a session-log line, and patch only fields that changed.
- Optionally patch the project's agent-instruction file with the project's invariants (business model, source of truth, guardrail policy, hard constraints) so every future session inherits them without loading this skill.
- Do not scaffold a working tree the project hasn't earned. Scaffold only what this session needs - premature structure hard-codes decisions the project hasn't made yet.
- Keep a decision log only when the project actually accumulates contested decisions; otherwise the "decided vs open" field is enough. An empty ceremony log goes stale and erodes trust in the artifact.
Update the artifact before the session ends, every session - an unwritten session is a cold start next time.
## 6. Memory
If your harness has persistent memory, derive memory entries from the context artifact - never the reverse. The artifact stays the source of truth because memory is invisible and unreviewable to teammates; a memory-first flow forks the project state per user.
- Persist interview responses to memory after the interview completes and before § 4 Output shape: write the captured answers into the context artifact first, then derive the memory entry from the artifact. Never write memory straight from the answer, and never skip the artifact because the answer felt obvious.
- Store memory in exactly one of three places: local to the user's environment, a team knowledge base, or a `memories/` directory in a git repository. Index it with an index file listing each entry with a one-line hook.
- On warm start, diff memory against the artifact. When they diverge, propose reconciliation - artifact wins by default; ask before overwriting either.
- Never put into memory: customer PII or the contents of uploaded customer lists, ad account IDs and credentials, negotiated media rates and agency fees, unreleased campaign or pricing plans. State this exclusion when you first write memory.
- When memory lives in a git repository, never commit it silently. Show the diff and get approval first, every time.
## 7. Routines
If your harness supports scheduled routines, propose 2 to 4, always as a dry-run shown to the user before anything is created, each with an explicit output channel. A routine without an output channel is noise the user silences within a week.
A routine's cost is not its setup but its attention per firing multiplied by how often it fires; its value is the decision it puts in front of someone while that decision is still open. Rank the candidates on that ratio, highest first, and propose from the top down:
1. **Monthly spend health check** → `mbfinotti/advertising-skills@cac-roas-benchmark`. Fires twelve times a year, costs about an hour of assembling inputs you assemble anyway, and is the only routine whose output can stop a losing month. Anchor it before the allocation decision it feeds, never after.
2. **Weekly pacing check** → `mbfinotti/advertising-skills@ad-budget-pacing`. Near-zero per firing, and it catches an over- or under-spend inside the period where it can still be corrected. Its firing rate is its whole cost - drop it to monthly once spend is stable.
3. **Monthly or quarterly re-invocation of this kickoff.** Near-zero, and it keeps the artifact and the routing current, which is what stops every other routine from firing at work that no longer exists. Match its cadence to the project's pace from the git log.
4. **Monthly search term mining** → `mbfinotti/advertising-skills@ad-negative-keywords`. Costs a search-term export plus a review pass each month, and compounds: every negative added keeps paying. Worth nothing on an account with no search spend - skip it there rather than shrinking it.
5. **Weekly or biweekly creative wear-out check** → `mbfinotti/advertising-skills@ad-creative-fatigue`. The most expensive per firing - a genuine read of per-creative delivery - and its verdict is worthless without production capacity to act on it. Install it only where creative can actually be replaced.
6. **Quarterly source refresh** → `mbfinotti/advertising-skills@advertising-radar`. Four near-zero firings a year buying currency rather than an outcome.
- efficiency: `spend health > pacing > kickoff re-invocation > search term mining > wear-out check > source refresh`
- value: `spend health > wear-out check > search term mining > pacing > kickoff re-invocation > source refresh`
- effort: `wear-out check > search term mining > spend health > pacing == kickoff re-invocation == source refresh`
- compliance cost: `search term mining > every other routine (none)` - search term reports carry user-typed text that can identify a person, so its output channel has to be one the account's data-handling policy already covers; the others emit aggregates.
The source refresh is the cheapest candidate and the last one to install - the clearest proof that cheap and efficient are different orderings. The wear-out check is second on value and fifth on efficiency, because what it costs is a weekly read and what it buys is a verdict that only converts into an outcome downstream.
Default: rungs 1-3, which is three routines. Add rung 4 when search is a meaningful share of spend, rung 5 only when creative production capacity exists. Never exceed 4 - the cap is what protects the routines that matter from the ones that fire into the void.
The ranking is a default, not a law: it shifts with the account and with who executes it. Re-rank it against the interview:
- "not spending yet" (Q3) leaves only the kickoff re-invocation standing
- a fixed date inside six weeks (Q5) promotes pacing above spend health for the flight's duration and tightens it to daily in the final week
- a regulated vertical (Q5) blocks search term mining until its channel clears compliance review
- no creative capacity (Q5) removes the wear-out check entirely
- "one-off, hours only" (Q6) means install one routine, not four
- an agency already delivering a weekly pacing report makes rung 2 a duplicate: demote it rather than send the user the same number twice
Anchor triggers to the media calendar - month-end budget reset, campaign flight dates, seasonal peaks - rather than arbitrary dates whenever it fits. List and clean up obsolete routines left over from a previous flight or quarter before adding new ones.
If the harness has no scheduled routines, fall back to one recurring calendar reminder ("Advertising check-in - re-run the advertising kickoff") and stop there. See `references/routines.md` for the dry-run format, media-calendar trigger anchoring, event-trigger preference, and cleanup checklist.
## 8. Invocation examples
- "Start a new paid advertising project for our product launch."
- "Which advertising skill do I need? Our ROAS dropped last week."
- "Run my advertising check-in."
- "Where do I start? We've never bought ads before."
## 9. Failure modes
- **Forcing a match.** Stretching the nearest skill onto a task it doesn't cover wastes a session and hides the gap. Say "none fits" and name the gap.
- **Re-interviewing on a warm start.** The artifact exists precisely so questions aren't repeated. Ask only the session goal.
- **Routing from a guessed scope.** Route only from the declared scopes in `references/skill-routing.md`; a plausible-sounding guess misroutes confidently.
- **Uncapped interview.** Past 7 questions the kickoff becomes a form the user abandons. Detection, not questions, fills the gaps.
- **Routines with no output channel.** They fire into the void and get silenced, burying the one routine that mattered.
- **A flat short-list.** Five equal-looking options get picked by taste or by whichever sits first. Order by value per unit of effort and name both sides on every line, or the user cannot choose.
- **Leading with the cheapest option.** A near-zero skill or routine that buys near-zero is a rounding error, not a quick win.
- **Memory committed silently.** Teammates can't review what they can't see land. Diff and approval, always.
- **Stale routing table.** Update this skill - table, `references/skill-routing.md`, boundary pairs, chains, gap list - whenever the collection changes: a skill added, renamed, removed, or re-scoped. A stale router sends users to skills that no longer exist, which is worse than no router at all.
## 10. Pass bar
Before ending the session, check every item. If any fails, fix it and re-check - do not close the session on a failing bar.
1. Every recommended skill's declared scope actually matches the stated task - re-read its description to confirm.
2. Zero routes to a name outside the 31 skills in the table above.
3. Interview stayed within its cap: at most 7 questions on cold start, only the session-goal question on warm start.
4. `advertising-context.md` was written or updated, including a session-log line, before the session ended.
5. Every proposed routine was shown as a dry-run and has an explicit output channel.
6. The short-list and the routine set are both ordered by value per unit of effort, each entry naming the bottleneck it attacks and what it costs:
- the re-rank was stated out loud whenever an interview answer moved something off its default place
- anything the constraints ruled out appears as deleted by name, not ranked last
- the starved high-value/high-effort entry is named with the condition that would promote it
## References
- `references/skill-routing.md` - per-skill route/do-not-route signals, boundary-pair disambiguations, ordered chains, coverage gaps. Read before routing any ambiguous task.
- `references/context-artifact.md` - the artifact template, one worked example, one negative example.
- `references/routines.md` - dry-run format, media-calendar trigger anchoring, event triggers, cleanup checklist.