Skip to content
Back to skills

Video Digest

ASecurity

Triage new videos, generate watch recommendations

  • 52 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 9, 2026
securityrustgoreactnodeawsazuretestingapidatabasesecurity

Works with

  • claude code
  • api

Security analysis

A100/100

Scanned September 9, 2026

npx -y skills add DavidROliverBA/ArchitectKB --skill video-digest --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Video Digest?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Video Digest
[![Security: A โ€” Skills Directory](https://www.skillsdirectory.com/api/skills/davidroliverba-video-digest/badge)](https://www.skillsdirectory.com/skills/davidroliverba-video-digest)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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)

1. **Read subscriptions** from `.claude/subscriptions.yaml`

2. **For each channel** (in parallel), fetch RSS feed:

   ```
   https://www.youtube.com/feeds/videos.xml?channel_id={{channel_id}}
   ```

   Use `WebFetch` with prompt: "Extract video entries: title, video_id, published_date, description (first 500 chars)"

3. **Identify new videos**:
   - Compare video IDs against `last_video_id`
   - Select videos published since last check
   - If first check, take only most recent video

4. **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, modernisation
- `domain/data`: analytics, data products, streaming, Kafka, databases
- `domain/cloud`: AWS, Azure, infrastructure, serverless, containers
- `domain/security`: IAM, encryption, compliance, threats, vulnerabilities
- `domain/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_score` from subscriptions.yaml (0-20, default 10)
- Scale to 0-100 by multiplying by 5

#### Boost Keywords

Apply additional boosts from `triage_settings.boost_keywords`:

```yaml
boost_keywords:
  - keyword: "architecture"
    boost: 10
  - keyword: "Claude Code"
    boost: 15
```

#### Never Process Keywords

Skip videos containing `triage_settings.never_process_keywords`:

```yaml
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:

1. **Update video queue** (`.claude/video-queue.yaml`):

   ```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: 4
   ```

2. **Include in digest** with full reasoning

#### Worth Processing (50-79)

Launch parallel `/youtube` processing:

1. For each video in this tier, invoke `/youtube <url>`:
   - Follow full `/youtube` skill workflow
   - Create YouTube node with transcript analysis
   - Spawn Concept/Pattern nodes as appropriate

2. **Track results**:
   - Count spawned nodes
   - Update `processing_stats` in subscriptions.yaml

#### Quick Capture (25-49)

**Model:** Haiku

Create minimal Weblink note:

**Filename:** `Weblink - {{sanitised title}}.md`

```markdown
---
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

1. Read `.claude/video-queue.yaml`
2. For each video in `must_watch`:
   - If `always_watch_channel: true` โ†’ Keep in must_watch
   - If age > `must_watch_expiry_days` (default 5) โ†’ Move to `backlog`

3. Update queue file with moves

#### Backlog Structure

```yaml
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.

1. **Find daily note**: Check both formats:
   - `Daily/{{year}}/{{YYYY-MM-DD}}.md` (actual format used)
   - `Daily/{{year}}/Daily - {{YYYY-MM-DD}}.md` (documented format)
2. **Create if missing**: Use `/daily` skill
3. **Insert digest section** (before `## End of Day Review` if present, otherwise at end)

#### Digest Template

```markdown
## 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

1. **Update subscriptions.yaml**:
   - Set `last_checked` to current timestamp
   - Set `last_video_id` to most recent video per channel
   - Increment `processing_stats` counters

2. **Update video-queue.yaml**:
   - Add new must-watch videos
   - Move expired videos to backlog
   - Remove watched videos (via `--watched` flag)

## Handling --watched Flag

When invoked as `/video-digest --watched <video>`:

1. Parse video identifier (title or video_id)
2. Search `must_watch` and `backlog` in queue
3. Remove matching entry
4. Confirm removal

## Handling --report Flag

When invoked as `/video-digest --report`:

1. Read `.claude/video-queue.yaml`
2. 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 `/daily` skill
- **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

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading commentsโ€ฆ

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.