Rules
What chaff finds in a document, grouped by what it helps with. Open a rule to see a text it flags and the same text fixed, what it leaves alone, and how to turn it off.
Most rules run by default. A rule marked on by default (info) reports as information and never fails the run. Experimental rules (new ones not measured yet) are off: name one under rules: in chaff.yaml, or pass --experimental.
The list with examples and real output (Reference)
Readability
Sentences that run too long, packed paragraphs, and other places a reader stumbles.
- Ordinary words run together in capitals, such as "DO NOT DELETE THIS"For example: "DO NOT DELETE THIS FILE" is written in capitals
- Too much boldbold-densitySo much bold text that nothing stands out any moreFor example: 7 bold spans in 318 characters (limit 20 per 1000)
- So many emoji that the decoration drowns the textFor example: 16 emoji per 1000 words (limit 8)
- A first sentence that only repeats the heading above itFor example: The first sentence repeats the heading "How to claim expenses"
- A paragraph packed with so many sentences that the reader has nowhere to pauseFor example: This paragraph runs 4 sentences (limit 3)
- A sentence so long that the reader loses the subject before the verbFor example: This sentence runs 49 words (limit 45)
- The same phrase used over and over, so nothing new seems to be saidFor example: "We listen to our customers" appears 4 times (limit 3)
- Repeated sentence openingrepeated-sentence-headSeveral sentences in a row that open with the same wordsFor example: 4 sentences in a row open with "The tool is" (limit 3)
- A title or heading too long to take in at a glanceFor example: The heading "What every store needs to do during the move to the new inventory system in the 2025 financial year" runs 19 words (limit 14)
- An acronym such as "KGI" or "PMF" used without ever being spelled outFor example: "KGI" is used without an expansion (2 such acronyms)
- A negative negated, such as "not uncommon" or "not unlike"For example: "not uncommon" is a double negative
- A paragraph opening "In other words" that mostly repeats the one beforeFor example: This paragraph opens with "In other words" and 86% of its content words repeat the paragraph before
- Paragraphs keep opening the same wayrepeated-conjunctionParagraph after paragraph opening with a connective such as "Also" or "Moreover"For example: 3 paragraphs in a row open with a conjunction (limit 2)
- Too many -ly adverbs, which usually prop up a weak verbFor example: 20 -ly adverbs per 1000 words (limit 15)
- A Japanese sentence that turns twice on the contrastive particle がFor example: 一文に逆接の「が」が 2 個あります(1 個まで)
- Brackets inside brackets inside brackets in one sentenceFor example: Brackets nested 3 deep (limit 2)
- A Japanese sentence that chains clause after clause with て, が, ので and commasFor example: 一文に節が 6 つつながっています(5 つまで)
- Sentences in a row that open with a word pointing back (This, That, It)For example: 3 sentences in a row open with a word that points back, such as "This" (limit 2)
- Many sentences that open with "There is" or "It is ... that"For example: "There is ..." appears 2 times (limit 1)
- A Japanese adverb written in rare kanji where kana is easier to readFor example: 「殆ど」は ひらがなで書くのが読みやすいです
- A long run of kanji with no kana between them, hard for readers to take apartFor example: 「新規顧客獲得施策検討会議」は漢字が 12 字続いています(10 字まで)
- A Japanese sentence cut by many commas (、)For example: 一文に読点が 7 個あります(6 個まで)
- The same Japanese particle repeated, so what attaches to what is unclearFor example: 「の」が読点を挟まずに 3 回続いています(2 回まで)
- So many items joined by middle dots (・) in one sentence that groups blurFor example: この文に中黒が 7 個あります(5 個まで)
- Paragraph after paragraph of a single sentence, so nothing is groupedFor example: 5 one-sentence paragraphs in a row (limit 4)
- So many product, company and personal names that a newcomer gets lostFor example: 166 proper nouns per 1000 words (limit 150)
- Japanese sentences in a row that all end the same way ("…です。…です。…です。")For example: 「〜です」で終わる文が 3 文続いています(2 文まで)
- A run of sentences that open with "And", "But" or "So" (そして, しかし)For example: 3 sentences in a row open with a conjunction (limit 2)
- Many Japanese sentences that stop on a noun and read as unfinishedFor example: 本文に体言止めが 3 文あります(2 文まで)
- A Japanese sentence that makes the reader wait long for its verbFor example: 「は」で出した主題から述語まで 91 字あります(80 字まで)
Wording
Emphasis that says nothing, stock phrases, and passives that never say who acted.
- A worn phrase such as "at the end of the day" or "low-hanging fruit"For example: "at the end of the day" is a cliché
- Cliched closingclosing-clicheA stock closing such as "Hope this helps" that leaves the reader nothingFor example: Closes with "hope this helps"
- A Japanese sentence opening with a spoken conjunction (なので, でも)For example: 「なので」で始まる文が 1 個あります(1 個から)
- 並びに in a sentence with no 及び, or 若しくは in one with no 又はFor example: 「並びに」の文に、段の組になる語がありません(一段なら「及び」)
- So many softeners ("sorry to bother", "just wanted to") that the ask gets lostFor example: "sorry to bother" and other softeners: 16 per 1000 words (limit 5)
- Empty intensifierempty-intensifierWords like "extremely important" that add weight without saying what mattersFor example: "it is important to note that" emphasises without saying anything
- Too much hedgingexcessive-hedgingHedges piled up ("it may perhaps be possible") until nobody is saying anythingFor example: This sentence stacks 3 hedges ("It may be, could, perhaps")
- Open list that a limit closesnado-closed-listAn open list (etc., and so on) that "only" or "limited to" closesFor example: "etc." leaves the list open, but "only" closes it
- A word formal writing treats as nonstandard, such as "irregardless"For example: "is comprised of" is nonstandard in formal writing; write "comprises"
- A sentence that opens with a numeral, such as "20 people came."For example: The sentence opens with the numeral "20"
- A duty to act with no deadline (shall pay, shall return)obligation-without-deadlineon by default (info)A duty to pay, deliver, return or notify with no deadline, where others have oneFor example: "return" is a duty with no deadline; a time makes it one that can be met or missed
- An ordinal with the wrong endingordinal-suffix-mismatchAn ordinal whose ending does not fit its number, such as "3th" or "11st"For example: "22th" is written "22nd"
- Padded openingpadded-introAn opening such as "In recent years, X has gained attention" that says nothingFor example: "in recent years" is an opening that fits any article
- A Japanese potential form without ら, such as 見れる for 見られるFor example: 「見れ」は「ら」の抜けた形です
- Two words that say the same thing, such as "end result" or "each and every"For example: "end result" says the same thing twice
- "As far as possible", "if necessary", "etc." or "and/or" in a requirementFor example: "as fast as possible" does not say how much is enough to meet the requirement
- A sentence that opens with "So,", a spoken pause carried into writingFor example: 1 sentence opens with "So," (1 needed)
- A degree given to a word that has none, such as "very unique"For example: "very unique" grades an adjective that has no degrees
- Superlative with nothing to compareunqualified-superlativeA superlative such as "the fastest" with nothing to compare it againstFor example: "the fastest" has nothing to compare against (3 such claims)
- A deadline written as "promptly" where other deadlines are in daysFor example: "promptly" sets no deadline; a number of days makes it one that can be met or missed
- Too many vague words ("as appropriate", "as needed") for the lengthFor example: "as needed" and other vague words: 20 per 1000 words (limit 4)
- "Very" + adjective, such as "very important", used too oftenFor example: "very important" and other "very" + adjective: 12.3 per 1000 words (limit 2)
- Phrases like "many experts say" or "studies show" that credit no oneFor example: "many experts say" does not say who
- Phrases like "in order to" or "due to the fact that" where one word doesFor example: "in order to" can be said in fewer words
- A Japanese adverb that pairs with a negation (全然, 決して) used without oneFor example: 「全然」の後に打ち消しがありません
- Passive with no actoragentless-passiveA passive sentence ("the budget was approved") that never says who did itFor example: This sentence is passive ("approved") but never says who did it
- Japanese service-counter keigo (でよろしかったでしょうか, こちらになります)For example: 「でよろしかったでしょうか」はバイト敬語と呼ばれる言い方です
- A comparison such as "is faster" that never says faster than whatFor example: "faster" does not say what it is compared with
- An opening participle followed by an empty "it" or "there" as the subjectFor example: "Having reviewed the logs" has no one to attach to; the subject is an empty "it"
- A Japanese verb with the same kind of honorific applied twiceFor example: 「おっしゃられる」は敬語が二重になっています
- A Japanese humble verb used for what the reader or others do (伺ってください)For example: 「拝見してください」は謙譲語を相手の動作に使っています
- A Japanese idiom in a form dictionaries list as a mistake (的を得る)For example: 「的を得る」は誤用とされる形です。「的を射る」と書きます
- Kanji where Japanese official style writes kana (〜て下さい); koyobun style onlyFor example: 「事」は公用文ではかなで「こと」と書きます
- A Japanese document with more katakana loanwords than human-written articlesFor example: カタカナ語が 1000 字あたり 135 語あります(55 語まで)。多いのは「ボトルネック、アジェンダ、プロジェクト」です
- Verbs hidden in nouns ("make a decision", "conduct an analysis"), used too oftenFor example: "conduct an analysis" can be "analyze" (8 hidden verbs per 1000 words, limit 2)
- A request ("Please send …") with no deadline and no one named to do itFor example: This request says neither who should do it nor by when
- The Japanese humble form させていただく repeated until it hides who decides whatFor example: 「させていただく」が文書内に 4 回あります(3 回まで)
- A Japanese 〜たり used once and followed by another clause, so its pair is missingFor example: 「だり」が一つだけで、対になる「〜たり」がありません
- A Japanese sentence stacking several 〜的 words (効果的, 具体的)For example: 一文に「〜的」が 3 個あります(2 個まで)
- 時 written for a condition (受けた時は) where legal Japanese writes ときFor example: 条件を言うなら「時」は「とき」と書きます
- A Warning that names a risk but not what the reader should doFor example: This warning names a risk but not what the reader should do
- より written for a starting point (4月1日より) where official style writes からFor example: 起点の「より」は「から」と書けます
- A conclusion that only repeats the body and leaves nothing (read by an AI)Text an AI reads, for example: This article described how to make the build faster. A fast build is important.
Slips
Words and spaces left over from an edit.
- A weekday or month written in lower case, as in "on monday"For example: Write "monday" as "Monday"
- Doubled punctuationdoubled-punctuationTwo punctuation marks side by side, as ",," or ".."For example: Punctuation is doubled: ",,"
- Half-width katakana such as "アイウ", and half-width Japanese punctuationFor example: 半角の片仮名「メール」があります(全角は「メール」)
- A spaced hyphen or a double hyphen standing in for a dashFor example: "-" stands in for a dash
- A stray Latin letter left inside a Japanese word by the input methodFor example: 日本語の語の中に英字「r」が一字だけあります(変換し損ねた跡)
- Invisible characterinvisible-characterCharacters that do not show on screen, such as a zero-width spaceFor example: 1 zero-width character (U+200B): search and copy break the word here
- "e.g" or "eg." for "e.g.", and the same for "i.e."For example: "e.g" has some of its periods but not all
- Link text shows one address, the link goes to anotherlink-text-url-mismatchA link whose text is a URL on one site and whose target is on anotherFor example: The link text shows "docs.example.com" but the link goes to "old.example.net"
- Look-alike characterlookalike-characterA character that looks like an ordinary one but is a different oneFor example: "é" is a letter and a separate mark (U+0065 U+0301), not the single letter "é"
- A comma between two words with no space after it, as in "address,and"For example: No space after the comma in "address,and"
- A space before a period, comma or other mark, as in "word ."For example: A space before ","
- A bracket or quotation mark with no partner, such as a "(" that is never closedFor example: "(" is never closed
- Text runs on after a URLurl-run-onA URL followed straight away by text that the link swallowsFor example: The URL "https://example.com/guide" is followed by "—" with no space; the link runs on into it
- "a" or "an" that does not fit the next sound, as in "a apple" or "an user"For example: "a hour" takes "an" before that sound
- Chat citation residuechat-citation-residueMarks a pasted chat answer leaves behind, such as "?utm_source=chatgpt.com"For example: "utm_source=chatgpt.com" is left over from a chat answer
- "And so on" said twicedoubled-nado"And etc." or など with 等: two words for "and so on" written togetherFor example: "and etc." says "and so on" twice
- A sound-alike typed for another word, such as "it's own" or "their are"For example: "it's own" has one homophone typed for another
- Common misspellingknown-misspellingA common misspelling, such as "definately" or "seperate"For example: "seperate" is a misspelling of "separate"
- A wrong Japanese sound-alike picked by the input method (以外と for 意外と)For example: 「以外」は「意外」の変換の誤りです
- Unfilled placeholderunfilled-placeholderA template blank left unfilled, such as "[Your Name]" or "TODO: …"For example: "[Insert Date]" was never filled in
- An English word not in the dictionary but one letter from one ("attched")For example: "attched" is not in the dictionary; did you mean "attached"?
- Words that no longer agree after an edit, as in "these new version"For example: "These new version" mixes singular and plural
- Word written twicedoubled-wordThe same word written twice in a row, as in "the the"For example: "the the" doubles a word; one of the two is left over
- A long kanji compound written once with one kanji changedFor example: 「就職永河期世代」と書いています(この文書は「就職氷河期世代」を 3 回書いています)
- "Less" before a countable plural, as in "less errors" for "fewer errors"For example: "less errors" counts things; write "fewer errors"
- A stray space inside a Japanese phrase, usually left over from retypingFor example: 助詞「を」と「送り」のあいだに空白があります(この文書は文節のあいだをふつう詰めて書く。4 箇所のうち 1 箇所が空いている)
Consistency
Two ways of writing that are both right, mixed in one document. chaff does not pick a side; it points at whichever the document uses less.
- Full-width and half-width brackets mixed in one Japanese documentFor example: 括弧を「(」と書いています(この文書はふつう「(」。6 箇所のうち 2 箇所が違う)
- A code block without a language among blocks that name theirsFor example: This code block names no language, unlike the others (2 blocks name one)
- Dates written two ways in one document, as "2026-10-02" and "October 2, 2026"For example: The date "10/16/2026" is written differently from 2 other dates in the document (such as "October 2, 2026")
- Full-width !? and half-width !? mixed in one Japanese documentFor example: 「?」と書いています(この文書はふつう「?」。3 箇所のうち 1 箇所が違う)
- Headings that end with a colon or full stop mixed with headings that do notFor example: The heading "Checks:" ends with ":", while 3 other headings end bare ("Preparation")
- Bullets ("-", "*", "+", "・") mixed in one list or one documentFor example: The bullet changes from "-" to "*"; Markdown starts a new list here
- Straight quotes (" ') and curly quotes (“ ” ’) mixed in one documentFor example: The quote mark “ here, where the document usually writes " (2 of 6)
- One space between sentences in some places and two in othersFor example: 2 spaces after this sentence, where the document usually leaves 1 (1 of 3)
- Shell commands written with a "$" prompt in some places and without in othersFor example: This block writes its commands with a prompt ($) differently from the other 2 blocks
- Amounts written with and without a scale word ("$1.5 million", "$2,500,000")For example: "$2,500,000" here, where the document writes amounts of this size like "$4 million"
- The same word written both contracted ("don't") and in full ("do not")For example: "do not" is written "don't" elsewhere in the document
- One currency written two ways in one document, such as "$20" and "USD 20"For example: "USD 10" here, where the document usually writes this currency like "$300" (1 of 4)
- An ellipsis written two ways in one document, such as "..." and "…"For example: The ellipsis "..." here, where the document usually writes "…" (1 of 3)
- One list mixing phrases with sentences, or verb-first items with noun-first onesFor example: "The configuration file in your home folder" opens with a noun phrase; the other items in this list open with a verb (1 of 3)
- A paragraph ending without 。 in a document whose other paragraphs end with itFor example: この段落は「。」で終わっていません(この文書の段落はふつう「。」で終わります。4 段落のうち 1 段落)
- Numbers written two ways in one document, such as 1,000 and 1000For example: "5" here, where the document usually writes numbers below ten like "three" (1 of 3)
- One document calling itself or its reader two ways ("you" and "one")For example: "One can" here, where the document usually says "you" (1 of 5)
- Ranges written with two marks in one document, such as "10–20" and "10-20"For example: The range "6-12" here, where the document usually writes ranges like "10–20" (1 of 4)
- The same column header written two ways across tables (Owner and Owners)For example: The table header "Owners" here, where the document's other tables write "Owner" (1 of 2)
- A number and its unit spaced in some places and not others (5 GB, 5GB)For example: "20GB" here, where the document usually writes this unit like "5 GB" (1 of 3)
- Abbreviation expanded two waysacronym-expansion-conflictThe same abbreviation spelled out as two different names in one documentFor example: "SLA" is expanded as "Support Level Agreement" here and as "Service Level Agreement" on line 1
- A URL written bare in a document whose other links are wordsFor example: The URL "https://example.com/contact" is written bare (3 worded links in this document)
- A paper that cites as [1] in one place and as (Smith, 2020) in anotherFor example: The citation "(Young, 2020)" is written differently from the paper's other citations ("[1]" and others, 2 in all)
- The same word spelled one way in some files and another way in othersFor example: "e-mail" here, but "email" in 2 other files checked with it (as in a.md)
- A party given a short name ("the Supplier") and later written out in fullFor example: "Harbour Works Ltd" was given the short name "Supplier" on line 3
- A defined term later written in another form: quoted, lower case, or lengthenedFor example: "Services" is defined with a capital on line 3, but written in lower case here
- Full-width and half-width letters and digits are mixedfullwidth-alnum-consistencyon by default (info)jaLetters and digits both full-width (ABC123) and half-width (ABC123)For example: 全角の「2024」と書いています(この文書はふつう半角の「2024」。4 箇所のうち 1 箇所が違う)
- A katakana word written both with and without its final ー (コンピューター, コンピュータ)For example: 「コンピュータ」と「コンピューター」が混ざっています(この語は 2 回のうち 1 回が「コンピュータ」)
- Japanese commas or periods written two ways (、 and ,, 。 and .)For example: 読点を「,」と書いています(この文書はふつう「、」。3 箇所のうち 1 箇所が違う)
- A space between Japanese and Latin letters in some places and not othersFor example: 日本語と英字のあいだを詰めています(この文書はふつう空ける。7 箇所のうち 2 箇所が違う)
- The same person, company or product name written slightly differentlyFor example: "Github" is written "GitHub" elsewhere in the document (case, width or punctuation)
- A Japanese sentence whose polite or plain ending differs from the restFor example: この文だけ他と文末の調子が違います(本文の中で 1 文)
- One word written two ways in one document, such as e-mail and emailFor example: "e-mail" here, where the document usually writes "email" (1 of 3)
- A name outside the announced listoutside-announced-listA platform or language named later that the list given earlier left outFor example: "Linux" is not in the list given on line 1 (Windows, macOS)
- Lists that put a comma before the final "and" in some places and not in othersFor example: This list punctuates differently from the rest (1 in this document)
- 乙及び甲 in a contract that otherwise writes 甲及び乙For example: 「乙及び甲」は、この文書がほかの所で書く順(「甲又は乙」)と逆です
- A party named by its role instead of the name the contract gave itparty-role-nameon by default (info)A party given a short name ("the Supplier") and later called something elseFor example: "Vendor" is not a name this contract gave a party (Supplier, Customer)
- British and American spellings (colour and color) mixed in one documentFor example: "color" here, where the document usually spells it "colour" (1 of 3)
- Numbered steps that mix statements (The tool asks) with orders (Run it)For example: This step is a statement that opens with its subject, unlike the other 3 instructions
- Headings that mix Title Case and sentence caseFor example: This heading's capitalisation differs from the rest (1 in this document)
- A screen label written two ways that differ only in case, spacing or a particleFor example: "Start restore" is written as "Start Restore" elsewhere
- A term written like a defined one (its Affiliates) that is never definedFor example: "Affiliates" is written like a defined term, but the document defines it nowhere
- Restrictive clauses opened with "which" in some places and "that" in othersFor example: This restrictive clause opens with "which"; the document mostly uses "that"
Structure
Skipped numbers, references to provisions that are not there, terms defined twice, long preambles.
- Link that goes nowherebroken-linkA link that goes nowhere: no address, a missing heading, or no definitionFor example: The link "[Install](#install)" points to "#install", which is not a heading on this page
- A section with no number, code or link: nothing for the reader to take awayFor example: Section "Results" has no number, code or link (1 of 1 section)
- Link to another file that goes nowherecross-doc-broken-linkA link to another of the files checked whose file or heading is not thereFor example: The link "[Setup](./a.md#preparation)" points to "./a.md#preparation", but that file has no such heading
- A date with no year where the document's dates span years or cross a new yearFor example: "October 28" has no year, and the document's dates run from 2025 to 2026, so the year is unclear
- Duplicate sibling headingduplicate-headingTwo headings with the same words under the same parent headingFor example: The heading "Before you start" repeats the one on line 3 under the same parent
- Empty list itemempty-list-itemA list item with only a label ("Owner:") and no value, or with nothing in itFor example: Nothing after "Owner" (the other items in this list give a value)
- Empty sectionempty-sectionA heading with nothing under it before the next heading at its level or higherFor example: Nothing under the heading "Before you start"
- Blank table cellempty-table-cellA table cell left blank in a column every other row fillsFor example: The "Owner" column is blank in this row only
- A heading that skips a level, such as "####" right after "##"For example: Heading "Safety" goes from level 2 to level 4 (expected 3)
- Sibling headings numbered in mixed ways: "1. Overview", "2. Steps", "Summary"For example: The heading "Summary" has no number, while 2 of its siblings do ("1. Overview")
- Image without alt textimage-alt-textAn image with no alt text, as in ""For example: Image "" has no alt text
- Image alt text is a file nameimage-file-name-altAn image whose alt text is a file name, as in ""For example: The image alt text "IMG_2041.png" is a file name
- A first paragraph under the title that only says the title againFor example: The paragraph after the title "The new inventory system" adds only 2 words the title does not have
- Number without its unitnumber-without-unitA bare number where the other values in its column all have a unitFor example: "960" has no unit (the other "Cost" values carry "$")
- Headings such as "Benefit 1" and "Tip 2" that are only a label and a numberFor example: The heading "Benefit 1" is only a label and a number and says nothing about the section (2 such headings)
- Too many paragraphs before the first heading, which delays the pointFor example: 3 paragraphs before the first heading (limit 2)
- Table row with more cells than the headertable-row-overflowA table row with more cells than the header row (the extra ones are not shown)For example: This row has 3 cells; past the header's 2 columns they are not shown
- Unclosed code fenceunclosed-code-fenceA code block opened with "```" and never closedFor example: The code block opened with "```sh" is never closed
- Unrendered emphasis marksunrendered-emphasis"**" or "__" that Markdown cannot pair and shows as writtenFor example: "**" is not turned into bold and shows as written
- Link text that does not say where it goesvague-link-textA link whose whole text is "here", "click here" or "read more"For example: The link text "here" does not say where it goes
- A work email that opens without a greeting or ends without a closingFor example: The email does not open with a greeting
- Subject line empty or too longemail-subject-lengthA work email whose "Subject:" line is empty or longer than the limitFor example: The subject has 93 characters (up to 70)
- A figure, table or clause pointed at by where it isvague-figure-reference"The table below" in a document that numbers its tables and figuresFor example: Name it by its number instead of "the figure below" (this document numbers its Figures)
- An absolute rule with an exception written elsewhereabsolute-exceptionA rule said to have no exception ("must always") that another part exceptsFor example: This says "always", but line 7 makes an exception ("except") for the same act
- An abstract over the length limit, or a paper with sections that has no abstractFor example: This paper has sections but no abstract
- One term defined differently in different filescross-doc-duplicate-definitionThe same term defined in other words in different filesFor example: "Member" is defined in other words than in 2 other files checked with it (as in a.md)
- Reference to a missing provisiondangling-referenceA reference such as "see Article 5" to an article the document does not haveFor example: "Article 5" (address 5) is not in this document
- Term defined twiceduplicate-definitionThe same term defined in two places in one documentFor example: "Service" is also defined on line 5
- Figures and tables referred to out of order or out of placefigure-reference-orderon by default (info)A figure or table referred to out of order, too late, or neverFor example: Figure 1 is first referred to after Figure 2
- A note mark with no note, or a note nothing points tofootnote-mismatchA note mark ("[^3]") with no note, or a note nothing points toFor example: There is no note for "[^2]"
- Opposite obligations on the same actmodal-conflictThe same act required or allowed in one sentence and forbidden in anotherFor example: This says "may", but line 3 says "must not" about the same act
- Skipped or repeated numbernumbering-gapA numbered item that skips or repeats a number, such as Article 1 then 3For example: "Article 3" follows "Article 1" (expected number 2)
- "Before you begin" written after the numbered steps it should come beforeFor example: This prerequisite comes after the steps it applies to
- A required skill listed again as preferredrequired-listed-as-preferredA job posting that lists one skill both as required and as preferredFor example: "At least three years of bookkeeping experience" is also listed as required (At least three years of bookkeeping experience)
- A reference to a step that does not existstep-reference-missingA reference such as "see step 5" past the last step the document hasFor example: "step 4" is referred to, but the steps end at 3
- A table-of-contents entry with no headingtoc-heading-mismatchA table of contents entry that matches no heading of the documentFor example: No heading matches the contents entry "2 Costs"
- A step uses something the list of what you need leaves outunlisted-item-usedA step that uses an ingredient or a tool missing from the document's own listFor example: "pepper" is not in Ingredients
- A term the document defines and then never usesFor example: "Service" is defined but never used
- A term defined in passing, as in (the "Seller"), that is used before that pointFor example: "Seller" is used here, before it is defined on line 1
- A proposal that gives only the upside and no risk (read by an AI)Text an AI reads, for example: Moving to the new accounting system closes the month three days sooner. It also cuts costs by 20,000 dollars a year.
Facts that disagree
A date and its weekday, dates out of order, a total and its items: disagreements a calendar or a sum can settle.
- Default value stated two waysdefault-value-mismatchA parameter's default that differs between the signature, a table and the textFor example: The default of `width` is given as 80 here, but as 72 elsewhere
- Deprecated name used in an exampledeprecated-option-usedAn option the document calls deprecated, still used in one of its examplesFor example: `indent` is used in an example, but the document calls it deprecated
- A heading names a command its section's code does not showheading-command-missingon by default (info)A command or option named in a heading that the section's examples never useFor example: "--dry-run" in this heading does not appear in the section's code
- Number in words differs from its figurenumber-word-figure-mismatchA number in words with a different figure in brackets, as "six (7) months"For example: "Fifty Thousand Dollars ($5,000)" says 50,000 in words and 5,000 in figures
- Parameter table that does not match the signatureparameter-table-mismatchA parameter in only one of a signature and the parameter table under itFor example: `tabSize` is in only one of the signature of `measure` and its parameter table
- A return type stated two waysreturn-type-mismatchA return type that the signature and the description state differentlyFor example: `measure` is said to return string here, but its signature returns `number`
- Example calls a function the page does not defineundefined-function-callAn example calling a name the page never defines, close to one it documentsFor example: `wrapText` is called, but this page documents `wrap`
- The version in the text is not the one in the codeversion-mismatchA version named right above a code block that the block does not useFor example: "2.3.0" is written, but the code below has 2.4.0
- A version out of order in a changelogversion-orderOne version out of order in a changelog or a list of releasesFor example: 3.3.0 breaks the order of the versions around it (after 3.1.1)
- Attachment mentioned but not shownattachment-not-attachedAn email that says something is attached but shows no attachmentFor example: An attachment is mentioned, but no attachment line or file name is shown
- A quotation given to a speaker named only by a role ("…," said an analyst)For example: "Few products for small businesses show all their stock on one screen" is given to "an analyst", who is not named
- A quotation given to someone ("X said …") in a paragraph that gives no sourceFor example: "adding people to a late project only makes it later." is given to someone, but no source (a link, a footnote, a reference) is given
- An amount range whose upper end is below its lower endamount-range-reversedAn amount range that ends lower than it starts, such as "$90,000–$70,000"For example: The amount range "$90,000–$70,000" ends below where it starts
- A list that does not have the number of items announcedannounced-count-mismatchA list whose number of items differs from the number announced just before itFor example: "three items" is announced, but the number of items in the list below is 2
- Annual days off fewer than the weekly days off giveannual-holidays-mismatchAnnual days off fewer than the 104 days that two days off every week giveFor example: The annual days off (90 days) are fewer than the 104 days a year that "Two days off every week" gives
- An example annual pay that is not the monthly pay and bonusannual-pay-mismatchAn example annual pay that is not 12 months' pay plus the bonus monthsFor example: $75,000 is not 15 months of the monthly pay $4,800 (twelve months and a bonus of three months)
- An arrival before its departurearrival-before-departureA flight or a train in an itinerary that arrives before it departsFor example: Arrives at 1:05 PM, before it departs at 1:30 PM
- A backordered quantity that is not the ordered less the deliveredbackorder-mismatchA backordered quantity that is not the ordered less the delivered on its rowFor example: The backordered quantity "25 boxes" is written, but the ordered and delivered quantities on the row give 20 boxes
- A BMI in a checkup that the weight divided by the height squared does not giveFor example: BMI 21.4 is written, but the height and weight give 23.4
- A runtime longer than the battery capacity divided by the consumptioncapacity-runtime-mismatchA runtime longer than the battery capacity divided by its consumptionFor example: 50 Wh at 10 W lasts 5 hours, but the runtime is given as 8 hours
- A rate of change the two values do not givechange-rate-mismatchA rate of change the two values in one sentence or table row do not giveFor example: "20%" is written, but the two values give 50%
- Citations and reference list do not matchcitation-reference-mismatchA citation with no entry in the reference list, or an entry the text never citesFor example: The citation "[3]" names 3, which is not in the reference list
- A closing balance that is not the opening balance plus deposits less withdrawalsclosing-balance-mismatchA closing balance that is not the opening balance plus deposits less withdrawalsFor example: "$2,165.56" is written, but the opening balance plus deposits less withdrawals is $2,156.56
- A connection shorter than the stated travel timeconnection-time-shortAn itinerary that leaves less time for a connection than the trip it statesFor example: Only 10 minutes from 9:05 AM to 9:15 AM, less than the stated travel time (25 minutes)
- A contact written two wayscontact-variantAn email or postal address written differently in one placeFor example: The email address suport@hibari-lab.example may be a slip for support@hibari-lab.example
- More registered than the stated capacitycount-over-capacityA stated capacity smaller than the number registeredFor example: The capacity (90 seats) is smaller than the number stated later (95 members)
- One item given different values in different filescross-doc-fact-conflictThe same item (a fee, a deadline, a contact) given different values in two filesFor example: "Monthly fee" is $15 here, but $12 in 2 other files checked with it (as in a.md)
- A cumulative figure lower than this period'scumulative-below-currentA year-to-date figure lower than the same row's figure for this periodFor example: The cumulative figure "$85.80" is lower than this period's "$96.00"
- One amount in another currency in a column of amountscurrency-column-mixA lone amount in another currency in a column, such as ¥12,500 among dollarsFor example: "Marine insurance" is written "¥12,500", in another currency than the rest of its column ("$640.00")
- Reference to a missing figure or tabledangling-figure-referenceA figure or table the text refers to that the document does not haveFor example: Figure 3 is referred to, but the document has no Figure 3
- A date out of order in a scheduledate-orderOne date out of order in an itinerary, a schedule or a changelog's headingsFor example: 5 March 2026 breaks the order of the dates around it (after 3 April 2026)
- A date outside the stated perioddate-outside-periodA dated item outside the period the document gives, such as a trip's datesFor example: May 7 is outside the stated period "May 3–5, 2026"
- A period that ends before it startsdate-range-reversedA period whose end date comes before its start dateFor example: The period "1 April 2026 – 31 March 2026" ends before it starts
- An established date after the last updatedate-stamp-orderAn established date later than the last update at the foot of a policy or termsFor example: The established date April 1, 2027 is after the update July 1, 2026
- Date and weekday disagreedate-weekday-mismatchA date and its weekday that disagree, such as "Friday, 1 October 2026"For example: 1 October 2026 is a Thursday, not a Friday
- A registration deadline after the eventdeadline-after-eventA sign-up or RSVP deadline that falls after the event itselfFor example: The registration deadline November 27, 2026 is after the event on November 20, 2026
- A deductible larger than the most paiddeductible-exceeds-limitA deductible or excess larger than the most paid for the same benefitFor example: The excess of $80 is more than the most paid, $50: this benefit would never pay out
- A delivered quantity larger than the ordered quantitydelivered-over-orderedA row of an order table that delivers more than was orderedFor example: The delivered quantity "300 folders" is larger than the ordered quantity "250 folders" on the same row
- A discount that the list price and the tier price do not givediscount-rate-mismatchA discount on a price list that the list price and the tier price do not giveFor example: The discount 15% is not what the list price $0.080 and the price $0.072 give (10%)
- A due date before the issue datedue-before-issueA due date or other later date that falls before the date it must followFor example: The due date November 25, 2026 is before the issue date November 30, 2026
- A start plus a length of time that does not reach the stated endduration-mismatchA start date plus a length of time that does not reach the end date givenFor example: April 1, 2026 plus 3 months ends around June 30, 2026, but the end is given as July 31, 2026
- A number of sessions times their length that does not make the stated totalduration-product-mismatchSessions times the length of each that does not make the total givenFor example: 15 sessions of 90 minutes make 22 hours 30 minutes, but the total is given as 24 hours
- A count of years that does not match its starting yearelapsed-years-mismatchA count of years or an age that does not match its starting year or birth dateFor example: From 1980 to 2026 is 46 years, but the text says "30"
- One item given two different valuesfact-conflictThe same item (a deadline, a fee) given two different values in one sectionFor example: "Deadline" is May 5, 2026 here, but May 3, 2026 earlier in the same section
- An amount that is not what its label's formula givesformula-amount-mismatchAn amount that is not what its label's formula ("5% of the sale price") givesFor example: $12,000.00 is not "5% of the sale price" worked out on the sale price $250,000.00 ($12,500.00)
- A grade-point average that is not what the course grades and credits giveFor example: The GPA "3.52" is written, but the course grades and credits give 3.33
- A date the calendar does not haveimpossible-dateA date not on the calendar ("February 30"), or a year two calendars disagree onFor example: "April 31" is not on the calendar (that month has 30 days)
- A time the clock does not haveimpossible-timeA time the clock does not have, such as "13 PM", "午後13時" or "10:75"For example: "13 PM" is not a time (with AM or PM, the hour runs to 12)
- A total of payments that is not the payments added upinstallment-total-mismatchA total of payments that is not the number of payments times the paymentFor example: The payments add up to $2,544.00 ($106.00 × 24), not the total of payments $2,496.00
- Interest on a statement that is not the stated balance times the stated rateFor example: The interest $1.80 is not the balance $3,600.00 at 0.50% ($18.00)
- A minimum interval and a maximum count of uses that cannot both hold, or a count that differs from the tableinterval-count-mismatchA minimum gap and maximum count that conflict, or a maximum unlike the table'sFor example: 4 feedings a day at least 8 hours apart take 24 hours from the first to the last, which does not fit in 24 hours
- A layout that does not match the rooms listedlayout-code-mismatchA room layout such as "3 bedrooms" that does not match the rooms listedFor example: The layout "3 bedrooms" has 3 rooms, but the room list names 2
- Quantity times unit price is not the line amountline-amount-mismatchA line of a quote or invoice whose quantity times price is not its amountFor example: The amount $6,000 is not quantity × unit price (4 × $1,600 = $6,400)
- The meter readings' difference is not the usagemeter-usage-mismatchA utility bill whose current minus previous meter reading is not the usageFor example: The readings' difference (48,650 kWh − 47,900 kWh = 750) is not the usage 720 kWh
- A net amount that is not the gross amount minus the deductionsnet-amount-mismatchA net pay that is not the gross pay minus the total deductionsFor example: "$1,369.41" is written, but the gross amount minus the deductions is $1,396.41
- A net weight larger than the gross weightnet-over-grossA row of a packing list whose net weight is larger than its gross weightFor example: The net weight "68.0 kg" is larger than the gross weight "65.0 kg" on the same row
- Shares of a whole that do not add up to 100%percent-sum-mismatchA breakdown whose percentages do not add up to 100%For example: The shares add up to 90%, not 100%
- A period other than the one the title reportsperiod-label-conflictNot the title's period: Q3 in a Q2 release, tax year 2025 in a 2026 statementFor example: "FY2025" is not the period the title reports, "FY2026"
- An amount that is not the stated number of paymentsperiod-multiple-mismatchAn amount said to be 12 monthly payments that is not 12 times the monthly oneFor example: $298 is not 12 × the Monthly amount ($24), though it says 12 monthly payments
- A part of a period that is longer than the periodperiod-part-exceeds-wholeA part of a period longer than the whole: 18 months within a 12-month warrantyFor example: "18 months" is longer than the period it is part of, "12-month"
- Phone number with two digits swappedphone-number-variantA phone number written elsewhere with two digits swappedFor example: The phone number 0120-123-465 is 0120-123-456 with two neighbouring digits swapped
- An amount per use times the uses that goes over the stated maximumproduct-exceeds-maximumAn amount per use times the uses per period that is over that period's maximumFor example: 2 tablets each, 3 times a day, makes 6 tablets, more than the stated maximum of 4 tablets
- A measured range whose upper end is below its lower endquantity-range-reversedA measured range that ends lower than it starts, such as "-10 to -40 °C"For example: The range "-10 to -40 °C" ends below where it starts
- Bands that overlap or leave a gaprange-band-mismatchNeighbouring bands that overlap or leave a gap, such as "7 to 12", "12 to 14"For example: The bands "1 to 6 years" and "8 years and over" leave a gap between them
- A margin the two values it divides do not giveratio-mismatchA margin in a table or sentence that is not its profit divided by its salesFor example: Operating margin "8.0%" is written, but its two values give 7.3%
- A flag that does not match the result and its reference rangereference-flag-mismatchA lab result flagged high though within its range, or normal though outside itFor example: "HbA1c" is 5.2 %, within its reference range (4.0–5.6 %), but is flagged "H"
- The same receipt or invoice number on two rows of an itemised tablereference-number-repeatedThe same receipt or invoice number written on two rows of one itemised tableFor example: "K-119" in the column "Receipt no." is already on line 4
- Booking or reference number with two characters swappedreference-number-variantA booking number written once with two neighbours swapped (MN-48215, MN-48251)For example: The number MN-48251 is MN-48215 with two neighbouring characters swapped
- A reference whose name does not match its target's headingreference-title-mismatchon by default (info)A reference's title ("Section 5 (Privacy)") that differs from the headingFor example: Section 2 is called "Refunds" here, but its heading is "Pricing"
- A reference that names a topic ("see Section 2 for pricing") never found thereFor example: "refunds" does not appear in Section 2 (Pricing)
- A test result in another unit than its reference rangereference-unit-mismatchA results table row whose result and reference range are in different unitsFor example: The result "0.82 mmol/L" for "Creatinine" is in another unit than its reference range "0.57–1.11 mg/dL"
- A relative date that does not match its base daterelative-date-mismatchA date given as "two weeks later, on May 16" that is not that far awayFor example: Two weeks later from May 1, 2026 is May 15, 2026, but the date is given as May 16, 2026
- A deposit that is not the stated months of rentrent-multiple-mismatchA deposit amount that is not the stated months of rentFor example: $3,000 is not 2 months of the rent ($1,600)
- A forecast revision that moves the other wayrevision-direction-mismatchA forecast said to be revised up whose new figure is lower, or the reverseFor example: "revising upward" is written, but Net sales goes the other way, from 5,200 to 5,000
- A running balance the row above and this row's amounts do not giverunning-balance-mismatchA running balance that is not the balance above plus or minus this row's amountsFor example: The balance "$2,298.00" is written, but the row above and this row give $2,288.00
- One row of a servings table that does not scale with the othersscaled-quantity-mismatchA recipe table with one row that does not scale with the servingsFor example: "Ketchup" Serves 8 "4 tablespoons" does not scale like the other 3 rows (from Serves 4 "4 tablespoons", the ratio gives 8)
- A serial or lot number range that ends below where it startsserial-range-reversedA serial or lot number range that ends below its start, such as "L5240 to L5210"For example: The number range "B3900 to B3100" ends below where it starts
- An amount paid that is not the stated share of the totalshare-amount-mismatchAn amount paid on a medical bill that is not the stated share (30%) of the totalFor example: The amount $108.00 is not 30% of the total $600.00 ($180.00)
- A share above 100%share-over-hundredA share of a group over 100%, such as "120% of respondents"For example: "120%" is a share of respondents, so it cannot pass 100%
- A total time that is not the sum of the steps' timesstep-time-sum-mismatchA recipe or guide whose total time is not the sum of its steps' timesFor example: "30 minutes" is not the sum of the times in the 3 steps (40 minutes)
- A summary value that differs from the bodysummary-fact-mismatchA value in the summary (a deadline, a fee) that differs from the bodyFor example: The summary gives "The fee" as $300, but the body gives $350
- A table that mixes scales of amounttable-unit-mixA cell in thousands in a table in millions, or a row a thousand times the othersFor example: "Net profit" is written "$110,000 thousand", in another scale than the table's (million)
- A tax that is not its rate of the subtotaltax-mismatchA tax line, or a price list's price with tax, that does not match the tax rateFor example: The tax $880 is not 10% of the amount above it ($800)
- A member's tier that their own points or nights do not reachtier-threshold-mismatchA stated tier whose member's points or nights fall outside that tier's bandFor example: The tier "Platinum" needs "30 nights or more stayed last year", but "24 nights" falls in "Gold"
- A time out of order in a day's scheduletime-orderOne time out of order in an itinerary or a day's programmeFor example: 11:00 AM breaks the order of the times around it (after 12:00 PM)
- A time range that ends before it startstime-range-reversedA time range whose end comes before its startFor example: The time range "2:00 to 1:30 pm." ends before it starts
- A total that is not the sum of its itemstotal-mismatchA total in a quote, invoice or contract that is not the sum of its itemsFor example: The total $9,000 is not the sum of its items ($8,000)
- One item given in two units that do not convertunit-mismatchThe same item in two units that do not convert ("5 km" and "3000 m")For example: "Distance" is 3000 m here, but 5 km earlier in the same section, and they do not convert
- A variance that is not the difference of the budget and the actualvariance-mismatchA table row whose variance is not the difference of its budget and actualFor example: "Emergency supplies" shows a variance of "$43.50", but its budget and actual give "$34.50"
- A walking time that does not match the stated distancewalk-time-distance-mismatchA walking time that does not match the distance beside itFor example: "3-minute walk" does not match "600 m" (8 minutes at 80 m per minute)
- A number the reader has no way to check (checked by an AI)Text an AI reads, for example: Nine in ten users are happy with this feature.
Signs of generated text
Traits common in generated text. None of them alone says the text was generated; they mark places to reread.
- Several signals of generated text togetherai-generated-compositeMany signs of generated text in one document (a place to reread, not a verdict)For example: "ai-tell, rule-of-three, padded-intro" occur together in this document (3 signals, 2 needed)
- An outline that lies past human articles on several structure measures at onceFor example: 3 structure measures lie past 90% of human articles (2 needed): sections of one or two paragraphs, headings split into three, list items opening with a bold label
- List items, one after another, that open with a bold label and a colonFor example: 「速さ」など、太字の札で始まる項目が 5 個あります(5 個から)
- Section after section that opens with a sentence ending in a colon before a listFor example: コロンで箇条書きへ渡す文が 1000 字あたり 3.6 個あります(2 個まで)
- Headings with an emoji in them ("## 🚀 Getting started"), one after anotherFor example: Heading "🚀 Getting started" has an emoji (3 headings with one, 3 needed)
- Too many dashes, which is also one of the better-known marks of generated textFor example: 16 dashes per 1000 words (limit 8)
- Paragraphs all of about the same length, as if poured into a mouldFor example: Paragraph length varies by only 3% (want at least 30%)
- Lists that almost all have exactly three items, as if padded or trimmed to fitFor example: 3 of 3 lists have exactly three items (70% allowed)
- Every section filled to the same size, which is what a template doesFor example: Section length varies by only 6% (want at least 35%)
- Monotonous sentence rhythmsentence-rhythmSentences that are all about the same length, so the text reads as a droneFor example: Sentence length varies by only 6% (want 30%)
- Phrases common in generated text ("delve into", "plays a crucial role") piled upFor example: "delve into, in today's fast-paced world, plays a crucial role" appear together (score 26, limit 18)
- Openers that announce a point before making it ("The key point is") piled upFor example: "The key point is" and other announcing openers start 3 sentences (3 needed)
- Chat-reply residueassistant-residueWords left from a pasted chat reply, such as "I hope this helps"For example: "as of my last knowledge update" is chat-reply wording (score 10, from 10)
- Contrasts piled up ("It's not X, it's Y"), knocking down an X nobody saidFor example: "not just" and other contrast frames: 8.2 per 1000 words (limit 3)
- Figures such as "like magic" or "secret sauce" piled up instead of the mechanismFor example: "like magic" and other decorative figures: 16 per 1000 words
- Too many sentences opening with "Moreover" or "Additionally"For example: "Moreover" and other stock transitions open 12.4 sentences per 1000 words (limit 6)
- Japanese that copies English syntax (を可能にする, 重要な役割を果たす, あなたは) too oftenFor example: 「を可能にする」など、翻訳調の言い回しが 1000 字あたり 5 個あります(1 個まで)
Your team's words
Rules that check only what your team lists in chaff.yaml: spellings, jargon, required headings. With nothing listed, they say nothing.
- A heading the team requires (such as "Risks") missing, set in chaff.yamlFor example: No heading for "Risks"
- Words that only work inside your team, from jargon in chaff.yamlFor example: "ping" may only be understood inside your team (1 such word)
- A spelling the team chose not to use ("e-mail" for "email"), from chaff.yamlFor example: Write "email", not "e-mail"
- A provision's verb form is not the one the house rule usesrequirement-modalwhen listed in chaff.yamlA requirement's verb ("must", "shall") that the team's house rule does not useFor example: Write "must" instead of "shall"