The contract came first
Before porting anything I had every legacy export audited and given a fate: replaced by a new component, absorbed into a recipe, or deprecated. What nobody used was deleted, not migrated. The result is a machine-readable manifest that maps each component to its Figma counterpart and its status, with a test that fails the build if the docs and the manifest ever drift.
For Smallstep, “how’s the migration going?” stopped being a feeling and became a query. For an agent, it is the file that says which component to reach for, so it picks a mapped one instead of inventing one.
- 39replaced
- 8absorbed
- 14deprecated
- 1kept





