Today — three code sites never got the helper the other thirty-six got:
$ mossaic-art --version
mossaic-art 0.6.3
$ mossaic-art '.' --year 2027 --no-colour --plan /dev/null | head -1
. · 2027 · 5 of 53 columns · 1 days · 4 commits
$ mossaic-art '.' --year 2027 --commits 1 --no-colour --plan /dev/null | head -1
. · 2027 · 5 of 53 columns · 1 days · 1 commits
and, in the --draw panel at every level, level 4 0 days 1 commits each.
One site that did get the helper lost its grammar — src/plan.rs:948-952, the markdown holed branch:
$ git diff v0.6.0..v0.6.3 -- src/plan.rs | sed -n '/Cannot be drawn cleanly/,+8p'
- "**Cannot be drawn cleanly** — {} day(s) inside the letters are already \
+ "**Cannot be drawn cleanly** — {} {} inside the letters already \
lit, and nothing takes those away.\n\n",
- self.holes
+ self.holes,
+ plural(self.holes, "day is", "days are")
$ … --track --format markdown … | sed -n 3p
**Cannot be drawn cleanly** — 14 days are inside the letters already lit, and nothing takes those away.
The verb moved in front of "inside the letters", so "already lit" became a reduced relative clause on the letters: the sentence now says the letters are lit rather than the days. The text renderer's equivalent (src/bin/mossaic-art.rs:798, "14 days are brighter than the picture wants") still reads correctly, so only the markdown path regressed — and markdown is what the Action publishes.
The docs were never regenerated. docs/ART.md:319 and :450 label their blocks "to reproduce this exactly":
$ sed -n '367,370p' docs/ART.md
letters ██████░░░░░░░░░░░░░░░░░░░░░░ 18 of 75 bright
owing 57 day(s) short, 5,994 contributions between them
holes 61 day(s) inside the letters are lit and cannot be unlit
around 23 day(s) outside the text have contributions
$ mossaic-art VYNCINT --year 2026 --track --merge art/vyncint-2026.json --today 2026-08-19 --no-colour --plan /dev/null | sed -n '8,11p'
letters ██████░░░░░░░░░░░░░░░░░░░░░░ 18 of 75 bright
owing 57 days short, 5,994 contributions between them
holes 61 days are lit inside the letters and cannot be unlit
around 23 days outside the text with contributions
$ grep -rn 'day(s)\|pixel(s)\|commit(s)' README.md docs/*.md | wc -l
16
Every figure matches and every line is worded differently. The same holds for the overhang note (ART.md:74), the --background report (:106), the picture-tracking table (:326), the backfill report (:456-463) and two README blocks — all six checked. The backfill warning separately lost a verb: ART.md:457 says "61 day(s) inside the letters are already lit"; the binary now prints "61 days inside the letters already lit".
Why it is worth fixing — the first line of every drawing preview reads "1 days · 1 commits" for a one-day picture, after a release whose changelog says that exact class of slip was swept up ("Counts read as English… twenty-nine of them, on the first lines a new user reads"). grep -c '(s)' src/*.rs src/bin/*.rs returns 0, which is why the pass looked finished — the three surviving sites never had a (s) to find.
The markdown sentence is the first line of the body the Action hands to every channel action/README.md documents, and it appears only when the news is bad, so it is the one sentence a reader stops on. contribution-art posts it to a public issue on every short day; the comments already on its issue #1 carry the older, correct wording, so the next report will visibly read worse than the ones above it. tests/art_cli.rs:717 asserts only md.contains("Cannot be drawn cleanly"), so nothing pins it.
The docs are the larger cost. These blocks are not illustrations, they are the project's fixtures: --today exists so "a documented sample stops being true overnight" cannot happen, and the pages hand a reader a command and the exact output it produces. A reader who diffs their output against the page cannot tell wording drift from a real regression, and a contributor who copies the documented wording into a new message reintroduces the plural 0.6.3 removed. AGENTS.md:104 states the standard: "Documentation is checked, not maintained. Where a README states a fact the code owns, there is usually a test asserting the two agree." This is the same failure as closed #33 and #32, one release later, in the document that says it is exactly reproducible.
Fix — route the three sites through plural(): src/bin/mossaic-art.rs:262 and :655 hardcode {} days · {} commits, and src/draw.rs:529 pluralises nothing in {} commits each. Restore the word order in src/plan.rs:948-952 and pluralise the noun rather than the verb — "… — {} {} inside the letters are already lit, and nothing takes {} away." with plural(holes, "day", "days") and plural(holes, "it", "those"); the trailing "those" read oddly at holes = 1 before 0.6.3 as well, so it is not a regression, but it is worth fixing in the same breath. Put the dropped "are" back in the backfill warning — note there is no plural(n, "day is", "days are") call site anywhere in src to route it through, contrary to what the wording suggests.
Then regenerate the sixteen quoted blocks: every one is a single command with --merge art/vyncint-{2026,2027}.json --today 2026-08-19 --plan /dev/null, so they can be pasted rather than retyped.
The part that matters most is the check AGENTS.md already claims exists. tests/art_cli.rs:1715 already reaches into the docs, so the cheapest version is a test that runs the documented invocations and asserts each quoted block is a substring of the output — the fixtures are pinned by --today precisely so that is possible. A regenerating script is the alternative, but a test that fails is worth more than a script nobody runs.
Done when — mossaic-art '.' --year 2027 prints "1 day · 4 commits" and --commits 1 prints "1 commit"; the --draw panel prints "1 commit each"; the markdown holed line reads as a sentence at holes = 1 and holes > 1, with a test asserting the whole sentence rather than its first four words; the backfill warning reads "…are already lit"; grep -rn 'day(s)\|commit(s)\|pixel(s)\|cell(s)\|template(s)' README.md docs/ action/ returns nothing; every command docs/ART.md labels "to reproduce this exactly" produces output containing its block verbatim; and a test fails if any of them drifts again.
Today — three code sites never got the helper the other thirty-six got:
and, in the
--drawpanel at every level,level 4 0 days 1 commits each.One site that did get the helper lost its grammar — src/plan.rs:948-952, the markdown
holedbranch:The verb moved in front of "inside the letters", so "already lit" became a reduced relative clause on the letters: the sentence now says the letters are lit rather than the days. The text renderer's equivalent (src/bin/mossaic-art.rs:798, "14 days are brighter than the picture wants") still reads correctly, so only the markdown path regressed — and markdown is what the Action publishes.
The docs were never regenerated. docs/ART.md:319 and :450 label their blocks "to reproduce this exactly":
Every figure matches and every line is worded differently. The same holds for the overhang note (ART.md:74), the
--backgroundreport (:106), the picture-tracking table (:326), the backfill report (:456-463) and two README blocks — all six checked. The backfill warning separately lost a verb: ART.md:457 says "61 day(s) inside the letters are already lit"; the binary now prints "61 days inside the letters already lit".Why it is worth fixing — the first line of every drawing preview reads "1 days · 1 commits" for a one-day picture, after a release whose changelog says that exact class of slip was swept up ("Counts read as English… twenty-nine of them, on the first lines a new user reads").
grep -c '(s)' src/*.rs src/bin/*.rsreturns 0, which is why the pass looked finished — the three surviving sites never had a(s)to find.The markdown sentence is the first line of the body the Action hands to every channel action/README.md documents, and it appears only when the news is bad, so it is the one sentence a reader stops on. contribution-art posts it to a public issue on every short day; the comments already on its issue #1 carry the older, correct wording, so the next report will visibly read worse than the ones above it. tests/art_cli.rs:717 asserts only
md.contains("Cannot be drawn cleanly"), so nothing pins it.The docs are the larger cost. These blocks are not illustrations, they are the project's fixtures:
--todayexists so "a documented sample stops being true overnight" cannot happen, and the pages hand a reader a command and the exact output it produces. A reader who diffs their output against the page cannot tell wording drift from a real regression, and a contributor who copies the documented wording into a new message reintroduces the plural 0.6.3 removed. AGENTS.md:104 states the standard: "Documentation is checked, not maintained. Where a README states a fact the code owns, there is usually a test asserting the two agree." This is the same failure as closed #33 and #32, one release later, in the document that says it is exactly reproducible.Fix — route the three sites through
plural(): src/bin/mossaic-art.rs:262 and :655 hardcode{} days · {} commits, and src/draw.rs:529 pluralises nothing in{} commits each. Restore the word order in src/plan.rs:948-952 and pluralise the noun rather than the verb —"… — {} {} inside the letters are already lit, and nothing takes {} away."withplural(holes, "day", "days")andplural(holes, "it", "those"); the trailing "those" read oddly at holes = 1 before 0.6.3 as well, so it is not a regression, but it is worth fixing in the same breath. Put the dropped "are" back in the backfill warning — note there is noplural(n, "day is", "days are")call site anywhere in src to route it through, contrary to what the wording suggests.Then regenerate the sixteen quoted blocks: every one is a single command with
--merge art/vyncint-{2026,2027}.json --today 2026-08-19 --plan /dev/null, so they can be pasted rather than retyped.The part that matters most is the check AGENTS.md already claims exists. tests/art_cli.rs:1715 already reaches into the docs, so the cheapest version is a test that runs the documented invocations and asserts each quoted block is a substring of the output — the fixtures are pinned by
--todayprecisely so that is possible. A regenerating script is the alternative, but a test that fails is worth more than a script nobody runs.Done when —
mossaic-art '.' --year 2027prints "1 day · 4 commits" and--commits 1prints "1 commit"; the--drawpanel prints "1 commit each"; the markdown holed line reads as a sentence at holes = 1 and holes > 1, with a test asserting the whole sentence rather than its first four words; the backfill warning reads "…are already lit";grep -rn 'day(s)\|commit(s)\|pixel(s)\|cell(s)\|template(s)' README.md docs/ action/returns nothing; every command docs/ART.md labels "to reproduce this exactly" produces output containing its block verbatim; and a test fails if any of them drifts again.