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.
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 |