feat(v1-removal): Phase 4 — manifest schema cleanup (drop type/windowHints, bump to v3)
Drops the legacy compat fields from the tile manifest schema in lockstep:
- `TileEntry.type?: 'window' | 'background' | 'panel'` removed.
- `type: "background"` migrated to `resident: true`.
- `type: "window"` / `type: "panel"` were no-ops; stripped.
- `TileEntry.windowHints?: TileWindowHints` removed; the
`TileWindowHints` interface is gone. Window properties are flat on
`TileEntry` only — every consumer migrated to hoisted fields.
- `manifestVersion` bumped from `2` → `3` everywhere (29 feature
manifests, 2 scaffold templates in `tile-ipc.ts`, audit script,
every unit test fixture, and the hello-world prose example).
Validator behaviour:
- `validateTileManifest` now rejects both `tile.type` and
`tile.windowHints` outright with explicit migration messages — no
normalization layer, no warnings.
- `detectManifestVersion` recognises `manifestVersion: 3` as v2 (the
current architectural namespace) and reclassifies `manifestVersion: 2`
as v1 (legacy). Re-installing an unmigrated v2 feature now fails.
Consumer migrations:
- `tile-launcher.ts`: introduces `TileWindowOverrides` (subset of flat
`TileEntry` window fields) to replace `Partial<TileEntry['windowHints']>`
in `TileLaunchOptions.windowOverrides`. Hint extraction inside
`createTileBrowserWindow` reads the flat fields directly.
- `tile-compat.ts`: residency check is `t.resident === true` — no
`t.type === 'background'` fallback.
- `tile-ipc.ts`: enable-feature handler residency check matches above;
both `feature-dev:scaffold` manifest templates emit v3 shape.
- `tile-lazy.ts`: `find(t => t.type === 'background')` replaced with
`find(t => t.lazy === true) ?? tiles[0]` (lazy entries by convention).
- `convertV1ToV2`: emits `manifestVersion: 3`, sets `resident: !lazy`
on the synthesised background entry.
Docs:
- `docs/tiles-single-file.md`: scaffold example bumped to v3, removed
the "backwards compatibility" section, added a "Migration from v2 → v3"
section, refreshed the runtime-changes section to reflect the
hard-cutover state.
- `docs/v1-removal-plan.md`: status updated from NOT started → DONE.
- `features/features-manager/PLAN.md`: scaffold example bumped to v3.
Tests:
- All ~1700 unit tests passing (588 in tests/unit + 1698 in
dist/backend/electron — no regressions).
- Two test files (`tile-features-strict.test.ts`, `tile-izui-strict.test.ts`)
had `tile-{ id, type: 'background', url }` fixtures migrated to
`{ id, url, resident: true }`. Two new validator tests cover the
rejection of `tile.type` and `tile.windowHints`.