lint
Skill0 starsChanged 47 days agoApache-2.0View on GitHub
Lint a video-studio project against its platform targets (TikTok, Instagram, YouTube Shorts, LinkedIn, Facebook Page API) - duration/fps/size envelopes, text cut off, text or captions under the app UI, contrast, caption reading speed and timing (captions too brief or out of sync with the voice, flicker), cuts off the beat, data inserts out of step with the voice, flashing, on-screen text too brief to read, story arc, title length, stock phrases, post caption and hashtag limits, cover, brand banned phrases (also in the generated post copy), banned motion effects, busy crossfades, sound effects (licence, harsh repeats, under the voice), acceptance numbers and the loop seam - and fix what it finds by editing the spec and re-rendering. Use when the user runs /video-studio:lint, asks whether a video is ready for a platform, or after a render before publishing.
80 other projects use a version of this.
Adopted by
Most recently taken up by
- PMDevSolutions/Flaviantheir own version, first seen Nov 8, 2026
- aiagentkit-labs/agentic-dev-kittheir own version, first seen Nov 8, 2026
- levi-qiao/obsidian-llm-wikitheir own version, first seen Nov 8, 2026
- elastic/docs-buildertheir own version, first seen Nov 4, 2026
- DataDog/dd-trace-pytheir own version, first seen Nov 1, 2026
- PMDevSolutions/Aureliustheir own version, first seen Nov 1, 2026
Used with
Projects with it also use query, coverage and 9 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
ArtemXTechSkillquery
Query data from this vault. USE WHEN user asks about projects, clients, tasks, daily notes. Use grep to extract frontmatter - do NOT read full files.
Also in 17 projects that use this
PydanticSkillcoverage
Fetch coverage diff from Codecov for the current branch or a specific PR. Shows uncovered lines, patch coverage, and overall coverage change.
Also in 4 projects that use this
seongjaeryuSkillsave
Complete and save your current thinking to Bindly
Also in 5 projects that use this
BugRogerSkillproject
Project lifecycle management. Dispatches to Ada.
Also in 4 projects that use this
AnthropicSkilldigest
Generate a daily or weekly digest of activity across all connected sources. Use when catching up after time away, starting the day and wanting a summary of mentions and action items, or reviewing a week's decisions and document updates grouped by project.
Also in 3 projects that use this
AWSSkillissue
Implement a GitHub issue end-to-end — branch, code, test, docs, and commit.
Also in 4 projects that use this
Other versions80 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 80
- ray-project/ray★ 44ksame name
- FalkorDB/FalkorDB★ 10ksame name
- FastLED/FastLED★ 7.5ksame name
- fleetdm/fleet★ 7.2ksame name
- aaddrick/claude-desktop-debian★ 5.5ksame name
- cloudposse/atmos★ 1.4ksame name
- ethereum/execution-specs★ 1.2ksame name
- adobe/S3Mock★ 1.2ksame name
- maxGraph/maxGraph★ 1.2ksame name
- jason-effi-lab/karpathy-llm-wiki-vault★ 718same name
70 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository24 other files it gives its agents.
The file
We split this skill into the rules it gives an agent
5 rules. 0 are common, 1 is distinctive, and 4 are very specific to this project.
0
Common
Most of the 67 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 14
Use the project folder the user named, else the cwd (absolute path).
- Distinctive: line 24
Run this loop when lint returns errors, or warnings the user wants cleared:
- Very specific: line 37
When it is in the generated post copy (a target with no publish override), write publish.<target>.post_caption without it, or edit the …
- Very specific: line 105
Add the cue the fix names (cues: [{word: "40"}]), or move a cue that sits on the wrong word.
- Very specific: line 143
Run mcp__plugin_video-studio_engine__spec_validate {project_dir} and fix any errors it reports.
“Common” is measured: kept by at least 6 in 10 of the 67 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Lint a video for its platforms
Lint compares the project with the platform contracts in platform-specs/
(one per target in the spec's targets) and with the design rules. Platform
limits live only in those contracts: quote numbers from the findings, never
from memory.
- Use the project folder the user named, else the cwd (absolute path). It
needs
project/video-spec.json; without a render only spec checks run (envelopes, caption placement, reading speed, post copy, cover, brand). - Call
mcp__plugin_video-studio_engine__lint {project_dir}(addquality: "preview"to check a preview render; the default isfinal). - Report the status (
pass,warn,fail) and each finding asseverity id [target] scene: message, then itsfix.
Fix loop (at most 3 passes)
Run this loop when lint returns errors, or warnings the user wants cleared:
- Apply each finding's
fixtoproject/video-spec.json(orbrand.yamlfor contrast): edit only the fields the fix names, keep every other value, and keep claims grounded (do not add facts to shortened text).caption_mask: prefer removingcaptions.positionso captions are placed automatically; use the suggestedyonly if the user wants a manual position.text_overflow,reading_density: shorten the named text or voiceover, or lengthen the scene; do not change the meaning.envelope_*: adjust durations,masterortargetsas the fix says; ask the user before dropping a target.brand_banned_phrase: rewrite the named field without the phrase. When it is in the generated post copy (a target with nopublishoverride), writepublish.<target>.post_captionwithout it, or edit the brief's hook, key messages or desired action the draft comes from.cliche(warning): a stock phrase fromresearch-specs/cliches.yaml("game-changer", "excited to share", …) in the voiceover, on-screen or graphic text, cover headline, publish copy or the generated post copy. Say it in the product's own words or make a concrete claim (a number, what it does); keep it grounded. A brand's own banned phrases stay errors; this list is a default.busy_crossfade(warning): a crossfade (the scene's own, or the style's default) between two text-dense scenes (6+ on-screen words each) or twomotionpages; mid-blend neither reads. Set that scene'stransitiontofade_blackorcut, or stagger: old content out, then new in.- Sound effects (see the plan skill's
references/sound-design.md):sfx_license_missing: a project audio file insfxhas nolicense. Addlicense {id, source}(e.g.user-owned), or use a bundled sound (bundled:<id>, CC0).sfx_harsh_repeat: a bright or high-hf_riskbundled sound plays more than 3 times, or two effects start under 250 ms apart (a run of bundled key presses is exempt). Drop or swap repeats for a warm one; move one of the close pair.sfx_over_voice(needs a render with voice timings): an effect's peak lands inside a spoken word. Moveat_secinto the pause the fix names, or lowervolume_db.
- Timing findings need a render (they read
renders/<quality>/render-state.json,captions/captions.jsonand the voice tracks):caption_too_brief: a caption is on screen for less than its reading time (0.25 s/word + 0.3 s, min 0.7 s; CJK 9 characters/s). Lower brandcaptions.max_lines, set a slowervoice.rate_wpm, or shorten the scene's voiceover.caption_sync: a caption starts over 250 ms before its first spoken word or stays over 400 ms after its last (beyond the 0.8 s minimum display), or speech runs over 1.5 s with no caption. Re-render first (stale captions); then split long voiceover sentences. Not checked when the voice has no timings (timing_source: none).caption_gap(minor): captions separated by under 120 ms flicker. Re-render; if it stays, join the two phrases.cut_off_beat: withaudio.beat_syncon, a cut further than the tolerance (default 250 ms) from a beat (from a downbeat whensnap: downbeat), usually because moving it would clip speech. Set the namedduration_sec, shorten the voiceover, or raiseaudio.beat_sync.tolerance_ms.acceptance_unmet(error): the render missed aspec.acceptancenumber (changes per second, frozen %, longest static stretch, hold); the message has the measured value. Stage more visual beats or cut the static stretchesqa/report.mdlists, re-render, lint again.loop_seam(error, withmaster.loop): the last frame does not return to the first, or the audio jumps across the seam. Make cyclic motion periods divide the loop length and loop the bed on a bar.flashing: from QA's flash measurement of the render. An error above 3 flashes in any 1 s (no acceptance override) and a warning for single-frame luma spikes. Measured on mean luma (approximates WCAG 2.3.1; red flashes are not measured). Slow or soften the flashing, or replace or fade the spike frames, then re-render.onscreen_too_brief: on-screen text (on_screen_text+ props) the voiceover does not say needs more reading time than the scene has (3 words/s after a 1 s settle). Cut the text, say it, or lengthen the scene. Silent scenes already flagged byreading_densityare not repeated.cue_unmatched: a word cue could not be placed (the word is not in the spoken words, the render is silent so there are no timings, or it is spoken after the scene ends); that item kept its default timing. Cue a word the scene says, render with a voice, or move the word earlier.cue_too_close: two cues in a scene land under 0.4 s apart. Drop one cue or cue a later word.insert_early: a data insert (a stat, a chart value, any number in the graphic) is on screen over 1 s before the voice says its number. Add the cue the fix names (cues: [{word: "40"}]), or move a cue that sits on the wrong word. An uncued item counts from the scene start (its stagger is ignored). A number that is only in the layout (a title) can't be cued: say it sooner or move it into a cued item.insert_overstays: a scene's only data insert stays over 2.5 s after the sentence that says it ends, while another sentence plays. Split the scene after that sentence (the next thought gets its own visual), or end the scene sooner.insert_crowded: one sentence cues two or more data items. Keep one insert per statement: cue the later item on a word in a later sentence, or split the scene.- The insert checks use the voice word timings and skip the render
when there are none (
timing_source: none, silent voice).
text_repeats_captions: a narrated scene's on-screen text repeats its voiceover word for word while burned-in captions show the same words. For kinetic text that types out the narration, setburn_captions: falseon that scene (the .srt/.vtt keep the words). Otherwise put something else on screen (the number, a keyword, the payoff), or cut it to the 1-3 words that matter.banned_effect(error): amotionscene declares inprops.effectsan effect the style'smotion.avoidbans orbrand.visual.forbiddennames. Remove it fromeffectsand from the page, or pick another style with the user. Lint only sees declared effects: also look at the stills sheet.cutaway_rhythm: a cutaway (footage.cutaway) starts inside the hook's first second, lasts outside 3–10 s, or leaves under 2 s of the speaker since the previous one. Move, lengthen, split or merge it.title_length: the social title (spec.title, else the brief's hook or the first voiceover sentence), apublish.<target>.title, or a multi-line publish caption's first line is outside 24–58 characters. The band is a heuristic fromresearch-specs/titles.yaml, not a platform limit, and unverified: trim filler or add the concrete payoff as the fix says, and ignore it when the user prefers the title.story_structure(3+ scenes): no tension scene (question, problem, contrarian_claim, story) in the first 40% after the hook, or the last scene before the CTA/end card is not a payoff (payoff, result, reveal, loop_back). Re-plan those beats with the plan skill'sreferences/storytelling.md; ask the user before restructuring.
- Run
mcp__plugin_video-studio_engine__spec_validate {project_dir}and fix any errors it reports. - Re-render with
mcp__plugin_video-studio_engine__render_submit(same quality as before) and pollmcp__plugin_video-studio_engine__job_statusuntil it finishes. Cached scenes are reused, so this is quick. - Lint again. Stop when there are no errors, after the third pass, or when a finding repeats unchanged after its fix: then show the remaining findings and ask the user how to proceed.
The full report is in qa/lint.md (machine-readable: qa/lint.json). UI
masks are approximations of each app's interface, not official safe zones, so
also look at a frame of the reel before posting.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

