Implements #162 (epic #157).
Added
migrateLegacyProfile(legacy, library) (TypeScript, @cratis/scene.engine) and ProfileMigrator.Migrate(legacy, library) (C#, Cratis.Scene.Engine.Profiles): one pure function that turns a legacy profile - the blueprint (shell) and layout name plus the Studio-only navigationMode, colorScheme, accent and defaultScreenTemplate - into the new shape: root (blueprint reference pinned to ^major.minor, or own reference), root.options.navigationMode, appearance, defaults.newScreenTemplate.
- Idempotent: a migrated profile comes back unchanged (
changed: false) with or without the legacy fields; a value already in the new shape wins. Once a root exists the legacy layout is dropped (readers accept both shapes, writers emit the new one).
- Six engine-owned diagnostics for what cannot be mapped, with real names:
legacyLayoutUnknown, legacyShellNotInstalled, legacyShellHasNoLayout, legacyColorSchemeUnknown, legacyNavigationModeWithoutRoot, legacyDefaultScreenTemplateUnknown.
- Shared corpus
profile-migration-fixtures.json (29 permutations incl. idempotence) asserted by for_ProfileMigrator (C#) and for_migrateLegacyProfile (TS) with identical profiles (canonical JSON) and identical diagnostics.
- Docs: "Migrating a legacy profile" and the compatibility rules in
blueprints/root-template.md.