Research source (Exa)
Default: Exa, per .claude/rules/exa-protocol.md (auto-loaded for research, audit, competitor, ICP, AEO, content sourcing, sales prospecting work).
Primary Exa tools for this skill: web_search_exa, company_research_exa. Use case: pre-podcast guest + company research.
Citation: every Exa-derived claim uses [VERIFIED: exa_search, {url}, accessed {YYYY-MM-DD}] per .claude/rules/ontology.md. Quality gate: ≥3 sources per major claim, ≥50% [VERIFIED] confidence, date filter for any "recent / latest" claim, no fallback to WebSearch without flagging.
GTM Engineer School podcast
Turn a single podcast transcript into a complete amplification kit: the Substack post, Matteo's LinkedIn expert post, a guest-voice LinkedIn post (with a soft Cohort 4 CTA), and an outreach email bundling it all for the guest. Every quote traces verbatim to the transcript — no fabrication, no invented promo codes, no generic filler.
Doctrine inherited (Step 7 — 0626 rollout)
Output complies with:
output-tenets.md— the seven tenetsoutput-simplicity.md— length caps, three-layer source placement, robot-tells banai-speak-anti-patterns.md— the 12 patterns LinkedIn voice can't carry- Step 6 calibration: see [[feedback_execution_doctrine_refinements_step6]]
Refinements applied to this skill:
| Code | Refinement | How it lands in gtme-podcast |
|---|---|---|
| R1 | Source placement (three layers) | Substack post + LinkedIn posts + guest email are end-customer-facing. No sources block. Transcript quotes appear inline with attribution to the guest — but no [VERIFIED:...] tags. Source transcript lives in working doc for QA only. |
| R3 | Product-update tone | When the episode features GTME School cohort framing, frame as "Cohort 5 opens [date]" not "we are thrilled to announce Cohort 5." Per [[feedback_gtme_pulse_conventions]] cohort-naming rule. |
| R6 | CTA hierarchy | Substack + LinkedIn posts → soft cohort enrollment as primary CTA, podcast subscribe as fallback. Guest email → reply-to-share primary, social-share as fallback. Cohort naming pulled from current cohort in [[feedback_gtme_pulse_conventions]]. |
| R9 | Action-oriented section names | "Why this episode matters / What [Guest] shipped / How to take [Guest's] approach further" — verb-led + entity-named. |
Claude Code triggers
Invoke when user says:
- "Write up episode S{N}E{M}" (e.g., "S2E1")
- "GTME podcast Substack post"
- "Podcast episode post"
- "Create the episode kit"
- "/gtme-podcast"
- User pastes a podcast transcript and mentions GTM Engineer School
Do NOT invoke when:
- User wants Pulse newsletter → use
gtme-pulse - User wants raw transcript insights only → use
transcript-analysis - User wants Matteo's expert post without the full episode kit → use
linkedin-expert-postsdirectly - User wants a personal/story-style post → use
linkedin-personal-posts
Input requirements
Required
| Input | Description | Source |
|---|---|---|
| Transcript | Full episode transcript text, file path, or YouTube URL | User provides |
| Season number | Integer (default 2 for current season) |
User provides or defaults |
| Episode number | Integer — episode-within-season, NOT cumulative | User provides |
| Guest full name | e.g., "Yash Tekriwal" | User provides |
| Guest role + company | e.g., "Head of Education, Clay" | User provides |
| Guest LinkedIn URL | Used in Substack footer + email | User provides |
Episode numbering convention:
- Season 1 used
E{N}format on Substack (E1–E10, legacy). - Season 2+ uses
S{S}E{E}format (S2E1, S2E2, …). - File naming ALWAYS uses
s{S}e{E}(lowercase), e.g.,s2e1.
Optional but strongly encouraged
| Input | How it helps |
|---|---|
episode_title |
Main topic. If missing, derived from transcript themes. |
guest_company_url |
For Substack footer "Where to find {guest}" |
guest_email |
Required if user wants Gmail draft staged. Skip if email delivered as file only. |
guest_promo_code |
Unlocks secondary CTA in guest LinkedIn post AND partnership section in email. If missing → both omitted, skill flags omission. |
spotify_url, youtube_url, apple_podcasts_url |
Populate email link block. If missing → _placeholder retained. |
| Release date | For context line in email |
Cohort-level config (auto-loaded)
The skill reads the premium reference for: cohort_name, cohort_url, student_discount, guest_commission, referral_dashboard_url. Update once per cohort — never pass per-episode.
Validation
Before proceeding: transcript provided (fetch via youtube-transcript MCP if URL); episode number provided; guest name + role + company + LinkedIn URL provided; cohort config loaded.
If guest_promo_code missing → ask: "No promo code passed — proceed without the Cohort 4 CTA? (yes / provide code / cancel)". Default to proceed without if user confirms.
If any required input missing → ask, don't invent.
Process flowchart
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│ INPUT │─▶│ PHASE 1│─▶│ PHASE │─▶│ PHASE 4│─▶│ PHASE 5│─▶│ PHASE 6│
│ VALID. │ │ INSIGHT│ │ 2–3 │ │ BUNDLE │ │ NOTION │ │ SUMMARY│
│ │ │ ANALYS.│ │ 4 ASSTS│ │ ASSEMB.│ │ PUSH │ │ TO USER│
└────────┘ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘
│
▼
Notion page URL
(last mile — mandatory)
Process
The episode kit runs in 6 phases. Read the premium reference for the full step-by-step.
Phase summary:
- Phase 1 — Transcript analysis. Delegate to
transcript-analysis; save SCQA insights with verbatim quotes + timestamps toinsights.md(audit trail). - Phase 2 — Substack post. 11-section structure following
substack-template.md. 4 takeaways, 4 verbatim blockquotes, 15–20 timestamps, both co-hosts in footer. - Phase 3a — Host LinkedIn post. Chain into
linkedin-expert-postswith the most opinion-worthy POV from the episode + 2–3 verbatim quotes as proof. - Phase 3b — Guest LinkedIn post (inline). Match the guest's voice (NOT Matteo's). Always marked
[DRAFT — edit freely]. Conditional Cohort 4 P.S. iffguest_promo_codeprovided. - Phase 3c — Guest outreach email. Specific-takeaway opener; 🎧 listen / 🧵 host posts / ✏️ embedded guest draft / 💸 conditional partnership block / closing.
- Phase 4 — Bundle assembly. Concatenate all 4 artifacts with
═══ SECTION N ═══dividers into one bundle.md. - Phase 5 — Notion push (mandatory). Resolve the GTME School podcast parent page via
notion-search, thennotion-create-pageswith the bundle as body. Append the Notion sync-back manifest line (<!-- notion: pageId=... url=... published=... last_pulled=... -->) to the localbundle.mdper.claude/rules/notion-protocol.md. - Phase 6 — Delivery summary. Notion page URL + local file paths + promo-code status + unfilled placeholder warnings + next actions.
The Iron Law (inherited from transcript-analysis + extended)
- Every quote traces to transcript. Substack blockquotes, guest LinkedIn paraphrases, email takeaway line — all traceable.
- Core Takeaways reference specific SCQA insights from Phase 1. No invented takeaways.
- Guest bio facts marked inferred if sourced from WebSearch, not user input.
- Tools list contains only tools named in transcript. No "probably mentioned".
- Chapter descriptions correspond to transcript ranges. Rewritten for scannability, not fabricated.
- Guest LinkedIn post must not put words in their mouth. Always marked
[DRAFT — edit freely before publishing]. - Guest email's specific-takeaway line references a real transcript moment. No generic filler.
- Never invent a promo code, discount, commission, or cohort URL. If
guest_promo_codemissing → omit both CTA blocks cleanly and flag in delivery summary. Routing real student signups to a fabricated code is a revenue-integrity failure.
Red flags (stop and verify)
🚩 About to write a Substack quote without a transcript match → STOP. Pull from insights.md verbatim.
🚩 About to render {guest_promo_code} as a literal string → STOP. Either a real code was passed, or the CTA block is absent entirely.
🚩 About to send / auto-stage email without URL placeholders filled → STOP. Always save as draft / file; Matteo fills URLs before sending.
🚩 About to omit Jared from the Substack "Where to Connect" footer → STOP. Template requires both co-hosts.
🚩 About to write the guest LinkedIn post with arrows, em-dash section setups, or Matteo's catchphrases → STOP. Voice must be the guest's, not Matteo's.
Anti-hallucination guardrails
- No invented promo codes, discounts, or commission rates.
- No invented URLs — placeholders stay as
_placeholderstrings until filled. - No invented guest bio details — if guest input is thin, use WebSearch but mark inferred fields.
- No paraphrased "quotes" — if a blockquote appears, it's verbatim from transcript.
- No fabricated tool mentions — category rows skipped if no tools in that category were named.
- No attributing specific statements to the guest in the guest LinkedIn post unless they said it on the pod.
Quality
Per-artifact pre-delivery checklist (Substack / host LI / guest LI / guest email / all artifacts / bundle+GDoc): the premium reference.
Gotchas
- Both hosts in the footer. The Substack template lists Jared Waxman AND Matteo Tittarelli as co-founders. Missing Jared is an obvious error — always verify against
e8-reference.md. - Quotes have no attribution. E8/E10 both show clean blockquotes with no
— Guest, [MM:SS]suffix. Attribution lives ininsights.md, not the published Substack post. - Promo code is conditional, not defaulted. Missing code → both CTAs omitted cleanly. Do NOT fall back to a house code.
- Cohort 4 has no referral dashboard yet. The
Track signups:line in the email is omitted untilcohort-config.mdgets that URL. - Guest LinkedIn post uses guest voice, not Matteo. Single most common failure mode — read aloud and verify.
- URL placeholders stay as placeholders. The Substack post isn't published when the email is drafted. Matteo swaps URLs after publishing.
- Notion push is not optional. The delivery is the Notion page (changed from GDoc 2026-05-25). If push fails, surface the error — don't silently fall back to "here are the local files". The local bundle.md must carry a
<!-- notion: pageId=... -->manifest line after a successful push so the ambient sync-back engine can pull edits back. - File naming is
s{S}e{E}, note{N}. Legacye{N}was Season 1 only. Current and future episodes uses2e1,s2e2, etc. Mismatches break sort order.
Integration with other skills
| Skill | Relationship | Usage |
|---|---|---|
| transcript-analysis | depends_on (Phase 1) |
Extract SCQA insights + verbatim quotes |
| linkedin-expert-posts | depends_on (Phase 3a) |
Generate Matteo's LinkedIn post |
| gtme-pulse | Sibling | Both publish to GTM Engineer School Substack. Share voice + footer conventions |
| voice-reviewer | validates |
Optional gate before delivery — run on Substack + host LI |
| notion (MCP) | feeds_into |
Mandatory Phase 5 — push bundle to branded Notion page under the GTME School podcast parent (changed from create-gdrive 2026-05-25; see .claude/rules/notion-protocol.md) |
File locations (reference)
| File | Purpose |
|---|---|
| the premium reference | Full 6-phase step-by-step |
| the premium reference | Per-artifact pre-delivery checklist |
| the premium reference | Current cohort values — update per cohort |
| the premium reference | Substack post template with placeholders |
| the premium reference | Guest-voice post template + voice calibration |
| the premium reference | Outreach email template + conditional rendering |
| the premium reference | Gold-standard filled example (E8 — Nico Druelle, Season 1 legacy format) |
| the premium reference | One-doc-all-assets layout for the Notion push (Phase 4 + 5) |
Final ship gate
Run /premortem --output before ship. See /premortem skill for the 5 execution domains (will-it-resonate / will-it-convert / will-it-stay-on-brand / will-stakeholder-push-back / will-it-degrade-over-time) and output template.
Trivial-case escape: ## Premortem\nNo failure modes — trivial change satisfies the contract for genuinely trivial outputs.
Persuasion & stickiness pass
Output complies with persuasion-and-stickiness.md — Cialdini's 7 persuasion levers + Heath's SUCCESs. Deploy the 1-2 Cialdini levers that fit the reader's barrier (never all seven; every lever must be TRUE), run the SUCCESs diagnostic (Simple / Unexpected / Concrete / Credible / Emotional / Stories) over the near-final draft, then the rule's pre-ship gate.