-- DurableStore substrate tables owned by remora-durable. -- Feature packages add their own migrations; they do not alter these tables. CREATE TABLE mutation_records ( scope_subject TEXT NOT NULL, scope_operation TEXT NOT NULL, operation_key TEXT NOT NULL, kind TEXT NOT NULL, -- Opaque RemoraApiMutation eligibility / authority binding (attempt, fence, -- worker incarnation, or other claim material). Compared for exact replay. eligibility_claim BYTEA NOT NULL, request_fingerprint BYTEA NOT NULL CHECK (octet_length(request_fingerprint) = 32), response_status TEXT NOT NULL CHECK (response_status IN ('accepted', 'rejected')), response_body JSONB NOT NULL, effect_applied BOOLEAN NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), PRIMARY KEY (scope_subject, scope_operation, operation_key), CHECK (effect_applied = (response_status = 'accepted')) ); CREATE TABLE outbox_messages ( id BIGSERIAL PRIMARY KEY, topic TEXT NOT NULL, payload JSONB NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), available_at TIMESTAMPTZ NOT NULL DEFAULT now(), claimed_by TEXT, claimed_until TIMESTAMPTZ, -- Monotonic per-row claim epoch; with claimed_by forms the ownership token. claim_generation BIGINT NOT NULL DEFAULT 0, projected_at TIMESTAMPTZ, attempt_count INTEGER NOT NULL DEFAULT 0, last_error TEXT ); CREATE INDEX outbox_messages_claimable_idx ON outbox_messages (available_at, id) WHERE projected_at IS NULL;