diff --git a/api-v3/src/database/migrations/1790099200000-reset-operational-hierarchy-data.ts b/api-v3/src/database/migrations/1790099200000-reset-operational-hierarchy-data.ts index c09ecd1..4c2cb70 100644 --- a/api-v3/src/database/migrations/1790099200000-reset-operational-hierarchy-data.ts +++ b/api-v3/src/database/migrations/1790099200000-reset-operational-hierarchy-data.ts @@ -32,6 +32,27 @@ export class ResetOperationalHierarchyData1790099200000 implements MigrationInte name = 'ResetOperationalHierarchyData1790099200000'; public async up(queryRunner: QueryRunner): Promise { + // This is a one-time live-data cleanup, not a new canonical empty seed. + // Fresh CI/bootstrap databases intentionally have no admin account while + // replaying the historical migration chain, so they must retain the F6.1 + // presentation seed used by hierarchy/planning contract tests. + const adminRows = (await queryRunner.query(` + SELECT id + FROM users + WHERE lower(btrim(username))='admin' + ORDER BY id + `)) as Array<{ id: string }>; + if (adminRows.length === 0) { + // eslint-disable-next-line no-console + console.log('[hierarchy-reset] skipped: no live admin account on migration replay'); + return; + } + if (adminRows.length !== 1) { + throw new Error( + `Hierarchy reset aborted: expected exactly one live admin account, found ${adminRows.length}`, + ); + } + const targetTypes = (await queryRunner.query( ` SELECT lower(code) AS code