Skip to content

CSS Phase D: twin folds, 760-rule legacy dead sweep, css-winners gate, roadmap revision#379

Merged
pftg merged 4 commits into
masterfrom
css-migration/phase-d
Jul 19, 2026
Merged

CSS Phase D: twin folds, 760-rule legacy dead sweep, css-winners gate, roadmap revision#379
pftg merged 4 commits into
masterfrom
css-migration/phase-d

Conversation

@pftg

@pftg pftg commented Jul 19, 2026

Copy link
Copy Markdown
Member

What this is

Phase D — the last planned phase of the CSS migration project. After this PR the project's goal is achieved by its own five criteria and the tracker moves to maintenance mode, with the remaining risky items parked as trigger-conditioned work.

D1 — fold-then-dedup, the 4 position-sensitive twin sets (165 rules)

  • single-career (18 twins): the FL export left contradictory display sequences (gform_title block→block→none, form-description none→block) in BOTH critical and pages; their cross-file interleave decided the winners. Folded each contradiction to the live compiled winner in both files, then deduped. careers_ruby screenshot green.
  • clients (45 twins): the flip C5 reported was a winner-parser artifact (comma split inside :not(b, strong)); paren-aware winner maps prove the dedup exact.
  • single-service + single-use-cases (49 + 53 twins): the .clearfix pair is triply position-load-bearing — critical's Bootstrap-style copy must stay byte-identical to vendors/base-4.min.css's (so production dedup eats the vendor copy) and the pages-side table twin must stay positioned to win. Both kept with in-file warnings; folding either link breaks the chain (verified by compiled-order forensics).

D2 — legacy dead-rule sweep (760 rules, ~89KB source)

Agent-audited per-bundle PurgeCSS survival across the 5 legacy shared files: 586 (−122), style (−2), theme-main (−227), component-bundle (−180), legacy-theme-skin (−229). Every deleted rule verified absent from all 19 compiled bundles; the postponed jt-reviews-box/pp-swiper/pp-review rules excluded per Paul. One audit false positive caught by the byte-gate (a :not()-chain white-text enforcer alive via the /^fl-node/ greedy safelist) and restored — final state: all fingerprints byte-identical except cssnano de-grouping of the restored rule, winner-maps exact.

Tooling + roadmap

  • bin/css-winners: the per-selector last-wins comparison gate promoted to a first-class tool — it caught both real regressions this phase that declaration-set comparison missed.
  • Roadmap revised in the tracker: project complete; wrapper collapse / fl-* trio retirement / deeper strangler parked as trigger-conditioned; Phase E "new-page paved path" defined (starter template, more shared section components via the C1 protocol, new-page checklist docs) — per Paul's direction that a person should be able to build a consistent new page from scratch reusing components.

Verification

  • Full macOS system suite: 65 runs / 119 screenshots / 0 failures, zero baseline changes
  • Linux full suite (bin/dtest-all) on the branch head
  • Scoped gates green per commit throughout

🤖 Generated with Claude Code

https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V

Paul Keen and others added 4 commits July 19, 2026 12:47
The FL export left contradictory display sequences (gform_title
block->block->none, form-description none->block) in BOTH critical and
pages; their cross-file interleaving decided the compiled winners, which
is why C5's plain dedup regressed the apply form. Fold: each
contradiction collapsed to the LIVE compiled winner (title none,
form-title block, form-description none, span.gform_description none)
in both files; then the 18 pages-side twins deleted.

Gate: per-selector winner map vs clean-room master build identical
except the known var(--font-system-ui) equivalence; careers_ruby
screenshot test green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
…les)

clients (45), single-service (49), single-use-cases (53) twins deleted
from the pages side. Two hard-won findings baked into the source:
- The clients 'flip' C5 reported was a winner-parser artifact (comma
  split inside :not(b, strong)); with a paren-aware splitter the dedup
  is provably winner-identical.
- The .clearfix table/block pair is TRIPLY position-load-bearing:
  critical's Bootstrap-style block rule must stay byte-identical to
  vendors/base-4.min.css's copy (so production dedup eats base-4's
  later copy) AND the pages-side table twin must stay (its post-critical
  position makes table the final winner). Both kept, with an in-file
  warning comment. Folding either breaks the apply chain - verified
  empirically via compiled-order forensics.

Gate: per-selector paren-aware winner maps identical vs clean-room
master builds for all three bundles; scoped screenshot gate green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
…s deleted (~89KB source)

Per-bundle PurgeCSS-survival audit (agent-produced dead lists with
cssnano-normalization false-positive controls) across the 5 legacy
shared files: 586 (-122), style (-2), theme-main (-227),
component-bundle (-180), legacy-theme-skin (-229). Every deleted rule
verified absent from all 19 compiled bundles.

One audit false positive caught by the byte-gate and restored: the
fl-node-ntfp1iza9jy8 :not(...)-chain white-text enforcer (alive via the
/^fl-node/ greedy safelist; the long :not chain defeated fragment
matching). Postponed jt-reviews-box/pp-swiper/pp-review rules excluded
from the sweep per Paul.

Gate: all bundle fingerprints byte-identical except the two
component-bundle consumers, which differ only by cssnano de-grouping of
the restored rule - paren-aware per-selector winner maps identical.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
…e promoted

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@pftg, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 36 seconds

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 9e2a4b94-72dc-47dd-a914-16495ca287c4

📥 Commits

Reviewing files that changed from the base of the PR and between a90679f and 734e883.

📒 Files selected for processing (12)
  • bin/css-winners
  • docs/projects/2509-css-migration/TASK-TRACKER.md
  • themes/beaver/assets/css/586.css
  • themes/beaver/assets/css/component-bundle.css
  • themes/beaver/assets/css/critical/single-careers.css
  • themes/beaver/assets/css/legacy-theme-skin.css
  • themes/beaver/assets/css/pages/clients.css
  • themes/beaver/assets/css/pages/single-career.css
  • themes/beaver/assets/css/pages/single-service.css
  • themes/beaver/assets/css/pages/single-use-cases.css
  • themes/beaver/assets/css/style.css
  • themes/beaver/assets/css/theme-main.css
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch css-migration/phase-d

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@pftg
pftg merged commit e12d9ec into master Jul 19, 2026
3 checks passed
@pftg
pftg deleted the css-migration/phase-d branch July 19, 2026 11:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant