-- Round 5S additive migration. Apply ONLY to an approved isolated database first. -- No history backfill to REAL, no deletion, no account/privilege changes. -- Stop the application before migration; do not run old and new writers together. ALTER TABLE iotlocks.lock_auth ADD COLUMN IF NOT EXISTS execution_mode varchar(16) NOT NULL DEFAULT 'LEGACY'; ALTER TABLE iotlocks.lock_auth ADD COLUMN IF NOT EXISTS environment_id varchar(128); ALTER TABLE iotlocks.lock_auth ADD COLUMN IF NOT EXISTS intent_key varchar(64); ALTER TABLE iotlocks.lock_auth ADD COLUMN IF NOT EXISTS intent_version bigint NOT NULL DEFAULT 0; ALTER TABLE iotlocks.lock_auth ADD COLUMN IF NOT EXISTS execution_state varchar(32) NOT NULL DEFAULT 'QUARANTINED'; ALTER TABLE iotlocks.lock_auth ADD COLUMN IF NOT EXISTS intent_action varchar(16); ALTER TABLE iotlocks.lock_auth ADD COLUMN IF NOT EXISTS intent_at timestamp; ALTER TABLE iotlocks.lock_command ADD COLUMN IF NOT EXISTS execution_mode varchar(16) NOT NULL DEFAULT 'LEGACY'; ALTER TABLE iotlocks.lock_command ADD COLUMN IF NOT EXISTS environment_id varchar(128); ALTER TABLE iotlocks.lock_command ADD COLUMN IF NOT EXISTS intent_key varchar(64); ALTER TABLE iotlocks.lock_command ADD COLUMN IF NOT EXISTS intent_version bigint NOT NULL DEFAULT 0; ALTER TABLE iotlocks.lock_command ADD COLUMN IF NOT EXISTS execution_state varchar(32) NOT NULL DEFAULT 'QUARANTINED'; ALTER TABLE iotlocks.lock_command ADD COLUMN IF NOT EXISTS intent_action varchar(16); ALTER TABLE iotlocks.lock_command ADD COLUMN IF NOT EXISTS intent_at timestamp; ALTER TABLE iotlocks.lock_command ADD COLUMN IF NOT EXISTS device_sn varchar(64); ALTER TABLE iotlocks.lock_command ADD COLUMN IF NOT EXISTS attempt_started_at timestamp; CREATE UNIQUE INDEX IF NOT EXISTS uq_round5s_command_intent ON iotlocks.lock_command(intent_key); CREATE UNIQUE INDEX IF NOT EXISTS uq_round5s_auth_intent ON iotlocks.lock_auth(intent_key); CREATE INDEX IF NOT EXISTS ix_round5s_command_recovery ON iotlocks.lock_command(execution_state, attempt_started_at); CREATE INDEX IF NOT EXISTS ix_round5s_auth_recovery ON iotlocks.lock_auth(execution_state, intent_action); -- Existing rows are LEGACY / version 0 / QUARANTINED. Never bulk relabel them. -- READY: proven never attempted; DISPATCHING/AWAITING_ACK: outcome may be unknown. -- MANUAL_REVIEW/QUARANTINED: no automatic resend; CONFIRMED requires correlated device evidence.