Back to skills
extension
Category: Development & EngineeringNo API key required

comp-scout-compose

Generate authentic, memorable competition entries (25 words or less) and auto-persist to GitHub issue. Creates multiple variations with different arcs and tones.

personAuthor: jakexiaohubgithub

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

  1. Gathers user context to find authentic angles (interactive) or uses saved stories (unattended)
  2. Generates 3-5 entry variations with different arcs
  3. Rates and recommends the strongest entries
  4. Auto-persists entries as comment on GitHub issue
  5. Adds entry-drafted label 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.

  1. 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
  1. Parse the Saved Stories section for story entries

  2. 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)
  3. 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?
  1. If user selects a story, use its details for entry composition (skip Step 1)

  2. 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:

  1. Honest admission of current state
  2. Aspiration or need
  3. 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:

  1. Setup (unexpected angle or joke)
  2. Pivot to genuine substance
  3. 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:

  1. Confession (the annual shame)
  2. Constraint (why it persists)
  3. Resolution (this fixes it)
  4. 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:

  1. Quick list establishing credentials ("Done X, Y, Z")
  2. Identify the gap ("But we've never...")
  3. 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:

  1. Scene-setting
  2. Vivid sensory detail
  3. 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:

  1. Skips all user prompts - No context gathering questions
  2. Uses saved stories - Matches story keywords to competition prompt/brand
  3. Falls back to generic - If no story matches, uses strategy themes
  4. Generates varied arcs - Always produces 3-5 entries with different structures
  5. Auto-persists immediately - No confirmation needed

Story Matching (Unattended)

The skill reads saved stories from the target repo's CLAUDE.md and matches by:

  1. Keyword matching - Story keywords vs. competition title, brand, prize, prompt
  2. Theme matching - Story theme vs. strategy themes (if available)
  3. 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-drafted label for tracking
  • Can be followed by submission confirmation (add entry-submitted label)
  • Can be invoked by comp-scout-daily in unattended mode