mirror of
https://github.com/jhd3197/ServerKit.git
synced 2026-11-10 14:03:14 +09:00
Plan 76 milestone G. 114 top-level class definitions share 50 names across partials, so those classes have no owner: every definition applies, merged per-property in main.scss import order, and editing one file changes only the properties that file happens to win. `.empty-state` is the worked example the audit named. Three partials define it — components/_empty-state.scss (flex column, min-height 200px), _cards.scss (card background, solid border, radius), _users.scss (padding, colour) — and the compiled sheet carries five competing top-level rules. What renders takes its background and *dashed* border from one, its padding and display from another, and its colour from a third. No author wrote that element. Ratcheted rather than merged, on purpose. Reproducing the cascade's computed result has no byte-identical-output proof available (unlike the @keyframes sweep, where deleting seven dead copies left the CSS unchanged to the byte), so it needs eyes on the affected pages — plan invariant 9, no repo-wide mechanical rewrite without behavioural tests. The ratchet counts DEFINITIONS, not names: counting names would let an already-shared class spread to a fourth and fifth partial without moving the number, which is the failure mode worth stopping. Mutation-checked both ways — adding a definition of an existing shared class and introducing a brand-new shared name each fail it, and both pass on revert. Wired into `npm run lint`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>