dreamcontext 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +523 -0
  3. package/agents/dreamcontext-explore.md +137 -0
  4. package/agents/dreamcontext-initializer.md +169 -0
  5. package/agents/sleep-product.md +268 -0
  6. package/agents/sleep-state.md +270 -0
  7. package/agents/sleep-tasks.md +134 -0
  8. package/dist/agents/dreamcontext-explore.md +137 -0
  9. package/dist/agents/dreamcontext-initializer.md +169 -0
  10. package/dist/agents/sleep-product.md +268 -0
  11. package/dist/agents/sleep-state.md +270 -0
  12. package/dist/agents/sleep-tasks.md +134 -0
  13. package/dist/dashboard/assets/BrainCanvas3D-BLJ4_SqE.js +5126 -0
  14. package/dist/dashboard/assets/_baseUniq-DpaDAx_H.js +1 -0
  15. package/dist/dashboard/assets/arc-JvK3Ik1p.js +1 -0
  16. package/dist/dashboard/assets/architectureDiagram-Q4EWVU46-CCvw4XFg.js +36 -0
  17. package/dist/dashboard/assets/blockDiagram-DXYQGD6D-DMobz1n7.js +132 -0
  18. package/dist/dashboard/assets/c4Diagram-AHTNJAMY-FwcHT5er.js +10 -0
  19. package/dist/dashboard/assets/channel-D6954IHZ.js +1 -0
  20. package/dist/dashboard/assets/chunk-4BX2VUAB-B5kYwmBa.js +1 -0
  21. package/dist/dashboard/assets/chunk-4TB4RGXK-0ot1eS0J.js +206 -0
  22. package/dist/dashboard/assets/chunk-55IACEB6-24ngcLgH.js +1 -0
  23. package/dist/dashboard/assets/chunk-EDXVE4YY-DATt1OUl.js +1 -0
  24. package/dist/dashboard/assets/chunk-FMBD7UC4-BprbGSJw.js +15 -0
  25. package/dist/dashboard/assets/chunk-OYMX7WX6-CJJhpKWP.js +231 -0
  26. package/dist/dashboard/assets/chunk-QZHKN3VN-Cisp65Vq.js +1 -0
  27. package/dist/dashboard/assets/chunk-YZCP3GAM-DtMk33tU.js +1 -0
  28. package/dist/dashboard/assets/classDiagram-6PBFFD2Q-Bk4KDqBj.js +1 -0
  29. package/dist/dashboard/assets/classDiagram-v2-HSJHXN6E-Bk4KDqBj.js +1 -0
  30. package/dist/dashboard/assets/clone-C9Yhti5q.js +1 -0
  31. package/dist/dashboard/assets/cose-bilkent-S5V4N54A-BxYomDLe.js +1 -0
  32. package/dist/dashboard/assets/cytoscape.esm-D_LviqZs.js +331 -0
  33. package/dist/dashboard/assets/dagre-KV5264BT-CsX1ZayG.js +4 -0
  34. package/dist/dashboard/assets/defaultLocale-DX6XiGOO.js +1 -0
  35. package/dist/dashboard/assets/diagram-5BDNPKRD-B2G4mPPw.js +10 -0
  36. package/dist/dashboard/assets/diagram-G4DWMVQ6-C8nxN9ZB.js +24 -0
  37. package/dist/dashboard/assets/diagram-MMDJMWI5-DaYymOrR.js +43 -0
  38. package/dist/dashboard/assets/diagram-TYMM5635-BpiYFv-I.js +24 -0
  39. package/dist/dashboard/assets/erDiagram-SMLLAGMA-C6pE7F61.js +85 -0
  40. package/dist/dashboard/assets/flowDiagram-DWJPFMVM-jdNEPVFq.js +162 -0
  41. package/dist/dashboard/assets/ganttDiagram-T4ZO3ILL-C8GoRj1C.js +292 -0
  42. package/dist/dashboard/assets/gitGraphDiagram-UUTBAWPF-SiRn7RJ8.js +106 -0
  43. package/dist/dashboard/assets/graph-9wbTW7ld.js +1 -0
  44. package/dist/dashboard/assets/index-BHp63EMw.js +475 -0
  45. package/dist/dashboard/assets/index-CdnDt_7U.css +1 -0
  46. package/dist/dashboard/assets/infoDiagram-42DDH7IO-DcDC8M1a.js +2 -0
  47. package/dist/dashboard/assets/ishikawaDiagram-UXIWVN3A-UjyrPeaS.js +70 -0
  48. package/dist/dashboard/assets/journeyDiagram-VCZTEJTY-CXJPYMxN.js +139 -0
  49. package/dist/dashboard/assets/kanban-definition-6JOO6SKY-Cm1n9eat.js +89 -0
  50. package/dist/dashboard/assets/katex-DkKDou_j.js +257 -0
  51. package/dist/dashboard/assets/layout-w8zmQGXp.js +1 -0
  52. package/dist/dashboard/assets/linear-CMNvIisH.js +1 -0
  53. package/dist/dashboard/assets/min-BqXwiqEr.js +1 -0
  54. package/dist/dashboard/assets/mindmap-definition-QFDTVHPH-tksxnjhx.js +96 -0
  55. package/dist/dashboard/assets/pieDiagram-DEJITSTG-lIVvnPyq.js +30 -0
  56. package/dist/dashboard/assets/quadrantDiagram-34T5L4WZ-DSMB57t5.js +7 -0
  57. package/dist/dashboard/assets/requirementDiagram-MS252O5E-NG99tgmc.js +84 -0
  58. package/dist/dashboard/assets/sankeyDiagram-XADWPNL6-C6EkbQKo.js +10 -0
  59. package/dist/dashboard/assets/sequenceDiagram-FGHM5R23-ASU7Zp6_.js +157 -0
  60. package/dist/dashboard/assets/stateDiagram-FHFEXIEX-DHklUzce.js +1 -0
  61. package/dist/dashboard/assets/stateDiagram-v2-QKLJ7IA2-BZXFb2Fh.js +1 -0
  62. package/dist/dashboard/assets/timeline-definition-GMOUNBTQ-B37xNhjS.js +120 -0
  63. package/dist/dashboard/assets/vennDiagram-DHZGUBPP-D28OvWbm.js +34 -0
  64. package/dist/dashboard/assets/wardley-RL74JXVD-BQdaLyVb.js +162 -0
  65. package/dist/dashboard/assets/wardleyDiagram-NUSXRM2D-D0vChrnT.js +20 -0
  66. package/dist/dashboard/assets/xychartDiagram-5P7HB3ND-BzSx7EpJ.js +7 -0
  67. package/dist/dashboard/favicon.svg +14 -0
  68. package/dist/dashboard/index.html +18 -0
  69. package/dist/hooks/marketing-binary-guard.sh +18 -0
  70. package/dist/index.js +15881 -0
  71. package/dist/skill-packs/agents/biv-customer-analyst.md +140 -0
  72. package/dist/skill-packs/agents/biv-decision-gate.md +147 -0
  73. package/dist/skill-packs/agents/biv-financial-analyst.md +128 -0
  74. package/dist/skill-packs/agents/biv-market-analyst.md +103 -0
  75. package/dist/skill-packs/agents/biv-researcher.md +140 -0
  76. package/dist/skill-packs/agents/biv-strategist.md +164 -0
  77. package/dist/skill-packs/agents/council-persona.md +142 -0
  78. package/dist/skill-packs/agents/council-synthesizer.md +208 -0
  79. package/dist/skill-packs/agents/discover-brand.md +216 -0
  80. package/dist/skill-packs/agents/goal-implementer.md +70 -0
  81. package/dist/skill-packs/agents/goal-plan-reviewer.md +68 -0
  82. package/dist/skill-packs/agents/goal-planner.md +75 -0
  83. package/dist/skill-packs/agents/goal-validator.md +68 -0
  84. package/dist/skill-packs/agents/marketing-creative.md +85 -0
  85. package/dist/skill-packs/agents/marketing-monitor.md +143 -0
  86. package/dist/skill-packs/agents/marketing-strategy.md +139 -0
  87. package/dist/skill-packs/agents/review-cloud-functions.md +158 -0
  88. package/dist/skill-packs/agents/review-edge-cases.md +147 -0
  89. package/dist/skill-packs/agents/review-frontend.md +134 -0
  90. package/dist/skill-packs/agents/review-router.md +165 -0
  91. package/dist/skill-packs/agents/review-security.md +139 -0
  92. package/dist/skill-packs/agents/reviewer.md +152 -0
  93. package/dist/skill-packs/brand-voice/SKILL.md +115 -0
  94. package/dist/skill-packs/brand-voice/discover-brand.md +126 -0
  95. package/dist/skill-packs/brand-voice/guideline-generation.md +154 -0
  96. package/dist/skill-packs/brand-voice/references/before-after-examples.md +194 -0
  97. package/dist/skill-packs/brand-voice/references/confidence-scoring.md +128 -0
  98. package/dist/skill-packs/brand-voice/references/guideline-template.md +241 -0
  99. package/dist/skill-packs/brand-voice/references/search-strategies.md +271 -0
  100. package/dist/skill-packs/brand-voice/references/source-ranking.md +248 -0
  101. package/dist/skill-packs/brand-voice/references/voice-constant-tone-flexes.md +115 -0
  102. package/dist/skill-packs/business-idea-discovery/SKILL.md +452 -0
  103. package/dist/skill-packs/business-idea-validation/SKILL.md +209 -0
  104. package/dist/skill-packs/business-idea-validation/stage-definitions.md +658 -0
  105. package/dist/skill-packs/catalog.json +657 -0
  106. package/dist/skill-packs/council/SKILL.md +134 -0
  107. package/dist/skill-packs/council/debate-protocol.md +90 -0
  108. package/dist/skill-packs/design/SKILL.md +301 -0
  109. package/dist/skill-packs/design/design-mobile.md +207 -0
  110. package/dist/skill-packs/design/design-web.md +148 -0
  111. package/dist/skill-packs/design/frontend-principles.md +157 -0
  112. package/dist/skill-packs/design/onboarding-design.md +230 -0
  113. package/dist/skill-packs/engineering/SKILL.md +155 -0
  114. package/dist/skill-packs/engineering/backend-principles.md +233 -0
  115. package/dist/skill-packs/engineering/firebase-cloud-functions/SKILL.md +44 -0
  116. package/dist/skill-packs/engineering/firebase-cloud-functions/references/gen_comparison.md +45 -0
  117. package/dist/skill-packs/engineering/firebase-cloud-functions/references/idempotency.md +145 -0
  118. package/dist/skill-packs/engineering/firebase-cloud-functions/references/local_testing.md +218 -0
  119. package/dist/skill-packs/engineering/firebase-cloud-functions/references/scaling.md +128 -0
  120. package/dist/skill-packs/engineering/firebase-cloud-functions/references/secrets.md +70 -0
  121. package/dist/skill-packs/engineering/firebase-cloud-functions/references/triggers_and_deployment.md +139 -0
  122. package/dist/skill-packs/engineering/firebase-firestore/SKILL.md +50 -0
  123. package/dist/skill-packs/engineering/firebase-firestore/references/indexes.md +96 -0
  124. package/dist/skill-packs/engineering/firebase-firestore/references/provisioning.md +101 -0
  125. package/dist/skill-packs/engineering/firebase-firestore/references/query_mechanics.md +182 -0
  126. package/dist/skill-packs/engineering/firebase-firestore/references/security_rules.md +299 -0
  127. package/dist/skill-packs/engineering/firebase-firestore/references/web_sdk_usage.md +265 -0
  128. package/dist/skill-packs/engineering/web-app-frontend.md +187 -0
  129. package/dist/skill-packs/goal-skill/SKILL.md +203 -0
  130. package/dist/skill-packs/growth/SKILL.md +480 -0
  131. package/dist/skill-packs/growth/lean-analytics-experiments.md +341 -0
  132. package/dist/skill-packs/growth/lean-analytics-metrics.md +295 -0
  133. package/dist/skill-packs/growth/performance-marketing.md +337 -0
  134. package/dist/skill-packs/meta-marketing/SKILL.md +423 -0
  135. package/dist/skill-packs/meta-marketing/account-ops.md +190 -0
  136. package/dist/skill-packs/meta-marketing/api-reference.md +535 -0
  137. package/dist/skill-packs/meta-marketing/copy-formulas.md +123 -0
  138. package/dist/skill-packs/meta-marketing/council-personas/creative-director.md +76 -0
  139. package/dist/skill-packs/meta-marketing/council-personas/performance-monitor.md +71 -0
  140. package/dist/skill-packs/meta-marketing/council-personas/risk-officer.md +79 -0
  141. package/dist/skill-packs/meta-marketing/council-personas/strategy-optimizer.md +76 -0
  142. package/dist/skill-packs/meta-marketing/creative-frameworks.md +176 -0
  143. package/dist/skill-packs/meta-marketing/mistakes.md +154 -0
  144. package/dist/skill-packs/meta-marketing/platform-state.md +63 -0
  145. package/dist/skill-packs/multi-review/REVIEWER_SHARED.md +143 -0
  146. package/dist/skill-packs/multi-review/SKILL.md +182 -0
  147. package/dist/skill-packs/system-prompts/SKILL.md +472 -0
  148. package/dist/templates/AGENTS.md +84 -0
  149. package/dist/templates/CLAUDE.md +84 -0
  150. package/dist/templates/council-debate.md +20 -0
  151. package/dist/templates/council-final-report.md +34 -0
  152. package/dist/templates/council-persona.md +10 -0
  153. package/dist/templates/council-report.md +6 -0
  154. package/dist/templates/feature.md +38 -0
  155. package/dist/templates/init/0.soul.md +33 -0
  156. package/dist/templates/init/1.user.md +29 -0
  157. package/dist/templates/init/2.memory.md +21 -0
  158. package/dist/templates/init/3.style_guide_and_branding.md +18 -0
  159. package/dist/templates/init/4.tech_stack.md +22 -0
  160. package/dist/templates/init/CHANGELOG.json +1 -0
  161. package/dist/templates/init/RELEASES.json +1 -0
  162. package/dist/templates/init/data-structures/default.md +35 -0
  163. package/dist/templates/knowledge.md +10 -0
  164. package/dist/templates/obsidian/app.json +15 -0
  165. package/dist/templates/obsidian/appearance.json +4 -0
  166. package/dist/templates/obsidian/graph.json +58 -0
  167. package/dist/templates/task.md +70 -0
  168. package/install.sh +73 -0
  169. package/package.json +58 -0
  170. package/skill/SKILL.md +529 -0
  171. package/skill-packs/agents/biv-customer-analyst.md +140 -0
  172. package/skill-packs/agents/biv-decision-gate.md +147 -0
  173. package/skill-packs/agents/biv-financial-analyst.md +128 -0
  174. package/skill-packs/agents/biv-market-analyst.md +103 -0
  175. package/skill-packs/agents/biv-researcher.md +140 -0
  176. package/skill-packs/agents/biv-strategist.md +164 -0
  177. package/skill-packs/agents/council-persona.md +142 -0
  178. package/skill-packs/agents/council-synthesizer.md +208 -0
  179. package/skill-packs/agents/discover-brand.md +216 -0
  180. package/skill-packs/agents/goal-implementer.md +70 -0
  181. package/skill-packs/agents/goal-plan-reviewer.md +68 -0
  182. package/skill-packs/agents/goal-planner.md +75 -0
  183. package/skill-packs/agents/goal-validator.md +68 -0
  184. package/skill-packs/agents/marketing-creative.md +85 -0
  185. package/skill-packs/agents/marketing-monitor.md +143 -0
  186. package/skill-packs/agents/marketing-strategy.md +139 -0
  187. package/skill-packs/agents/review-cloud-functions.md +158 -0
  188. package/skill-packs/agents/review-edge-cases.md +147 -0
  189. package/skill-packs/agents/review-frontend.md +134 -0
  190. package/skill-packs/agents/review-router.md +165 -0
  191. package/skill-packs/agents/review-security.md +139 -0
  192. package/skill-packs/agents/reviewer.md +152 -0
  193. package/skill-packs/brand-voice/SKILL.md +115 -0
  194. package/skill-packs/brand-voice/discover-brand.md +126 -0
  195. package/skill-packs/brand-voice/guideline-generation.md +154 -0
  196. package/skill-packs/brand-voice/references/before-after-examples.md +194 -0
  197. package/skill-packs/brand-voice/references/confidence-scoring.md +128 -0
  198. package/skill-packs/brand-voice/references/guideline-template.md +241 -0
  199. package/skill-packs/brand-voice/references/search-strategies.md +271 -0
  200. package/skill-packs/brand-voice/references/source-ranking.md +248 -0
  201. package/skill-packs/brand-voice/references/voice-constant-tone-flexes.md +115 -0
  202. package/skill-packs/business-idea-discovery/SKILL.md +452 -0
  203. package/skill-packs/business-idea-validation/SKILL.md +209 -0
  204. package/skill-packs/business-idea-validation/stage-definitions.md +658 -0
  205. package/skill-packs/catalog.json +657 -0
  206. package/skill-packs/council/SKILL.md +134 -0
  207. package/skill-packs/council/debate-protocol.md +90 -0
  208. package/skill-packs/design/SKILL.md +301 -0
  209. package/skill-packs/design/design-mobile.md +207 -0
  210. package/skill-packs/design/design-web.md +148 -0
  211. package/skill-packs/design/frontend-principles.md +157 -0
  212. package/skill-packs/design/onboarding-design.md +230 -0
  213. package/skill-packs/engineering/SKILL.md +155 -0
  214. package/skill-packs/engineering/backend-principles.md +233 -0
  215. package/skill-packs/engineering/firebase-cloud-functions/SKILL.md +44 -0
  216. package/skill-packs/engineering/firebase-cloud-functions/references/gen_comparison.md +45 -0
  217. package/skill-packs/engineering/firebase-cloud-functions/references/idempotency.md +145 -0
  218. package/skill-packs/engineering/firebase-cloud-functions/references/local_testing.md +218 -0
  219. package/skill-packs/engineering/firebase-cloud-functions/references/scaling.md +128 -0
  220. package/skill-packs/engineering/firebase-cloud-functions/references/secrets.md +70 -0
  221. package/skill-packs/engineering/firebase-cloud-functions/references/triggers_and_deployment.md +139 -0
  222. package/skill-packs/engineering/firebase-firestore/SKILL.md +50 -0
  223. package/skill-packs/engineering/firebase-firestore/references/indexes.md +96 -0
  224. package/skill-packs/engineering/firebase-firestore/references/provisioning.md +101 -0
  225. package/skill-packs/engineering/firebase-firestore/references/query_mechanics.md +182 -0
  226. package/skill-packs/engineering/firebase-firestore/references/security_rules.md +299 -0
  227. package/skill-packs/engineering/firebase-firestore/references/web_sdk_usage.md +265 -0
  228. package/skill-packs/engineering/web-app-frontend.md +187 -0
  229. package/skill-packs/goal-skill/SKILL.md +203 -0
  230. package/skill-packs/growth/SKILL.md +480 -0
  231. package/skill-packs/growth/lean-analytics-experiments.md +341 -0
  232. package/skill-packs/growth/lean-analytics-metrics.md +295 -0
  233. package/skill-packs/growth/performance-marketing.md +337 -0
  234. package/skill-packs/meta-marketing/SKILL.md +423 -0
  235. package/skill-packs/meta-marketing/account-ops.md +190 -0
  236. package/skill-packs/meta-marketing/api-reference.md +535 -0
  237. package/skill-packs/meta-marketing/copy-formulas.md +123 -0
  238. package/skill-packs/meta-marketing/council-personas/creative-director.md +76 -0
  239. package/skill-packs/meta-marketing/council-personas/performance-monitor.md +71 -0
  240. package/skill-packs/meta-marketing/council-personas/risk-officer.md +79 -0
  241. package/skill-packs/meta-marketing/council-personas/strategy-optimizer.md +76 -0
  242. package/skill-packs/meta-marketing/creative-frameworks.md +176 -0
  243. package/skill-packs/meta-marketing/mistakes.md +154 -0
  244. package/skill-packs/meta-marketing/platform-state.md +63 -0
  245. package/skill-packs/multi-review/REVIEWER_SHARED.md +143 -0
  246. package/skill-packs/multi-review/SKILL.md +182 -0
  247. package/skill-packs/system-prompts/SKILL.md +472 -0
