Docs/Skills and code/skill video-script-production

.claude/skills/video-script-production/references/lint-fixes.md

Markdown116 lines13.0 KBSkill: video-script-production

What the file says about itself

Lint fixes: what each rule is telling you and the fix that worked: For Step S8. check.js (or lint.js) names the rule and the quote or stretch. Fix the script, never rules.json.

Mentioned on: page 06, page 09, page 12

Lint fixes: what each rule is telling you and the fix that worked

For Step S8. check.js (or lint.js) names the rule and the quote or stretch. Fix the script, never rules.json. Every fix below is one that was actually used on Moser Baer v4 to v6. After any edit to a sentence, any chain quote that used its words will fail (E1, C4, G3, I1, H4 and so on); the failure names it. Quote matching ignores case, quote marks and punctuation but needs the same words in the same order.

General moves: reword before you cut; move a figure to a graphic or the ledger before you split a beat; add a person ("Puri", "Ratul", "you") before you add a sentence; when a WARN is a false alarm (a negation-pivot pattern in "I couldn't find what it earned. It was..."; "moving on" meaning leaving), reword so the pattern disappears.

A: stakes and load

RuleIt meansUsual causeFix that worked
A2 FAIL5+ figures in one 30-second windowa paragraph of amounts and dates (v5 beats 7 and 9; v6 beat 11)cut the secondary figure (the 60 percent, a rounded duplicate, "seven rupees for every hundred") or move it to a graphic; keep the hero number
A3 FAILmore than 1 figure in the hookdates and amounts in the sceneturn the figure into an image ("the second-biggest maker" instead of a share); one date is allowed (the shut gate)
A4 WARNa figure with no pair, comparator, person or question before it"17 years" standing alonegive it a person ("One of its workers, Mahesh Sharma, had spent 17 years") or a comparator ("but", "than", "against")
A6 FAILstake line not before the hero number in the same beatthe comparison line came firstreorder: stake, then value, then comparator
A7 FAILdeclared jargon not glossed at its first usethe term appears earlier than you thought (v6: "liquidation papers" in the hook)reword the earlier use ("creditors' claims") or gloss it there
A8 WARNa watch-list term (jargon_watch) is used and not declareda new technical wordadd it to chain.jargon with a gloss quote

B: opening and ladder

RuleIt meansUsual causeFix that worked
B2 FAILhook too long, a greeting, or a withheld term leakeda hook edited past 110 s (v6 was 111 s three times); "price", "solar", "debt" slipped incut 3 to 6 words (a "Then,", a clause), not a beat of content; swap the leaked word for an image
B3 FAILthe click not confirmed in the first ~75 wordsthe scene starts latemove the concrete payoff (the dark plant, the shut gate) up
B4 FAILladder seeds missing from the hook, or paid out of order or out of the time bandsa seed quote reworded in the hook but not in the chainmake the seed quote match the hook; rung 1 by 60%, rung 2 between 50 and 90%, rung 3 after 80%
B8 FAILa hook element missingthe learning or the viewer stake was cut when trimmingrestore it as a clause; keep at least two forward moments

C: flow

RuleIt meansUsual causeFix that worked
C1 FAILa beat opens with "then", "next", "meanwhile", "later"an "and then" joinrewrite the opening as a consequence or a complication ("But the city was getting harder to work in")
C2 WARNadditive words inside a beat"Then" at the start of a sentence, "moving on""But" or a cause; reword "moving on"
C3 WARNthe next beat does not pick up a noun the last two sentences createda join with no shared threadmake the opener repeat the key noun ("left" in B0 and B1)
C4 FAILa junction not typed, a hinge quote not in the text, a compel quote not in the beat's last two sentences, or a BUT with a link_why under six wordsthe closing sentence changedupdate compel_quote and next_opens_with to the new words; write a link_why that names the expectation reversed

D: beat contract and loops

