Skip to content

CSS Phase C sprint C3: page re-keying pilots - 27 semantic re-keys + dead-code sweep#374

Merged
pftg merged 31 commits into
masterfrom
css-migration/c3-rekey-pilot
Jul 19, 2026
Merged

CSS Phase C sprint C3: page re-keying pilots - 27 semantic re-keys + dead-code sweep#374
pftg merged 31 commits into
masterfrom
css-migration/c3-rekey-pilot

Conversation

@pftg

@pftg pftg commented Jul 19, 2026

Copy link
Copy Markdown
Member

What this is

Phase C sprint C3 (spec §Phase C): the three pilot pages move off fl-node-<hash> classes, establishing the velocity basis for the C4 backlog. 31 commits, one node per commit, every one independently gated.

Re-keys (27 nodes)

  • page/use-cases (4): use-cases-hero/-technologies/-cta/-cta-box — including the r5xy9wufkc2e rule that had leaked into shared technologies.css, swept in the same commit.
  • careers/single (12): career-hero/-hero-col/-meta-item/-meta-label/-meta-value/-share-col/-share-label/-share-module/-body/-content-col/-form-col/-form-module — every node's twin rules in critical/single-careers.css renamed in the same commits (the audit flagged the orphan risk).
  • page/clients (11): clients-hero/-hero-col/-heading/-intro/-grid/-carousel/-cta-box/-cta-divider/-cta-heading/-cta-text/-cta-spacer — includes the two largest single re-keys of the phase (grid 114 + carousel 105 rules).
  • clients/single: confirmed already re-keyed (pilot task was a no-op).

Gate per re-key: converged double-builds; every bundle byte-identical after guarded reverse substitution, with one documented tolerance — cssnano alphabetizes selector groups when member names change, so equality is checked on canonical rule-sets (selector groups comma-sorted). Purge-safelist prep commit (/^career-/, /^clients-/ greedy) landed first, per the C2 lesson.

Dead-code sweep

  • 8 dead fl-node classes dropped from templates (zero CSS rules each, verified; the two clients wrappers keep their semantic ids). All bundle fingerprints byte-identical.
  • ~580 rules keyed on 3 site-wide dead node ids deleted (d09l8jp3qrgf, 7d9wg1x8ua5m, ncg61wov0ytq — referenced by no layout anywhere; alive in output only via the /^fl-node/ purge shield). Removed across 12 files via bin/css-split; per-bundle decl-gate proved zero non-dead losses, zero extras. This is a real payload win on the critical/inline path.

Verification

  • Churn-based critical suite: 34 runs / 52 screenshots / 0 failures
  • Full macOS system suite: 65 runs / 119 screenshots / 0 failures, zero baseline changes
  • Linux full suite (bin/dtest-all): EXIT=0, 119 screenshots, no failures

Phase C scorecard after this PR

Criterion 2 (no obfuscated artifacts): shared partials + 3 pilot pages fully semantic; zero hash-named files. Remaining fl-node markup: the C4 backlog pages (404, use-cases/single, page/services, services/single, about, home) at the velocity measured here (~2-3 min/node).

🤖 Generated with Claude Code

https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V

Paul Keen and others added 30 commits July 19, 2026 03:55
… prefixes

Same mechanism as C2's testimonials-/cta-banner entries: semantic
re-keys must not lose the accidental /^fl-node/ purge shield for
runtime-only descendant classes. Added BEFORE the renames so each
re-key commit stays a pure substitution.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only. Gate: all bundles byte-identical after guarded
reverse substitution EXCEPT one cssnano selector-group reorder in the
use-cases bundle (same rule, selectors alphabetized differently) -
sorted-rule-set and last-wins winner map both identical.

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

Class rename only (incl. the leaked rule in shared technologies.css).
Gate: canonical rule-set equality (selector groups comma-sorted) across
all bundles - only cssnano alphabetization artifacts differ.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality
(byte-identity modulo guarded reverse substitution and cssnano
selector-group alphabetization).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality
(byte-identity modulo guarded reverse substitution and cssnano
selector-group alphabetization).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
Class rename only; gate: converged builds, canonical rule-set equality.

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

Each id verified to have ZERO rules in any live CSS (use-cases
xfdrceov0hji; clients ywdijlprtzo2 + f14gkcmxeo5i - both keep their
semantic ids; careers l6ztmq3h7fv2, rq3ws0n4gdmx, 0enadgf5wp84,
9v74jmuxkpdg, hm8u5ebytjw1). Class tokens removed from markup only;
data-node attrs kept. Gate: all bundle fingerprints byte-identical.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
d09l8jp3qrgf, 7d9wg1x8ua5m, ncg61wov0ytq are referenced by NO layout
anywhere (verified) - leftovers of retired FL exports, kept alive in
compiled output only by the /^fl-node/ purge shield. Removed via
bin/css-split across 12 files (8 critical + component-bundle, 404,
homepage, fl-layout-grid).

Gate: per-bundle decl-diff contains ONLY declarations under selectors
carrying the dead ids - zero non-dead losses, zero extras.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYRU9wGepomJo5hSuqtu7V
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: 11 minutes

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: 5793d861-9f9f-40a6-9346-0d2467196709

📥 Commits

Reviewing files that changed from the base of the PR and between 9ed9750 and 650363a.

📒 Files selected for processing (22)
  • docs/projects/2509-css-migration/TASK-TRACKER.md
  • postcss.config.js
  • themes/beaver/assets/css/404.css
  • themes/beaver/assets/css/component-bundle.css
  • themes/beaver/assets/css/critical/about-us-critical.css
  • themes/beaver/assets/css/critical/careers-critical.css
  • themes/beaver/assets/css/critical/clients-critical.css
  • themes/beaver/assets/css/critical/fl-layout-grid.css
  • themes/beaver/assets/css/critical/homepage-critical.css
  • themes/beaver/assets/css/critical/privacy-policy-critical.css
  • themes/beaver/assets/css/critical/single-careers.css
  • themes/beaver/assets/css/critical/single-clients.css
  • themes/beaver/assets/css/critical/single-services.css
  • themes/beaver/assets/css/critical/single-use-cases.css
  • themes/beaver/assets/css/homepage.css
  • themes/beaver/assets/css/pages/clients.css
  • themes/beaver/assets/css/pages/single-career.css
  • themes/beaver/assets/css/pages/use-cases.css
  • themes/beaver/assets/css/technologies.css
  • themes/beaver/layouts/careers/single.html
  • themes/beaver/layouts/page/clients.html
  • themes/beaver/layouts/page/use-cases.html
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch css-migration/c3-rekey-pilot

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 57590b5 into master Jul 19, 2026
2 checks passed
@pftg
pftg deleted the css-migration/c3-rekey-pilot branch July 19, 2026 02:42
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