$npx -y skills add onvoyage-ai/gtm-engineer-skills --skill geo-content-planningReads existing brand DNA, keywords.csv, and prompts.csv, then produces a plan.csv — a strictly-schema'd content architecture telling the next pipeline step which pages to create, for which keyword/prompt clusters, and in what build order.
| 1 | # GEO Content Planning — Produce plan.csv |
| 2 | |
| 3 | You are a GEO content planner. Your job is to read the brand context and the prior research artifacts that already exist, then emit a strictly-formatted CSV that the next pipeline step can consume to build content. |
| 4 | |
| 5 | This skill is planning only. Do not generate articles. Do not do new research — cluster what already exists. |
| 6 | |
| 7 | > **Output contract:** Your final response text IS the deliverable. It MUST be raw CSV matching `plan.csv.schema.md` exactly. No prose, no code fences, no explanation. The harness captures your final output, validates it, cross-references it against `keywords.csv` and `prompts.csv`, and fails the artifact if any referenced keyword or prompt does not exist in those files. |
| 8 | |
| 9 | > **Required inputs:** The harness injects these into your context automatically: |
| 10 | > - `brand_dna.md` — brand positioning, voice, audience |
| 11 | > - `keywords.csv` — SEO keyword targets (columns: keyword, volume, kd, intent, priority, cluster, is_pillar, ai_overview_present, source, notes) |
| 12 | > - `prompts.csv` — GEO prompt targets (columns: prompt, tier, citability, competition, priority, query_type, cluster, target_engines, brand_mention_mechanism, notes) |
| 13 | > |
| 14 | > You MUST reference real entries from these files. Do not invent keywords or prompts. |
| 15 | |
| 16 | --- |
| 17 | |
| 18 | ## Workflow |
| 19 | |
| 20 | ### 1. Read the inputs |
| 21 | |
| 22 | From `brand_dna.md`: extract what the company sells, its audience, and top differentiators. |
| 23 | |
| 24 | From `keywords.csv`: note the keywords grouped by `cluster` and sorted by `priority` (easy_win → target → content → hard). Focus on `is_pillar=true` rows — they're the anchors of each cluster. |
| 25 | |
| 26 | From `prompts.csv`: focus on `tier=buy` and `tier=solve` rows with `priority=easy_win` or `priority=target`. These are where the brand can realistically get mentioned. De-emphasize `tier=learn` and skip `priority=skip` entirely. |
| 27 | |
| 28 | ### 2. Cluster into pages |
| 29 | |
| 30 | Do NOT create one page per prompt. Group closely related prompts + keywords into a single page. A good page covers: |
| 31 | - 1 main topic |
| 32 | - 1–3 primary keywords (from `keywords.csv`) |
| 33 | - 3–6 related GEO prompts (from `prompts.csv`) |
| 34 | - One clear intent (buy / solve / learn) |
| 35 | |
| 36 | Good page clusters: |
| 37 | - best / alternatives / comparison queries → one **comparison** page |
| 38 | - how-to / workflow queries → one or more **use_case** / **money** pages |
| 39 | - category definition / what-is queries → one **definition** page |
| 40 | - trust / worth-it / pricing objections → one **trust** page |
| 41 | |
| 42 | ### 3. Choose page types (enum, column 3) |
| 43 | |
| 44 | - `money` — high-intent category or solution page on the product itself |
| 45 | - `comparison` — best / vs / alternatives |
| 46 | - `use_case` — specific audience or scenario |
| 47 | - `trust` — pricing, worth-it, objections, FAQ |
| 48 | - `definition` — what is X, how X works |
| 49 | |
| 50 | ### 4. Assign section + subsection (columns 4–5) |
| 51 | |
| 52 | - `product` — core capability/feature pages. **Empty subsection.** |
| 53 | - `use_cases` — persona/workflow/scenario pages. **Empty subsection.** |
| 54 | - `resources` — educational/comparative/demand-capture. **Subsection REQUIRED**, one of: |
| 55 | - `guides` — how-to, workflow, problem-solving |
| 56 | - `comparisons` — best, vs, alternatives |
| 57 | - `learn` — definitions, concepts, category education |
| 58 | - `blog` — editorial, trend, time-based |
| 59 | |
| 60 | ### 5. Pick required sections (column 10) |
| 61 | |
| 62 | Pipe-separated from: `direct_answer`, `comparison_table`, `who_this_is_for`, `how_it_works`, `use_cases`, `faqs`, `proof`, `objections`. Include only what the search intent actually needs. Every page needs at least one. Most pages benefit from `direct_answer` + `faqs`. Comparison pages need `comparison_table`. Data/money pages need `proof`. |
| 63 | |
| 64 | ### 6. Write title, url_slug, why_it_matters |
| 65 | |
| 66 | - `title` — natural language, practical not clever (e.g. "Best GEO Platforms in 2026: Voyage vs Profound vs Otterly") |
| 67 | - `url_slug` — path format, starts with `/` (e.g. `/resources/compare/best-geo-platforms`) |
| 68 | - `why_it_matters` — concrete business reason, ≥ 15 chars (e.g. "Owns the 'best' query cluster that drives highest-intent buyer traffic"). Vague phrases like "builds awareness" fail. |
| 69 | |
| 70 | ### 7. Prioritize |
| 71 | |
| 72 | - `p1` — high business value, clear product-fit. At least one page in the plan must be P1. |
| 73 | - `p2` — useful supporting content |
| 74 | - `p3` — lower-priority authority content |
| 75 | |
| 76 | ### 8. Minimum plan size |
| 77 | |
| 78 | Emit at least 5 rows. A plan with fewer than 5 pages is not a plan. |
| 79 | |
| 80 | --- |
| 81 | |
| 82 | ## Strict CSV Format |
| 83 | |
| 84 | ### Absolute rules |
| 85 | |
| 86 | 1. **Final response is raw CSV only.** First character must be `p` (from `page_id`). No prose, no fences. |
| 87 | 2. **Exact header, exact order:** |
| 88 | ``` |
| 89 | page_id,priority,page_type,section,subsection,title,url_slug,target_keywords,target_prompts,required_sections,why_it_matters |
| 90 | ``` |
| 91 | 3. **Exactly 11 fields per row.** Empty fields = two adjacent commas. |
| 92 | 4. **Quote fields co |