RuleIt meansUsual causeFix that worked
D1 FAILa beat is missing a declared fieldan unfilled chainfill understand, care, care_type, care_quote, change, compel, link fields
D2 FAILthe care line comes after the beat's first digit figurea figure in the opening sentenceput the care line first; years and dates do not count, digit amounts do
D4 WARNa middle beat over 260 or under 90 wordsa merged beat (v6 beats 9, 11, 12 ran 262 to 268)trim a sentence that restates; do not drop a hedge or a gloss
D5 FAILa loop's quotes not found, or the spine closes before 70% of the runtimereworded hookalign open_quote with the hook; the spine opens in the hook and closes after the peak reveal
D6 FAILmore than 3 loops live at onceoverlapping inside-beat loopsclose one before the next opens
D7 WARN60+ seconds without a beat-level questiona long beat with one loop at its endadd an inside-the-beat question with an honest open and close quote ("How big did it get?"; "Was it technology after all?")

E: pulls

RuleIt meansUsual causeFix that worked
E1 FAILa pull's signal or touch not in the text, a touch out of order, fewer than 2 touches, or neither resolved nor left opena reworded linerestore the words; touches must run in text order
E2 WARN / FAIL45 / 75 seconds with nothing pendinga stretch with no touched pull and no inside-beat loopadd a callback that is a real sentence ("with the bond about six months from falling due"), or an inside-beat question
E3 WARNfewer than 3 kinds of pullall motifsadd a clock, a jeopardy or a prediction
E4 WARNa middle beat with no pull and no looptouch a pull in it

F: voice

RuleIt meansFix that worked
F1negation pivots ("not just X", "no X, no Y, just Z")state the Y; if it is the denial of something nobody said, delete the denial
F2staged run-ups and script-talk ("here's what matters", "think about what that does", "I call that")delete the announcement and say the thing
F3stock phrases, machine vocabulary, lazy extremeschoose the specific word
F4fragment drumrolls, triads, every beat ending on a punch line, even sentence lengthsmerge two short sentences; end some beats on a long one
F5too few contractions, dashes, long sentences"it is" to "it's", "he would" to "he'd"; replace a dash with a comma or a full stop

G, H, I, J: texture

RuleIt meansFix that worked
G1a register (earnest or aloof) missing in a stretchadd the line where it is true ("I couldn't find what it earned")
G2a contested call told from one sidegive the case for and the case against in the same beat
G3no governing metaphor, it arrives late, never returns, or states no limit; a gloss not at its term; a parable with a figure or too shortput the picture in the beat where the hard idea first lands; return to it by name; state where it fails; lengthen a 23-word parable to 33
G4too few or too many comparisons, stock figures, verdict wordscut or add; replace "villain" with "culprit" only if the meaning is the same
H1a wall of number-heavy windowsturn a figure into a person or a picture between them
H2too many hard windows, too few quiet onesmove a figure to a graphic
H3two dense beats in a rowput a human beat between, or merge the figures into a graphic
H4a hero number with no landing (or a landing with a figure, or no person, viewer or picture in it)add one sentence after the figure: a person who pays, "you", or a comparison from daily life
H5a close with 3+ figures or no personstrip figures from the last beat; end on the witness
I1a person's want, detail or stake not in the textquote the sentence that carries it, or add it
I2protagonist not named in the hook, or named after word 160, or the want not in the hook or first story beatname them with a want in the hook
I3a hinge line with "he/she/his" and no name in that sentence or the one beforeput the name in the sentence: "the day Deepak Puri walked away... Why would he?"
I460+ seconds with no person and no "you"name a person, or address "you": "you'd expect sales to barely move"
I5viewer stakes missing in the hook, middle (30 to 70%) or last fifthadd a "you" line there
I6a person absent from enough beats, or the witness missing early or in the closereturn to them
J1a story part has no beatadd the beat or tag the beat that already tells it
J2story parts out of orderreorder the tags or the beats

K, L, M: clarity, turns, density (review round 7)

