Evolving An App
When adding a feature, decide first whether the behavior is product-specific or runtime-reusable.
Add A Protected Feature
- Add server entity and migration.
- Export a feature database manifest.
- Add GraphQL DTOs and resolver methods.
- Protect resolver methods with guards or principal checks.
- Regenerate the GraphQL schema.
- Add Relay operations in the webapp feature folder.
- Regenerate Relay artifacts.
- Update route loaders and UI.
- Add tests around app-owned behavior.
Move Behavior Into Labkit Only When
- a second app needs the same runtime rule;
- the behavior does not import product code;
- the abstraction reduces real duplication;
- ownership remains clear after extraction.
Keep product policy in the app. Move runtime mechanics into Labkit.