$npx -y skills add matteotitta/claude-code-marketing-quickstart --skill competitor-aggregateSynthesize multiple per-competitor research files (produced by /competitor-research) into a single canonical threat matrix. Writes to marketing/competitors/aggregate.md as the locked canonical version every downstream skill reads. Triggers - "competitor aggregate", "synthesize co
| 1 | # competitor-aggregate — Stage 2 synthesis skill |
| 2 | |
| 3 | Reads every file under `marketing/competitors/*.md` (per-competitor research files produced by `/competitor-research`) and synthesizes them into a single canonical threat matrix. The output is the locked file that downstream skills (positioning, messaging, landing-page-copy, sales-enablement) read. |
| 4 | |
| 5 | This is the **Stage 2 synthesis** step in the article's research → context loop. Stage 1 produces per-item research; Stage 2 locks the canonical version. |
| 6 | |
| 7 | --- |
| 8 | |
| 9 | ## When to use |
| 10 | |
| 11 | - Day 3 of Example 1: after running `/competitor-research` on 3-5 competitors, synthesize them |
| 12 | - Quarterly refresh: re-run after individual competitor dossiers update |
| 13 | - Before refreshing `/positioning` — positioning reads the aggregate, not per-competitor files |
| 14 | |
| 15 | ## When NOT to use |
| 16 | |
| 17 | - When fewer than 2 per-competitor files exist (no aggregation needed yet) |
| 18 | - For deep-diving a single competitor (use `/competitor-research`) |
| 19 | - For sales battlecards (use `/sales-enablement` after aggregate is locked) |
| 20 | |
| 21 | ## How it works |
| 22 | |
| 23 | 1. Inputs: none required (skill auto-discovers all files under `marketing/competitors/*.md` except `aggregate.md` itself) |
| 24 | 2. Reads: every per-competitor dossier in the folder. Excludes the prior `aggregate.md` if one exists (we're rebuilding it). |
| 25 | 3. Produces an aggregate threat matrix with these sections: |
| 26 | - **Threat ranking** — ordered table: competitor name | threat level | category | primary axis of competition |
| 27 | - **Common positioning patterns** — themes shared across competitors (e.g., all 3 lead on "model sophistication") |
| 28 | - **Where the category competes** — the axes the category implicitly accepts as the playing field |
| 29 | - **Where the category doesn't compete** — gaps in the collective positioning that your wedge can exploit |
| 30 | - **Status-quo alternatives synthesized** — single deduplicated list across all competitors |
| 31 | - **Per-competitor wedge summary** — one row per competitor: "where they lose / your wedge against them" |
| 32 | - **Watch list** — events across the set that would change the matrix |
| 33 | 4. Marks the file with `status: locked` frontmatter — signals downstream skills that this is the canonical version |
| 34 | 5. Writes to `marketing/competitors/aggregate.md` (overwrites prior canonical; the prior version is preserved in git history) |
| 35 | |
| 36 | ## Invoke |
| 37 | |
| 38 | ``` |
| 39 | /competitor-aggregate |
| 40 | ``` |
| 41 | |
| 42 | Or scoped to a subset: |
| 43 | ``` |
| 44 | /competitor-aggregate synthesize only 0526-bizible.md and 0526-dreamdata.md |
| 45 | ``` |
| 46 | |
| 47 | ## Example output structure |
| 48 | |
| 49 | ```markdown |
| 50 | --- |
| 51 | status: locked |
| 52 | locked_date: 2026-05-26 |
| 53 | sources: [0526-competitor-a.md, 0526-competitor-b.md, 0526-competitor-c.md] |
| 54 | --- |
| 55 | |
| 56 | # Competitor aggregate — threat matrix (canonical) |
| 57 | |
| 58 | ## Threat ranking |
| 59 | |
| 60 | | Competitor | Threat | Category | Primary axis | |
| 61 | |---|---|---|---| |
| 62 | | Bizible-style | PRIMARY | Multi-touch attribution | Model sophistication | |
| 63 | | Dreamdata-style | PRIMARY | Multi-touch attribution | Salesforce-native depth | |
| 64 | | HockeyStack-style | DIRECT | Marketing attribution | Self-serve mid-market | |
| 65 | |
| 66 | ## Common positioning patterns |
| 67 | ... (3-5 bullet themes) |
| 68 | |
| 69 | ## Where the category doesn't compete (your wedge) |
| 70 | ... (the gap your positioning exploits) |
| 71 | |
| 72 | ## Per-competitor wedge summary |
| 73 | ... (one row per competitor) |
| 74 | ``` |
| 75 | |
| 76 | ## Dependencies |
| 77 | |
| 78 | - **Reads from:** every `marketing/competitors/MMYY-*.md` file (per-competitor dossiers from `/competitor-research`) |
| 79 | - **Writes to:** `marketing/competitors/aggregate.md` (canonical, locked) |
| 80 | - **Downstream readers:** `/positioning`, `/product-messaging`, `/landing-page-copy`, `/sales-enablement` |
| 81 | |
| 82 | ## Customization |
| 83 | |
| 84 | Add a custom dimension to the threat matrix (e.g., "Mid-market vs enterprise split") by editing the section list in this SKILL.md body. The aggregate adapts to whatever sections you specify. |
| 85 | |
| 86 | ## Where this fits in the Example 1 chain |
| 87 | |
| 88 | ``` |
| 89 | Day 1-3: /competitor-research × N → per-competitor files |
| 90 | Day 3: /competitor-aggregate (THIS SKILL) → canonical threat matrix |
| 91 | Day 5: /icp-research reads aggregate.md |
| 92 | W |