Symptom
The plugin is installed and the frontend entry loads, but side-menu items are missing, routes render empty shells, or admin APIs fail with 403.
Fix
- Register routes/menus in PluginModule.register(AppRegistry)
- Use the same withApiMetadataFetchFn object for fetch, Protected, and menu requiredApis
- Split ProtectedXxx wrapper from XxxPage that runs React Query hooks
- Public / root routes need AppRegistry.rootRoute.add — not the standard chrome route
- Confirm the signed-in user’s role allows the required APIs