Skip to content

test(docs): cover the English view-roster name column, not just the body - #1567

Merged
os-sales merged 1 commit into
mainfrom
claude/issue-1562-english-roster-coverage-name-column
Sep 3, 2026
Merged

test(docs): cover the English view-roster name column, not just the body#1567
os-sales merged 1 commit into
mainfrom
claude/issue-1562-english-roster-coverage-name-column

Conversation

@os-sales

@os-sales os-sales commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Fixes #1562

The English view-roster coverage rule asks body.includes(label) — does the name appear anywhere in the roster section, prose and bullets included. That is a pure existence question, so it is blind to multiplicity by construction and blind to an omission whenever the section's prose still names the dropped view. #1557 closed that shape on the two translated faces; the English rule was the original of it and kept the hole.

This adds the symmetric name-column coverage rule, reusing nameColumns('') and expectNameColumnIsReadable unchanged, so it inherits the revenue/approvals exclusion and the vacuity floor structurally. 11 tests to 12. File surface is test/docs-view-rosters.test.ts plus a changeset — no content/docs/** page and no src/ metadata moved.

The hole, reproduced before anything was written

On main at 7db21456 (PR #1561's merge), service/cases.mdx's Escalated Cases row renamed to All Cases in its table row only — the name column then names All Cases twice and never names Escalated Cases, row count unchanged:

 Test Files  1 passed (1)
      Tests  11 passed (11)

Green over the defect. Body coverage passed because the bullets below the table still say Escalated Cases; name exactness passed because All Cases is a lawful label; the count rule passed because no row moved. Blob 2e2ac02 to aec1304, **Escalated Cases** 3 to 2, **All Cases** 1 to 2, restored to an empty git diff HEAD with the blob back at 2e2ac02.

The 9-of-55 figure re-derived, not carried forward on trust: 9 of the 55 English name cells echo their view name in the section body outside their own table row — All Accounts, All Contacts, Open Deals, Closing This Quarter, All Tasks, All Quotes, Service Workflow, Escalated Cases, All Contracts. Re-measured independently on each face: 9/55 on English, 9/55 on zh-Hans, 9/55 on zh-Hant.

⚠️ Which rule keeps which job — and the card's premise on this is falsified

The card and the file both read the body rule as the wider net: the one that still catches a view named nowhere on the page at all, prose included. Measured, that is false, and the body rule is not deleted — it is kept and relabelled for the job it actually does.

Name-column coverage strictly implies body coverage. boldName returns a substring of the name cell, the name cell is a substring of its table row, and the row is part of the section body — so a label the name column names is a label body.includes finds, always. Contrapositive: every label the body rule reports missing is one the new rule reports missing too. There is no page and no label on which the body rule fires alone.

Measured in both directions, not argued only:

mutation body coverage new name-column rule
service/cases.mdx Escalated CasesAll Cases (prose still names it) green red
revenue/products.mdx Product CatalogAll Products (name then absent from the section entirely) red red

So the name-column rule is the detector, and the body rule is kept as a diagnostic — labelled as one in the header and at the rule itself rather than dressed up as coverage it does not add. When both fire, the view is named nowhere in the section and the page needs writing; when only the new rule fires, the view is named in prose but has no row, and the table needs a line. Folding them into one message loses that split.

The :950 question the seat asked

No third instance of the body-shaped blindness. That binding is consumed only by entryCounttableBodyRows, which keeps lines matching /^\|/ less the header and delimiter — a structural row count, never a substring search. The single body.includes(label) in the file is the body coverage rule. Measured rather than read: a prose bullet naming a lawful view name injected into service/cases.zh-Hans.mdx's roster section leaves all rules green — blob 3799917 to c0397b4, injected anchor 0 to 1 while the removed anchor stayed 3 to 3, which is why an insertion is read by its hash and its injected count.

Ablation

Every mutation confirmed on disk by blob hash and anchored counts on removed and injected text; every restore proved by state — blob back at its HEAD value and an empty git diff HEAD, never by exit code.

  • the card's own shape1 failed | 11 passed (12), only the new rule red:
    content/docs/service/cases.mdx never names "Escalated Cases" in its name column, which crm_case ships
  • name absent from the section2 failed | 10 passed (12), both coverage rules red. This is the measurement behind the subsumption above.
  • vacuity on the English face — renaming the ## Standard list views heading on revenue/products.mdx fires the reused guard inside the new rule: English: roster sections this rule read no name column out of: content/docs/revenue/products.mdx

Verification

pnpm verify green end to end on 4d1f70db — validate, typecheck, lint, lint:i18n-gate (0 i18n/missing-*), hygiene (✓ source hygiene clean), hygiene:tokens (✓ source token ratchet clean), build, and the full suite:

 Test Files  159 passed (159)
      Tests  3366 passed | 1 skipped (3367)

No roster page changed, so the guard and its subject did not move in the same round.


🤖 Generated with Claude Code

https://claude.ai/code/session_019hUuCQStzXGMFSX4dzww5t


Generated by Claude Code

The English coverage rule asks `body.includes(label)` — does the name appear
anywhere in the roster section, prose and bullets included. That is a pure
existence question, so it is blind to multiplicity by construction and blind to
an omission whenever the section's prose still names the dropped view.

Measured on the tree #1561 landed: `service/cases.mdx`'s **Escalated Cases**
row renamed to **All Cases** leaves the name column naming *All Cases* twice
and never naming *Escalated Cases*, row count unchanged, and the file ran
`Tests 11 passed (11)`. Nine of the fifty-five English name cells echo their
view name in the section body outside their own table row, so those nine rows
had no rule protecting them.

This adds the name-column coverage rule the translated faces got in #1557,
reusing `nameColumns('')` and `expectNameColumnIsReadable` unchanged so it
inherits the `revenue/approvals` exclusion and the vacuity floor structurally.

The body-shaped rule is kept, and is now labelled for the job it does. Measured,
it is not the wider net it was taken for: name-column coverage strictly implies
body coverage, so every label the body rule reports missing is one the new rule
reports missing too. It stays as a diagnostic — both firing means the view is
named nowhere in the section, only the new rule firing means it is named in
prose but has no row — and the header says that rather than claiming coverage
it does not add.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019hUuCQStzXGMFSX4dzww5t
@vercel

vercel Bot commented Sep 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
hotcrm Ignored Ignored Sep 3, 2026 12:24pm UTC

Request Review

@github-actions github-actions Bot added the ci/cd CI plumbing and the verification pipeline label Sep 3, 2026
@os-sales
os-sales marked this pull request as ready for review September 3, 2026 12:31
@os-sales
os-sales added this pull request to the merge queue Sep 3, 2026
Merged via the queue into main with commit ec5eff3 Sep 3, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd CI plumbing and the verification pipeline

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The ENGLISH view-roster coverage rule reads the section body, so the English name column can name one view twice and drop another and stay green

2 participants