Generate GTM content (emails, LinkedIn messages, call prep) using saved agents, Octave AI, or Claude direct — your choice. Use when user says "generate an email", "write a LinkedIn message", "prep for a call", "create outreach", or asks for single-asset content generation with mode selection.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
A direct command skips the review prompt. Inspect the source before running it.
Generate GTM content (emails, LinkedIn messages, call prep) using saved agents, Octave AI, or Claude direct — your choice. Use when user says "generate an email", "write a LinkedIn message", "prep for a call", "create outreach", or asks for single-asset content generation with mode selection.
/octave:generate - GTM Content Generator
Generate GTM content using your Octave library context. Choose how to generate: run a saved agent for consistency, use Octave's built-in AI, or have Claude draft it directly with Octave context.
Principles
Follow these standards during generation. Read each before producing output.
Content and language:
Editorial rules — no AI-isms, banned vocabulary, honest analyst tone
Presentation principles — use for any visual output (HTML, dashboards, tables); text follows the editorial rules above
Octave data:
Octave value — prioritize grounded workspace data over generic AI content
Octave research toolkit — tool selection (list vs. search) and standard error handling when gathering context for Mode B/C
Entity model — canonical entity types and oId prefixes referenced throughout (persona, product, Motion, Motion ICP, etc.)
Review:
For Mode C (Claude Direct), the content is Claude's own draft: run the review from protocol.md before presenting it — for HTML output the protocol is a mandatory gate; for text output run the preflight and the editorial checks. Modes A and B hand generation to a saved agent or Octave's own generation tools, so the protocol's reviewer pass doesn't apply — those outputs still get the Step 4/5 present-and-refine loop below.
"Run my cold outreach agent" / "use the enterprise agent" → Saved Agent
"Generate an email for..." / "create a sequence" → Octave Default
"Write me an email using our Motion narrative" / "draft this yourself" / "I want more control" → Claude Direct
When Ambiguous, Ask (via AskUserQuestion tool)
When the mode is not obvious from the request, always use the AskUserQuestion tool to present the three options as a UI selector. Never silently default to one mode — let the user choose.
Instructions
When the user runs /octave:generate:
Step 1: Parse the Request
Identify:
Content type (email, linkedin, call-prep, content)
Target person/company if specified
Topic or context
Optional constraints (persona, Motion, etc.)
Generation mode (if --mode flag or clear intent)
Step 2: Determine Generation Mode
Apply smart inference rules from the request wording:
"Run my cold outreach agent" / "use the enterprise agent" → Saved Agent (skip the question)
"Draft this yourself" / "I want more control" / "write it yourself" → Claude Direct (skip the question)
If mode is not obvious from the request, use the AskUserQuestion tool to ask — do NOT default silently:
AskUserQuestion({
questions: [{
question: "How should I generate this?",
header: "Gen mode",
options: [
{ label: "Use a saved agent", description: "I'll find matching agents from your library for consistency and team standards" },
{ label: "Generate with Octave (Recommended)", description: "Octave AI generates using your library context — balanced quality" },
{ label: "I'll draft it directly", description: "I'll pull Octave context, then write it myself — maximum control" }
],
multiSelect: false
}]
})
IMPORTANT: Do not skip this question by defaulting to Octave. If the user didn't explicitly indicate a mode, you MUST ask using AskUserQuestion.
Step 3: Generate (branch by mode)
Mode A: Saved Agent
Map the content type to an agent type and find matching agents:
run_content_agent({
agent: "<agent name or oId>",
person: { ... },
company: { ... },
runtimeContext: "<additional context>"
})
For Call Prep Agents:
run_call_prep_agent({
agent: "<agent name or oId>",
person: { ... },
meetingContext: "<meeting details>"
})
If no agents found:
No [type] agents found in your library.
Options:
1. Generate with Octave (default AI)
2. I'll draft it directly (Claude + Octave context)
3. Browse all agents with the `list_agents` tool
Your choice:
Mode B: Octave Default
Gather context, then call Octave's generation tools directly.
Gather Context:
If person specified, use find_person to get details
If company specified, use find_company to get company info
Use search_knowledge_base to get relevant messaging
Match to appropriate persona and Motion ICP cell
See octave-research-toolkit.md for the full list/search tool tables and standard error-handling responses (Octave connection failed, person/company not found, no matching Motion ICP cell, no proof points, no findings)
For Email Sequences:
generate_email({
person: {
firstName: "<first name>",
lastName: "<last name>",
email: "<email>",
linkedInProfile: "<linkedin url>",
companyName: "<company>",
title: "<job title>"
},
allEmailsContext: "<context for all emails>",
allEmailsInstructions: "<instructions for all emails>",
numEmails: 4
})
For General Content (including LinkedIn):
generate_content({
instructions: "<detailed instructions for content generation>",
customContext: "<additional context>",
person: { /* optional person details */ },
company: { /* optional company details */ }
})
Gather the same Octave context, but Claude generates the content itself — no generate_* MCP calls.
See entity-model.md for the canonical entityType values and oId prefixes used below (persona pe_, product px_, service sc_, competitor cp_, proof point pp_, Motion mot_, Motion ICP micp_).
Gather Context (same as Octave Default):
# Get persona details
search_knowledge_base({ query: "<topic> <persona>", entityTypes: ["persona"] })
get_entity({ oId: "<persona_oId>" })
# Get product details
list_entities({ entityType: "product" })
get_entity({ oId: "<product_oId>" })
# Find the matching Motion + Motion ICP cell for this topic and persona
list_motions()
list_motion_icps({ motionOId: "<motion_oId>" })
find_motion_icp({ motionIcpOId: "<motion_icp_oId>", includeLearnings: true })
# Get proof points
search_knowledge_base({ query: "<topic>", entityTypes: ["proof_point", "reference"] })
# Get brand voice
list_entities(entityType: "brand_voice")
# Get competitive positioning if relevant
search_knowledge_base({ query: "<topic>", entityTypes: ["competitor"] })
Generate directly:
Apply brand voice guidelines to tone and style
Use value props as messaging anchors
Incorporate proof points as evidence
Structure based on content type (email format, LinkedIn format, call prep format, etc.)
Claude has full control over structure, length, and approach
Label the output:
[Content here]
---
Generated by Claude (with Octave context)
Sources: [persona name], [Motion name + Motion ICP cell], [proof points used], [brand voice]
Step 4: Present Generated Content
Format the output clearly with:
The generated content
Context used (persona, Motion ICP cell, brand voice, etc.)
Generation mode used
Suggestions for customization
Step 5: Offer Refinement
What would you like to do?
1. Adjust tone or messaging
2. Add more proof points
3. Create version for a different persona
4. Try a different generation mode
5. Done
Your choice:
Tips
Provide as much context as possible for better results
Specify the persona if you know who you're targeting
Use /octave:research first if you need more info about the recipient
Use --mode agent for repeatable, team-standard sequences
Use --mode claude when you want maximum control over the output
run_email_agent - Run a saved email sequence agent
run_content_agent - Run a saved content generation agent
run_call_prep_agent - Run a saved call prep agent
Context Gathering
find_person / find_company - Research recipients
search_knowledge_base - Find relevant messaging, proof points, personas
get_entity - Get full entity details (persona, product, competitor)
list_motions - List all Motions in the workspace
list_motion_icps - List Motion ICP cells (persona × segment intersections) for a Motion
find_motion_icp - Get full Motion ICP cell narrative (Target ICP overview, Strategic narrative, Pains and consequences, Benefits and impacts, Methodology, References) plus Learning Loop learnings
list_motion_playbooks - List Default + Custom Motion Playbooks under a Motion (when a Thematic / Milestone / Account / Competitive angle applies)
get_motion_playbook - Full details for a Motion Playbook
list_entities (entityType: "brand_voice") - Get brand voice for consistency