fix(db): recover progress_text columns skipped by migration-version collision
Merging origin/main collided on schema version 15: the deployment DB recorded v15 as `reviewer_failure_count` (downstream-only), while upstream defines v15 as `turn_progress_text`. The runner tracks applied migrations by version number, so it skips upstream's `turn_progress_text` on the live DB and never creates paired_turns.progress_text / progress_updated_at — columns the merged runtime reads and writes (db/paired-turns.ts, web-dashboard-data.ts), which would crash the live paired-room flow. Add idempotent migration 019 to re-create those columns under a free version number. No-op on fresh installs where migration 015 already ran. Caught by a pre-flight boot of the merged code against a copy of the live DB. Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
This commit is contained in:
@@ -43,6 +43,7 @@ function getExpectedSchemaMigrations(): Array<{
|
|||||||
{ version: 16, name: 'room_skill_overrides' },
|
{ version: 16, name: 'room_skill_overrides' },
|
||||||
{ version: 17, name: 'scheduled_task_room_role' },
|
{ version: 17, name: 'scheduled_task_room_role' },
|
||||||
{ version: 18, name: 'paired_turn_output_attachments' },
|
{ version: 18, name: 'paired_turn_output_attachments' },
|
||||||
|
{ version: 19, name: 'turn_progress_text_recovery' },
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
35
src/db/migrations/019_turn-progress-text-recovery.ts
Normal file
35
src/db/migrations/019_turn-progress-text-recovery.ts
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import type { Database } from 'bun:sqlite';
|
||||||
|
|
||||||
|
import { tableHasColumn } from './helpers.js';
|
||||||
|
import type { SchemaMigrationDefinition } from './types.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recovery for a migration-version collision introduced by merging
|
||||||
|
* origin/main into the long-lived deployment branch.
|
||||||
|
*
|
||||||
|
* The deployment DB recorded schema version 15 as `reviewer_failure_count`
|
||||||
|
* (a downstream-only migration), while upstream defines version 15 as
|
||||||
|
* `turn_progress_text` (migration 015). Because the migration runner tracks
|
||||||
|
* applied migrations by version number alone, the upstream `turn_progress_text`
|
||||||
|
* migration is skipped on the live DB and `paired_turns.progress_text` /
|
||||||
|
* `progress_updated_at` are never created — even though merged runtime code
|
||||||
|
* (src/db/paired-turns.ts, src/web-dashboard-data.ts) reads and writes them.
|
||||||
|
*
|
||||||
|
* This migration re-applies those columns idempotently under a fresh version
|
||||||
|
* number so the live deployment gets them. It is a no-op on databases where
|
||||||
|
* migration 015 already ran (fresh installs), thanks to the column guards.
|
||||||
|
*/
|
||||||
|
export const TURN_PROGRESS_TEXT_RECOVERY_MIGRATION: SchemaMigrationDefinition = {
|
||||||
|
version: 19,
|
||||||
|
name: 'turn_progress_text_recovery',
|
||||||
|
apply(database: Database) {
|
||||||
|
if (!tableHasColumn(database, 'paired_turns', 'progress_text')) {
|
||||||
|
database.exec(`ALTER TABLE paired_turns ADD COLUMN progress_text TEXT`);
|
||||||
|
}
|
||||||
|
if (!tableHasColumn(database, 'paired_turns', 'progress_updated_at')) {
|
||||||
|
database.exec(
|
||||||
|
`ALTER TABLE paired_turns ADD COLUMN progress_updated_at TEXT`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -18,6 +18,7 @@ import { TURN_PROGRESS_TEXT_MIGRATION } from './015_turn-progress-text.js';
|
|||||||
import { ROOM_SKILL_OVERRIDES_MIGRATION } from './016_room-skill-overrides.js';
|
import { ROOM_SKILL_OVERRIDES_MIGRATION } from './016_room-skill-overrides.js';
|
||||||
import { SCHEDULED_TASK_ROOM_ROLE_MIGRATION } from './017_scheduled-task-room-role.js';
|
import { SCHEDULED_TASK_ROOM_ROLE_MIGRATION } from './017_scheduled-task-room-role.js';
|
||||||
import { PAIRED_TURN_OUTPUT_ATTACHMENTS_MIGRATION } from './018_paired-turn-output-attachments.js';
|
import { PAIRED_TURN_OUTPUT_ATTACHMENTS_MIGRATION } from './018_paired-turn-output-attachments.js';
|
||||||
|
import { TURN_PROGRESS_TEXT_RECOVERY_MIGRATION } from './019_turn-progress-text-recovery.js';
|
||||||
import type {
|
import type {
|
||||||
SchemaMigrationArgs,
|
SchemaMigrationArgs,
|
||||||
SchemaMigrationDefinition,
|
SchemaMigrationDefinition,
|
||||||
@@ -44,6 +45,7 @@ const ORDERED_SCHEMA_MIGRATIONS: readonly SchemaMigrationDefinition[] = [
|
|||||||
ROOM_SKILL_OVERRIDES_MIGRATION,
|
ROOM_SKILL_OVERRIDES_MIGRATION,
|
||||||
SCHEDULED_TASK_ROOM_ROLE_MIGRATION,
|
SCHEDULED_TASK_ROOM_ROLE_MIGRATION,
|
||||||
PAIRED_TURN_OUTPUT_ATTACHMENTS_MIGRATION,
|
PAIRED_TURN_OUTPUT_ATTACHMENTS_MIGRATION,
|
||||||
|
TURN_PROGRESS_TEXT_RECOVERY_MIGRATION,
|
||||||
];
|
];
|
||||||
|
|
||||||
function ensureSchemaMigrationsTable(database: Database): void {
|
function ensureSchemaMigrationsTable(database: Database): void {
|
||||||
|
|||||||
Reference in New Issue
Block a user