Score UGC videos for virality before publishing
Virality Scoring

Score UGC videos for virality before publishing. 7 criteria, 0-100 each.
---
name: scrollclaw-score
description: "Score UGC videos for virality before publishing. 7 criteria, 0-100 each. Only 70+ gets published."
metadata:
openclaw:
emoji: "📊"
user-invocable: true
triggers:
- "score video"
- "virality score"
- "ugc score"
- "rate ugc"
- "video quality check"
---
# Virality Scoring
Score every video before publishing. Read `references/virality-scoring.md` for the full methodology.Overview
Score every video before publishing. Read references/virality-scoring.md for the full methodology.
What you get
- Producesone score card per clip, a go/no-go decision, and appended learnings
- Formatmarkdown files in workspace/campaigns/<slug>/scores/ plus append-only entries in learnings.md
- Default behaviorscore every final clip against the 7 dimensions and route the user back to the failing stage if the score is below 70
- Downstream usepublish/no-publish decision and future campaign learnings
Manual install (npx, ZIP)
Claude Code
npx skills add TheMattBerman/scrollclaw --skill scrollclaw-score -g -a claude-codeClaude Code (manual)
mkdir -p ~/.claude/skills && curl -sL https://codeload.github.com/TheMattBerman/scrollclaw/tar.gz/ea175d4b62fd \
| tar -xz -C ~/.claude/skills --strip-components=1 scrollclaw-ea175d4b62fd/scoreWindows (PowerShell)
New-Item -ItemType Directory -Force "$HOME\.claude\skills" | Out-Null; Invoke-WebRequest "https://m.agentalley.io/zip/a6ff1d80965765cd51c1/score.zip" -OutFile "$env:TEMP\score.zip"; Expand-Archive "$env:TEMP\score.zip" -DestinationPath "$HOME\.claude\skills" -ForceClaude.ai / desktop
Codex, Cursor, other agents
Connects with Agent Alley MCP · agentalley.io/mcp
Files included
SKILL.md4.8 KBreferences/1 file · 4.8 KB
Read the files here
TheMattBerman/
Shared references2SKILL.md reads these from elsewhere in the repo. Not in the ZIP.
Get them on GitHub ↗SKILL.md
Show the full text136 lines
Virality Scoring
Score every video before publishing. Read references/virality-scoring.md for the full methodology.
Criteria
7 dimensions, scored 0-100 each:
- Hook Strength — Does frame 1 + first 3 seconds force a pause?
- Emotional Impact — Does it trigger a visceral response (not just "interesting")?
- Pacing — Does every second earn the next second?
- Text Readability — Are captions legible on mobile, properly timed?
- Scroll-Stop Power — Would this stop a thumb mid-scroll in a feed?
- Completion Likelihood — Will viewers watch to the end?
- Shareability — Would someone send this to a friend?
Thresholds
| Score | Action |
|---|---|
| 70+ | Publish. Ship it. |
| 60-69 | Polish — specific fixes can save it. Identify which dimensions are dragging. |
| Below 60 | Regenerate. Don't polish a bad clip. Go back to the failing stage. |
Process
- Watch the final video on a phone screen, in-app, scrolling past it like a user
- Score each dimension independently
- Calculate average
- If below threshold, identify the weakest dimensions
- Route back to the appropriate skill:
- Hook/scroll-stop weak →
/first-frame(regenerate canonical face) - Pacing/completion weak →
/persona(restructure script) - Emotional impact weak →
/persona(better language from research) - Text readability weak →
/assemble(fix captions) - Audio/voice issues →
/assemble(re-run S2S)
- Hook/scroll-stop weak →
Brand Memory Integration
Reads
| File | Purpose |
|---|---|
workspace/campaigns/<slug>/clips/final-*.mp4 |
Video(s) to score |
workspace/campaigns/<slug>/brief.md |
Original campaign goals — score against intent, not just virality |
workspace/campaigns/<slug>/persona-research.md |
Whether the script language matches real customer language |
Writes
| File | Notes |
|---|---|
workspace/campaigns/<slug>/scores/score-<version>.md |
Score card with per-dimension breakdown and go/no-go |
workspace/campaigns/<slug>/learnings.md |
Append-only — what worked, what didn't, threshold notes |
Context loading
📊 Score context loaded:
✓ Campaign: ridge-q1
✓ Final clips: 2 (workspace/campaigns/ridge-q1/clips/final-*.mp4)
✓ Brief: workspace/campaigns/ridge-q1/brief.md
✓ Persona research: workspace/campaigns/ridge-q1/persona-research.md
Learnings append format
After every score, append to workspace/campaigns/<slug>/learnings.md:
## YYYY-MM-DD — <campaign-slug> <format>
**Score:** <average>/100 (<go/no-go>)
**Dimension breakdown:** Hook <n> | Emotional <n> | Pacing <n> | Captions <n> | Scroll-stop <n> | Completion <n> | Share <n>
**What worked:**
- [specific finding]
**What didn't:**
- [specific finding]
**Remediation:** [if no-go: which skill to route back to and why]
Never overwrite this file. Only append.
Contract
Input
- Required: at least one final assembled clip
- Optional: campaign brief, persona research, prior campaign learnings
- Format: workspace video files plus markdown context
- Source:
/assemble,workspace/campaigns/<slug>/brief.md, andpersona-research.md
Output
- Produces: one score card per clip, a go/no-go decision, and appended learnings
- Format: markdown files in
workspace/campaigns/<slug>/scores/plus append-only entries inlearnings.md - Default behavior: score every final clip against the 7 dimensions and route the user back to the failing stage if the score is below 70
- Downstream use: publish/no-publish decision and future campaign learnings
Validation
- Pre-conditions: final clip exists and is watchable end to end
- Post-conditions: score includes a dimension breakdown, a threshold decision, and clear remediation if needed
- Failure checks: do not recommend publishing without a real breakdown; if the clip is unscorable or missing context, flag the gap explicitly
Output
- Virality score card in
workspace/campaigns/<slug>/scores/score-<version>.md - Go/no-go decision
- Learnings appended to
workspace/campaigns/<slug>/learnings.md - If no-go: specific remediation routing
Batch Scoring
For campaign batches, score all variants and rank. Publish only the 70+ tier. Below-60 variants get regenerated, not tweaked.
bash scripts/batch-campaign.sh \
--workspace workspace/campaigns/<slug> \
--creators workspace/campaigns/<slug>/creators/ \
--formats "talking-head,pov-demo,podcast-clip" \
--dual-output
| 1 | |
| 2 | name scrollclaw-score |
| 3 | description "Score UGC videos for virality before publishing. 7 criteria, 0-100 each. Only 70+ gets published." |
| 4 | metadata |
| 5 | openclaw |
| 6 | emoji "📊" |
| 7 | user-invocable true |
| 8 | triggers |
| 9 | - "score video" |
| 10 | - "virality score" |
| 11 | - "ugc score" |
| 12 | - "rate ugc" |
| 13 | - "video quality check" |
| 14 | |
| 15 | |
| 16 | # Virality Scoring |
| 17 | |
| 18 | Score every video before publishing. Read `references/virality-scoring.md` for the full methodology. |
| 19 | |
| 20 | ## Criteria |
| 21 | |
| 22 | 7 dimensions, scored 0-100 each: |
| 23 | |
| 24 | **Hook Strength** — Does frame 1 + first 3 seconds force a pause? |
| 25 | **Emotional Impact** — Does it trigger a visceral response (not just "interesting")? |
| 26 | **Pacing** — Does every second earn the next second? |
| 27 | **Text Readability** — Are captions legible on mobile, properly timed? |
| 28 | **Scroll-Stop Power** — Would this stop a thumb mid-scroll in a feed? |
| 29 | **Completion Likelihood** — Will viewers watch to the end? |
| 30 | **Shareability** — Would someone send this to a friend? |
| 31 | |
| 32 | ## Thresholds |
| 33 | |
| 34 | | Score | Action | |
| 35 | |-------|--------| |
| 36 | | 70+ | **Publish.** Ship it. | |
| 37 | | 60-69 | Polish — specific fixes can save it. Identify which dimensions are dragging. | |
| 38 | | Below 60 | **Regenerate.** Don't polish a bad clip. Go back to the failing stage. | |
| 39 | |
| 40 | ## Process |
| 41 | |
| 42 | Watch the final video on a phone screen, in-app, scrolling past it like a user |
| 43 | Score each dimension independently |
| 44 | Calculate average |
| 45 | If below threshold, identify the weakest dimensions |
| 46 | Route back to the appropriate skill: |
| 47 | Hook/scroll-stop weak → `/first-frame` (regenerate canonical face) |
| 48 | Pacing/completion weak → `/persona` (restructure script) |
| 49 | Emotional impact weak → `/persona` (better language from research) |
| 50 | Text readability weak → `/assemble` (fix captions) |
| 51 | Audio/voice issues → `/assemble` (re-run S2S) |
| 52 | |
| 53 | ## Brand Memory Integration |
| 54 | |
| 55 | ### Reads |
| 56 | | File | Purpose | |
| 57 | |------|---------| |
| 58 | | `workspace/campaigns/<slug>/clips/final-*.mp4` | Video(s) to score | |
| 59 | | `workspace/campaigns/<slug>/brief.md` | Original campaign goals — score against intent, not just virality | |
| 60 | | `workspace/campaigns/<slug>/persona-research.md` | Whether the script language matches real customer language | |
| 61 | |
| 62 | ### Writes |
| 63 | | File | Notes | |
| 64 | |------|-------| |
| 65 | | `workspace/campaigns/<slug>/scores/score-<version>.md` | Score card with per-dimension breakdown and go/no-go | |
| 66 | | `workspace/campaigns/<slug>/learnings.md` | Append-only — what worked, what didn't, threshold notes | |
| 67 | |
| 68 | ### Context loading |
| 69 | |
| 70 | |
| 71 | 📊 Score context loaded: |
| 72 | ✓ Campaign: ridge-q1 |
| 73 | ✓ Final clips: 2 (workspace/campaigns/ridge-q1/clips/final-*.mp4) |
| 74 | ✓ Brief: workspace/campaigns/ridge-q1/brief.md |
| 75 | ✓ Persona research: workspace/campaigns/ridge-q1/persona-research.md |
| 76 | |
| 77 | |
| 78 | ### Learnings append format |
| 79 | |
| 80 | After every score, append to `workspace/campaigns/<slug>/learnings.md`: |
| 81 | |
| 82 | |
| 83 | ## YYYY-MM-DD — <campaign-slug> <format> |
| 84 | |
| 85 | **Score:** <average>/100 (<go/no-go>) |
| 86 | **Dimension breakdown:** Hook <n> | Emotional <n> | Pacing <n> | Captions <n> | Scroll-stop <n> | Completion <n> | Share <n> |
| 87 | |
| 88 | **What worked:** |
| 89 | - [specific finding] |
| 90 | |
| 91 | **What didn't:** |
| 92 | - [specific finding] |
| 93 | |
| 94 | **Remediation:** [if no-go: which skill to route back to and why] |
| 95 | |
| 96 | |
| 97 | Never overwrite this file. Only append. |
| 98 | |
| 99 | ## Contract |
| 100 | |
| 101 | ### Input |
| 102 | Required: at least one final assembled clip |
| 103 | Optional: campaign brief, persona research, prior campaign learnings |
| 104 | Format: workspace video files plus markdown context |
| 105 | Source: `/assemble`, `workspace/campaigns/<slug>/brief.md`, and `persona-research.md` |
| 106 | |
| 107 | ### Output |
| 108 | Produces: one score card per clip, a go/no-go decision, and appended learnings |
| 109 | Format: markdown files in `workspace/campaigns/<slug>/scores/` plus append-only entries in `learnings.md` |
| 110 | Default behavior: score every final clip against the 7 dimensions and route the user back to the failing stage if the score is below 70 |
| 111 | Downstream use: publish/no-publish decision and future campaign learnings |
| 112 | |
| 113 | ### Validation |
| 114 | Pre-conditions: final clip exists and is watchable end to end |
| 115 | Post-conditions: score includes a dimension breakdown, a threshold decision, and clear remediation if needed |
| 116 | Failure checks: do not recommend publishing without a real breakdown; if the clip is unscorable or missing context, flag the gap explicitly |
| 117 | |
| 118 | ## Output |
| 119 | |
| 120 | Virality score card in `workspace/campaigns/<slug>/scores/score-<version>.md` |
| 121 | Go/no-go decision |
| 122 | Learnings appended to `workspace/campaigns/<slug>/learnings.md` |
| 123 | If no-go: specific remediation routing |
| 124 | |
| 125 | ## Batch Scoring |
| 126 | |
| 127 | For campaign batches, score all variants and rank. Publish only the 70+ tier. Below-60 variants get regenerated, not tweaked. |
| 128 | |
| 129 | |
| 130 | bash scripts/batch-campaign.sh \ |
| 131 | --workspace workspace/campaigns/<slug> \ |
| 132 | --creators workspace/campaigns/<slug>/creators/ \ |
| 133 | --formats "talking-head,pov-demo,podcast-clip" \ |
| 134 | --dual-output |
| 135 | |
| 136 |
Details
- Updated
- Mar 27, 2026
- License
- MIT
- Stars on the repo
- ★ 71
- Checked
- Source
- TheMattBerman/scrollclaw ↗
- Creator
- TheMattBerman · 6 listings
Similar skills
See all →
SkillReverse engineer native, managed, Electron/JavaScriptREA
SkillBrainstorms ideas into designs before any creative workBrainstorming Ideas Into Designs
SkillRequires technical rigor and verificationCode Review Reception
SkillDiagnosis loop for hard bugs and performance regressionsDiagnosing bugs
SkillImplement the result of /to-spec and /to-tickets in codeImplement spec
SkillWriting a PR bodyMore from TheMattBerman
SkillAnimate first frames into A-roll talking head clipsAnimate (A-Roll)
SkillGenerate B-roll environment and product shots with Kling 3B-Roll (Kling 3)
SkillStart of the UGC pipeline for persona researchPersona & Script
SkillRouter and orchestrator for AI UGC video productionScrollClaw
SkillScrollClaw system — core doctrine, format selection