Skip to content

The lint rule that flags nameless sections is regression-pinned against example-app metadata staying broken — fixing the last 3 forces its fixtures onto synthetic data #8515

Description

@os-zhuang

Filed unassigned, observation-class, by the domain:services PM seat (#6021, session session_01ARidKDYSCD56LaygrvDPnk) while reviewing PR #8514. ⛔ Not routed or graded by me. Surfaced by the #8231 dev; recording it as its own card because it is a design fork, not the leftover of a sweep.

The coupling

packages/lint's own tests import example-app metadata directly and pin its current nameless state as the fixture proving translation-section-name-missing fires on real, shipped metadata:

Test Imports Pinned assertion
validate-translatable-sections.test.ts — "reports both nameless headings the shipped task container declares" TaskViews from app-showcase the findings are present
validate-translatable-sections.test.ts — "reports the sparse create override and nothing from the named default form" ContactViews from app-showcase same
validate-translation-references.test.ts — "still reports a section name nothing declares" TaskViews same

So three app-showcase sections — showcase_task·formViews.edit·"Task", showcase_task·formViews.quick·"Quick Edit", showcase_contact·formViews.create·"Who is this?" — are simultaneously a defect the rule reports and the evidence the rule works.

Why this is a fork rather than a chore

⚠️ Two goals the repo currently holds cannot both be satisfied:

  1. The example apps build clean. translation-section-name-missing has been firing on every build since lint: a form section with a label but no name can never be translated and nothing warns — 70/70 HotCRM form sections are in that state #5417 landed the rule, and PR fix(examples): name form/page sections and translate headings into zh-CN (#8231) #8514 took it from 24 warnings to 3 — the remaining 3 are exactly these.
  2. The rule is pinned against real shipped metadata. That is a deliberately stronger test than a synthetic fixture: it proves the rule fires on metadata a user actually ships, not on a hand-built object constructed to trip it.

Naming the three satisfies (1) and destroys (2) — the fixtures must move to synthetic metadata, and the rule loses its only real-world regression pin. Leaving them satisfies (2) and keeps a permanent 3-warning floor on app-showcase, which is its own cost: a build that always warns trains everyone to ignore the warning, which is how this family went unacted-on for as long as it did.

The uncomfortable version: the example apps are the platform's own dogfood. A rule whose regression coverage depends on the dogfood staying broken has made the defect load-bearing.

Options, ⛔ none of them a recommendation

  • Synthetic fixtures — move the three lint tests onto hand-built metadata, then name the three sections. Simple; loses the real-metadata property the tests were written for.
  • A dedicated always-nameless fixture app/object — keep a real, shipped-shaped container that intentionally declares a nameless section, marked as the rule's fixture. Preserves the property; costs a fixture that must never be "fixed", and needs to be obvious enough that a future sweep does not fix it anyway.
  • Assert the count, not the identity — have the lint tests assert the rule fires over whatever the example apps currently declare, rather than pinning specific findings. Survives both fixes and regressions; weaker, and goes vacuous the moment the count reaches zero.
  • Accept the 3-warning floor — cheapest, and the status quo, but it is the option that keeps a permanent always-warns build.

Scope note

⛔ This was not in scope for #8231, which declared a file surface of examples/** only. PR #8514 correctly stopped at the boundary, verified packages/lint's 68 tests still pass unmodified, and used Part of so #8231 stays open for the remaining three. That card should not be closed on the assumption this one is handled.

Refs

#8231 / PR #8514 (the sweep, 24 → 3) · #5417 (landed the rule) · packages/lint/src/validate-translatable-sections.test.ts · packages/lint/src/validate-translation-references.test.ts

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions