PRAGMA foreign_keys=ON; CREATE TABLE IF NOT EXISTS task_lineage_supersessions ( source_task_id TEXT NOT NULL, supersession_ordinal INTEGER NOT NULL CHECK (supersession_ordinal = 1), child_task_id TEXT NOT NULL UNIQUE, source_task_identity_sha256 TEXT NOT NULL, source_metadata_sha256 TEXT NOT NULL, owner_decision_sha256 TEXT NOT NULL UNIQUE, decision_id TEXT NOT NULL UNIQUE, created_at TEXT NOT NULL, PRIMARY KEY (source_task_id, supersession_ordinal) ); CREATE TABLE IF NOT EXISTS task_lineage_supersession_receipts ( decision_id TEXT PRIMARY KEY, nonce TEXT NOT NULL UNIQUE, source_task_id TEXT NOT NULL, supersession_ordinal INTEGER NOT NULL, child_task_id TEXT NOT NULL UNIQUE, owner_decision_sha256 TEXT NOT NULL UNIQUE, decision_json TEXT NOT NULL, receipt_json TEXT NOT NULL, consumed_at TEXT NOT NULL, FOREIGN KEY (source_task_id, supersession_ordinal) REFERENCES task_lineage_supersessions(source_task_id, supersession_ordinal) ); CREATE TABLE IF NOT EXISTS task_claim_guard_bindings_v2 ( binding_id TEXT PRIMARY KEY, task_id TEXT NOT NULL UNIQUE, source_task_id TEXT NOT NULL, supersession_ordinal INTEGER NOT NULL, expected_revision INTEGER NOT NULL CHECK (expected_revision >= 1), metadata_sha256 TEXT NOT NULL, required_capabilities_sha256 TEXT NOT NULL, worker_id TEXT NOT NULL, execution_digest TEXT NOT NULL, repository TEXT NOT NULL, target_branch TEXT NOT NULL, generation INTEGER NOT NULL, policy_json TEXT NOT NULL, policy_sha256 TEXT NOT NULL, binding_json TEXT NOT NULL, binding_sha256 TEXT NOT NULL UNIQUE, created_at TEXT NOT NULL, FOREIGN KEY (source_task_id, supersession_ordinal) REFERENCES task_lineage_supersessions(source_task_id, supersession_ordinal) ); CREATE TABLE IF NOT EXISTS task_claim_guard_binding_receipts_v2 ( receipt_id TEXT PRIMARY KEY, binding_id TEXT NOT NULL UNIQUE, task_id TEXT NOT NULL UNIQUE, receipt_json TEXT NOT NULL, receipt_sha256 TEXT NOT NULL UNIQUE, created_at TEXT NOT NULL, FOREIGN KEY (binding_id) REFERENCES task_claim_guard_bindings_v2(binding_id) ); CREATE TRIGGER IF NOT EXISTS task_lineage_supersessions_no_update BEFORE UPDATE ON task_lineage_supersessions BEGIN SELECT RAISE(ABORT, 'TASK_LINEAGE_SUPERSESSION_APPEND_ONLY'); END; CREATE TRIGGER IF NOT EXISTS task_lineage_supersessions_no_delete BEFORE DELETE ON task_lineage_supersessions BEGIN SELECT RAISE(ABORT, 'TASK_LINEAGE_SUPERSESSION_APPEND_ONLY'); END; CREATE TRIGGER IF NOT EXISTS task_lineage_supersession_receipts_no_update BEFORE UPDATE ON task_lineage_supersession_receipts BEGIN SELECT RAISE(ABORT, 'TASK_LINEAGE_SUPERSESSION_RECEIPT_APPEND_ONLY'); END; CREATE TRIGGER IF NOT EXISTS task_lineage_supersession_receipts_no_delete BEFORE DELETE ON task_lineage_supersession_receipts BEGIN SELECT RAISE(ABORT, 'TASK_LINEAGE_SUPERSESSION_RECEIPT_APPEND_ONLY'); END; CREATE TRIGGER IF NOT EXISTS task_claim_guard_bindings_v2_no_update BEFORE UPDATE ON task_claim_guard_bindings_v2 BEGIN SELECT RAISE(ABORT, 'TASK_CLAIM_GUARD_BINDING_APPEND_ONLY'); END; CREATE TRIGGER IF NOT EXISTS task_claim_guard_bindings_v2_no_delete BEFORE DELETE ON task_claim_guard_bindings_v2 BEGIN SELECT RAISE(ABORT, 'TASK_CLAIM_GUARD_BINDING_APPEND_ONLY'); END; CREATE TRIGGER IF NOT EXISTS task_claim_guard_binding_receipts_v2_no_update BEFORE UPDATE ON task_claim_guard_binding_receipts_v2 BEGIN SELECT RAISE(ABORT, 'TASK_CLAIM_GUARD_BINDING_RECEIPT_APPEND_ONLY'); END; CREATE TRIGGER IF NOT EXISTS task_claim_guard_binding_receipts_v2_no_delete BEFORE DELETE ON task_claim_guard_binding_receipts_v2 BEGIN SELECT RAISE(ABORT, 'TASK_CLAIM_GUARD_BINDING_RECEIPT_APPEND_ONLY'); END;