fm-cascade

Diffs legacy and migrated stylesheets node by node to detect computed-style divergences on real page markup.

1|Updated Feb 19, 2026
One-click install
npx skills add https://github.com/ohmyhotelco/hare-cc-plugins --skill fm-cascade-ohmyhotelco
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: fm-cascade
Source: https://github.com/ohmyhotelco/hare-cc-plugins/tree/main/frontend-migration-plugin/skills/fm-cascade
Command: npx skills add https://github.com/ohmyhotelco/hare-cc-plugins --skill fm-cascade-ohmyhotelco

SYSTEM DOCUMENTATION & REQUIREMENTS

What problem does it solve? During a legacy frontend migration, element-indexed style specs and jsdom-based DOM tests cannot see CSS divergences on dynamically injected markup (CMS rich text, i18n HTML, editor output), and full visual parity checks require both legacy and target hosts running. This Skill compares the two compiled stylesheets directly on the page's real markup, catching rule-level divergences like reset collisions and dropped global rules using only legacy's compiled CSS. ## Core Features & Use Cases - Stylesheet-only cascade diffing: Compares legacy's compiled global CSS against the migrated app's CSS on the page's own markup, with the stylesheet as the only variable, producing a cascade-diff.json report. - Divergence classification: Every divergence is bucketed as real (fix it), consequence (fixed by its cause), or artifact (harness leak), preventing misleading counts and unnecessary rule ports. - Gate integration and regression tests: Records results in the migration tracker, routes unfixed divergences to owner approval, and converts each fixed divergence into a negative-control-verified e2e regression assertion. - Use Case: A migrated hotel booking page renders CMS-injected rich text differently than legacy. Run this stage after verification to find that a legacy reset rule was dropped, port it, re-run the diff, and lock the fix in with a regression test before e2e. ## Quick Start Run the fm-cascade skill for the booking-detail page to diff its stylesheet cascade against legacy and classify any divergences.

Frequently Asked Questions about fm-cascade

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I compare CSS between a legacy app and a migrated app?▼

Run this stage after the page passes verification; it fetches both compiled stylesheets and measures computed-style divergences on the page's real markup with the stylesheet as the only variable. The result is a cascade-diff.json report classifying each divergence as real, consequence, or artifact.

How to catch CSS regressions on CMS-injected or dynamic HTML during migration?▼

Element-indexed style specs cannot enumerate nodes unknown at analysis time, so this stage diffs the full cascade on the rendered markup instead. It covers rich text, i18n HTML, and editor output injected via innerHTML or dangerouslySetInnerHTML.

Does the legacy app need to be running to diff its styles?▼

No, only legacy's compiled stylesheet is required, not a serving legacy host. The CSS can come from a --legacy-css flag, the legacy dev server's stylesheet link, or the newest compiled sheet in the legacy build output.

Why does the cascade diff report font-family divergences across the whole document?▼

A document-wide fontFamily divergence is the signature of a harness artifact, meaning the probe leaked a second variable such as fonts. It is not a finding; fix the harness setup, re-run the diff, and note the correction in the report.

What happens to unfixed style divergences before route flip?▼

Each unfixed real divergence is written to owner-decisions.md with status pending, including the divergence identity and reason. The route flag-on step proceeds only after the owner flips entries to approved with their name and date.