Virality Scoring

Score UGC videos for virality before publishing.

How to use it

Claude Code
  1. Run the line below. It pulls the whole folder into ~/.claude/skills/score-2, including the files SKILL.md points to.
  2. 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-2

For 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)
  1. On this page open ⋯ → Download .md.
  2. Save it as SKILL.md in a folder, zip the folder, then Customize → Skills → + → Create skill → Upload a skill.
  3. Pick the file and Save. Claude shows the name and description and runs a security scan.
  4. Check the skill is switched on.
  5. Start a new chat and describe your job in plain words. The AI follows the skill from there.
ChatGPT or another app
  1. ChatGPT: make a Project and paste it into Instructions.
  2. 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.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Source of Virality Scoring

Show the full text136 lines
namedescriptionmetadata
scrollclaw-scoreScore 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:

  1. Hook Strength — Does frame 1 + first 3 seconds force a pause?
  2. Emotional Impact — Does it trigger a visceral response (not just "interesting")?
  3. Pacing — Does every second earn the next second?
  4. Text Readability — Are captions legible on mobile, properly timed?
  5. Scroll-Stop Power — Would this stop a thumb mid-scroll in a feed?
  6. Completion Likelihood — Will viewers watch to the end?
  7. 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

  1. Watch the final video on a phone screen, in-app, scrolling past it like a user
  2. Score each dimension independently
  3. Calculate average
  4. If below threshold, identify the weakest dimensions
  5. 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)

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, and persona-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 in learnings.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---
2name: scrollclaw-score
3description: "Score UGC videos for virality before publishing. 7 criteria, 0-100 each. Only 70+ gets published."
4metadata:
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 
18Score every video before publishing. Read `references/virality-scoring.md` for the full methodology.
19 
20## Criteria
21 
227 dimensions, scored 0-100 each:
23 
241. **Hook Strength** — Does frame 1 + first 3 seconds force a pause?
252. **Emotional Impact** — Does it trigger a visceral response (not just "interesting")?
263. **Pacing** — Does every second earn the next second?
274. **Text Readability** — Are captions legible on mobile, properly timed?
285. **Scroll-Stop Power** — Would this stop a thumb mid-scroll in a feed?
296. **Completion Likelihood** — Will viewers watch to the end?
307. **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 
421. Watch the final video on a phone screen, in-app, scrolling past it like a user
432. Score each dimension independently
443. Calculate average
454. If below threshold, identify the weakest dimensions
465. 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 
80After every score, append to `workspace/campaigns/<slug>/learnings.md`:
81 
82```markdown
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 
97Never 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 
127For campaign batches, score all variants and rank. Publish only the 70+ tier. Below-60 variants get regenerated, not tweaked.
128 
129```bash
130bash 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