Virality Scoring
Score UGC videos for virality before publishing.
How to use it
Claude Code
- Run the line below. It pulls the whole folder into
~/.claude/skills/score-2, including the files SKILL.md points to. - Describe your job in plain words. Claude Code follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit TheMattBerman/scrollclaw/score#main ~/.claude/skills/score-2For one project only, change the path to .claude/skills/score-2. This skill also uses persona-research.md, learnings.md — copying SKILL.md alone won't be enough. See the folder on GitHub.
Claude (web or desktop app)
- On this page open ⋯ → Download .md.
- Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
- Pick the file and Save. Claude shows the name and description and runs a security scan.
- Check the skill is switched on.
- Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
- ChatGPT: make a Project and paste it into Instructions.
- Neither? Paste it at the top of a new chat — it works for that chat.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Source of Virality Scoring
Show the full text136 lines
| name | description | metadata |
|---|---|---|
| scrollclaw-score | Score UGC videos for virality before publishing. 7 criteria, 0-100 each. Only 70+ gets published. | 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.
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 |
Discussion
Browse more free Claude skills.