[
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.usbReceiptAttached. USB receipt printer matching the configured vendor is attached",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'usbReceiptAttached'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `usbReceiptAttached` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'USB receipt printer matching the configured vendor is attached'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.usbReceiptPermission. Android USB permission granted for the receipt printer",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'usbReceiptPermission'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `usbReceiptPermission` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Android USB permission granted for the receipt printer'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.usbLabelAttached. USB label printer matching the configured vendor is attached",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'usbLabelAttached'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `usbLabelAttached` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'USB label printer matching the configured vendor is attached'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.usbLabelPermission. Android USB permission granted for the label printer",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'usbLabelPermission'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `usbLabelPermission` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Android USB permission granted for the label printer'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.isDebug. App is a debuggable build (debug build running in the field = alert)",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'isDebug'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `isDebug` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'App is a debuggable build (debug build running in the field = alert)'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.buildType. Gradle build type e.g. debug/release",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'buildType'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `buildType` VARCHAR(16) DEFAULT NULL COMMENT 'Gradle build type e.g. debug/release'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.appInstalledAt. From appInstalledMillis (first install) for rollout tracking",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'appInstalledAt'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `appInstalledAt` DATETIME DEFAULT NULL COMMENT 'From appInstalledMillis (first install) for rollout tracking'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.appUpdatedAt. From appUpdatedMillis (last update) for rollout tracking",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'appUpdatedAt'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `appUpdatedAt` DATETIME DEFAULT NULL COMMENT 'From appUpdatedMillis (last update) for rollout tracking'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.uptimeSinceBootMillis. Elapsed ms since boot (reboot-loop detector); a DURATION, not a timestamp",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'uptimeSinceBootMillis'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `uptimeSinceBootMillis` BIGINT DEFAULT NULL COMMENT 'Elapsed ms since boot (reboot-loop detector); a DURATION, not a timestamp'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.batteryHealth. good/overheat/dead/over_voltage/cold/unknown",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'batteryHealth'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `batteryHealth` VARCHAR(16) DEFAULT NULL COMMENT 'good/overheat/dead/over_voltage/cold/unknown'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.batteryPlugged. ac/usb/wireless/unplugged (unplugged on a fixed kiosk = alert)",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'batteryPlugged'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `batteryPlugged` VARCHAR(16) DEFAULT NULL COMMENT 'ac/usb/wireless/unplugged (unplugged on a fixed kiosk = alert)'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.powerSaveMode. Android battery-saver active",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'powerSaveMode'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `powerSaveMode` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Android battery-saver active'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.storageFreeBytes. Free internal storage (StatFs)",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'storageFreeBytes'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `storageFreeBytes` BIGINT DEFAULT NULL COMMENT 'Free internal storage (StatFs)'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.storageTotalBytes. Total internal storage (StatFs)",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'storageTotalBytes'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `storageTotalBytes` BIGINT DEFAULT NULL COMMENT 'Total internal storage (StatFs)'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.ramAvailableBytes. Available RAM (ActivityManager.MemoryInfo)",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'ramAvailableBytes'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `ramAvailableBytes` BIGINT DEFAULT NULL COMMENT 'Available RAM (ActivityManager.MemoryInfo)'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.ramTotalBytes. Total RAM",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'ramTotalBytes'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `ramTotalBytes` BIGINT DEFAULT NULL COMMENT 'Total RAM'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.lowMemory. System reported low-memory state",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'lowMemory'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `lowMemory` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'System reported low-memory state'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.locale. Device locale e.g. en-US",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'locale'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `locale` VARCHAR(32) DEFAULT NULL COMMENT 'Device locale e.g. en-US'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.timezone. Device timezone id e.g. America/Chicago",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'timezone'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `timezone` VARCHAR(64) DEFAULT NULL COMMENT 'Device timezone id e.g. America/Chicago'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.cameraPresent. Device has a camera (DL scanning capable)",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'cameraPresent'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `cameraPresent` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Device has a camera (DL scanning capable)'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.cameraPermission. Camera permission granted (revoked = cannot scan DLs)",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'cameraPermission'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `cameraPermission` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Camera permission granted (revoked = cannot scan DLs)'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.lastCustomerSyncError. Last customer-sync error string; NULL = healthy",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'lastCustomerSyncError'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `lastCustomerSyncError` VARCHAR(255) DEFAULT NULL COMMENT 'Last customer-sync error string; NULL = healthy'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.lastPrintAt. From lastPrintAtMillis; last receipt print attempt",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'lastPrintAt'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `lastPrintAt` DATETIME DEFAULT NULL COMMENT 'From lastPrintAtMillis; last receipt print attempt'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.lastPrintOk. Outcome of the last print; NULL = never printed (tri-state)",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'lastPrintOk'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `lastPrintOk` TINYINT(1) DEFAULT NULL COMMENT 'Outcome of the last print; NULL = never printed (tri-state)'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.printErrorCount. Cumulative print errors since the health store was created",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'printErrorCount'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `printErrorCount` INT DEFAULT NULL COMMENT 'Cumulative print errors since the health store was created'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.lastNewbuyOkAt. From lastNewbuyOkMillis; last successful buy submit (stale = idle/broken)",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'lastNewbuyOkAt'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `lastNewbuyOkAt` DATETIME DEFAULT NULL COMMENT 'From lastNewbuyOkMillis; last successful buy submit (stale = idle/broken)'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.lastConfigRefreshOkAt. From lastConfigRefreshOkMillis; last successful /config 200/304",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'lastConfigRefreshOkAt'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `lastConfigRefreshOkAt` DATETIME DEFAULT NULL COMMENT 'From lastConfigRefreshOkMillis; last successful /config 200/304'"
    },
    {
        "type": "alter_table",
        "description": "Spec 050 fleet-health: add deviceDiagnostics.lastConfigRefreshError. Last /config refresh error string; NULL = healthy",
        "database": "kiosk_buykiosk",
        "check_query": "SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics' AND COLUMN_NAME = 'lastConfigRefreshError'",
        "sql": "ALTER TABLE `deviceDiagnostics` ADD COLUMN `lastConfigRefreshError` VARCHAR(255) DEFAULT NULL COMMENT 'Last /config refresh error string; NULL = healthy'"
    }
]
