Docs/Skills and code/skill video-script-production
.claude/skills/video-script-production/scripts/rules.json
What the file says about itself
JSON: version, wpm, hook, ladder, load, chain, loops, …
Mentioned on: page 01, page 06, page 07, page 09, page 12, page 13, page in
{
"_note": "Thresholds for lint.js. Each rule traces to a lesson in references/principles.md (A stakes and load, B opening and ladder, C causal chain, D beat contract and forced continuation). Change a number here when a cohort contradicts it; do not edit lint.js to get a script through.",
"version": "1",
"wpm": 150,
"hook": {
"max_sec": 110,
"max_quantities": 1,
"first_payoff_max_words": 75,
"min_ladder_seeds": 2,
"greeting_scan_words": 40,
"_note": "max_sec raised from 75 to 110 on 2026-10-25: the user judged the v5 hook (73 s) thin. A longer hook must earn it: it has to carry a named person, a viewer stake, the weight of the rise and of the fall, and forward moments (rule B8), and still no figures."
},
"ladder": {
"min_rungs": 3,
"min_bonuses": 1,
"rung1_by": 0.6,
"rung2_between": [
0.5,
0.9
],
"rung3_after": 0.8
},
"load": {
"max_quantities_per_min": 5,
"max_quantities_in_30s": 4,
"max_hero_numbers": 7,
"max_understand_words": 25
},
"chain": {
"allowed_links": [
"THEREFORE",
"BUT",
"BECAUSE"
],
"min_but_share": 0.2,
"max_but_share": 0.65,
"max_additive_elsewhere_per_100w": 0.3,
"beat_words": [
90,
260
]
},
"loops": {
"max_live_major": 3,
"beat_loop_max_gap": 2,
"spine_closes_after": 0.7,
"max_uncovered_sec": 60
},
"care": {
"min_viewer_or_person_share": 0.4,
"types": [
"viewer",
"person",
"contrast",
"scale"
]
},
"pulls": {
"_note": "E rules. A pull is an implied open loop: the viewer is waiting without anyone having asked a question (a date that is coming, a person at risk, something they know and the people in the story do not). It counts as live for warm_sec after each declared touch and stops at its resolution.",
"types": [
"clock",
"irony",
"jeopardy",
"prediction",
"motif",
"gap",
"pattern"
],
"warm_sec": 60,
"min_touches": 2,
"min_pulls": 4,
"min_types": 3,
"max_uncovered_sec": 45,
"fail_uncovered_sec": 75,
"tail_grace_words": 60
},
"voice": {
"_note": "F rules. Budgets, not bans. Humans use every one of these devices; the problem is the density, and the same few shapes repeating. Calibrated on Moser Baer v3 and v4 and on 12 English winner transcripts (median 1.5 contractions per 100 words).",
"max_negation_pivots_warn": 1,
"max_negation_pivots_fail": 4,
"max_runups_warn": 3,
"max_runups_fail": 8,
"max_stock_warn": 2,
"max_stock_fail": 8,
"max_extremes_per_1000": 6,
"max_fragment_runs_warn": 1,
"max_fragment_runs_fail": 4,
"max_triads": 5,
"max_short_closer_share": 0.5,
"min_sentence_cv": 0.45,
"max_repeat_openers": 2,
"min_contractions_per_100": 1,
"max_dashes": 3,
"max_avg_sentence_words": 22
},
"jargon_watch": [
"fccb",
"cdr",
"mra",
"ibc",
"nclt",
"tranche",
"coupon",
"convertible",
"haircut",
"moratorium",
"ebitda",
"recast",
"restructuring",
"insolvency",
"liquidation",
"debenture",
"covenant",
"arc"
],
"additive_openers": "^(?:and then|then\\b|next\\b|after that|afterwards|meanwhile|also\\b|later\\b|following that|in addition|moving on|now,? let's move|let's move on|at the same time|here is the (?:first|second|third|next|last|final)\\b)",
"additive_inline": "\\b(?:and then|meanwhile|after that|afterwards|moving on|in addition)\\b|(?:^|[.?!]\\s+)(?:then|next|also|later)\\b",
"greeting": "\\b(?:hello|welcome|hi guys|hey guys|hi everyone|subscribe|like and|bell icon|stay (?:with me )?till the (?:very )?end|stay tuned|channel)\\b",
"persona": {
"_note": "G1, G2. The channel voice is earnest about facts and people, aloof about verdicts and heroes. See references/texture.md.",
"min_quotes_each": 3,
"min_beats_each": 3,
"first_by": 0.35,
"last_after": 0.65,
"min_sides": 2
},
"figures": {
"_note": "G3, G4. One governing metaphor, a few glosses by analogy, at least one parable. Sopory and Dillard (2002): one early, novel metaphor with a familiar target beats many.",
"governing_by": 0.45,
"min_governing_touches": 3,
"min_gloss": 3,
"min_parables": 1,
"parable_words": [
25,
130
],
"min_markers": 4,
"max_markers": 16,
"max_per_60s": 2,
"max_cliches_warn": 2,
"max_cliches_fail": 5,
"max_verdict_warn": 2,
"max_verdict_fail": 5,
"max_domains_per_beat": 2
},
"rhythm": {
"_note": "H rules. 30 s windows; a window is hard when it holds hard_quantities or more spoken quantities. Calibrated 2026-10-25 on 8 English winner transcripts (hard share 9 to 67 percent, median about 30; quiet share 17 to 74, median about 46; longest hard run 1 to 13, median 3; 7 of 8 stayed within 6) and Moser Baer v3 to v5. Warn above the winners median run, fail above 6. A first draft with a warn at 2 would have flagged 4 of the 8 winners. 8 videos is a small sample.",
"window_sec": 30,
"hard_quantities": 2,
"max_hard_run_warn": 3,
"max_hard_run_fail": 6,
"max_hard_share": 0.4,
"min_soft_share": 0.3,
"dense_beat_qpm": 4,
"landing_max_words": 45,
"closing_max_quantities": 2
},
"human": {
"_note": "I rules. A person (named or by role) or the viewer should be present throughout; the protagonist is named before any pronoun stands for them.",
"min_humans": 2,
"max_person_gap_sec_warn": 60,
"max_person_gap_sec_fail": 100,
"min_viewer_stakes": 3,
"min_protagonist_beats": 4,
"min_witness_beats": 3,
"protagonist_by_words": 160
},
"arc": {
"_note": "J rules. Added 2026-10-25 from the v5 request to tell the whole story that v3 and v4 had cut (the founder, the city, the partner, the rise). The default parts suit a company-collapse story; a different kind of video sets chain.arc_required. Craft, not evidence (grade C): it only forces the author to plan for completeness.",
"roles": [
"hook",
"origin",
"rise",
"peak",
"turn",
"response",
"fall",
"people",
"blame",
"verdict",
"lesson"
],
"required": [
"origin",
"rise",
"turn",
"response",
"fall",
"people",
"blame",
"lesson"
],
"order": [
"origin",
"rise",
"turn",
"response",
"fall"
],
"origin_in_first": 2,
"lesson_in_last": 2
},
"clarity": {
"_note": "K rules. Added 2026-10-25 from the review of the Hinglish v6 script (references/review-round-7.md): a new person arrived with no tag (\"who is Ratul\"), a company was named once with no tie to the story (Xidex), a count (\"three escapes\") the viewer had not been given the items for, a line that could only be understood by decoding it, and a term glossed that the audience already knows (crore). Design budgets, not findings: retag_after_words is about a minute of speech. By the name heuristic in lint.js the v6 busiest beat (B3) had 4 first mentions of people and organisations, so max_new_names_per_beat (5) would not have caught it; the dense-beat headline rule (M1, dense_new_names 4) is the one that fires on it. The name heuristic reads capitalised words in the middle of sentences, so it misses a first mention that opens a sentence.",
"retag_after_words": 150,
"max_new_names_per_beat": 5,
"min_oneoff_reason_chars": 15,
"max_vague_referents": 0,
"buried_verb": { "min_sentence_words": 18, "max_aside_words": 7, "warn_over": 0 },
"concept_min_uses": 2
},
"turns": {
"_note": "L rules. The contrast has to be heard: the winning is stated in the audience's own terms, and the fall starts with a contrast word. A BUT junction carries a contrast word in the two sentences either side of it. Where a person pays, the line carries an intensifier of the cost. Craft, grade C.",
"hook_turn_gap_sentences": 2,
"but_join_scan_sentences": 2
},
"density": {
"_note": "M rules. A dense beat opens with a one-line headline (what is about to be told, with no figure in it), then the details. The hook ends in a trailer, not a menu: the tease is a list of fragments and the takeaway is one short sentence.",
"dense_quantities": 7,
"dense_new_names": 4,
"headline_max_words": 20,
"headline_within_sentences": 2,
"tease_max_words": 30,
"takeaway_max_words": 14,
"max_lab_voice": 0
},
"bar": {
"_note": "The v6 bar: what a finished script must show, beyond zero FAIL. Set 2026-10-25 from Moser Baer v6 (the script the user approved). Soft targets, tighter than the linter, so a script that merely passes is not mistaken for a finished one. See references/quality-bar.md.",
"warnings_max": 0,
"contractions_per_100_min": 1.5,
"quantities_per_min_max": 3,
"hook_sec": [
60,
110
],
"person_gap_sec_max": 60,
"hard_share_max": 0.4,
"figure_markers": [
4,
16
]
}
}
Shown as it is in the repository at build time (2026-11-03); the home directory appears as <home>. If this page and the file differ, the file is right. Back to the catalogue.