name: comp-scout-compose description: Generate authentic, memorable competition entries (25 words or less) and auto-persist to GitHub issue. Creates multiple variations with different arcs and tones.
Competition Entry Composer
Generate authentic, memorable "25 words or less" competition entries and automatically save to GitHub issue.
Execution Modes
| Mode | Behavior |
|---|---|
| Interactive (default) | Ask for user context, stories, tone preferences |
| Unattended | Use saved stories or generic approach, no prompts |
The comp-scout-daily workflow always invokes this skill in unattended mode.
Interactive Mode
When run interactively, this skill asks:
- "What genuine experience do you have with this brand/product?"
- "Any specific memory or story that relates to the prompt?"
- "Tone preference: funny, sincere, or mix?"
Unattended Mode
When invoked with --unattended or by comp-scout-daily:
- Checks saved stories from CLAUDE.md for keyword matches
- Uses best-matching story, or generic approach if none match
- Generates 3-5 entries with varied arcs
- Auto-persists with recommendation highlighted
- No user prompts - runs end-to-end automatically
What This Skill Does
- Gathers user context to find authentic angles (interactive) or uses saved stories (unattended)
- Generates 3-5 entry variations with different arcs
- Rates and recommends the strongest entries
- Auto-persists entries as comment on GitHub issue
- Adds
entry-draftedlabel to the issue
No manual "please save entries" step required.
Input
- Strategy from
comp-scout-analyze(recommended) - OR competition details (prompt, word_limit, brand)
- User context (personal connection, preferences) - interactive mode
- issue_number (for auto-persist)
Optional flags:
--unattended- Skip all interactive prompts, use saved stories or generic approach
Workflow
Step 0: Check for Matching Saved Stories
Before asking for new context, check if saved stories from the data repo match this competition.
- Fetch saved stories from the data repo's CLAUDE.md:
gh api repos/$TARGET_REPO/contents/CLAUDE.md -H "Accept: application/vnd.github.raw" 2>/dev/null
-
Parse the Saved Stories section for story entries
-
For each story, calculate relevance by matching story keywords against:
- Competition prompt
- Brand/sponsor name
- Prize description
- Strategy themes (if available from comp-scout-analyze)
-
If matching stories found, present them:
I found saved stories that might work for this competition:
1. **Opa's German Christmas** (3 keyword matches: christmas, chocolate, family)
Theme: Nostalgia, heritage, German traditions
2. **Teaching Daughter to Cook** (1 keyword match: kitchen)
Theme: Family moments, passing on traditions
Would you like to use one of these, or provide new context?
-
If user selects a story, use its details for entry composition (skip Step 1)
-
If user provides new context AND it's rich enough to reuse, offer to save:
That's great context! Would you like me to save this as a story for future competitions?
Suggested name: "Sunday BBQ Traditions"
Themes: barbecue, summer, Australian lifestyle
Keywords: bbq, summer, meat, outdoor, gathering
To save a new story, update the data repo's CLAUDE.md with the new story entry.
Step 1: Gather User Context
Before drafting, ask clarifying questions:
Essential:
- What genuine experience or connection do you have with this brand/product?
- Any specific memory or story that relates to the prompt?
Helpful:
- Tone preference: funny, sincere, or mix?
- Anyone you'd nominate instead of yourself? (partner, family member)
- Any personal details that might be relevant? (job, hobby, family situation)
If user has no connection:
- What's generally true for you that could relate?
- What would you actually do with this prize?
- What's the honest version of your situation?
Step 2: Find the Authentic Hook
Generic entries lose. The goal is specificity that makes judges smile in recognition.
Transformation examples:
| Generic | Specific |
|---|---|
| "I love cooking" | "Sunday arvo freezer audit before the weekly shop" |
| "I want to relax" | "Like my shoulders have dropped from my ears" |
| "I like Japan" | "Horseback archery champs, bonsai masters, noodle competitions" |
| "I need ice" | "The person who forgot to refill the ice tray mid-barbecue" |
| "I love coffee" | "The only five minutes that's mine before school run chaos" |
| "I want to travel" | "We've done Japan at full speed. Time to walk it slowly." |
Questions to surface hooks:
- What's actually true for you?
- What's the embarrassing/honest version?
- What specific detail would make a judge smile in recognition?
- What do you already do that relates to this prize/brand?
Step 3: Select Entry Arc Structure
Choose the arc that best fits the tone and content:
Sincere Arc (wellness, luxury, emotional prizes)
Structure:
- Honest admission of current state
- Aspiration or need
- Warm landing
Example (wellness retreat):
"My partner nurtures everyone else first. Always. Her mind, body, and soul have been running on empty. She's earned this."
Comedic Arc (setup → pivot → callback)
Structure:
- Setup (unexpected angle or joke)
- Pivot to genuine substance
- Callback that recontextualises the setup
Example (solar panels):
"Befriend a neighbour with a pool. Run the laundry while the sun shines. I can watch my panels work, while I float!"
Self-Deprecating Arc (relatable failure → redemption)
Structure:
- Confession (the annual shame)
- Constraint (why it persists)
- Resolution (this fixes it)
- Optional undercut (but there's always something else)
Example (ice maker):
"Every summer barbecue I realise I'm the person who forgot to refill the ice tray, and I can't do a servo run mid-barbecue. Finally, I become the host who is prepared for everything—except an empty gas bottle."
List → Pivot Arc (travel, experience prizes)
Structure:
- Quick list establishing credentials ("Done X, Y, Z")
- Identify the gap ("But we've never...")
- Land on the aspiration
Example (Japan walking tour):
"Horseback archery world champs. World's best bonsai. Noodle-making competitions. We've done Japan at full speed. Time to finally walk it slowly."
Sensory Arc (food, beverage, experiential)
Structure:
- Scene-setting
- Vivid sensory detail
- Emotional resonance
Example (early holiday memory):
"Ulladulla at four. Dad handed me my first oyster. Too slimy to chew. Swallowed it whole like a little pelican."
Step 4: Draft Multiple Versions
Generate 3-5 entries with different approaches:
For each entry, provide:
- The entry text
- Word count (must be ≤ word_limit)
- Arc type used
- Approach description
- Landing strength (1-5)
- Notes on why it works
Step 5: Refine Based on Feedback
After user selects a direction:
Tighten word economy:
- Remove redundant words
- Combine phrases
- Use stronger single words instead of phrases
Strengthen the landing:
- Last line should resonate
- Consider callbacks to earlier elements
- Avoid trailing off
Check rhythm:
- Short sentences for punch
- Longer sentences for warmth
- Vary sentence length for flow
Verify compliance:
- Word count within limit
- Addresses the actual prompt
- Authentic to user's voice
Step 6: Final Quality Check
Before delivering final entry:
- Meets word limit exactly or under
- Contains specific detail (not generic)
- Has clear structure/arc
- Landing line is strong
- Authentic to user's voice
- Appropriate tone for sponsor/audience
- No repeated words doing the same job
- No clichés or overused phrases
- Would make a judge smile or nod
Step 7: Auto-Persist to GitHub Issue
Add entries as comment and add label:
# Add entry drafts as comment
gh issue comment $ISSUE_NUMBER -R "$TARGET_REPO" --body "$(cat <<'EOF'
## Entry Drafts
### Option 1 ({word_count} words) ⭐⭐⭐⭐⭐
> {entry_text}
Arc: {arc_type}
Notes: {notes}
### Option 2 ({word_count} words) ⭐⭐⭐⭐
> {entry_text}
Arc: {arc_type}
Notes: {notes}
### Option 3 ({word_count} words) ⭐⭐⭐
> {entry_text}
Arc: {arc_type}
Notes: {notes}
**Recommendation:** Option {n} - {reason}
---
*Generated: {date}*
EOF
)"
# Add label to indicate entries are drafted
gh issue edit $ISSUE_NUMBER -R "$TARGET_REPO" --add-label "entry-drafted"
Step 8: Report Completion
✅ Entries saved to issue #42!
**3 entry options drafted:**
- Option 1 (24 words) ⭐⭐⭐⭐⭐ - Self-deprecating list
- Option 2 (25 words) ⭐⭐⭐⭐ - Confession
- Option 3 (23 words) ⭐⭐⭐ - Practical humour
**Recommendation:** Option 1
**Label added:** `entry-drafted`
(In interactive mode: "Which option do you want to submit?")
Anti-Patterns to Avoid
Tone:
- Generic enthusiasm ("I would love to win!")
- Empty superlatives ("This amazing prize")
- Begging or desperation ("Please pick me")
- Over-explaining the joke
Content:
- Lies or fabricated stories
- Clichés judges will see hundreds of times
- Vague generalities
- Repeated words doing the same job
Structure:
- Flat endings that don't land
- No clear arc or progression
- Starting with "I" (consider varying)
- Wasting words on setup
Special Entry Types
"Why do you deserve to win?" Prompts
- Avoid begging or sad stories unless genuinely relevant
- Frame around appreciation, not desperation
- Self-awareness wins over earnestness
- Consider nominating someone else for emotional weight
Naming Competitions
- Name should be memorable, punchy, ideally wordplay
- Explanation builds the story behind the name
- Consider: cultural references, product features as wordplay, personality
Haiku/Poetry Requests
- Count syllables carefully (5-7-5 for haiku)
- Prioritise imagery over explanation
- Land on a strong final image
Output Format
entries:
- text: "The actual entry text goes here, exactly as it should be submitted."
word_count: 24
arc_type: "self_deprecating"
approach: "Confession → resolution with self-aware undercut"
landing_strength: 4
notes: "Relatable summer hosting struggle, personality in the undercut"
- text: "Second variation with different approach..."
word_count: 23
arc_type: "sincere"
approach: "Problem → vivid consequence → hopeful resolution"
landing_strength: 5
notes: "Strongest landing, 'dignity melts' is memorable"
- text: "Third variation..."
word_count: 25
arc_type: "comedic_list"
approach: "Establish credentials → pivot to weakness"
landing_strength: 3
notes: "Solid structure but landing could be stronger"
recommendation: 1 # 0-indexed
recommendation_reason: "Best balance of specificity, personality, and strong landing"
issue_number: 42
persisted: true
Example Session
User: Write entries for issue #42
Claude: I'll write entries for this competition.
[Reads issue #42]
Competition: Win a $500 Coles Gift Card
Prompt: "Tell us in 25 words or less what you'd buy"
First, a few questions to find your authentic angle:
1. What do you typically buy at Coles?
2. Any specific situation where $500 would help?
3. Tone preference: practical/sincere or humorous?
User: We do our weekly shop there. Always buying for the kids. Would love to
just buy nice things for once instead of bulk snacks and school lunch stuff.
Claude: That's a great angle - the "finally treating yourself" vs endless kid supplies.
## Entry Drafts
### Option 1: Self-Deprecating List (24 words) ⭐⭐⭐⭐⭐
> "Tiny teddies. Zooper doopers. Le Snaks. Cheese stringers. For once, I'd
> fill a trolley with things that aren't in a lunchbox."
Arc: List of kid stuff → pivot to self
Landing: 5/5 - "aren't in a lunchbox" is specific and relatable
### Option 2: Confession (25 words) ⭐⭐⭐⭐
> "I know every lunchbox snack by heart but forgot what cheese I actually
> like. Five hundred dollars of rediscovering my own taste buds."
Arc: Confession → resolution
Landing: 4/5 - "own taste buds" works but slightly abstract
### Option 3: Practical Humour (23 words) ⭐⭐⭐
> "School lunches sorted for a term. Then with whatever's left—maybe
> $4.50—something from the fancy cheese section. Just for me."
Arc: Practical → undercut → treat
Landing: 3/5 - Good but "$4.50" joke might not land for everyone
**Recommendation:** Option 1 - The specific snack names are immediately
recognisable to any parent, and the landing is both relatable and punchy.
[Runs: gh issue comment 42 --body "..."]
[Runs: gh issue edit 42 --add-label "entry-drafted"]
✅ Entries saved to issue #42!
- Added 3 entry options as comment
- Added `entry-drafted` label
Note: When run in unattended mode (via comp-scout-daily), do NOT ask "Which option do you want to submit?" - the workflow will report all results at the end.
Unattended Mode Details
When running in unattended mode (e.g., via comp-scout-daily), the skill:
- Skips all user prompts - No context gathering questions
- Uses saved stories - Matches story keywords to competition prompt/brand
- Falls back to generic - If no story matches, uses strategy themes
- Generates varied arcs - Always produces 3-5 entries with different structures
- Auto-persists immediately - No confirmation needed
Story Matching (Unattended)
The skill reads saved stories from the target repo's CLAUDE.md and matches by:
- Keyword matching - Story keywords vs. competition title, brand, prize, prompt
- Theme matching - Story theme vs. strategy themes (if available)
- Scoring - Rank stories by match count, use best match
If no story matches (score = 0), use generic approach based on:
- Strategy's recommended tone
- Strategy's angle ideas
- Sponsor category defaults
Generic Entry Patterns (No Saved Story)
| Arc Type | Pattern | Example |
|---|---|---|
| Sincere | Honest need → aspiration | "My kitchen sees more takeaway containers than..." |
| Self-deprecating | Confession → resolution | "I've tried every [X], but this is the one..." |
| Sensory | Scene → vivid detail | "The moment when [specific sensory detail]..." |
| List-pivot | Credentials → gap | "I've done X, Y, Z. But never [this prize]." |
| Comedic | Setup → pivot | "My partner says I [quirk]. [Prize] would..." |
Invocation by comp-scout-daily
The daily workflow invokes this skill as:
For each new competition issue (after analyze):
1. Read issue details + strategy comment
2. Load saved stories from CLAUDE.md
3. Run comp-scout-compose with --unattended
4. Entries are auto-persisted as comment
5. entry-drafted label added
Integration
This skill:
- Uses strategy from
comp-scout-analyze(optional but recommended) - Auto-saves entries to GitHub issue
- Adds
entry-draftedlabel for tracking - Can be followed by submission confirmation (add
entry-submittedlabel) - Can be invoked by
comp-scout-dailyin unattended mode