-- Old paginated cursors cannot authorize the single-response discovery contract. -- Keep task assignments and execution recovery; require a fresh snapshot. DROP TABLE IF EXISTS local_v01_task_discovery_pages; DROP TABLE IF EXISTS local_v01_task_discovery_state; CREATE TABLE IF NOT EXISTS local_v02_task_discovery_state ( dispatcher_id TEXT PRIMARY KEY, cursor TEXT NOT NULL, last_mode TEXT NOT NULL CHECK (last_mode IN ('snapshot', 'changes')), ready INTEGER NOT NULL CHECK (ready IN (0, 1)), updated_at TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS local_v02_task_discovery_response ( dispatcher_id TEXT PRIMARY KEY, content_sha256 TEXT NOT NULL CHECK (length(content_sha256) = 64), body BLOB NOT NULL, stored_at TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS local_v01_task_assignments ( dispatcher_id TEXT NOT NULL, task_id TEXT NOT NULL, tenant_id TEXT NOT NULL, tenant_key TEXT NOT NULL, task_revision INTEGER NOT NULL CHECK (task_revision >= 0), saas_status TEXT NOT NULL CHECK (saas_status IN ('running', 'paused', 'stopped', 'finished', 'removed')), admission_state TEXT NOT NULL CHECK (admission_state IN ('running', 'paused', 'stopped', 'finished', 'removed')), removed INTEGER NOT NULL DEFAULT 0 CHECK (removed IN (0, 1)), queue_exchange TEXT NOT NULL, routing_key TEXT NOT NULL, binding_key TEXT NOT NULL, queue_name TEXT NOT NULL, updated_at TEXT NOT NULL, PRIMARY KEY (dispatcher_id, task_id) ); CREATE INDEX IF NOT EXISTS local_v01_task_assignments_admission ON local_v01_task_assignments(dispatcher_id, removed, admission_state);