diff --git a/src/features/housekeeping/foundation/foundation-source-contract.test.ts b/src/features/housekeeping/foundation/foundation-source-contract.test.ts index c53f2c16..68291299 100644 --- a/src/features/housekeeping/foundation/foundation-source-contract.test.ts +++ b/src/features/housekeeping/foundation/foundation-source-contract.test.ts @@ -605,15 +605,15 @@ describe("housekeeping foundation completion contracts", () => { expect(html).toContain(`>${sentinel}`); }); - it("validates the complete 143-row migration matrix without issues", () => { + it("validates the complete 144-row migration matrix without issues", () => { const discovered = discoverLegacyPages(); const issues = validateMigrationEntries( discovered, HOUSEKEEPING_MIGRATION_MATRIX, ); - expect(HOUSEKEEPING_MIGRATION_MATRIX).toHaveLength(143); - expect(discovered).toHaveLength(143); + expect(HOUSEKEEPING_MIGRATION_MATRIX).toHaveLength(144); + expect(discovered).toHaveLength(144); expect(issues).toEqual([]); }); }); diff --git a/src/features/housekeeping/migration/discover-legacy-pages.test.ts b/src/features/housekeeping/migration/discover-legacy-pages.test.ts index 6f50e1e2..244eb52d 100644 --- a/src/features/housekeeping/migration/discover-legacy-pages.test.ts +++ b/src/features/housekeeping/migration/discover-legacy-pages.test.ts @@ -29,7 +29,7 @@ describe("discoverLegacyPages", () => { it("discovers the exact legacy administration inventory", () => { const pages = discoverLegacyPages(); - expect(pages).toHaveLength(143); + expect(pages).toHaveLength(144); expect(pages).toContainEqual({ surface: "admin", legacyPath: "/admin/users/:id/edit", diff --git a/src/features/housekeeping/migration/hotel.ts b/src/features/housekeeping/migration/hotel.ts index a44b56d2..520e9fbc 100644 --- a/src/features/housekeeping/migration/hotel.ts +++ b/src/features/housekeeping/migration/hotel.ts @@ -573,6 +573,29 @@ export const hotelMigrationEntries: readonly MigrationEntry[] = [ accessibility: "PARTIAL", notes: ["The current page relies on action-level catalog-edit enforcement"], }), + plannedHotelEntry({ + surface: "admin", + legacyPath: "/admin/studio/nitro-cleanup", + sourceFile: "src/app/admin/studio/nitro-cleanup/page.tsx", + targetPath: "/admin/hotel/studio/nitro-cleanup", + decision: "REBUILD", + capabilities: { + read: [PERMS.ASSETS_IMPORT], + mutate: [PERMS.ASSETS_IMPORT], + }, + dependencies: { + queries: ["GET /api/admin/studio/nitro-cleanup", "scanFakeBrokenNitros"], + mutations: [ + "DELETE /api/admin/studio/nitro-cleanup", + "clearFurniImportCache", + "deleteNitroCleanupFiles", + ], + }, + auditRequirement: "PRIVILEGED_MUTATION", + localization: "PARTIAL", + accessibility: "PARTIAL", + notes: ["Deletes orphaned or unparseable nitro bundles from asset files"], + }), plannedHotelEntry({ surface: "admin", legacyPath: "/admin/studio/pets", diff --git a/src/features/housekeeping/migration/matrix.test.ts b/src/features/housekeeping/migration/matrix.test.ts index 4b2514a6..a6bdf4e8 100644 --- a/src/features/housekeeping/migration/matrix.test.ts +++ b/src/features/housekeeping/migration/matrix.test.ts @@ -4,10 +4,10 @@ import { HOUSEKEEPING_MIGRATION_MATRIX } from "./matrix"; import { validateMigrationEntries } from "./validate-matrix"; describe("HOUSEKEEPING_MIGRATION_MATRIX", () => { - it("covers all 143 legacy pages exactly once", () => { + it("covers all 144 legacy pages exactly once", () => { const discovered = discoverLegacyPages(); - expect(HOUSEKEEPING_MIGRATION_MATRIX).toHaveLength(143); + expect(HOUSEKEEPING_MIGRATION_MATRIX).toHaveLength(144); expect( validateMigrationEntries(discovered, HOUSEKEEPING_MIGRATION_MATRIX), ).toEqual([]);