"""Add a stable, correlation-scoped catalog for runner artifacts.""" from alembic import op revision = "20260723_140" down_revision = "20260723_130" branch_labels = None depends_on = None def upgrade() -> None: op.execute( """ CREATE TABLE public.rule_run_artifacts ( id UUID PRIMARY KEY, correlation_id UUID NOT NULL, binding_id UUID NOT NULL REFERENCES public.dataflow_dataset_bindings(id) ON DELETE RESTRICT, artifact_ref VARCHAR(1000) NOT NULL, artifact_digest CHAR(64) NOT NULL, row_count BIGINT NOT NULL CHECK (row_count >= 0), schema_hash CHAR(64) NOT NULL, schema_fields JSONB NOT NULL, artifact_kind VARCHAR(20) NOT NULL CHECK (artifact_kind IN ('input','lookup','output')), expires_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE (correlation_id, binding_id, artifact_digest) ); CREATE INDEX idx_rule_run_artifacts_resolve ON public.rule_run_artifacts (correlation_id, binding_id, created_at DESC); """ ) def downgrade() -> None: # Runtime handoff evidence is immutable and intentionally retained. pass