1. A parity manifest as the contract
Every component gets an entry in a machine-readable manifest: its status, its deliberate deviations from upstream shadcn, and which legacy components it replaces. A second manifest resolves the fate of every legacy export: replaced, absorbed into a recipe, or deprecated. A test fails the build if the docs and the manifest ever drift.
"How's the migration going?" stopped being a feeling. It became a query. It is also the file an agent reads to know which component to reach for.
I directed Claude Code against that contract. The agent had to pick mapped components instead of inventing APIs. The same test I wanted any model to pass.
- 32replaced
- 8absorbed
- 13deprecated
- still moving

