20260723_120_rule_execution_runtime.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. """Add immutable runtime bindings and evidence for governed rule execution."""
  2. from alembic import op
  3. revision = "20260723_120"
  4. down_revision = "20260723_110"
  5. branch_labels = None
  6. depends_on = None
  7. def upgrade() -> None:
  8. op.execute(
  9. """
  10. CREATE TABLE public.data_schema_snapshots (
  11. id UUID PRIMARY KEY,
  12. schema_ref VARCHAR(500) NOT NULL,
  13. schema_hash CHAR(64) NOT NULL,
  14. fields JSONB NOT NULL,
  15. source_revision VARCHAR(200) NOT NULL,
  16. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  17. UNIQUE (schema_ref, schema_hash)
  18. );
  19. CREATE TABLE public.dataflow_dataset_bindings (
  20. id UUID PRIMARY KEY,
  21. dataflow_deployment_id UUID NOT NULL REFERENCES public.dataflow_deployments(id),
  22. logical_ref VARCHAR(500) NOT NULL,
  23. data_source_uid UUID,
  24. object_kind VARCHAR(30) NOT NULL CHECK (
  25. object_kind IN ('table','view','query','parquet_artifact')
  26. ),
  27. object_ref VARCHAR(1000) NOT NULL,
  28. schema_snapshot_id UUID NOT NULL REFERENCES public.data_schema_snapshots(id),
  29. dialect VARCHAR(30) NOT NULL,
  30. access_mode VARCHAR(20) NOT NULL CHECK (
  31. access_mode IN ('read','write','read_write')
  32. ),
  33. write_mode VARCHAR(30),
  34. binding_hash CHAR(64) NOT NULL,
  35. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  36. UNIQUE (dataflow_deployment_id, logical_ref)
  37. );
  38. CREATE INDEX idx_dataflow_dataset_binding_snapshot
  39. ON public.dataflow_dataset_bindings(schema_snapshot_id);
  40. CREATE TABLE public.rule_compile_evidence (
  41. id UUID PRIMARY KEY,
  42. rule_execution_plan_id UUID NOT NULL REFERENCES public.rule_execution_plans(id)
  43. ON DELETE RESTRICT,
  44. compiler_version VARCHAR(80) NOT NULL,
  45. compiler_digest CHAR(64) NOT NULL,
  46. status VARCHAR(20) NOT NULL CHECK (status IN ('success','failed')),
  47. evidence JSONB NOT NULL DEFAULT '{}'::jsonb,
  48. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  49. UNIQUE (rule_execution_plan_id, compiler_digest)
  50. );
  51. CREATE INDEX idx_rule_compile_evidence_plan
  52. ON public.rule_compile_evidence(rule_execution_plan_id, created_at DESC);
  53. CREATE TABLE public.rule_test_evidence (
  54. id UUID PRIMARY KEY,
  55. rule_execution_plan_id UUID NOT NULL REFERENCES public.rule_execution_plans(id)
  56. ON DELETE RESTRICT,
  57. test_kind VARCHAR(40) NOT NULL,
  58. evidence_hash CHAR(64) NOT NULL,
  59. status VARCHAR(20) NOT NULL CHECK (status IN ('success','failed')),
  60. evidence JSONB NOT NULL DEFAULT '{}'::jsonb,
  61. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  62. UNIQUE (rule_execution_plan_id, test_kind, evidence_hash)
  63. );
  64. CREATE INDEX idx_rule_test_evidence_plan
  65. ON public.rule_test_evidence(rule_execution_plan_id, created_at DESC);
  66. ALTER TABLE public.rule_generation_runs
  67. ADD COLUMN created_by UUID REFERENCES public.users(id) ON DELETE SET NULL,
  68. ADD COLUMN candidate JSONB;
  69. """
  70. )
  71. def downgrade() -> None:
  72. # Immutable runtime evidence and audit linkage are retained on rollback.
  73. pass