RuleIt meansUsual causeFix that worked
K1 FAIL/WARNa person is named with no role or relation near it (WARN when the chain declares no tags at all)the cast was declared before the tags field existed; a name introduced on its ownadd humans[].tags and put one of them in the sentence of the first mention or the next: "Ratul Puri, Deepak's son and a company director"
K2 FAILa person returned after 150 words or more with no tag"Ratul" bare in a later beat; "Mahesh Sharma joined the plant" three beats after the hooktag the return: "Ratul, Deepak's son", "Mahesh Sharma, the worker we met at the start". The protagonist is exempt
K3 WARNmore than five new people or organisations in one beata beat that introduces backers, rivals and a regulator togethercut one, or move it to a graphic; a dense beat also needs a headline (M1)
K4 WARNa name appears once with no declared reasona trivia name (Xidex), a source named oncetie it to the protagonist in the sentence, or cut it; if it stays, add it to one_off_names with the reason. Publications and the company itself go in not_cast
K5 FAIL/WARNa spoken count ("three pivots", "three problems") has no declared items, a wrong count, or items in the wrong orderthe count was said before the items were given alouddeclare it in counted_sets; signpost the items as they happen ("his first pivot"); a promise's items come after it, a tally's before
K6 FAILa named idea is not defined at its first use, is defined twice, or is used fewer than twice afterthe label was introduced in passing, or explained again laterdefine it once in plain words where it first appears ("the business world has a word for that: a pivot") and use it again
K7 WARNa term the audience knows is glossed"A crore is ten million rupees" in a script for Indian viewerscut the gloss, or change audience.known_terms if the audience is different
K8 WARNa vague referent ("whatever was running out", "something that") or a verb buried behind a long asidean abstract phrase; "Puri, the man many people had doubted in the early nineties, was running..."name the thing; split the sentence: the doubt first, then "Now Puri's company was..."
L1 FAIL/WARNthe hook's rise names no prize, or the fall does not open on a contrast word, or they are far apart"For years it made more discs than anyone. One morning...""...and made serious money doing it. But one morning..."
L2 FAIL/WARNthe witness's cost line states the cost flat"had spent 17 years inside""had spent a full 17 years inside"; "part of their own pay"
L3 WARNa junction typed BUT with no spoken contrast near the jointhe contrast is in the structure onlyopen the next beat on "But" or "Even though", or end the last on it
L4 WARNa neutrality disclaimer ("favourite theory")the persona's aloofness applied to a mechanism the record supportssay what the record supports and what the popular story skips; keep the disclaimer for people and for what is unproven
M1 FAIL/WARNa dense beat (7 figures or 4 new names) has no headline, or the headline is late, long or holds a figurethe beat opens on a detailone sentence, 20 words or fewer, within the first two, no figure: "What happened took half a year: the company went from saying it was well-funded to asking for time."
M2 FAILthe tease is over 30 words or the takeaway over 14, or they are not in the hookthe hook ends in a long list of events and a long promisetease: three fragments, the strongest last; takeaway: one short sentence that keeps the "you"
M3 WARNlab voice ("if that is right, you would expect...", "there should be a sign")the narrator announces a testshow the sign: "But the first signs were starting to show."

Tool-level problems

SymptomCauseFix
check.js T1 FAIL "0x8 at char N"a regex written through a shell heredoc or sed lost a backslashrewrite the line with the Write or Edit tool
Damage test MISS on a new rulethe rule has a loopholemake the mutation fail the rule by fixing the rule, not the mutation (lesson-protocol.md)
ledger-check MISSING for a figurethe ledger records a rounded or differently-expressed valueadd the spoken form to the ledger row ("28 cents", "spoken as ₹110 crore")
Lint crashes on a blank beatan empty **VO:** linefixed in lint.js; write the VO or delete the beat
Show the raw text
# Lint fixes: what each rule is telling you and the fix that worked

For Step S8. `check.js` (or `lint.js`) names the rule and the quote or stretch. Fix the **script**, never `rules.json`. Every fix below is one that was actually used on Moser Baer v4 to v6. After any edit to a sentence, any chain quote that used its words will fail (E1, C4, G3, I1, H4 and so on); the failure names it. Quote matching ignores case, quote marks and punctuation but needs the same words in the same order.

