---
name: viral-score
description: Check a draft vertical video before posting on TikTok, Instagram Reels or YouTube Shorts — measure it with FlashBoards tools (length, size, cuts, first word, words in the first 3 seconds), lay out two frame sheets, score eight rubric criteria from the sheets and the facts, and get a band per platform with the platform checks and three fixes from get_draft_verdict; also compares two versions. A band reads the craft and is not a forecast of views.
---
# Will my draft work

FlashBoards user skill, version 1.2.3 (2026-10-13).

On the board, read these guides with `list_skills` and `get_skill` when the assistant exposes them; otherwise use the hosted index through an available read-only retrieval tool. Use that runtime’s actual model discovery, current page context and guarded board actions for execution. Keep native readiness, approval and cost gates; do not claim a guide was read when retrieval is unavailable.

Read related guides with `get_skill({skillId:"<id>"})` or the [hosted index](https://pub-78da82d51ed14147ac554d38094b0c0b.r2.dev/user-skills/1.2.3/index.html). Reading a guide does not start or authorize a paid generation.

Read `viral` for the shared rules. **The person's own draft. Never score from memory of another clip, and never tell a band before `get_draft_verdict` returns it.**

Slots: {draft} — the video: a FlashBoards result (`generationId` or a trim's `videoFinishingTaskId`) or an upload from `show_media_upload_picker` · {platforms} · {name} — a short name for this version.

## Measure, look, score, say

1. **Get the draft into FlashBoards.** An upload comes as a `videoReceipt`: `trim_video` it once from 0 (no end) to make it a FlashBoards video; the trim's `generationId` and `videoFinishingTaskId` go to every step below. A FlashBoards result is used as it is.
2. **Measure** (free except the words):
   - length and frame rate: the trim's `durationSeconds` and `frameRate`, or `get_generation`;
   - size: `extract_video_frame` at 0 s gives width and height; pass them as `aspectRatio` "<width>:<height>" (for example "480:832": within 3% of 9:16 counts as 9:16) and the shorter side as `heightPx`;
   - cuts: `detect_video_cuts` → the count, cuts per 10 s, the longest shot;
   - words: `transcribe_media` with `model: "scribe_v2"` (word times; about a cent a minute) → the first word's time, the words in the first 3 seconds and what they say, words a second. Skip it for a clip without speech.
   - Not measured here: loudness, silence, black frames, frozen frames and motion. Score `sound` and `pacing` from the words, the cuts and the sheets, and say once that loudness was not measured.
3. **Two sheets.** The first 3 seconds: `extract_video_frame` at 0, 0.25, 0.5 … 2.75 s (12 frames), then `arrange_images` with those images in order, `columns: 4`, cells at the clip's aspect (for example 270 × 480 for 9:16). The whole clip: 12 frames evenly from start to end, the same layout. Tiles read left to right, top to bottom; keep the times. Frames in quick succession can answer `image_busy`: wait a few seconds and repeat the same `requestId`.
4. **Read the rubric**: `get_draft_verdict` with no scores returns the eight criteria, each with its question, the anchors for 0, 1 and 2 and the facts to look at.
5. **Look and score.** `describe_media` each sheet with the criteria's questions (one call a sheet, for example "Tiles 1–4 are the first second: what is the strongest frame, is there text, is there a face, what changes?"). Score every criterion 0, 1 or 2 by its anchors, from what the sheets show and what the facts say, not from the idea you were told. A measured fact beats an impression: a first word at 0.9 s is a late start even if the clip feels fine; 0 cuts in 20 s is slow even if the frame is pretty. `null` only where a criterion does not apply (no on-screen text in a clip that works without it). One line per low score in `notes`: what you saw.
6. **Verdict**: `get_draft_verdict` with `scores`, `platforms` (only where the person will post; all three when they did not say), `facts` (`durationSeconds`, `aspectRatio`, `heightPx`, `hasAudio`, `wordsFirst3s`), `ai` (how the clip was made: Reels and Avatar → `avatar`, Cartoon → `animation`, Film scene and photoreal Animate → `photoreal`, a changed voice → `voice`, a generated song → `music`, else `none`), `content` and `notes`.
7. **Say it** in this order, short: the band per platform (one line each; a "not eligible" platform first, with its reason), what is strong, the fixes as actions (at most three, the first one first), the AI policies if any, and the `calibration` line once in its own words. Then offer the fix you can make here: a new start frame, captions, a tighter cut (`trim_video`), a re-shoot of the opening.

## Two versions

Score both (two names), then compare criterion by criterion: which one is stronger and on what — "B opens stronger (first second 2 vs 1), A lands the ending better". Ranking two drafts is what this judge does best; a single band is rougher.

## Rules

1. Never turn a band into views, a percentage of success or "will go viral".
2. Never skip the sheets: a verdict without looking is a guess.
3. "Not eligible" comes from a platform rule (for example a Short longer than 3 minutes): lead with it.
4. Long YouTube videos are not scored here: the click is decided by the title and the thumbnail (`youtube`).

## Example run (reference only — never reuse its files or scores for a person)

- 2026-10-12, an 8-second talking reel of a demo character (768 × 1344, 24 fps): 0 cuts, first word at 0.12 s, 2.2 words a second. Scores 1 / 2 / 2 / 1 / 2 / 0 / 2 / 1 → TikTok high (75%), Reels high (71%), Shorts high (78%); fixes: the first second, pacing (one static take), captions (none on a talking clip).

## Execute through MCP or on the board

Use the person's FlashBoards account; never ask for a personal provider key or run the source's local scripts. Discover `get_account`, `list_generation_models` and the tools of this client first: a published guide does not prove a feature is deployed.

**Headless, no open board.** Quote with `estimate_generation_cost` (skill models: `estimate_skill_model`), then run `generate_image`, `generate_video`, `generate_audio` or `run_skill_model` with one stable `generationAttemptId` per logical attempt. Pass `maxCostUsd` only when the current operation and selected model support it; otherwise use the quoted cost and the person's explicit approval with the supported controls. Never silently ignore an unsupported spending cap; make one `get_generation` check after `retryAfterSeconds`. Pass the person's own results by `generationId`: images in `referenceGenerationIds`, `firstFrameUrl` and `endFrameUrl`, audio in `referenceAudioUrls` or `targetAudioUrl`, videos in `referenceVideoGenerationIds`. They are read on the server; signed result links do not work as public URLs. Every `generationId` a tool returns stays valid: a later read of the same result gives a different string, and both work. Film frames and gallery pictures go in by `previewHandle`: `referencePreviewHandles` of the generation tools, a `{previewHandle}` source of `arrange_images`, `crop_image` and `pad_image`, and `describe_media`. New files come from `show_media_upload_picker` as receipts. The person's character comes in as its sheet, by `generationId` or as an upload; there is no search by name. If the person names a character without the sheet, ask for it or make one with `character-sheet`; do not scan recent results for it. Free server steps: `trim_video`, `concat_videos`, `conform_video`, `replace_video_audio`, `extract_video_frame`, `extract_video_audio`, `detect_video_cuts`, `crop_image`, `pad_image`, `arrange_images`, `cut_audio_span`, `concat_audio_tracks`, `mix_audio_tracks`, `fit_audio_duration`, `add_audio_reverb`. Check every result with `describe_media` (a question about an image; `model`, `mode` and `sourceRange` only for a video) and `transcribe_media` for speech. Both checks are paid: `describe_media` costs a fraction of a cent for an image and about 2–4 ¢ for a short video (more for a long one), `transcribe_media` under 1 ¢ a minute — count the checks you plan in the price you name before the first paid step. `describe_media` is not reliable about sound: it misses effects mixed under music and can hear voices or instruments that are not there. Check speech with `transcribe_media` and ask the person to listen for effects and music. Never repay an uncertain submission; reuse an attempt ID only for the identical request. Make each new `requestId` or `generationAttemptId` unique, for example the task, the date and a short random suffix: an ID used before, even in another chat, replays that earlier request or answers `REQUEST_ID_CONFLICT`.

**On the board.** Inspect with `list_board_sessions` and `get_board_snapshot` and carry the same `sessionId` and a fresh `activeBoardId` as `expectedBoardId`. Native cards: `execute_board_action` (`listNativeModels`, `setModel`), `prepare_board_generation` with ordered board items or owned outputs, then one `generate_on_board` within the authorized budget. Board media tools: `list_media_tools` → `start_media_tool` → `get_media_tool_run`. Put headless results on a board with `add_media_to_board`.

Keep mandatory safety settings and the live limits of each model. Prices, timings, endpoints and "free retry" claims in the sources are historical, not FlashBoards contracts. If a step this guide needs is not available or is refused (a tool error, `audio_not_configured`, a missing model or input), keep the finished assets, tell the person which step is blocked and why, and ask how to go on. A single generation that ends `failed` is not a blocked step: submit it once more with a new `generationAttemptId` (reworded if it may have hit the content checker), and stop to ask only if it fails again. A failed attempt is not always refunded, so the retry may be paid again and `maxCostUsd` caps each request on its own: count both against the budget the person approved. Never swap in another route on your own: no image model redrawing a layout or a frame, no `describe_media` in place of the frames it should check, no clip generated only to take its sound, no picture drawn where the guide takes a film frame.

## Source and related guides

- The owner's viral radar (flashboards-apps `.claude/skills/viral-score`, 2026-10-12); no Learn article yet.

Read: `viral`, `viral-rules`, `viral-publish`, `reels`. Source experiments and demo materials are historical; use the person's own approved media.
