feat(control-pipeline): JSONB migration for generation_metadata

- Add migration script (scripts/migrate_jsonb.py) that converts
  89,443 Python dict repr rows to valid JSON via ast.literal_eval
- Column altered from TEXT to native JSONB
- Index created on generation_metadata->>'merge_group_hint'
- Remove unnecessary ::jsonb casts in pipeline_adapter.py

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-04-22 07:49:11 +02:00
parent ba3b172223
commit 4716023abc
2 changed files with 150 additions and 6 deletions

View File

@@ -452,7 +452,7 @@ class MigrationPasses:
"review": """
UPDATE canonical_controls
SET generation_metadata = jsonb_set(
COALESCE(generation_metadata::jsonb, '{}'::jsonb),
COALESCE(generation_metadata, '{}'::jsonb),
'{triage_status}', '"review"'
)
WHERE release_state NOT IN ('deprecated')
@@ -462,7 +462,7 @@ class MigrationPasses:
"needs_obligation": """
UPDATE canonical_controls
SET generation_metadata = jsonb_set(
COALESCE(generation_metadata::jsonb, '{}'::jsonb),
COALESCE(generation_metadata, '{}'::jsonb),
'{triage_status}', '"needs_obligation"'
)
WHERE release_state NOT IN ('deprecated')
@@ -472,7 +472,7 @@ class MigrationPasses:
"needs_pattern": """
UPDATE canonical_controls
SET generation_metadata = jsonb_set(
COALESCE(generation_metadata::jsonb, '{}'::jsonb),
COALESCE(generation_metadata, '{}'::jsonb),
'{triage_status}', '"needs_pattern"'
)
WHERE release_state NOT IN ('deprecated')
@@ -482,7 +482,7 @@ class MigrationPasses:
"legacy_unlinked": """
UPDATE canonical_controls
SET generation_metadata = jsonb_set(
COALESCE(generation_metadata::jsonb, '{}'::jsonb),
COALESCE(generation_metadata, '{}'::jsonb),
'{triage_status}', '"legacy_unlinked"'
)
WHERE release_state NOT IN ('deprecated')
@@ -517,7 +517,7 @@ class MigrationPasses:
)
SELECT
COALESCE(
(generation_metadata::jsonb->>'source_regulation'),
(generation_metadata->>'source_regulation'),
''
) AS regulation_code,
obl.value::text AS obligation_id,
@@ -586,7 +586,7 @@ class MigrationPasses:
UPDATE canonical_controls
SET release_state = 'deprecated',
generation_metadata = jsonb_set(
COALESCE(generation_metadata::jsonb, '{}'::jsonb),
COALESCE(generation_metadata, '{}'::jsonb),
'{deprecated_reason}', '"duplicate_same_obligation_pattern"'
)
WHERE id = CAST(:uuid AS uuid)