| name | skill-deck-plan |
| description | Pitch deck planning with interactive template, content, and ordering selection |
| allowed-tools | Agent, Bash, Edit, Read, Write, Glob, AskUserQuestion |
Deck Plan Skill
Interactive pitch deck planning skill that gathers user preferences (pattern, theme, content, ordering) via AskUserQuestion pickers before delegating plan generation to deck-planner-agent. Handles preflight/postflight status management and all interactive selection.
IMPORTANT: This skill implements the skill-internal postflight pattern. After the subagent returns,
this skill handles all postflight operations (status update, artifact linking, git commit) before returning.
Context Pointers
Reference (do not load eagerly):
- Path:
.claude/context/formats/subagent-return.md
- Purpose: Return validation
- Load at: Subagent execution only
- Path:
.context/deck/index.json
- Purpose: Library index for building AskUserQuestion options
- Load at: Stage 4.1 (Library Initialization)
Trigger Conditions
This skill activates when:
Direct Invocation
/plan command on a task with language: founder and task_type: deck
- Extension routing lookup finds
routing.plan["founder:deck"]
Task-Type-Based Routing
- Task type is "founder" AND task_type is "deck"
/plan {N} where task {N} has language="founder" and task_type="deck"
When NOT to trigger
Do not invoke for:
- Non-deck founder tasks (use skill-founder-plan)
- Tasks with other language types (general, meta, neovim, etc.)
- Tasks already in [PLANNED] or [COMPLETED] status
Note: The --quick flag is handled inside this skill (skips pattern and theme questions, uses defaults). It is NOT a reason to skip this skill.
Execution
Stage 1: Input Validation
Validate inputs from delegation context:
task_number - Required, integer
session_id - Required, string
if [ -z "$task_number" ]; then
return error "task_number is required"
fi
if [ -z "$session_id" ]; then
return error "session_id is required"
fi
Stage 2 + Stage 3: Preflight Status Update and Postflight Marker
Source skill-base.sh once, then follow @.claude/context/patterns/skill-preflight-flow.md in
full for Stage 2 (preflight status update) and Stage 3 (marker creation):
source .claude/scripts/skill-base.sh
padded_num=$(printf "%03d" "$task_number")
project_name=$(jq -r --argjson num "$task_number" \
'.active_projects[] | select(.project_number == $num) | .project_name' \
specs/state.json)
task_dir="specs/${padded_num}_${project_name}"
mkdir -p "$task_dir"
skill_name="skill-deck-plan"
operation="plan"
Stage 4: Context Preparation
Extract task_type and research_path from state.json:
task_type=$(jq -r --argjson num "$task_number" \
'.active_projects[] | select(.project_number == $num) | .task_type // null' \
specs/state.json)
research_path=$(jq -r --argjson num "$task_number" \
'.active_projects[] | select(.project_number == $num) | .artifacts[] | select(.type == "research") | .path' \
specs/state.json 2>/dev/null | head -1)
Prepare base delegation context (enhanced in Stage 4.4):
{
"task_context": {
"task_number": 234,
"project_name": "{project_name}",
"description": "{description}",
"task_type": "founder",
"task_type": "deck"
},
"research_path": "specs/{NNN}_{SLUG}/reports/01_{short-slug}.md",
"metadata_file_path": "specs/{NNN}_{SLUG}/.return-meta.json",
"metadata": {
"session_id": "sess_{timestamp}_{random}",
"delegation_depth": 2,
"delegation_path": ["orchestrator", "plan", "skill-deck-plan"]
}
}
Stage 4.1: Library Initialization
If .context/deck/index.json does not exist, initialize the deck library from the extension seed:
if [ ! -f .context/deck/index.json ]; then
mkdir -p .context/deck
cp -r .claude/extensions/founder/context/project/founder/deck/* .context/deck/
echo "Initialized deck library from extension seed"
fi
This ensures the reusable deck library is available for building AskUserQuestion options.
Stage 4.2: Load Research Report
Read the research report at research_path. Extract:
- Slide Content Analysis: For each slide, whether content is populated or MISSING
- Appendix Content: Any content listed under "Additional Content for Appendix"
- Information Gaps: Critical vs nice-to-have gaps
- Purpose: Deck purpose (INVESTOR, UPDATE, INTERNAL, PARTNERSHIP)
If no research report exists, return with status "failed" and message: "No research report found. Run /research {N} first."
Stage 4.3: Interactive Questions
Execute 4 sequential AskUserQuestion calls to gather user preferences. Each question uses the structured JSON format.
--quick flag handling: If --quick flag is set in the command arguments, skip questions 1 and 2 (pattern and theme). Use defaults: pattern = "yc-10-slide", theme = "dark-blue". Still execute questions 3 and 4 (content and ordering).
Question 1: Pattern Selection (single select)
Query the library index for available patterns:
jq -r '.entries[] | select(.category == "pattern") | "\(.id)|\(.name)|\(.description)"' .context/deck/index.json
Present via AskUserQuestion:
{
"question": "Select a deck pattern for your pitch deck:",
"header": "Deck Pattern",
"multiSelect": false,
"options": [
{
"label": "YC 10-Slide Investor Pitch",
"description": "Standard Y Combinator format (10 slides) [yc-10-slide]"
},
{
"label": "Lightning Talk",
"description": "5-minute format (5 slides) [lightning-talk]"
},
{
"label": "Product Demo",
"description": "Screenshots, code, demo (8-12 slides) [product-demo]"
},
{
"label": "Investor Update",
"description": "Quarterly update (8 slides) [investor-update]"
},
{
"label": "Partnership Proposal",
"description": "Business partnership (8 slides) [partnership-proposal]"
}
]
}
Build options dynamically from index.json entries where category == "pattern".
Store selected_pattern with the pattern id and slide sequence from the pattern JSON.
Question 2: Theme Selection (single select)
Query the library index for available themes:
jq -r '.entries[] | select(.category == "theme") | "\(.id)|\(.name)|\(.description)|\(.tags.color_schema)"' .context/deck/index.json
Present via AskUserQuestion:
{
"question": "Select a visual theme:",
"header": "Visual Theme",
"multiSelect": false,
"options": [
{
"label": "Dark Blue (AI Startup)",
"description": "Deep navy + blue accents [dark] [dark-blue]"
},
{
"label": "Minimal Light",
"description": "Clean white + blue accent [light] [minimal-light]"
},
{
"label": "Premium Dark (Gold)",
"description": "Near-black + gold accents [dark] [premium-dark]"
},
{
"label": "Growth Green",
"description": "Mint/white + green accents [light] [growth-green]"
},
{
"label": "Professional Blue",
"description": "White + navy/blue [light] [professional-blue]"
}
]
}
Build options dynamically from index.json entries where category == "theme".
Store selected_theme with theme id and config path.
Question 3: Content Selection (multi select per slide position)
For each slide position in the selected pattern:
- Query content library for matching
slide_type entries
- Check research report for available content
- Present existing library content + option to create NEW
Present via AskUserQuestion:
{
"question": "Assign content for each slide position. Select library content or mark as NEW.\n\nSlide 1 (cover): cover-standard, cover-hero, NEW\nSlide 2 (problem): problem-statement, problem-story, NEW\n...",
"header": "Slide Content Assignment",
"multiSelect": true,
"options": [
{
"label": "Slide 1 (cover): cover-standard",
"description": "Standard title + tagline + round"
},
{
"label": "Slide 1 (cover): NEW",
"description": "Create new cover content from research"
},
{
"label": "Slide 2 (problem): problem-statement",
"description": "Bold single-sentence + 3 evidence points"
},
{
"label": "Slide 2 (problem): NEW",
"description": "Create new problem content from research"
}
]
}
Build options dynamically per slide position from index.json content entries + NEW option.
Also ask which slides should be MAIN vs APPENDIX. If the pattern defines default main/appendix split, present that as the default selection.
Validation: If fewer than 3 main slides selected, present a confirmation question:
{
"question": "You selected fewer than 3 main slides. A deck needs at least 3 slides to be useful. Would you like to restart slide selection?",
"header": "Slide Count Warning",
"multiSelect": false,
"options": [
{"label": "Yes, let me select slides again", "description": "Return to content selection"},
{"label": "No, continue with current selection", "description": "Proceed with fewer slides"}
]
}
If "Yes": Repeat Question 3.
Store:
content_manifest: Mapping of slide positions to content IDs or NEW markers
main_slides: Slide positions for the main deck
appendix_slides: Slide positions for appendix
Question 4: Slide Ordering (single select)
Present ordering strategies from the selected pattern:
{
"question": "Select slide ordering strategy:",
"header": "Slide Ordering",
"multiSelect": false,
"options": [
{
"label": "YC Standard",
"description": "Title, Problem, Solution, Traction, Why Us/Now, Business Model, Market, Team, Ask, Closing"
},
{
"label": "Story-First",
"description": "Title, Problem, Solution, Why Us/Now, Traction, Business Model, Market, Team, Ask, Closing"
},
{
"label": "Traction-Led",
"description": "Title, Traction, Problem, Solution, Why Us/Now, Market, Business Model, Team, Ask, Closing"
}
]
}
Build options from selected pattern's ordering_strategies. Filter to only include slides in main_slides.
Store ordering_strategy and final slide_order.
User Abandonment: If the user cancels any AskUserQuestion interaction (empty response or explicit cancel), return with partial status:
Deck planning interrupted by user. No plan created.
Status remains [PLANNING]. Run /plan {N} again to restart.
Stage 4.4: Prepare Enhanced Delegation Context
Bundle all user selections into the delegation context for the agent:
{
"task_context": {
"task_number": 234,
"project_name": "{project_name}",
"description": "{description}",
"task_type": "founder",
"task_type": "deck"
},
"research_path": "specs/{NNN}_{SLUG}/reports/01_{short-slug}.md",
"metadata_file_path": "specs/{NNN}_{SLUG}/.return-meta.json",
"metadata": {
"session_id": "sess_{timestamp}_{random}",
"delegation_depth": 2,
"delegation_path": ["orchestrator", "plan", "skill-deck-plan"]
},
"user_selections": {
"pattern": {"id": "yc-10-slide", "name": "YC 10-Slide Investor Pitch"},