name: video-digest context: orchestrate description: Triage new videos, generate watch recommendations model: opus hooks: Stop: - type: command command: >- test -f "Daily/$(date +%Y)/Daily - $(date +%Y-%m-%d).md" && grep -q "## Video Digest" "Daily/$(date +%Y)/Daily - $(date +%Y-%m-%d).md" statusMessage: "Verifying digest in daily note"
/video-digest
Intelligently triage new videos from subscribed YouTube channels, process selectively based on relevance, and generate a daily digest with watch recommendations.
Usage
/video-digest # Full triage and processing
/video-digest --triage-only # Score videos without processing
/video-digest --report # Show current queue status
/video-digest --watched <video> # Mark video as watched (removes from queue)
Examples
/video-digest
/video-digest --triage-only
/video-digest --watched "YouTube - AI Security Patterns"
Model Strategy
| Phase | Model | Rationale |
|---|---|---|
| RSS fetch | Haiku | Simple data extraction |
| Title/desc triage | Haiku | Fast relevance scoring |
| Worth Processing | Sonnet | Full transcript analysis |
| Quick Capture | Haiku | Brief summary only |
| Digest generation | Sonnet | Quality recommendations |
Instructions
Phase 1: Gather New Videos
Model: Haiku (parallel subagents)
Read subscriptions from
.claude/subscriptions.yamlFor each channel (in parallel), fetch RSS feed:
https://www.youtube.com/feeds/videos.xml?channel_id={{channel_id}}Use
WebFetchwith prompt: "Extract video entries: title, video_id, published_date, description (first 500 chars)"Identify new videos:
- Compare video IDs against
last_video_id - Select videos published since last check
- If first check, take only most recent video
- Compare video IDs against
Collect candidates with basic metadata:
- video_id, title, description, duration (if available)
- channel_name, channel_trust_score, always_watch
Phase 2: Rapid Triage
Model: Haiku
For each candidate video, compute triage score:
Scoring Algorithm
TRParentCorpE_SCORE = (
PROJECT_RELEVANCE * 0.35 + # 0-100
DOMAIN_RELEVANCE * 0.25 + # 0-100
FRESHNESS_BOOST * 0.20 + # 0-100
CHANNEL_TRUST * 0.20 # 0-100 (from trust_score * 5)
)
Relevance Matching
Project Relevance (read .claude/context/projects.md):
Match title + description against project keywords:
| Project | Keywords |
|---|---|
| Beta | ERPSystem, MRO, Swiss-AS, EWS, modernisation, aviation, maintenance |
| Alpha | SAP, DataPlatform, data products, Kafka, Datasphere, integration |
| AlertHub | AWS Bedrock, AI agents, safety, incident, LLM, Claude |
| Delta | AircraftMfg, Gatelink, EFB, aircraft, AvionicsVendor, avionics |
| Cyber Uplift | security, IAM, compliance, LLD, AWS security, threat |
| DataPlatform | data platform, Snowflake, analytics, data engineering |
Domain Relevance (read .claude/rules/tag-taxonomy.md domain/ section):
Match against domain keywords:
domain/engineering: systems, architecture, design, modernisationdomain/data: analytics, data products, streaming, Kafka, databasesdomain/cloud: AWS, Azure, infrastructure, serverless, containersdomain/security: IAM, encryption, compliance, threats, vulnerabilitiesdomain/ai: LLM, agents, machine learning, Claude, GPT, automation
Freshness Boost:
- Check if topic keywords appear in notes modified in last 14 days
- Higher score = more recently active topics
- Use Graph search:
node .claude/scripts/graph-query.js --search="<keywords>" --since=$(date -v-14d +%Y-%m-%d) --json
Channel Trust:
- Use
trust_scorefrom subscriptions.yaml (0-20, default 10) - Scale to 0-100 by multiplying by 5
Boost Keywords
Apply additional boosts from triage_settings.boost_keywords:
boost_keywords:
- keyword: "architecture"
boost: 10
- keyword: "Claude Code"
boost: 15
Never Process Keywords
Skip videos containing triage_settings.never_process_keywords:
never_process_keywords:
- "reaction"
- "drama"
- "podcast"
- "unboxing"
Duration Filtering
Skip videos outside minimum_duration / maximum_duration thresholds.
Category Assignment
| Category | Score Range | Action |
|---|---|---|
| Must Watch | 80-100 | Flag for user with reasoning |
| Worth Processing | 50-79 | Full /youtube processing |
| Quick Capture | 25-49 | Weblink only, brief summary |
| Skip | 0-24 | Log reason, no files created |
Phase 3: Selective Processing
Model: Sonnet (parallel for Worth Processing tier)
Must Watch (80-100)
Do NOT process automatically. Instead:
Update video queue (
.claude/video-queue.yaml):must_watch: - video_id: "abc123" title: "Video Title" url: "https://youtube.com/watch?v=abc123" channel: "Channel Name" score: 92 first_recommended: "2026-02-05T08:00:00Z" always_watch_channel: false reasoning: - "Directly relevant to [[Project - AlertHub]] - discusses AI agent security" - "Knowledge gap: No vault content on 'AI firewall' patterns" - "Channel trust: 2.8 nodes/video historical yield" potential_nodes: 4Include in digest with full reasoning
Worth Processing (50-79)
Launch parallel /youtube processing:
For each video in this tier, invoke
/youtube <url>:- Follow full
/youtubeskill workflow - Create YouTube node with transcript analysis
- Spawn Concept/Pattern nodes as appropriate
- Follow full
Track results:
- Count spawned nodes
- Update
processing_statsin subscriptions.yaml
Quick Capture (25-49)
Model: Haiku
Create minimal Weblink note:
Filename: Weblink - {{sanitised title}}.md
---
type: Reference
title: "{{title}}"
url: "{{youtube_url}}"
domain: youtube.com
createdAt: "{{ISO timestamp}}"
description: "{{brief summary from description}}"
created: { { DATE } }
modified: { { DATE } }
tags:
- video
- activity/research
relatedTo: []
---
# {{title}}
**Channel:** {{channel name}}
**Duration:** {{duration}}
**Source:** [Watch on YouTube]({{url}})
## Summary
{{2-3 sentence summary based on title and description}}
## Relevance
Quick captured due to moderate relevance (score: {{score}}/100).
_Full processing not warranted based on triage criteria._
Skip (0-24)
Log to digest only. No files created.
Phase 4: Queue Management
Check Must Watch Expiry
Read
.claude/video-queue.yamlFor each video in
must_watch:- If
always_watch_channel: true→ Keep in must_watch - If age >
must_watch_expiry_days(default 5) → Move tobacklog
- If
Update queue file with moves
Backlog Structure
backlog:
- video_id: "ghi789"
title: "Older Video"
url: "https://youtube.com/watch?v=ghi789"
channel: "Some Channel"
expired_from_must_watch: "2026-02-05"
original_score: 85
reasoning:
- "Was relevant to [[Project - Beta]]"
Phase 5: Generate Digest
Model: Sonnet
Add ## Video Digest section to today's daily note.
- Find daily note: Check both formats:
Daily/{{year}}/{{YYYY-MM-DD}}.md(actual format used)Daily/{{year}}/Daily - {{YYYY-MM-DD}}.md(documented format)
- Create if missing: Use
/dailyskill - Insert digest section (before
## End of Day Reviewif present, otherwise at end)
Digest Template
## Video Digest
_Generated at {{timestamp}}_
### 📊 Summary
| Category | Count | Action |
| ---------------- | ----- | ---------------------------- |
| Must Watch | {{n}} | Review recommendations below |
| Worth Processing | {{n}} | Auto-processed |
| Quick Capture | {{n}} | Weblink created |
| Skipped | {{n}} | Not relevant |
### 🎯 Must Watch
{{For each must-watch video:}}
#### [[YouTube - {{title}}]] _(not yet created)_
**Channel:** {{channel}} | **Duration:** {{duration}} | **Score:** {{score}}/100
**Why watch:**
{{For each reasoning point:}}
- {{reasoning}}
**If skipped:** Will extract ~{{potential_nodes}} concepts including {{top concepts}}
---
### ✅ Auto-Processed
| Video | Channel | Score | Nodes Created |
| ----- | ------- | ----- | ------------- |
{{For each processed video:}}
| [[YouTube - {{title}}]] | {{channel}} | {{score}} | {{nodes_count}} |
### 📎 Quick Captures
{{For each quick capture:}}
- [[Weblink - {{title}}]] - {{brief reason}}
### ⏭️ Skipped
| Video | Channel | Reason |
| ----- | ------- | ------ |
{{For each skipped video:}}
| "{{title}}" | {{channel}} | {{skip_reason}} |
{{If backlog not empty:}}
### ⏳ When You Get Time (Backlog)
Videos that expired from Must Watch after {{expiry_days}} days:
| Video | Channel | Original Score | Days in Queue |
| ----- | ------- | -------------- | ------------- |
{{For each backlog video:}}
| [[YouTube - {{title}}]] | {{channel}} | {{score}} | {{days}} |
Phase 6: Update State
Update subscriptions.yaml:
- Set
last_checkedto current timestamp - Set
last_video_idto most recent video per channel - Increment
processing_statscounters
- Set
Update video-queue.yaml:
- Add new must-watch videos
- Move expired videos to backlog
- Remove watched videos (via
--watchedflag)
Handling --watched Flag
When invoked as /video-digest --watched <video>:
- Parse video identifier (title or video_id)
- Search
must_watchandbacklogin queue - Remove matching entry
- Confirm removal
Handling --report Flag
When invoked as /video-digest --report:
- Read
.claude/video-queue.yaml - Display summary:
Video Queue Status
==================
Must Watch: {{count}}
{{For each:}}
- "{{title}}" ({{channel}}) - Score: {{score}} - {{days_old}} days old
Backlog: {{count}}
{{For each:}}
- "{{title}}" ({{channel}}) - Expired {{days_ago}} days ago
Last Digest: {{timestamp}}
Handling --triage-only Flag
When invoked as /video-digest --triage-only:
- Execute Phases 1-2 only
- Output scoring results without processing
- Do not update subscriptions.yaml (except last_checked)
- Useful for testing triage algorithm
Quality Standards
- Always generate digest in daily note
- Always provide reasoning for must-watch recommendations
- Always update queue state after execution
- Never process must-watch automatically (user should decide)
- Never create duplicate YouTube nodes for already-processed videos
- Use UK English throughout
- Update subscriptions.yaml after every run
- Track spawned nodes for trust score calibration
Example Output
For a run with 2 channels, 8 new videos:
Video Digest Results
====================
Checked 2 channels, found 8 new videos.
📊 Triage Results:
Must Watch: 1
- "AI Security for Autonomous Agents" (IndyDevDan) - Score: 92
Worth Processing: 2
- "AWS Bedrock Deep Dive" - Score: 68
- "Kafka Streaming Patterns" - Score: 55
Quick Capture: 2
Skipped: 3
✅ Processed 2 videos:
- [[YouTube - AWS Bedrock Deep Dive]] → 2 concepts, 1 pattern
- [[YouTube - Kafka Streaming Patterns]] → 1 concept
📎 Created 2 quick captures:
- [[Weblink - Tech News Weekly]]
- [[Weblink - Developer Productivity Tips]]
📝 Updated today's daily note with digest.
📋 1 video added to must-watch queue.
Error Handling
- RSS fetch fails: Log warning, continue to next channel
- Transcript unavailable: Process with description-only analysis
- Daily note missing: Create using
/dailyskill - Queue file missing: Create with empty arrays
- Config missing: Use default thresholds
Related Skills
/rss-check- Channel subscription management/youtube- Full video processing/daily- Daily note creation/schedule- Scheduled execution setup