General moves: reword before you cut; move a figure to a graphic or the ledger before you split a beat; add a person ("Puri", "Ratul", "you") before you add a sentence; when a WARN is a false alarm (a negation-pivot pattern in "I couldn't find what it earned. It was..."; "moving on" meaning leaving), reword so the pattern disappears.

## A: stakes and load

| Rule | It means | Usual cause | Fix that worked |
|---|---|---|---|
| A2 FAIL | 5+ figures in one 30-second window | a paragraph of amounts and dates (v5 beats 7 and 9; v6 beat 11) | cut the secondary figure (the 60 percent, a rounded duplicate, "seven rupees for every hundred") or move it to a graphic; keep the hero number |
| A3 FAIL | more than 1 figure in the hook | dates and amounts in the scene | turn the figure into an image ("the second-biggest maker" instead of a share); one date is allowed (the shut gate) |
| A4 WARN | a figure with no pair, comparator, person or question before it | "17 years" standing alone | give it a person ("One of its workers, Mahesh Sharma, had spent 17 years") or a comparator ("but", "than", "against") |
| A6 FAIL | stake line not before the hero number in the same beat | the comparison line came first | reorder: stake, then value, then comparator |
| A7 FAIL | declared jargon not glossed at its first use | the term appears earlier than you thought (v6: "liquidation papers" in the hook) | reword the earlier use ("creditors' claims") or gloss it there |
| A8 WARN | a watch-list term (`jargon_watch`) is used and not declared | a new technical word | add it to `chain.jargon` with a gloss quote |

## B: opening and ladder

| Rule | It means | Usual cause | Fix that worked |
|---|---|---|---|
| B2 FAIL | hook too long, a greeting, or a withheld term leaked | a hook edited past 110 s (v6 was 111 s three times); "price", "solar", "debt" slipped in | cut 3 to 6 words (a "Then,", a clause), not a beat of content; swap the leaked word for an image |
| B3 FAIL | the click not confirmed in the first ~75 words | the scene starts late | move the concrete payoff (the dark plant, the shut gate) up |
| B4 FAIL | ladder seeds missing from the hook, or paid out of order or out of the time bands | a seed quote reworded in the hook but not in the chain | make the seed quote match the hook; rung 1 by 60%, rung 2 between 50 and 90%, rung 3 after 80% |
| B8 FAIL | a hook element missing | the learning or the viewer stake was cut when trimming | restore it as a clause; keep at least two forward moments |

## C: flow

| Rule | It means | Usual cause | Fix that worked |
|---|---|---|---|
| C1 FAIL | a beat opens with "then", "next", "meanwhile", "later" | an "and then" join | rewrite the opening as a consequence or a complication ("But the city was getting harder to work in") |
| C2 WARN | additive words inside a beat | "Then" at the start of a sentence, "moving on" | "But" or a cause; reword "moving on" |
| C3 WARN | the next beat does not pick up a noun the last two sentences created | a join with no shared thread | make the opener repeat the key noun ("left" in B0 and B1) |
| C4 FAIL | a junction not typed, a hinge quote not in the text, a compel quote not in the beat's last two sentences, or a BUT with a `link_why` under six words | the closing sentence changed | update `compel_quote` and `next_opens_with` to the new words; write a `link_why` that names the expectation reversed |

## D: beat contract and loops

| Rule | It means | Usual cause | Fix that worked |
|---|---|---|---|
| D1 FAIL | a beat is missing a declared field | an unfilled chain | fill understand, care, care_type, care_quote, change, compel, link fields |
| D2 FAIL | the care line comes after the beat's first digit figure | a figure in the opening sentence | put the care line first; years and dates do not count, digit amounts do |
| D4 WARN | a middle beat over 260 or under 90 words | a merged beat (v6 beats 9, 11, 12 ran 262 to 268) | trim a sentence that restates; do not drop a hedge or a gloss |
| D5 FAIL | a loop's quotes not found, or the spine closes before 70% of the runtime | reworded hook | align `open_quote` with the hook; the spine opens in the hook and closes after the peak reveal |
| D6 FAIL | more than 3 loops live at once | overlapping inside-beat loops | close one before the next opens |
| D7 WARN | 60+ seconds without a beat-level question | a long beat with one loop at its end | add an inside-the-beat question with an honest open and close quote ("How big did it get?"; "Was it technology after all?") |

