30 lines
1.6 KiB
SQL
30 lines
1.6 KiB
SQL
-- One immutable terminal fact per accepted local execution. Releasing the
|
|
-- reservation and recording the fact share a transaction; the final result
|
|
-- may be enqueued immediately or later after the recording outcome is known.
|
|
CREATE TABLE IF NOT EXISTS local_v01_call_terminals (
|
|
execution_id TEXT PRIMARY KEY REFERENCES tasks(execution_id),
|
|
call_id TEXT NOT NULL UNIQUE,
|
|
source TEXT NOT NULL CHECK (source IN ('mock_agent', 'dispatcher_refusal', 'mock_agent_deadline', 'dispatcher_deadline')),
|
|
started_at TEXT NOT NULL,
|
|
ended_at TEXT NOT NULL,
|
|
outcome TEXT NOT NULL,
|
|
reason_code TEXT NOT NULL,
|
|
recording_expected INTEGER NOT NULL CHECK (recording_expected IN (0, 1)),
|
|
recording_id TEXT UNIQUE,
|
|
upload_id TEXT UNIQUE,
|
|
recording_manifest BLOB,
|
|
recording_outcome BLOB,
|
|
recording_outcome_sha256 TEXT,
|
|
recording_status TEXT CHECK (recording_status IN ('uploaded', 'unavailable')),
|
|
fact_sha256 TEXT NOT NULL,
|
|
result_event_id TEXT UNIQUE,
|
|
result_sha256 TEXT,
|
|
CHECK ((result_event_id IS NULL) = (result_sha256 IS NULL)),
|
|
CHECK ((recording_expected = 0 AND recording_id IS NULL AND upload_id IS NULL AND recording_manifest IS NULL AND recording_outcome IS NULL)
|
|
OR (recording_expected = 1 AND recording_id IS NOT NULL AND upload_id IS NOT NULL AND recording_manifest IS NOT NULL)),
|
|
CHECK ((recording_outcome IS NULL) = (recording_outcome_sha256 IS NULL)),
|
|
CHECK ((recording_outcome IS NULL) = (recording_status IS NULL))
|
|
);
|
|
CREATE INDEX IF NOT EXISTS local_v01_call_terminals_pending_idx
|
|
ON local_v01_call_terminals (result_event_id, ended_at);
|