The migration that gets to 70% adoption naturally then plateaus is the most common shape. The remaining 30% are the surfaces with deadlines, the surfaces nobody owns, and the surfaces shipped by teams that haven't bought in yet.
Getting from 70% to 100% requires a different motion than getting from 0% to 70%. The first phase is opt-in evangelism. The second is opt-out enforcement.
Lint rules at error level
Once enough surface area is migrated that error-level lint won't break the build everywhere, escalate. New code can't reference legacy components, raw hex values, or off-token spacing.
Existing code grandfathered in via per-file disable comments. The disable comments are the inventory of the remaining work.
PR templates that ask the question
Add a checkbox to every PR template: 'Did you use the design system for new UI?' Reviewers ask the question. Authors who don't see it don't merge.
Doesn't sound like much. Moves the curve more than docs do.
Track adoption per product, not aggregate
Per-product adoption percentage on a public dashboard. Names attached. The product team that's at 95% and the product team that's at 35% have different conversations to have.
The aggregate number hides the laggards. The per-product breakdown forces specific conversations.
Ship the cutover ceremony
When you reach the criterion you defined in chapter 2, retire the bridge publicly. Email the engineering org. Update the docs. Remove the legacy package from the registry.
The ceremony is the signal that the migration is done. Without it, the migration is in zombie state — mostly done, never finished.
- 01Lint at error level once critical mass is migrated; existing code grandfathered with documented disables.
- 02PR templates with one targeted question move the curve more than docs.
- 03Per-product adoption metrics force specific conversations; aggregates hide the laggards.
- 04Retire the bridge publicly when criterion is met — without the ceremony, migration enters zombie state.