CREATE TABLE IF NOT EXISTS schema_meta ( meta_key TEXT NOT NULL PRIMARY KEY, role TEXT NOT NULL, schema_version INTEGER NOT NULL, agent_id TEXT, app_version TEXT, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL ) STRICT; CREATE TABLE IF NOT EXISTS config_machine_state ( state_key TEXT NOT NULL PRIMARY KEY, value_json TEXT NOT NULL, updated_at_ms INTEGER NOT NULL ) STRICT; CREATE TABLE IF NOT EXISTS update_runs ( run_id TEXT PRIMARY KEY NOT NULL, created_at_ms INTEGER NOT NULL, updated_at_ms INTEGER NOT NULL, trigger TEXT NOT NULL CHECK (trigger IN ('chat', 'control-ui', 'cli', 'campaign', 'mac-app', 'api')), phase TEXT NOT NULL CHECK (phase IN ('requested', 'staging', 'validating', 'repairing', 'activating', 'restarting', 'verifying', 'finished')), status TEXT NOT NULL CHECK (status IN ('running', 'succeeded', 'failed', 'rolled-back', 'skipped')), reason TEXT, origin_json TEXT NOT NULL CHECK (length(CAST(origin_json AS BLOB)) <= 16384), target_json TEXT NOT NULL CHECK (length(CAST(target_json AS BLOB)) <= 16384), before_json TEXT NOT NULL CHECK (length(CAST(before_json AS BLOB)) <= 16384), after_json TEXT NOT NULL CHECK (length(CAST(after_json AS BLOB)) <= 16384), steps_json TEXT NOT NULL CHECK (length(CAST(steps_json AS BLOB)) <= 16384), verification_json TEXT NOT NULL CHECK (length(CAST(verification_json AS BLOB)) <= 16384), repair_json TEXT NOT NULL CHECK (length(CAST(repair_json AS BLOB)) <= 16384), confirmed_at_ms INTEGER, finished_at_ms INTEGER, downtime_ms INTEGER, CHECK ((status = 'running' AND phase != 'finished' AND finished_at_ms IS NULL) OR (status != 'running' AND phase = 'finished' AND finished_at_ms IS NOT NULL)) ) STRICT; CREATE INDEX IF NOT EXISTS idx_update_runs_created ON update_runs(created_at_ms DESC, run_id); CREATE INDEX IF NOT EXISTS idx_update_runs_active ON update_runs(status, created_at_ms DESC, run_id);