## E: pulls

| Rule | It means | Usual cause | Fix that worked |
|---|---|---|---|
| E1 FAIL | a pull's signal or touch not in the text, a touch out of order, fewer than 2 touches, or neither resolved nor left open | a reworded line | restore the words; touches must run in text order |
| E2 WARN / FAIL | 45 / 75 seconds with nothing pending | a stretch with no touched pull and no inside-beat loop | add a callback that is a real sentence ("with the bond about six months from falling due"), or an inside-beat question |
| E3 WARN | fewer than 3 kinds of pull | all motifs | add a clock, a jeopardy or a prediction |
| E4 WARN | a middle beat with no pull and no loop | | touch a pull in it |

## F: voice

| Rule | It means | Fix that worked |
|---|---|---|
| F1 | negation pivots ("not just X", "no X, no Y, just Z") | state the Y; if it is the denial of something nobody said, delete the denial |
| F2 | staged run-ups and script-talk ("here's what matters", "think about what that does", "I call that") | delete the announcement and say the thing |
| F3 | stock phrases, machine vocabulary, lazy extremes | choose the specific word |
| F4 | fragment drumrolls, triads, every beat ending on a punch line, even sentence lengths | merge two short sentences; end some beats on a long one |
| F5 | too few contractions, dashes, long sentences | "it is" to "it's", "he would" to "he'd"; replace a dash with a comma or a full stop |

## G, H, I, J: texture

| Rule | It means | Fix that worked |
|---|---|---|
| G1 | a register (earnest or aloof) missing in a stretch | add the line where it is true ("I couldn't find what it earned") |
| G2 | a contested call told from one side | give the case for and the case against in the same beat |
| G3 | no governing metaphor, it arrives late, never returns, or states no limit; a gloss not at its term; a parable with a figure or too short | put the picture in the beat where the hard idea first lands; return to it by name; state where it fails; lengthen a 23-word parable to 33 |
| G4 | too few or too many comparisons, stock figures, verdict words | cut or add; replace "villain" with "culprit" only if the meaning is the same |
| H1 | a wall of number-heavy windows | turn a figure into a person or a picture between them |
| H2 | too many hard windows, too few quiet ones | move a figure to a graphic |
| H3 | two dense beats in a row | put a human beat between, or merge the figures into a graphic |
| H4 | a hero number with no landing (or a landing with a figure, or no person, viewer or picture in it) | add one sentence after the figure: a person who pays, "you", or a comparison from daily life |
| H5 | a close with 3+ figures or no person | strip figures from the last beat; end on the witness |
| I1 | a person's want, detail or stake not in the text | quote the sentence that carries it, or add it |
| I2 | protagonist not named in the hook, or named after word 160, or the want not in the hook or first story beat | name them with a want in the hook |
| I3 | a hinge line with "he/she/his" and no name in that sentence or the one before | put the name in the sentence: "the day Deepak Puri walked away... Why would he?" |
| I4 | 60+ seconds with no person and no "you" | name a person, or address "you": "you'd expect sales to barely move" |
| I5 | viewer stakes missing in the hook, middle (30 to 70%) or last fifth | add a "you" line there |
| I6 | a person absent from enough beats, or the witness missing early or in the close | return to them |
| J1 | a story part has no beat | add the beat or tag the beat that already tells it |
| J2 | story parts out of order | reorder the tags or the beats |

## K, L, M: clarity, turns, density (review round 7)

