Agent skill
comp-scout-daily
End-to-end automated daily competition workflow. Orchestrates scrape, analyze, compose, and notify skills - all unattended for cron execution.
Install this agent skill to your Project
npx add-skill https://github.com/discreteds/competition-scout/tree/main/skills/comp-scout-daily
SKILL.md
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.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
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.
comp-scout-analyze
Generate strategic analysis for competition entries and auto-persist to GitHub issue. Identifies winning tone, themes, and angles based on sponsor type and brand voice.
comp-scout-scrape
Scrape competition websites, extract structured data, and auto-persist to GitHub issues. Creates issues for new competitions, adds comments for duplicates.
comp-scout-notify
Send beautifully formatted HTML digest emails summarizing open competitions, their status, and strategy. Supports dark mode, closing soon highlights, and multiple recipients.
comp-scout-persist
[DEPRECATED] Persistence logic has been merged into comp-scout-scrape. This skill remains for reference only.
edit-article
Edit and improve articles by restructuring sections, improving clarity, and tightening prose. Use when user wants to edit, revise, or improve an article draft.
Didn't find tool you were looking for?