All rules

A count of years that does not match its starting year

elapsed-years-mismatchon by defaultJapanese / English

A count of years or an age that does not match its starting year or birth date

Example

Flagged
April 1, 2026 Jane Doe (born in 1980, aged 30) leads the team.
What chaff prints
3:30 From 1980 to 2026 is 46 years, but the text says "30"
Fixed
April 1, 2026 Jane Doe (born in 1980, aged 46) leads the team.
What chaff prints
no finding

How to fix

Check whether the count or the starting year is right and correct the other. A count that changes every year can be replaced by the starting year alone.

Why it matters

A document that says "founded in 2015" and "5 years since its founding", or "born in 1980 (aged 30)", has kept one figure from an older version. It happens when last year's document is copied and only the date is changed. The starting year is taken from the document's own date (a paragraph holding only a date, or "Updated:") and compared with the count of years. A difference of one year is not pointed out, because of birthdays and of counting the tenth year as 10. A count written as a word ("ten years since its founding") is read as well. An age written beside a labelled date of birth ("Date of birth: March 2, 1969 (age 57)") is compared exactly with the age on a labelled date such as "Examination date" or "Report date", one less before the birthday; "at examination" picks the examination date.

What it does not flag

A document with no date of its own (a paragraph holding only a date, or "Updated:") has no year to count to and is not checked. A difference of one year, a count not attached to the origin word ("listed 3 years after its founding"), and a sentence without exactly one year of birth and one age are left alone. An age beside a date of birth is left alone when the date to count to (Examination date, Report date, As of) is missing or not one date (two examination dates), when the age is approximate, or when the date of birth has no year.

Turning it off or relaxing it

Silence this one spot (in the document)
<!-- stet: elapsed-years-mismatch — reason -->
Relax it for the team (the reason is kept as a comment in chaff.yaml)
npx chaffjs relax elapsed-years-mismatch --why "reason"
Turn it off for the team (chaff.yaml)
rules: elapsed-years-mismatch: off
Technical details
Layer
L3
Status
stable
Severity
warning
Languages
Japanese and English
Suited to
business, technical, blog, legal, docs, academic, literature, speech
Reads from the document
dates

Levels

Set a level for this rule under rules in chaff.yaml. With nothing set, it runs at the level its genre gives it (see By genre below).

normalwarning
relaxedinfo

This rule has no limit to count to. A level sets how a finding is marked: relaxed keeps the finding and marks it a step lower.

By genre

Runs by default in
technical/spec, technical/readme, blog/tech, blog/essay, blog/owned-media, business/proposal, business/report, business/email, business/press-release, business/meeting-notes, legal/contract, legal/statute, legal/judgment, legal/patent, docs/manual, docs/faq, docs/glossary, academic/paper, speech/address, speech/transcript
Turned off by the genre in
literature/fiction, literature/essay, literature/poetry, literature/play

Genres

Message

From {origin} to {reference} is {expected} years, but the text says "{written}"

Someone born on {birth} is {expected} on {reference}, but the text says "{written}"

Rewrite depth (chaff fix-plan --depth): light — words and sentences; the structure and the voice stay

This page is built from the rule's definition file:packages/chaff/rules/elapsed-years-mismatch.yaml