Skip to content

refactor(css): strangler migration — FL export CSS retired page-by-page at pixel parity#365

Draft
pftg wants to merge 12 commits into
masterfrom
css-migration/strangler-run
Draft

refactor(css): strangler migration — FL export CSS retired page-by-page at pixel parity#365
pftg wants to merge 12 commits into
masterfrom
css-migration/strangler-run

Conversation

@pftg

@pftg pftg commented Jul 12, 2026

Copy link
Copy Markdown
Member

What this is

Execution of the approved maintainability plan (docs/projects/2509-css-migration/2026-07-12-css-maintainability-redesign.md): Phase 0 safety scaffolding, then per-page strangler rewrites — semantic HTML + token-based page CSS, FL file deleted in the same commit — at strict pixel parity (group decision by a 3-advisor panel: architect/QA/product all converged on parity-only with no baseline regeneration; all JetVelocity modernization deferred to per-page sessions with Paul).

Stacked on css-migration/docs-realignment (PR #364).

Safety invariants (every page commit)

  • One atomic commit per page: template + css/pages/*.css + slice swap + FL deletion — one git revert restores everything.
  • Both suites (bin/test macOS + bin/dtest Linux) green with zero baseline changes — parity means even the target page's baselines stay.
  • Non-target bundles proven byte-identical (clean production build md5 compare).
  • Abort on any deterministic cross-page diff; one retry for flakes only; failing page gets reverted, never a loosened tolerance.

Progress

  • P0.1 special-content blog coverage (Mermaid / Chroma / inline-style / youtube), 6 tests, both-OS baselines
  • P0.4 orphan guard (resources.Get + @import chains + postcss-mixins) + 26 dead files deleted, bundles proven byte-identical
  • R1 3059-layout (privacy-policy + course-list)
  • R2 706 contact-us … (burn-down continues per ownership map)

🤖 Generated with Claude Code

Paul Keen and others added 7 commits July 12, 2026 20:14
…ed plan)

All encode the dead 70-80%-duplication-elimination goal: foundation-extraction
ROI math, 'NEVER touch FL layouts' preservation rules, swarm execution prompts,
stale baselines. Falsified by compiled+gzip evidence (Phase 1 WP1.2/1.4 +
Phase 2 sprint-7 audits). Moved whole into 70-79-archives/superseded-2026-07-12/
with a README stating why. No content edits.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e 0 deliverable

19 external bundles mapped to owning templates, FL files, and measured gzip
sizes (converged production build 2026-07-12); reverse map of all 16 live FL
layout files with consuming bundles and retirement status. Includes the
easy-to-miss repo-root layouts/course/list.html → course-list bundle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… superseded, Phase 0 + rewrite sprints added

GOAL OVERVIEW re-goaled (FL burn-down 16→0 replaces the falsified 70-80%
line-count target); CUMULATIVE METRICS → burn-down + historical note; Phase 3
WP definitions closed as superseded (preserved in git history + archives);
QUICK ACTIONS + navigation repointed to the spec and ownership map; sprint-8
update-log entry added. Spec count fix: 17→16 live FL files (PR #363 merged
e93d9b85 away — reviewer finding).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…r doc; repoint CLAUDE.md CSS row

PROJECT-INDEX was wall-to-wall dead plan (35.04 as PRIMARY AUTHORITY, 44,420→
11,884 line targets, WP tables) — replaced with a slim hub: spec, tracker,
ownership map, banner'd loading-order reference, standing constraints.
css-loading-order-analysis keeps its accurate load-order mechanics but gets a
supersede banner on its extraction-strategy framing. CLAUDE.md 'ANY CSS
changes' pointer now sends readers to the spec + ownership map instead of the
inverted FL-preservation rules.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…try, dead sprint-3 link)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… (Mermaid, Chroma, inline-style, youtube)

Desktop+mobile screenshots for one representative post per surface; volatile
regions (async Mermaid SVG, external iframe, images) skipped for determinism.
Replaces the dead skipped DiagramComponentTest (deleted; it was outside the
test:critical pattern anyway). Baselines committed for macOS AND Linux, both
suites 6/6 green; zero existing baselines touched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…exposed

Guard walks resources.Get from all templates, transitive @import chains
(file-relative AND css-root-relative, postcss-import style), and
postcss-mixins usage (@mixin <basename> against mixinsDir) — the mixin class
was learned live: deleting mixins/responsive-visibility.css crashed the
production build (undefined mixin in 590-layout), so it stays and the guard
now models it. The 26 deleted files (components/ leftovers 'migrated from'
long ago, utilities/ trees, powerpack originals) are proven dead: clean
production builds before/after deletion have byte-identical CSS bundles.
Second assertion catches the inverse defect (template referencing a missing
file).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f1c0e07f-5d2d-45eb-90fd-ba3d004c9d07

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch css-migration/strangler-run

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.

…le privacy-policy screenshots

P0.2 gate for the first rewrite targets: baselines captured from the UNCHANGED
pages on both OSes (4 new baselines; desktop privacy-policy already existed and
matched). Course-landing h1 assertion moved off the .fl-heading anchor to plain
h1 ahead of the semantic rewrite.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Base automatically changed from css-migration/docs-realignment to master July 12, 2026 20:28
Paul Keen and others added 4 commits July 12, 2026 22:49
…ist rewritten to semantic HTML at pixel parity

First FL file down (924 lines): both consumers rewritten in one atomic commit.
- page/single.html: FL row/col/module divs → main/article + css/pages/simple-page.css
  on the existing box model (hero 200/20/130 → 150@1115 → 100/50@860; 800px cap;
  h1 keeps skin's 70px strut with the clamp() span like .fl-heading-text did;
  fl-rich-text spacing cloned; single-content class kept for 586.css h2-h4 rules).
- layouts/course/list.html: FL wrapper dropped, h1.fl-heading → h1.course-title with
  the style.css/single-post.css rules cloned at identical specificity+order
  (css/pages/course-list.css).
- critical/privacy-policy-critical.css: page node rules stripped; FL header/nav
  rules stay until the header's own sprint.
- Both bundles drop bf72bba… too (7 consumers left).

Parity caught and fixed two real deltas: dropped single-content class (h2 sizing)
and a phantom 15px container padding (skin zeroes Bootstrap's trio under
.fl-builder). Verified: only the 2 target bundles changed bytes (17 others
md5-identical); privacy-policy 17.1→14.1KB gz, course-list 17.6→14.2KB gz;
bin/test + bin/dtest 54/54 green with ZERO baseline changes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…mantic HTML at pixel parity

Second FL file down (2,202 lines). FL row/col/module shell → semantic
contact-hero / contact-intro / contact-band / contact-list-panel /
contact-form-panel; the PowerPack infolist and Gravity Forms component markup
kept verbatim (5 checkmark items now a range loop). Live node rules ported
1:1 into css/pages/contact-us.css (~8 dead-node blocks + FL framework block
dropped with the file); 586.css's .contact-page height chain replicated
de-layered since the shared file must stay byte-identical.

Conversion-surface safety: compiled <form> element byte-identical pre/post
(md5 c34fac4d…); form partial untouched. All other bundles md5-identical
(only contact-us changed). bin/test + bin/dtest 54/54, 93 screenshots, ZERO
baseline changes — first-try parity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ly moved site-wide

single.html (all 584 blog posts) drops 3114-layout.css + bf72bba… from its
slice: FL wrapper → .single-post-row, h1.fl-heading → h1.post-title (style.css
already covers post-title in its shared 43rem block; the one single-post.css
override cloned into css/pages/blog-single.css). .fl-rich-text class kept
until the shared single-post.css re-key sweep.

Parity gate caught a real trap: baseof's skip-link relies on .sr-only, which
only existed in FL layout files — dropping 3114 unhid 'Skip to main content'
and shifted every blog page 28px. .sr-only now lives in the site-wide inline
navigation.css so no future FL retirement can unhide it. Also fixed nested
<main> landmarks from R1/R2 (baseof already provides main#main-content) and
the mobile test's .fl-heading anchor.

Verified: only blog-single bundle changed bytes; all 8 blog screenshots
(special-content matrix + post) 0-diff; bin/test + bin/dtest 54/54, 93
screenshots, ZERO baseline changes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…apter coverage)

course/single.html (course chapters) mirrors R3a: drops 3114-layout.css +
bf72bba… from its slice, FL wrapper → .single-post-row, h1.fl-heading →
h1.post-title, reusing css/pages/blog-single.css. New desktop+mobile
course/chapter screenshots added FIRST from the unchanged page (P0.2), then
verified 0-diff after the rewrite. Only the course-single bundle changed
bytes (now hash-identical to blog-single — same slice). Both suites 56/56,
zero baseline changes.

3114-layout.css consumers remaining: single-career, single-client.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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