| Rule | It means | Usual cause | Fix that worked |
|---|---|---|---|
| K1 FAIL/WARN | a person is named with no role or relation near it (WARN when the chain declares no `tags` at all) | the cast was declared before the tags field existed; a name introduced on its own | add `humans[].tags` and put one of them in the sentence of the first mention or the next: "Ratul Puri, Deepak's son and a company director" |
| K2 FAIL | a person returned after 150 words or more with no tag | "Ratul" bare in a later beat; "Mahesh Sharma joined the plant" three beats after the hook | tag the return: "Ratul, Deepak's son", "Mahesh Sharma, the worker we met at the start". The protagonist is exempt |
| K3 WARN | more than five new people or organisations in one beat | a beat that introduces backers, rivals and a regulator together | cut one, or move it to a graphic; a dense beat also needs a headline (M1) |
| K4 WARN | a name appears once with no declared reason | a trivia name (Xidex), a source named once | tie it to the protagonist in the sentence, or cut it; if it stays, add it to `one_off_names` with the reason. Publications and the company itself go in `not_cast` |
| K5 FAIL/WARN | a spoken count ("three pivots", "three problems") has no declared items, a wrong count, or items in the wrong order | the count was said before the items were given aloud | declare it in `counted_sets`; signpost the items as they happen ("his first pivot"); a promise's items come after it, a tally's before |
| K6 FAIL | a named idea is not defined at its first use, is defined twice, or is used fewer than twice after | the label was introduced in passing, or explained again later | define it once in plain words where it first appears ("the business world has a word for that: a pivot") and use it again |
| K7 WARN | a term the audience knows is glossed | "A crore is ten million rupees" in a script for Indian viewers | cut the gloss, or change `audience.known_terms` if the audience is different |
| K8 WARN | a vague referent ("whatever was running out", "something that") or a verb buried behind a long aside | an abstract phrase; "Puri, the man many people had doubted in the early nineties, was running..." | name the thing; split the sentence: the doubt first, then "Now Puri's company was..." |
| L1 FAIL/WARN | the hook's rise names no prize, or the fall does not open on a contrast word, or they are far apart | "For years it made more discs than anyone. One morning..." | "...and made serious money doing it. But one morning..." |
| L2 FAIL/WARN | the witness's cost line states the cost flat | "had spent 17 years inside" | "had spent a full 17 years inside"; "part of their own pay" |
| L3 WARN | a junction typed BUT with no spoken contrast near the join | the contrast is in the structure only | open the next beat on "But" or "Even though", or end the last on it |
| L4 WARN | a neutrality disclaimer ("favourite theory") | the persona's aloofness applied to a mechanism the record supports | say what the record supports and what the popular story skips; keep the disclaimer for people and for what is unproven |
| M1 FAIL/WARN | a dense beat (7 figures or 4 new names) has no headline, or the headline is late, long or holds a figure | the beat opens on a detail | one sentence, 20 words or fewer, within the first two, no figure: "What happened took half a year: the company went from saying it was well-funded to asking for time." |
| M2 FAIL | the tease is over 30 words or the takeaway over 14, or they are not in the hook | the hook ends in a long list of events and a long promise | tease: three fragments, the strongest last; takeaway: one short sentence that keeps the "you" |
| M3 WARN | lab voice ("if that is right, you would expect...", "there should be a sign") | the narrator announces a test | show the sign: "But the first signs were starting to show." |

## Tool-level problems

| Symptom | Cause | Fix |
|---|---|---|
| `check.js` T1 FAIL "0x8 at char N" | a regex written through a shell heredoc or `sed` lost a backslash | rewrite the line with the Write or Edit tool |
| Damage test MISS on a new rule | the rule has a loophole | make the mutation fail the rule by fixing the rule, not the mutation (`lesson-protocol.md`) |
| `ledger-check` MISSING for a figure | the ledger records a rounded or differently-expressed value | add the spoken form to the ledger row ("28 cents", "spoken as ₹110 crore") |
| Lint crashes on a blank beat | an empty `**VO:**` line | fixed in `lint.js`; write the VO or delete the beat |

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.