[
  {
    "type": "create_table",
    "description": "Spec 050 Kiosk API v1: per-device diagnostics snapshot (fleet telemetry). One LATEST row per (typeNum, tablet) — upserted by POST /api/v1/device/diagnostics on app launch + every 24h. Powers the admin Fleet dashboard (online status, battery health, app-version rollout, printer config, config/customer-sync staleness). Lives in kiosk_buykiosk (cross-store fleet view, single query) and links to kioskDevices via deviceId from the token. Columns are camelCase per project convention (handoff used snake_case; normalized here).",
    "database": "kiosk_buykiosk",
    "check_query": "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'kiosk_buykiosk' AND TABLE_NAME = 'deviceDiagnostics'",
    "sql": "CREATE TABLE `deviceDiagnostics` (\n  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,\n  `typeNum` VARCHAR(10) NOT NULL COMMENT 'Store identifier (from the JWT, not the body)',\n  `tablet` VARCHAR(8) NOT NULL COMMENT 'Tablet number; 0/blank = print/reprint station',\n  `deviceId` INT UNSIGNED DEFAULT NULL COMMENT 'kioskDevices.id resolved from the token (nullable; no hard FK so a purged device row never blocks ingest)',\n  `deviceName` VARCHAR(64) DEFAULT NULL COMMENT 'Admin-set friendly name (same value as Ably presence)',\n  `appName` VARCHAR(32) DEFAULT NULL,\n  `versionName` VARCHAR(16) DEFAULT NULL COMMENT 'App version string e.g. 3.3',\n  `versionCode` INT DEFAULT NULL,\n  `packageName` VARCHAR(64) DEFAULT NULL,\n  `manufacturer` VARCHAR(64) DEFAULT NULL,\n  `model` VARCHAR(64) DEFAULT NULL,\n  `androidRelease` VARCHAR(16) DEFAULT NULL,\n  `sdkInt` INT DEFAULT NULL,\n  `brandCode` VARCHAR(32) DEFAULT NULL COMMENT 'Display only; authority is the token',\n  `storeNumber` VARCHAR(16) DEFAULT NULL COMMENT 'Display only; authority is the token',\n  `paired` TINYINT(1) NOT NULL DEFAULT 1,\n  `receiptKind` VARCHAR(8) DEFAULT NULL COMMENT 'STAR | EPSON',\n  `receiptConn` VARCHAR(8) DEFAULT NULL COMMENT 'USB | TCP',\n  `receiptAddress` VARCHAR(64) DEFAULT NULL COMMENT 'TCP host (blank for USB)',\n  `labelKind` VARCHAR(8) DEFAULT NULL COMMENT 'NONE | ZEBRA',\n  `labelConn` VARCHAR(8) DEFAULT NULL COMMENT 'USB | TCP',\n  `labelAddress` VARCHAR(64) DEFAULT NULL COMMENT 'TCP host (blank for USB)',\n  `printRegisterCopy` TINYINT(1) NOT NULL DEFAULT 0,\n  `batteryPercent` INT DEFAULT NULL COMMENT '0..100, or -1 if unknown',\n  `batteryCharging` TINYINT(1) NOT NULL DEFAULT 0,\n  `batteryTemperatureC` DECIMAL(5,1) DEFAULT NULL,\n  `batteryVoltageMv` INT DEFAULT NULL,\n  `customersDownloaded` TINYINT(1) NOT NULL DEFAULT 0,\n  `customersCount` INT DEFAULT NULL,\n  `customersLastSync` DATETIME DEFAULT NULL,\n  `configLoaded` TINYINT(1) NOT NULL DEFAULT 0,\n  `configEtag` VARCHAR(128) DEFAULT NULL COMMENT 'Which /api/v1/config version this device is on',\n  `realtime` VARCHAR(16) DEFAULT NULL COMMENT 'ONLINE/OFFLINE/CONNECTING/REPRINTING; null on the daily job',\n  `networkType` VARCHAR(16) DEFAULT NULL COMMENT 'wifi/cellular/ethernet/none/other',\n  `reportedAt` DATETIME DEFAULT NULL COMMENT 'Device clock at capture (untrusted)',\n  `receivedAt` DATETIME NOT NULL COMMENT 'Server clock at ingest = authoritative last-seen',\n  `createdAt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'First diagnostics ingest for this device',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `uk_typeNum_tablet` (`typeNum`, `tablet`),\n  KEY `idx_typeNum` (`typeNum`),\n  KEY `idx_receivedAt` (`receivedAt`),\n  KEY `idx_deviceId` (`deviceId`),\n  KEY `idx_versionCode` (`versionCode`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Spec 050: latest per-device fleet diagnostics snapshot (one row per typeNum+tablet)'"
  }
]
