| name | comp-scout-daily |
| description | End-to-end automated daily competition workflow. Orchestrates scrape, analyze, compose, and notify skills - all unattended for cron execution. |
Daily Competition Scout
Automated end-to-end workflow for cron/scheduled execution. Orchestrates other skills rather than duplicating their logic.
CRITICAL: Fully Unattended Operation
This skill MUST run completely unattended with NO user prompts.
When this skill is invoked:
- DO NOT ask "Would you like me to..." at any point
- DO NOT wait for user confirmation before persisting
- DO NOT ask permission to analyze or compose entries
- JUST DO IT - scrape, persist, analyze, compose, notify - all automatically
If you find yourself about to ask a question, STOP and use the default behavior instead.
CRITICAL: Check for Duplicates Before Persisting
Each competition should only be stored ONCE, even if it appears on multiple sites.
Before creating any issue, you MUST:
- Get all existing issues:
gh issue list -R $TARGET_REPO --label competition --state all --json number,title,body --limit 500 - For each scraped competition, check if it already exists by:
- URL appears anywhere in any issue body (search full text - issues may have multiple URLs from different sites)
- OR normalized title similarity >80% to any existing issue title
- If URL found in existing issue → SKIP (already tracked)
- If title >80% similar but different URL → add comment to existing issue with the alternate URL
- If truly new (URL not found AND title <80% similar) → create issue
Word limit clarification: "25WOL" is a category name. Competitions with 25, 50, or 100 word limits are all valid - persist them (if new).
Auto-tagging (for-kids, cruise) is for LABELING, not skipping:
- Tagged competitions ARE STILL CREATED as issues (if new)
- They just get a label and are closed automatically
What This Skill Does
This skill is a workflow orchestrator that invokes other skills in sequence:
┌─────────────────┐
│ comp-scout-daily│
└────────┬────────┘
│
▼
┌─────────────────┐ Scrapes listings, fetches details,
│ comp-scout-scrape│────▶ checks duplicates, persists issues
└────────┬────────┘
│
▼ (for each new, non-filtered issue)
┌─────────────────┐
│comp-scout-analyze│────▶ Generates strategy (--unattended)
└────────┬────────┘
│
▼
┌─────────────────┐
│comp-scout-compose│────▶ Drafts entries (--unattended)
└────────┬────────┘
│
▼
┌─────────────────┐
│comp-scout-notify │────▶ Sends email digest
└─────────────────┘
Runs completely unattended - no user prompts during execution.
Prerequisites
ghCLI authenticated- Playwright installed:
pip install playwright && playwright install chromium - Target repository with CLAUDE.md containing user preferences
- SMTP credentials for email notifications (optional)
Invocation
Via Claude Code
"Perform daily competition scout"
"Run the daily comp scout workflow"
"Do the morning competition scrape and analysis"
Via Cron
# Daily at 7am
0 7 * * * claude -p "Perform daily competition scout" >> /var/log/comp-scout.log 2>&1
Workflow
Phase 1: Configuration
Determine target repository and load user preferences:
TARGET_REPO="${TARGET_REPO:-discreteds/competition-scout-25WOL}"
# Fetch user preferences from data repo
gh api repos/$TARGET_REPO/contents/CLAUDE.md -H "Accept: application/vnd.github.raw" 2>/dev/null
Parse from CLAUDE.md:
- Auto-filter keywords (for-kids, cruise, etc.)
- Saved stories for entry composition
- Personal context (partner name, location)
Phase 2: Scrape, Dedupe, and Persist (Automatic)
Execute the scrape workflow directly - no questions asked.
YOU MUST:
- Run the scraper to get listings from both sites
- BEFORE creating any issues, fetch ALL existing issues (open AND closed, limit 500)
- For each scraped competition:
- Search all issue bodies for the scraped URL (full text search, not field match)
- If URL found → SKIP (already tracked)
- If URL not found, check title similarity against all existing titles
- If title >80% similar → add comment to existing issue with alternate URL, don't create new
- If URL not found AND title <80% similar → this is NEW
- Fetch details for NEW competitions only
- Create issues for NEW competitions (no asking)
- Apply auto-filter rules (create + close filtered issues)
Key point: Most scraped competitions will already be tracked. Only create issues for truly new ones.
Output: List of new issue numbers created (usually 0-3 per day)
Phase 3: Analyze Each New Issue (Automatic)
For each new, non-filtered issue: analyze strategy immediately.
YOU MUST:
- Read the issue details
- Determine sponsor category and brand voice
- Generate 5 angle ideas using default tone mapping
- ADD STRATEGY COMMENT IMMEDIATELY (no asking)
DO NOT ask "Would you like me to analyze?" - JUST DO IT.
Phase 4: Compose Entries for Each New Issue (Automatic)
For each new, non-filtered issue: compose entries immediately.
YOU MUST:
- Read the issue + strategy comment
- Load saved stories from target repo CLAUDE.md
- Match story keywords to competition (or use generic)
- Generate 3-5 entry variations with ratings
- ADD ENTRIES COMMENT IMMEDIATELY (no asking)
- ADD entry-drafted LABEL (no asking)
DO NOT ask "Would you like me to compose entries?" - JUST DO IT.
Phase 5: Check Closing Soon
Query for competitions closing within 3 days:
gh issue list -R "$TARGET_REPO" \
--label "competition" \
--state open \
--json number,title,body,labels
Parse closing dates and flag urgent items.
Phase 6: Invoke comp-scout-notify
Delegate to the notify skill for email digest.
Invoke: comp-scout-notify send
Output: Email sent to configured recipients
Phase 7: Output Summary Report
## Daily Competition Scout Report - 2025-12-09
### Summary
- **New competitions:** 5
- **Auto-filtered:** 2 (1 for-kids, 1 cruise)
- **Analyzed and drafted:** 3
- **Duplicates added:** 1
### New Competitions (Ready for Entry)
| Issue | Competition | Closes | Story Used | Recommended |
|-------|-------------|--------|------------|-------------|
| #15 | Win $500 Coles Gift Card | Dec 31 | Generic | Option 2 |
| #16 | Win a Spa Day | Jan 5 | Margot Deserves Pampering | Option 1 |
| #17 | Win Kitchen Appliance | Dec 20 | Generic | Option 3 |
### Auto-Filtered (Created + Closed)
| Issue | Competition | Reason |
|-------|-------------|--------|
| #18 | Win Lego Set | for-kids (keyword: Lego) |
| #19 | Win P&O Cruise | cruise (keyword: P&O) |
### Closing Soon - Action Needed
| Issue | Competition | Days Left | Status |
|-------|-------------|-----------|--------|
| #12 | Woolworths Gift Cards | 1 | entry-drafted |
| #14 | TVSN Prize Pack | 2 | entry-drafted |
### Recommendations
1. **Priority:** #12 closes tomorrow - entry drafted, recommend Option 2
2. **High value:** #16 Spa Day ($500) - entry uses saved story, strong fit
3. **Review:** #17 Kitchen Appliance - closes in 11 days, time to refine
Unattended Operation
The skill makes NO interactive prompts during execution:
| Decision | Automatic Behavior |
|---|---|
| Story selection | Use best keyword-matching saved story, or generic approach |
| Entry generation | All entries drafted with star ratings; recommendation noted |
| Filter decisions | Based on keywords in CLAUDE.md preferences |
| Duplicates | Add comment to existing issue automatically |
| Tone selection | Based on sponsor category (see comp-scout-analyze) |
All choices are logged in the report for user review.
Error Handling
| Error | Behavior |
|---|---|
| Scrape fails for one site | Log error, continue with other site |
| Issue creation fails | Log error, skip to next competition |
| Analyze fails for one issue | Log error, skip compose for that issue |
| Compose fails for one issue | Log error, continue to next issue |
| Notify fails | Log error, report still generated |
| No new competitions | Report "No new competitions found" |
Errors are included in the final report.
Configuration
Environment Variables
TARGET_REPO=discreteds/competition-scout-25WOL
Data Repo CLAUDE.md
Must contain:
- User Preferences: Auto-filter rules with keywords
- Saved Stories: Personal stories for automatic matching (optional)
- Personal Context: Partner name, location, interests
Skill Invocation Pattern
This skill orchestrates - it does not duplicate logic:
| Skill | Invoked By Daily | Mode |
|---|---|---|
| comp-scout-scrape | Yes | Automatic (handles own persistence) |
| comp-scout-analyze | Yes | --unattended flag |
| comp-scout-compose | Yes | --unattended flag |
| comp-scout-notify | Yes | Automatic |
| comp-scout-persist | No | Logic merged into scrape |
Individual skills remain available for interactive use when you want manual control.
Example Cron Log Output
$ claude -p "Perform daily competition scout"
Starting daily competition scout...
Phase 1: Loading configuration
Target repo: discreteds/competition-scout-25WOL
Filter rules: for-kids (9 keywords), cruise (6 keywords)
Saved stories: 2 available
Phase 2: Invoking comp-scout-scrape
competitions.com.au: 8 competitions
netrewards.com.au: 5 competitions
New issues created: #43, #44, #45
Filtered issues (closed): #46, #47
Duplicate comments: #38
Phase 3: Invoking comp-scout-analyze (--unattended)
#43: Strategy added (Food/beverage → Relatable, sensory)
#44: Strategy added (Travel → Discovery, bucket-list)
#45: Strategy added (Tech → Knowledgeable, self-aware humor)
Phase 4: Invoking comp-scout-compose (--unattended)
#43: 3 entries drafted (using saved story: Sunday BBQ)
#44: 4 entries drafted (generic approach)
#45: 3 entries drafted (generic approach)
Phase 5: Checking closing soon
3 competitions closing within 3 days
Phase 6: Invoking comp-scout-notify
Email sent to 2 recipients
## Daily Competition Scout Report - 2025-12-09
[Full report as shown above]
Key Design Principle
DRY (Don't Repeat Yourself): This skill invokes other skills rather than reimplementing their logic. This means:
- Bug fixes in individual skills automatically apply to daily workflow
- Interactive and unattended modes share the same core logic
- Each skill has a single source of truth for its behavior
- Testing individual skills also tests the daily workflow
If you need to change how analysis works, change comp-scout-analyze - the daily workflow will automatically use the updated logic.