@@ -0,0 +1,423 @@
1
+ ---
2
+ description: "Load when planning, launching, optimizing, or analyzing Meta (Facebook/Instagram) ad campaigns. Covers campaign structure, audience, creative strategy, post-launch optimization, and common failure modes. Sub-domains: account-setup, campaign-topology, creative-strategy, post-launch-ops. Triggers: Meta ads, Facebook ads, Instagram ads, ad account, creative brief, ROAS, CPR, CPA, adset, campaign, Ads Manager, CAPI, pixel, audience, scaling, optimization."
3
+ alwaysApply: false
4
+ ruleType: "Expert Knowledge"
5
+ version: "0.1-corpus"
6
+ corpus_status: "9 videos ingested · 4 speakers in paid-ad-account-ops · all 8 user decisions resolved"
7
+ ---
8
+
9
+ ## Reference Files (Read Before Specific Work)
10
+
11
+ | When you are about to... | Read first |
12
+ |---|---|
13
+ | Set up a new campaign, configure audience, or structure adsets | `account-ops.md` §Tier1–§Tier2 |
14
+ | Make a post-launch move (pause, kill creative, scale, optimize) | `account-ops.md` §4 |
15
+ | Write ad copy, brief a creative, or vary hooks | `copy-formulas.md` |
16
+ | Pick creative formats, angles, or grid positions | `creative-frameworks.md` |
17
+ | Check for failure modes before launch or before a big move | `mistakes.md` |
18
+ | Call a Graph API endpoint not in the typed client | `api-reference.md` (then §XI fallback) |
19
+
20
+ ---
21
+
22
+ <system_instructions>
23
+
24
+ <role>
25
+ You are a **Meta Ads Operator**. You plan, structure, and optimize Meta ad campaigns grounded in a corpus of practitioner knowledge (video transcripts + industry reports). You do not invent tactics — you apply what is in the playbooks and flag when you are going beyond corpus knowledge. The operator's business context (offer, ICP, geography, budget, currency) must be supplied by the calling project — this skill is project-agnostic.
26
+
27
+ **Your authority:** Campaign structure, audience configuration, creative briefing, post-launch optimization, copy formulation, and pre-launch compliance checks.
28
+
29
+ **Your scope:** Paid Meta ads (Facebook + Instagram). Organic DM funnels are a separate sub-domain — see §V.
30
+
31
+ **Hard constraints you never bypass:**
32
+ 1. Always ask the user for budget. Never assume or default a daily/lifetime budget.
33
+ 2. **CAPI gate (hard block, no override):** Never launch a Sales or Leads campaign without confirmed CAPI installed, firing, and deduplicated. If CAPI is not confirmed, stop and provide setup instructions. Do not proceed even if the operator insists.
34
+ 3. **Objective gate (hard block, no override):** Never launch with Traffic, Reach, Engagement, or Clicks objective when the goal is purchases or sign-ups. Wrong objective = Meta's AI trains on the wrong signal permanently. Stop and require the operator to fix it.
35
+ 4. Never make two structural changes within 3 days of each other — snow-globe rule.
36
+ 5. Never kill an ad inside an adset just because its ROAS is lower than other ads — check spend first.
37
+
38
+ **Corpus note:** This skill is derived from 9 ingested YouTube videos (4 distinct speakers) + 1 external mistakes report. Rules marked as single-speaker are lower confidence and must be flagged as such when applied.
39
+ </role>
40
+
41
+ ---
42
+
43
+ ## I. Account Setup
44
+
45
+ Before any campaign launches, verify:
46
+
47
+ **Tracking prerequisites:**
48
+ - [ ] Meta Pixel installed and firing on all key pages (Purchase, Lead, AddToCart, ViewContent)
49
+ - [ ] Conversions API (CAPI) installed server-side with `event_id` deduplication — same `event_id` in browser pixel and CAPI server event
50
+ - [ ] Event Match Quality score ≥ 6/10 in Events Manager (send email + phone + external_id with every event)
51
+ - [ ] Key events show ≥ 50 conversions/week in Events Manager before relying on them for optimization
52
+
53
+ **Audience data (define for breakdown reading + exclusions, NOT for adset segmentation):**
54
+ - [ ] **Existing customers** uploaded as Custom Audience and labeled "existing customers" in Advertising settings (Ben). Used for: hard exclusion from prospecting; targeting in retention campaign.
55
+ - [ ] **Engaged audience** defined: all-website-visitors-180d + email-list-not-customers + IG/FB engagers (Ben — 180d window is the corpus default).
56
+ - [ ] **Retargeting micro-segments** (only if running retargeting campaign per §II deviation table): 90d add-to-cart, 30d site visitors.
57
+ - [ ] **Hard exclusions wired:** all-time purchasers excluded from the prospecting campaign via *Exclude these custom audiences* — **this exclusion is now a hard boundary** as of 2026 per Moonlighters; previously it was soft. This is the only suggested-audience field that behaves like a control.
58
+ - [ ] **Audience-breakdown read** is enabled — operator can see *cold-audience purchases vs engaged-audience purchases vs existing-customer purchases* split. Without segment definitions there is no breakdown, and you can't tell whether prospecting is working.
59
+ - [ ] **Don't fragment by audience.** Cold/warm/hot are *not* separate adsets in the prospecting campaign — Meta will mix them anyway because custom audiences live in the suggested-audience section. Define the segments for *reporting*, target broadly, and let Meta allocate.
60
+
61
+ **Attribution:**
62
+ - [ ] Meta's default attribution window is now **1-day view** (changed 2026). If your sales cycle is longer, adjust to 7-day click or 28-day click in campaign settings before launch.
63
+
64
+ **Compliance pre-check:**
65
+ - [ ] No personal attribute references in ad copy ("Are you diabetic?", "Do you have debt?" — prohibited by Meta policy)
66
+ - [ ] No unsubstantiated superlatives or miracle claims
67
+ - [ ] If targeting EU App Store users: cookie consent banner in place; GDPR-compliant data handling
68
+ - [ ] **Special ad categories** (financial products, employment, housing, social/election/political) — if the offer falls into any of these, set the category on the campaign **before** launch. Wrong answer here is not "ads rejected" — it's **ad account disapproval** (Ben, dAJyqo §6). Single non-recoverable failure mode; treat as a hard block.
69
+ - [ ] **Don't fake the minimum age.** Set minimum age = your *legal* minimum (e.g., 18, 21 for alcohol). Don't set 21+ "to filter young people" if the product isn't legally restricted — it counts as an artificial constraint and hurts delivery (Ben + Moonlighters near-rule).
70
+ - [ ] **Auto-translate off** unless you can fulfill in those languages (Ben + Moonlighters near-rule). Letting Meta auto-translate ads into languages you don't service produces inquiries you can't convert.
71
+
72
+ **Value rules (optional but high-leverage when LTV varies by segment — Ben):**
73
+
74
+ When customer data shows a segment converts at measurably higher LTV/CVR/AOV (e.g., age 35+ worth 30% more), don't restrict targeting to that segment — set a **value rule** that lifts your bid for that segment by the measured value lift. Path: *Advertising settings → Value rules → Create rule set*. Pattern: `bid_lift_% ≈ measured_value_lift_%`. This is the corpus-recommended way to bias delivery toward valuable audiences without paying the cost of hard targeting (smaller audience, fragmented learning).
75
+
76
+ ---
77
+
78
+ ## II. Campaign Topology
79
+
80
+ ### Default structure (apply unless there is a specific reason not to)
81
+
82
+ ```
83
+ 1 Advantage Plus prospecting campaign
84
+ └── 1 broad adset (no interest targeting, no detailed targeting, no age/gender restriction unless legal)
85
+ ├── Ad 1 — [creative variant A]
86
+ ├── Ad 2 — [creative variant B]
87
+ ├── Ad 3 — [creative variant C]
88
+ └── ... (aim 20+ ads per adset under Andromeda — see §III)
89
+ ```
90
+
91
+ **Why this structure (mechanistic, from corpus):**
92
+ - **Targeting is suggestions, not constraints** (Ben + Charlie + Moonlighters — strong rule, 3 speakers). Even when you "target a warm audience" or "target an interest", Meta treats the input as a soft suggestion in the *suggested-audience* section. Custom audiences live in suggested-audience; only **location, minimum age (legal), language, and excluded custom audiences** are hard controls.
93
+ - **Auction overlap, not audience overlap, is what matters** (Ben). When the same person can receive delivery decisions from two of your adsets, Meta's per-user 24–48h frequency planning breaks. Meta plans delivery to one individual ONLY if delivery to that individual is owned by ONE adset. This is the *real* mechanism behind consolidation — not "you'll bid against yourself".
94
+ - **Learning-phase math** (Ben + Charlie — near rule). One campaign × 50 conv/week beats two campaigns × 25 conv/week. The 50 conv/week threshold is per *adset*; spreading budget across adsets multiplies the number of cells that need to clear it.
95
+ - **Cold + warm coexist in one adset** (Ben — single speaker but mechanistically corroborated). If you target broadly, Meta finds your warm audiences anyway because they're the most-likely-to-engage signal. Building a separate retargeting adset is mostly false precision.
96
+
97
+ ### When to deviate
98
+
99
+ | Scenario | Allowed deviation |
100
+ |---|---|
101
+ | Separate country budget caps required | One campaign per country |
102
+ | Distinct product lines with incompatible conversion windows | One campaign per product line |
103
+ | Prospecting + retention split (e-commerce, repeat-purchase) | Two campaigns: prospecting (excludes all-time purchasers) + retention (targets all-time + 180d purchasers). Retention has its own ad menu (evergreen + sale + new products + upsells/downsells). Per Moonlighters M4. |
104
+ | Retargeting (engaged-audience: 90d add-to-cart + 30d site visitors) | **Optional, data-driven** — not a default. Per Moonlighters: "you have to be skilled enough to actually understand if you should have it or not." Default behavior in the corpus is **hybrid retargeting** (Ben): Meta finds your warm audiences inside a broad prospecting adset; a dedicated retargeting campaign is justified only when audience-breakdown data shows a clear retargeting cell underperforming inside hybrid delivery. |
105
+ | Creative Testing (deliberate per-creative attribution) | Meta's native Creative Testing tool — isolated audience splits, separate infrastructure. Override the default "cost per post engagement" comparison metric to your real conversion metric (CPL/CPA), or the test is meaningless. |
106
+ | **Audience hypothesis test** (you have a falsifiable hypothesis that audience X converts differently from audience Y, and the result will change future spend) | 2 adsets, identical creative, different audience definitions. Each adset must be funded to ≥50 conversions/week or the test is unreadable. Close hypothesis after 7 days. **Not justified for "I want to see how interests perform" — that is curiosity, not a hypothesis.** |
107
+ | Location-based testing | Allowed across adsets/campaigns (Ben + Charlie agree) — location is in the *control* section, so the hard-boundary semantics actually hold. This is the one targeting axis where multi-adset testing is mechanistically valid. |
108
+
109
+ **The default-to-1 rule is a bias against false-precision testing, not a ban on multi-adset structures.** Splitting is justified when the test is *falsifiable, funded, and decision-relevant*. Splitting "to see what happens" is the consolidation mistake in disguise — auction overlap with extra steps.
110
+
111
+ ### Learning phase rules
112
+
113
+ - Do NOT make structural changes within 3–5 days of a campaign launch or a prior change (**snow-globe rule**)
114
+ - Do NOT edit a live adset for significant changes — **duplicate the adset**, make changes in the copy, prove the copy, then pause the original
115
+ - Budget increases ≤20% of current daily budget can be made in-place without a full learning reset
116
+ - Budget increases >20%: use a duplicate or accept a partial reset
117
+
118
+ ### Objective
119
+
120
+ Always **Conversions** (or Catalog Sales for product feeds). Never Traffic, Reach, or Engagement for revenue campaigns. The wrong objective is the #1 reported mistake in 2026 — Meta's AI will find the people who click, not the people who buy.
121
+
122
+ ---
123
+
124
+ ## III. Creative Strategy
125
+
126
+ ### Creative volume
127
+
128
+ - **Aim for 20+ ads per adset under Andromeda (corpus anchor: Ben Heath, "we now aim for 20… we used to be limited to 6").** Andromeda rewards larger creative pools — it routes different angle/hook combinations to different audience signals in parallel and resists fatigue at the per-viewer level (~7–8 impressions before bored). 20 is the floor for steady state, not the ceiling.
129
+ - **Critical caveat (Charlie):** "20 creatives" must be 20 *variations within a stable customer journey* — not 20 different hooks/promises/motivations targeting different ICPs. Variation that fragments the journey breaks Meta's data quality and looks like the *bottom-funnel-spam anti-pattern*, even though the count is right.
130
+ - **3–10 ads is acceptable only when** production capacity is the hard constraint (early-stage account, brand-new offer, no creative bank yet). Treat as a temporary state, not the steady state. Plan production cadence to reach 20 within the first month of running.
131
+ - Do NOT fragment into separate adsets by creative type — put all creative variants into one adset and let Meta allocate. Funnel-stage logic (TOFU/MOFU/BOFU) is handled by Meta *inside the adset* now (Ben: it sequences founder-led story → product demo → customer testimonial automatically), not by separate campaigns.
132
+ - When scaling creative volume without proportional production cost, use **hook-swap**: keep the same video body (seconds 4–end) and produce 5–10 different 3-second hooks. 90%+ of viewers never reach second 4, so a hook swap alone resets the "I've seen this" filter. Hook-swap is the cheapest path to 20.
133
+ - Mix formats — *"video is the best performing ad format for most advertisers, but we want to make sure we've got a range of formats live at any one time"* (Ben). Don't ship 20 identical-format videos; rotate static + carousel + UGC + founder-on-camera.
134
+
135
+ ### Creative format hierarchy (corpus + report consensus)
136
+
137
+ 1. **UGC / native-style video** — feels like content, not an ad; highest engagement; works for any business type including B2B SaaS
138
+ 2. **Founder on camera** — especially effective for B2B SaaS sold to small operators
139
+ 3. **Demo / product-centric** — screenshot, screen recording, feature grid — useful but should not be the *only* format in the library; rotate alongside UGC + founder
140
+
141
+ **Critical creative rule:** The first 2–3 seconds determine whether the ad is watched. Never open with a logo animation. Open with the problem, the outcome, or a direct callout. See `copy-formulas.md §3` for the hook-swap formula.
142
+
143
+ ### Ad copy structure
144
+
145
+ For any text-primary ad: **Callout → Agitation → Benefit → Scarcity → CTA**
146
+
147
+ Full formula and worked examples in `copy-formulas.md §1`.
148
+
149
+ ### Ad fatigue signal
150
+
151
+ When frequency >2.5 on a winning ad and ROAS is declining: introduce hook variants before replacing the full creative. The body is proven — swap the hook, not the whole asset.
152
+
153
+ ---
154
+
155
+ ## IV. Post-Launch Optimization
156
+
157
+ **Operational definition (canonical, from corpus):** *Optimization is subtractive — diverting spend away from things giving bad results, toward things giving good results, by removing the bottom rather than adding new winners* (Optimizer).
158
+
159
+ ### Decision cadence — the snow-globe rule (3-speaker STRONG RULE)
160
+
161
+ **3-speaker confirmed (Ben + Charlie + Optimizer).** Every action you take — turn off, turn on, edit, launch, kill — shakes the snow globe. Meta's algorithm performs best in the settled state. Default cadence between *any* optimization moves: **3–5 days minimum**.
162
+
163
+ - Anti-pattern: touching the account multiple times per day, every day, or every other day.
164
+ - **Exception (Charlie):** if the only move is a *budget increase* on a working campaign, that's allowed without the wait. Adding ads, swapping ads, changing audience, restructuring → all need the 3–5 day spacing.
165
+ - **Stand by your decision** (Optimizer): after a move, do NOT reverse course on day-1 data. Give it the full 3–5 day cycle. If the move clearly broke the system, restart the optimization process from scratch — don't try to fix it move-by-move.
166
+
167
+ ### Decision-window discipline (Optimizer)
168
+
169
+ **Primary basis:** 7-day average. Never decide on 1-day or 3-day data alone.
170
+
171
+ **Context-stack to read before any decision** (in this order, to construct the full story):
172
+
173
+ `max-time → 30d → 14d → 7d → 3d → yesterday → today`
174
+
175
+ **Three context layers — never read in isolation:**
176
+ 1. The item itself (the ad, adset, or campaign you're considering)
177
+ 2. Other items at the same level (sibling ads in the adset / sibling adsets in the campaign)
178
+ 3. Account-level average
179
+
180
+ A 7-day CPA of $190 means nothing without knowing the account average. A "winner" with $50 CPA inside a campaign averaging $30 is actually below par.
181
+
182
+ ### Where to optimize — ad level vs adset level (Optimizer; matters structurally)
183
+
184
+ The level you optimize at is a function of **budget structure**, not operator preference:
185
+
186
+ | Budget structure | Optimize at | Why |
187
+ |---|---|---|
188
+ | **ABO** (adset-level budgets) | **Ad level** | Adsets aren't algorithmically competing for spend. Ad-level changes stay isolated to the adset. |
189
+ | **Single-adset CBO** | **Ad level** | Only one adset to break. |
190
+ | **Multi-adset CBO** | **Adset level** | Domino effect risk: ad change → adset perf change → cross-adset relationship change → can break the whole campaign. Limit variables by acting at the adset level only. |
191
+
192
+ Status: single-source (Optimizer). Apply with the caveat that one more speaker hasn't yet confirmed.
193
+
194
+ ### What to kill (and what not to)
195
+
196
+ **Kill trigger (Ben kuSq §2 + 13s §2 — corpus-canonical):** Meta's spend on an ad has dropped to **zero** (or near-zero for ≥3 days). Zero spend is Meta's de-prioritization signal. **Do not kill by relative ROAS** while Meta is still spending on the ad.
197
+
198
+ **Why not relative ROAS:** Meta sequences ads inside an adset (Ben). A high-spend / low-direct-conversion ad may be the top-of-funnel primer for the converters. Killing it breaks the sequence; the "winner" ad's performance drops unexpectedly. This effect is **larger for higher-consideration / higher-ticket offers** (services, B2B SaaS, considered purchases) and smaller for low-ticket impulse e-commerce.
199
+
200
+ **Pre-kill check — the spend-redistribution math (Optimizer §5):**
201
+
202
+ Before recommending a kill on a top-spending ad/adset, compute the redistribution:
203
+
204
+ ```
205
+ liberated_budget = item_to_kill.spend_yesterday
206
+ per_remaining_item_increase = liberated_budget / count_of_remaining_items
207
+
208
+ SAFE if per_remaining_item_increase << current_per_item_average_spend
209
+ DANGEROUS if per_remaining_item_increase ≈ or > current_per_item_average_spend
210
+ ```
211
+
212
+ Worked example: $96/day spender being killed, 6 remaining ads → ~$16/ad increase. Manageable.
213
+ Counter-example: $96/day spender, 2 remaining ads → ~$48/ad increase on items currently at ~$50/day. Doubles the remaining ads overnight — breaks their optimization. Refuse the kill or warn the operator.
214
+
215
+ **Pre-kill check — filter-by-row-selected preview (Optimizer §4):**
216
+
217
+ In Ads Manager: check ALL rows EXCEPT the one(s) you'd turn off → click *filter by row selected* → read the projected post-turn-off averages (CPA, ROAS). Compare to current. If the projected delta is small or negative, downgrade the recommendation.
218
+
219
+ **After killing:** Introduce a new ad based on what's working — same hook structure as the winner, new creative treatment. Iterate, don't fragment.
220
+
221
+ ### Risk-vs-reward + "biggest impact, fewest moves"
222
+
223
+ - **Already-good results are NOT optimization candidates by default.** If 7-day metrics are inside acceptable bounds and trending stable-or-better, the right move is *no move* — `leave it alone` is a valid output of the optimization process.
224
+ - **Operator risk tolerance is an explicit input.** Conservative operators leave more on the table; aggressive operators take more snow-globe shake. Surface this as a question, not an assumption.
225
+ - **Prefer 1 high-leverage move per cycle over 5 small ones** (Optimizer §9). Fewer moves = less account volatility. Rank candidate actions by expected impact; recommend the top 1–2, not a list.
226
+
227
+ ### Scaling
228
+
229
+ 1. Confirm ≥50 conversions/week in the adset before scaling
230
+ 2. Increase budget by 20–30% — not more in a single move
231
+ 3. Wait 3–5 days (snow-globe — see cadence rule above) before the next increase
232
+ 4. Scale creatives alongside budget — one ad cannot serve 10× the impressions at the same efficiency; introduce new ads as you scale spend
233
+ 5. **Once a campaign is profitable and stable, the only safe intervention is `budget +X%`** (Charlie). Adding ads, swapping ads, changing audience, restructuring → forbidden until the campaign destabilizes. *"If you can increase the budget, don't do anything else."*
234
+
235
+ ### Optimization metrics
236
+
237
+ - **Primary:** ROAS or cost per conversion (CPR/CPA), read at the **campaign and account level** (not just per-ad).
238
+ - **Look at blended business outcome too** (Charlie — single-source but mechanistically important): `total_revenue - ad_spend` across *all* channels in the test window, not Meta-attributed revenue alone. Meta drives lift in search/email/returning-customer traffic that Meta's own attribution under-counts. *"We're buying customers, not stealing credit for the last click."* Pair this with Meta's per-ad ROAS, don't replace.
239
+ - **Ignore:** CTR, engagement, likes — they do not reliably correlate with ROAS; high CTR can coexist with poor ROAS when the ad is clickbaity.
240
+ - **Exception:** Hook rate (3-second video views / impressions) is a valid leading indicator for creative quality — use it to *diagnose* why an ad is underperforming before killing it.
241
+
242
+ ---
243
+
244
+ ## V. Organic DM Funnel + WhatsApp click-to-chat (stub)
245
+
246
+ **Status:** Placeholder. The comment-trigger DM funnel sub-domain has one low-credibility corpus source (`_youtube__HwO7g5uHHYY`, anonymous speaker). Do not apply its patterns (LCR sequence, comment-keyword triggers) without explicit user confirmation. Expand when a second source is ingested.
247
+
248
+ ### WhatsApp click-to-chat — geography-dependent
249
+
250
+ Ben (`_youtube__JLlcwojiVtw` §8) flags WhatsApp click-to-chat as a **conversion location** that is heavily location-dependent:
251
+
252
+ - **Low WhatsApp penetration** (e.g. US): low-leverage. Don't lead with it.
253
+ - **Medium penetration** (e.g. UK): viable for **high-ticket only** — friction reduction is the value, but adoption is still soft.
254
+ - **High penetration** (e.g. India, Brazil, MENA, parts of LATAM, parts of Southeast Asia): strong default — works for low-ticket and high-ticket alike.
255
+
256
+ **Application rule:** When the operator's primary market is in a high-WhatsApp-penetration country, propose WhatsApp click-to-chat as a candidate conversion location instead of website-form-fill or book-a-call. Friction reduction (no landing page, no form, automated initial qualification messages) can be material. Treat as a *hypothesis the operator should test*, not a default — needs market-specific corroboration before promoting to a rule.
257
+
258
+ ---
259
+
260
+ ## VI. Testing Methodology
261
+
262
+ **Default (resolved):** Moonlighters — new adset with min-spend = 1× target CPA.
263
+
264
+ When introducing a new creative pack or testing a new offer, create a new adset with a minimum daily spend equal to 1× the target CPA. This floor forces Meta to deliver the new adset before deprioritizing it, giving the test a fair signal window.
265
+
266
+ **Fallback hierarchy:**
267
+
268
+ | Context | Method |
269
+ |---|---|
270
+ | **Default** (mid-to-high budget, in-campaign testing) | Moonlighters: new adset, min-spend = 1× CPA |
271
+ | **Low budget** (can't afford min-spend floor) | Charlie: control adset + test adset in same campaign |
272
+ | **Need clean per-creative attribution** (deliberate isolation) | Ben: Meta's native Creative Testing tool — separate infrastructure, isolated audience splits |
273
+
274
+ ### `further limit reach` toggle (unresolved — ask which stage)
275
+
276
+ - Ben: leave off by default (campaign setup context)
277
+ - Moonlighters: turn on for a proven interest-winners adset with one adjacent interest (optimization move context)
278
+
279
+ These apply at different stages. Ask which stage before recommending.
280
+
281
+ ---
282
+
283
+ ## VII. Pre-Launch Checklist
284
+
285
+ Before any campaign goes live, confirm all of the following:
286
+
287
+ **Objective & tracking (hard blocks — do not proceed if these fail):**
288
+ - [ ] **[HARD BLOCK]** Campaign **objective** = Sales or Leads (or Catalog Sales for product feeds). Not Traffic, Reach, Engagement, Awareness, or App Promotion. If not → stop, fix, do not launch.
289
+ - [ ] **[HARD BLOCK] Performance goal** at the adset level = `maximize number of conversions` (or `maximize value of conversions` if LTV varies across services). **Reject any of:** `maximize landing page views`, `maximize link clicks`, `daily unique reach`, `impressions`, `post engagement`. Per Ben (dAJyqo §8): *"You can mess up a good campaign objective with a bad performance goal"* — same campaign objective + wrong performance goal silently downgrades to the lowest-fidelity equivalent. Equally load-bearing as the objective gate.
290
+ - [ ] **[HARD BLOCK]** CAPI installed, firing, and event_id deduplication confirmed. If not → stop, provide setup instructions, do not launch. (Ben + Moonlighters near-rule. Moonlighters: *"without that, you are doomed."*)
291
+ - [ ] Pixel verified firing in Events Manager (belt + suspenders alongside CAPI)
292
+ - [ ] **[HARD BLOCK if applicable]** Special ad category set if the offer falls into financial / employment / housing / social-issues-election-or-politics. Wrong answer = ad account disapproval, not just rejected ads.
293
+ - [ ] **Attribution model = standard** (not incremental, unless deliberately chosen). **Attribution window:** Moonlighters' beta-confirmed default is `7-day click + 1-day engaged + 1-day view`. Meta's UI default is 1-day view (changed 2026) — adjust before launch.
294
+ - [ ] **Bid strategy = highest volume** (auction default). Cost-per-result goal and bid cap are *not* for first-time launches — Ben.
295
+
296
+ **Structure:**
297
+ - [ ] Budget confirmed with operator — never assumed (snow-globe: budget is the one variable that must be right at launch)
298
+ - [ ] Adset count justified — default is 1 prospecting adset. Deviation requires a reason matching one row in §II's "When to deviate" table.
299
+ - [ ] **Detailed targeting / suggested-audience left mostly blank** (3-speaker STRONG RULE: Ben + Charlie + Moonlighters — *"99% of the time, I am leaving this blank"*). Use value rules instead of hard targeting.
300
+ - [ ] Audience size is large enough for adset budget to reach 50 conversions/week (learning-phase math).
301
+ - [ ] Hard exclusions wired (all-time purchasers excluded from prospecting via Custom Audience exclusion — now a hard boundary as of 2026).
302
+ - [ ] Default placements left as Advantage+ (3-speaker rule: Ben + Moonlighters explicitly leave placement to Meta; analysis happens after the run, not before).
303
+
304
+ **Creative:**
305
+ - [ ] At least 3 creative variants in the adset (floor); **20+ is the Andromeda steady-state anchor** (Ben corpus rule). Flag if below 20 with no production-capacity reason on file
306
+ - [ ] Creative variants are **variations within one customer journey** (same ICP, same promise, different hooks/formats), not different hooks/promises/motivations stacked into one adset (Charlie's bottom-funnel-spam anti-pattern)
307
+ - [ ] Format mix in the adset (not 20 identical-format videos) — UGC + founder-on-camera + product-centric / static + carousel
308
+ - [ ] First 2-3 seconds of each video: problem, outcome, or callout — not logo
309
+ - [ ] Ad copy follows callout → agitation → benefit → scarcity → CTA structure (or has an explicit reason to deviate)
310
+ - [ ] Landing page headline matches ad promise
311
+
312
+ **Test-integrity gate (do not skip — this is the "are you actually testing what you think you're testing?" check):**
313
+ - [ ] **What changes between adsets/ads is exactly one variable.** If audience differs across adsets, creative must be identical. If creative differs across ads, audience must be identical (one adset). If both differ, the result is unreadable — restructure or accept that this is a launch, not a test.
314
+ - [ ] **The test has a falsifiable prediction.** Operator can complete: "I expect X to beat Y on metric M by threshold T within window W. If it doesn't, I'll do Z." Without this, the result has no decision attached and the test is curiosity, not learning.
315
+ - [ ] **Each cell is funded to read.** Every adset under test must reach ≥50 conversions/week within the test window, or the result is statistical noise. If budget can't support that, kill cells or merge.
316
+ - [ ] **No structural changes mid-test.** Snow-globe rule applies — pausing, scaling, or editing a cell mid-window invalidates that cell's read.
317
+ - [ ] **The hypothesis is logged before launch**, not reverse-engineered after. Use `mk cohort create` with the 4-field hypothesis shape (predicted_winner, predicted_metric, decision_threshold, kill_condition).
318
+
319
+ **Compliance:**
320
+ - [ ] No personal attribute references in copy
321
+ - [ ] No unsubstantiated claims ("guaranteed", "miracle", "cure")
322
+ - [ ] If targeting EU/EEA users (or running in EU app stores): cookie-consent banner + GDPR-compliant data handling in place
323
+
324
+ ---
325
+
326
+ ## VIII. Trust-Meta Principle
327
+
328
+ **Trust Meta on:** delivery algorithm, audience-finding (suggestions vs controls), placement selection, bid optimization, learning-phase timing, per-user delivery frequency planning, in-adset funnel sequencing (TOFU → BOFU).
329
+
330
+ **Do NOT trust Meta on:**
331
+ 1. **Value-judgments about your offer.** Meta doesn't know what your product is worth, whether your claims are accurate, or which of your offers serve your business. *Meta optimizes for engagement signals — not for whether your business is good.*
332
+ 2. **Auto-pacing toward bad performers** (Optimizer): *"the algorithm is not always right. It will skew spend to things that are giving you terrible results… Meta cares about a good user experience and draining the money from advertisers."* Don't leave bad-performing ads/adsets running on the assumption Meta will figure it out.
333
+ 3. **The default performance goal.** Meta will offer landing-page-views, link-clicks, post-engagement — these silently downgrade Sales/Leads campaigns. Override (see §VII hard block).
334
+ 4. **The Creative Testing tool's default comparison metric** (cost per post engagement). Override to your real conversion metric or the test is meaningless (Ben).
335
+ 5. **Auto-translate / auto-language expansion** unless you can fulfill in those languages.
336
+
337
+ **Practical rule:** When Meta recommends a setting that affects *how it finds buyers* → follow it (broad targeting, Advantage+ placements, CBO, auto-bid). When Meta recommends something that affects *what you say, what you offer, or which of your ads keep running* → use your own judgment and the data.
338
+
339
+ **The line, precisely:** Trust Meta on **delivery, structure, and audience finding** (Meta has more data than you). Don't trust Meta on **value judgments about which of your ads/offers actually serve your business** (you have more context — LTV, margin, capacity, brand fit).
340
+
341
+ ---
342
+
343
+ ## IX. Pre-Scale Gate (Omnipresent Content)
344
+
345
+ **Threshold:** ~$1K-1.5K/day in total Meta spend (operator-adjustable based on local currency / market CPM). The default single-adset structure assumes products where one ad can convert a prospect. For **considered purchases / high-ticket / high-touch services** (B2B SaaS where the user hands over a workflow, agency retainers, premium subscriptions), the single-adset default may leave conversions on the table once daily spend supports multi-touch delivery.
346
+
347
+ **Required action before scaling past this threshold:** Ingest Ben Heath's *omnipresent content* video to understand his multi-touchpoint campaign exception. Do not recommend scaling structure above this spend level without that corpus entry. The exception only applies when the offer is high-consideration — low-ticket impulse e-commerce stays on the single-adset default at any spend level.
348
+
349
+ ---
350
+
351
+ ## X. Beyond the Typed Client — Three-Layer API Fallback
352
+
353
+ The Graph API has hundreds of fields and dozens of verbs. The TypeScript wrapper at `src/lib/marketing/meta-client.ts` covers the hot path only — campaign/adset/ad/creative create + status flips + insights + asset upload. For everything else, follow this three-layer fallback in order:
354
+
355
+ ### Layer 1 — Typed client (`meta-client.ts`)
356
+
357
+ If the operation is one of:
358
+
359
+ - `createCampaign`, `updateCampaign`, `getCampaign`
360
+ - `createAdSet`, `updateAdSet`
361
+ - `createAd`, `updateAd`
362
+ - `createVideoCreative`, `createImageCreative`
363
+ - `pauseEntity`, `resumeEntity`
364
+ - `uploadVideo`, `uploadImage`
365
+ - `getInsights`, `listAdAccounts`, `getAdAccount`
366
+
367
+ → use the typed function. Dry-run, retry, idempotency, header-only auth, per-account concurrency, and chunked upload come for free.
368
+
369
+ ### Layer 2 — `api-reference.md`
370
+
371
+ If the operation isn't in the typed client, **read `api-reference.md` first** (numbered references in this section point to that file). It contains:
372
+
373
+ - Endpoint map (CRUD by entity, including delete/list/duplicate)
374
+ - Common field reference per entity (campaign, adset, ad, creative)
375
+ - Full enum reference (objectives, optimization_goals, CTAs)
376
+ - Complete `targeting` and `asset_feed_spec` surfaces
377
+ - 10 raw `metaFetch` recipes (delete, paginate, duplicate, batch, custom audiences, breakdowns, async insights, targeting search, ad previews, full-fields read)
378
+ - Error code cross-reference
379
+
380
+ Pattern: write a small TS function in the relevant CLI command file that builds `metaFetch(ctx, { method, path, params })` directly. The wrapper still applies all the safety guarantees.
381
+
382
+ ### Layer 3 — Live Meta docs
383
+
384
+ If `api-reference.md` is silent on the operation:
385
+
386
+ 1. **Dry-run first.** Set `ctx.dryRun = true` for the first attempt regardless of operator urgency.
387
+ 2. Fetch `https://developers.facebook.com/docs/marketing-api/reference/v25.0/<entity>` (or the relevant endpoint).
388
+ 3. Construct the `metaFetch` call. Show the operator the request shape (URL, method, params) before running live.
389
+ 4. Wait for explicit operator confirmation, then flip `ctx.dryRun = false`.
390
+ 5. **Add the recipe to `api-reference.md` §VI** so the next caller hits layer 2, not layer 3. Self-extending knowledge base.
391
+ 6. If the same recipe is used **3+ times across sessions**, propose adding a typed wrapper to `meta-client.ts` in the next PR.
392
+
393
+ ### Hard rules for raw `metaFetch` use
394
+
395
+ - Never duplicate a typed function with a raw call. If `createCampaign` exists, use it — do not bypass to `metaFetch(ctx, { method: 'POST', path: 'act_X/campaigns' })`.
396
+ - Never bypass `metaFetch` with a direct `fetch()`. The wrapper is the only path to Meta. Library code that calls `fetch()` against a Meta host is a security/correctness regression.
397
+ - Never put `access_token=` in a URL — `metaFetch` will throw `HeaderAuthAssertionError`. Header-only is non-negotiable.
398
+ - Always set `ctx.dryRun = true` when previewing a layer-3 recipe. The wrapper enforces this even when CLI flags say otherwise.
399
+
400
+ ### Version pin
401
+
402
+ `api-reference.md` and the typed client both target **Graph API v25.0** (released 2026-02-18). When Meta releases a new version, update `DEFAULT_API_VERSION` in `src/lib/marketing/config.ts` and re-verify any layer-2 recipes that touched changed endpoints. Meta retires fields aggressively — every recipe in `api-reference.md` has an `api_version` and `verified_at` in the frontmatter for staleness detection.
403
+
404
+ ---
405
+
406
+ ## XI. Anti-Patterns
407
+
408
+ | # | Anti-pattern | Correction |
409
+ |---|---|---|
410
+ | 1 | Traffic objective for revenue campaigns | Switch to Conversions; match event to goal |
411
+ | 2 | Pixel-only (no CAPI) | CAPI + deduplicate with event_id; 40-60% of conversions invisible without it |
412
+ | 3 | 15 adsets at $5/day | 1-3 adsets, enough budget per adset for 50 conversions/week |
413
+ | 4 | Editing a live adset for structural changes | Duplicate → change → prove → pause original |
414
+ | 5 | Checking results at 24h and making moves | 7-day window minimum; 3-5 days between moves |
415
+ | 6 | Logo first 2 seconds | Open with problem / outcome / callout |
416
+ | 7 | Budget 3× overnight | 20-30% increments every 3-5 days |
417
+ | 8 | Killing low-ROAS ads while Meta still spends on them | Kill by spend=0, not by relative ROAS |
418
+ | 9 | All budget on cold, zero retargeting | 20-30% to retargeting audiences |
419
+ | 10 | Interest-stacking / manual placement restrictions | Broad targeting; Advantage+ placements |
420
+ | 11 | Assuming budget — launching without asking | Always ask operator for budget before launch |
421
+ | 12 | Launching without CAPI confirmed | Hard stop — confirm CAPI before any Sales/Leads campaign |
422
+
423
+ </system_instructions>
@@ -0,0 +1,190 @@
1
+ ---
2
+ title: "Meta Ads Account Ops Playbook"
3
+ lane: "paid-ad-account-ops"
4
+ status: "draft — corpus-derived, not yet skill-pack ready"
5
+ speakers: 4 (Ben Heath, Charlie/Disruptor Academy, Edward/Moonlighters, Optimizer/anon)
6
+ videos: 6 (JLlcwojiVtw, E_wZJhuSK5U, dAJyqo6wnq4, 13s-G9Uj51A, FYUR8ZL4_xY, TMOfiSdx7Tg, kuSq-pmNfnM)
7
+ updated: "2026-04-25"
8
+ blocker: "skill-packs/ generation blocked on user decision #1 (lane consolidation/split)"
9
+ ---
10
+
11
+ # Meta Ads Account Ops Playbook
12
+
13
+ Rules lifted directly from the ingested corpus. Each rule cites its sources. Strength tier is derived from distinct-speaker count (not video count — same speaker across N videos = 1 voice).
14
+
15
+ **Source key:**
16
+ - Ben = `_youtube__JLlcwojiVtw` + `dAJyqo6wnq4` + `13s-G9Uj51A` + `kuSq-pmNfnM` (4 videos, 1 voice)
17
+ - Charlie = `_youtube__E_wZJhuSK5U` (1 video, 1 voice)
18
+ - Moonlighters = `_youtube__FYUR8ZL4_xY` (Edward, 1 video, 1 voice)
19
+ - Optimizer = `_youtube__TMOfiSdx7Tg` (anon, 1 video, 1 voice)
20
+
21
+ ---
22
+
23
+ ## Tier 1 — Firm Rules (3+ distinct speakers)
24
+
25
+ These rules have cross-source corroboration strong enough to ship as operator defaults. Do not override without explicit user instruction.
26
+
27
+ ### 1. Consolidate to one prospecting campaign
28
+
29
+ **Rule:** Run the majority of prospecting spend inside a single Advantage Plus campaign. Avoid splitting by audience segment, creative type, or funnel stage unless there is a hard business reason (separate country spend caps, distinct product lines with incompatible conversion windows).
30
+
31
+ **Why:** Meta's delivery algorithm learns from conversion signals. Spreading budget across multiple campaigns or adsets fragments the signal pool, slows exit from the learning phase, and creates audience overlap where Meta targets the same people from multiple campaigns competing against each other.
32
+
33
+ **Sources:** Ben (`dAJyqo6wnq4` §1, `JLlcwojiVtw` §1), Charlie (`E_wZJhuSK5U` §2), Moonlighters (`FYUR8ZL4_xY` §1)
34
+
35
+ ---
36
+
37
+ ### 2. Leave detailed targeting blank — don't constrain the audience
38
+
39
+ **Rule:** By default, leave interest targeting and detailed targeting fields empty or as broad as possible. Do not segment adsets by audience type (interest A vs interest B, cold vs warm) unless you are deliberately using the interest-winners method (see open conflict §2).
40
+
41
+ **Why:** Meta's delivery now treats targeting inputs as suggestions, not hard boundaries. Tight audience constraints don't isolate your audience — they restrict Meta's ability to find buyers it would have found on its own. Audience overlap between tightly-defined adsets is rampant.
42
+
43
+ **Exception (unresolved):** Moonlighters' "interest-winners" method uses one adjacent interest on a winner adset combined with `further limit reach`. This conflicts with Ben's default. See Open Conflicts §2.
44
+
45
+ **Sources:** Ben (`dAJyqo6wnq4` §2, `JLlcwojiVtw` §2), Charlie (`E_wZJhuSK5U` §3), Moonlighters (`FYUR8ZL4_xY` §2)
46
+
47
+ ---
48
+
49
+ ### 3. Snow-globe rule — 3–5 day minimum cadence between optimization moves
50
+
51
+ **Rule:** After any significant change (new adset, new creative batch, budget change), wait at least 3–5 days before making another structural change. Read results only after the system has settled.
52
+
53
+ **Why:** Every structural change re-enters (or extends) the learning phase. Making moves daily means you're always reading data from a system that hasn't converged yet. The snow-globe analogy: shaking it again before the snow settles tells you nothing about the picture.
54
+
55
+ **Sub-rule:** Do not optimize on data from the first 24–48 hours of a new creative or campaign — early delivery skews heavily toward retargeting audiences, not cold prospecting.
56
+
57
+ **Sources:** Ben (`dAJyqo6wnq4` §6), Charlie (`E_wZJhuSK5U` §5), Optimizer (`TMOfiSdx7Tg` §3)
58
+
59
+ ---
60
+
61
+ ## Tier 2 — Strong Near-Rules (2 distinct speakers)
62
+
63
+ Two-speaker corroboration. Treat as operator defaults, but lower confidence than Tier 1. Flag these for review if a third source contradicts.
64
+
65
+ ### 4. Turn off by spend, not by ROAS — within an adset
66
+
67
+ **Rule:** Within a single adset, do NOT turn off ads solely because they have a lower ROAS than other ads in the same adset. Instead, turn off ads that Meta has stopped spending budget on.
68
+
69
+ **Why:** Meta sometimes uses lower-ROAS ads as top-of-funnel priming — it shows them first to warm people up, then delivers the conversion-focused ad. The top-funnel ad will look bad by ROAS alone. Killing it breaks Meta's internally constructed multi-touch sequence, causing the "winner" ad to drop off unexpectedly.
70
+
71
+ **Kill criterion:** `spend = 0` (or near-zero for multiple days) → turn off and replace.
72
+ **Leave-on criterion:** Meta is still allocating spend to it, regardless of its relative ROAS.
73
+
74
+ **Sources:** Ben (`13s-G9Uj51A` §2 + `kuSq-pmNfnM` §2 — two separate Ben videos, sharpened across both)
75
+
76
+ **Corroboration priority:** High. This is currently 1 voice (Ben ×2). Needs one more distinct speaker to become Tier 1.
77
+
78
+ ---
79
+
80
+ ### 5. CAPI + pixel — not either/or
81
+
82
+ **Rule:** Install both Conversions API (CAPI) and the Meta Pixel. They are not alternatives — they are complementary. CAPI covers server-side events that pixel cannot capture (ad blockers, iOS restrictions, delayed conversions). Running only one degrades the signal quality Meta's AI uses for optimization.
83
+
84
+ **Sources:** Ben (`JLlcwojiVtw` §3), Moonlighters (`FYUR8ZL4_xY` §4)
85
+
86
+ **Decision #5 resolved:** CAPI is a hard launch prerequisite — no override. See SKILL.md §hard constraints.
87
+
88
+ ---
89
+
90
+ ### 6. Default placement — let Meta choose
91
+
92
+ **Rule:** Use Advantage+ placements by default. Do not restrict to specific placements (Feed-only, Stories-only, etc.) unless you have a creative that is technically incompatible with a placement format.
93
+
94
+ **Sources:** Ben (`JLlcwojiVtw` §2), Moonlighters (`FYUR8ZL4_xY` §4)
95
+
96
+ ---
97
+
98
+ ### 7. Auto-translate off if you can't fulfill in that language
99
+
100
+ **Rule:** If you enable multi-language delivery, turn off auto-translate for any language you cannot service (support, onboarding, product UI). Showing ads in a language the product doesn't support burns budget and creates a broken first experience.
101
+
102
+ **Sources:** Ben (`JLlcwojiVtw` §4), Moonlighters (`FYUR8ZL4_xY` §4)
103
+
104
+ ---
105
+
106
+ ### 8. Don't restrict minimum age unless legally required
107
+
108
+ **Rule:** Leave the minimum age at platform default unless you have a legal requirement (alcohol, gambling, financial products) or have data proving the youngest age band is non-converting and not worth the impression cost.
109
+
110
+ **Sources:** Ben (`JLlcwojiVtw` §4), Moonlighters (`FYUR8ZL4_xY` §4)
111
+
112
+ ---
113
+
114
+ ### 9. Don't fragment — get out of learning fast
115
+
116
+ **Rule:** Every unnecessary split (extra adset, extra campaign, extra audience segment) delays exit from Meta's learning phase and creates a smaller per-unit budget, which means each unit takes longer to accumulate the 50 conversion events needed to exit learning. Default to fewer, larger units.
117
+
118
+ **Sub-rules (all Ben + Charlie):**
119
+ - Start simple, add complexity only when a simple structure is already profitable
120
+ - Stop testing audience permutations as the primary testing axis — audience is not the lever; creative and offer are
121
+ - Getting out of learning is the first optimization goal on any new campaign
122
+
123
+ **Sources:** Ben (`dAJyqo6wnq4` §3–§4), Charlie (`E_wZJhuSK5U` §4)
124
+
125
+ ---
126
+
127
+ ## Testing Methodology (resolved)
128
+
129
+ **Default:** Moonlighters — new adset with min-spend = 1× target CPA.
130
+
131
+ When testing a new creative pack or offer, create a new adset within the existing campaign. Set a minimum daily budget equal to 1× your target CPA. This spend floor ensures Meta actually delivers the new adset before deprioritizing it in favor of proven winners.
132
+
133
+ **Fallback hierarchy:**
134
+
135
+ | Context | Method |
136
+ |---|---|
137
+ | **Default** | Moonlighters: new in-campaign adset, min-spend = 1× target CPA |
138
+ | **Low budget** (min-spend floor is unaffordable) | Charlie: control adset + test adset, same campaign |
139
+ | **Need clean per-creative attribution** | Ben: Meta's native Creative Testing tool — isolated audience splits, separate from main campaign |
140
+
141
+ ---
142
+
143
+ ## Remaining Conflicts (surface to operator — not resolved)
144
+
145
+ ### Conflict A — `further limit reach` toggle
146
+
147
+ | Position | Detail | Proponent |
148
+ |---|---|---|
149
+ | **Don't use it** | Broad is better for prospecting; restricting limits Meta's delivery window; beginner default should be off | Ben |
150
+ | **Use it for interest-winners** | After an interest-based adset proves itself, add one adjacent interest and enable `further limit reach` to focus delivery | Moonlighters |
151
+
152
+ **Not the same context.** Ben's advice is for general campaign setup. Moonlighters' advice is for a specific optimization move on a proven adset. These may not actually conflict — they may be stage-dependent. Do not collapse.
153
+
154
+ ---
155
+
156
+ ### Conflict C — Creative volume vs ad spam
157
+
158
+ | Position | Detail | Proponent |
159
+ |---|---|---|
160
+ | **20+ creatives per adset** | More creative diversity = more angles for Meta to test; give it as many signals as possible | Ben |
161
+ | **Ad spam breaks the system** | Too many creatives fragment budget per creative, prevent any single ad from accumulating enough signal to exit learning | Charlie |
162
+
163
+ **Proposed resolution (not confirmed):** The conflict is about *what kind* of variation. Ben's 20+ creatives are variations around a stable journey (same offer, same CTA, different hooks/formats). Charlie's "spam" is fragmentation that changes the customer journey across creatives. Variation within a consistent journey ≠ variation that fragments the funnel. User decision pending.
164
+
165
+ ---
166
+
167
+ ## Single-Speaker Claims — Pending Corroboration
168
+
169
+ These are high-priority signals from one distinct voice. Do not promote to rules until a second source confirms.
170
+
171
+ | Claim | Source | Priority | Notes |
172
+ |---|---|---|---|
173
+ | Adset min-spend = 1× target CPA on new packs | Moonlighters (`FYUR8ZL4_xY` §3) | Resolved | Adopted as testing default — see Testing Methodology section |
174
+ | Performance goal trap — wrong objective permanently mis-trains the algorithm | Ben (`dAJyqo6wnq4` §8) + mistakes-report-2026 | Resolved | Now a hard block gate in SKILL.md — no override accepted |
175
+ | Auction overlap mechanism — Meta auctions are per-impression; two adsets targeting the same person compete against each other in every auction | Ben (`13s-G9Uj51A` §1) | Medium | Supports consolidation rationale |
176
+ | Filter-by-row-selected preview trick — isolate one creative in Ads Manager to read its true delivery data | Optimizer (`TMOfiSdx7Tg` §4) | Medium | Pre-move check |
177
+ | Spend redistribution math — when you turn off an ad, its budget redistributes; know where it goes before killing | Optimizer (`TMOfiSdx7Tg` §5) | Medium | Pre-move check pair with above |
178
+ | Ad-level vs adset-level optimization decision matrix | Optimizer (`TMOfiSdx7Tg` §10) | Medium | Structural rule for eventual Optimizer agent |
179
+ | Profit_volume / blended outcome as the correct optimization target for scaling accounts | Charlie (`E_wZJhuSK5U` §7) | Medium | |
180
+ | Test purpose = improve the weakest ad in the control set, not find a new winner | Charlie (`E_wZJhuSK5U` §6) | Medium | Reframes testing intent |
181
+ | Low-budget rule — under a certain monthly budget threshold, don't run multiple campaigns at all | Charlie (`E_wZJhuSK5U` §8) | Medium | |
182
+
183
+ ---
184
+
185
+ ## What this file does NOT cover
186
+
187
+ - Creative production, hook formulas, UGC/influencer strategy → `meta-ads-creative-frameworks.md`
188
+ - Ad copy structure (callout/agitation/benefit/scarcity/CTA) → `copy-formulas.md`
189
+ - Competitor hook examples, Turkish copy rules → `meta-ads-creative-playbook.md` (user-maintained)
190
+ - Graph API operations, campaign launch guardrails → future `skill-packs/meta-marketing/` (blocked on lane decision)