diff --git a/backend-compliance/migrations/152_atom_classification.sql b/backend-compliance/migrations/152_atom_classification.sql new file mode 100644 index 00000000..7eeec4ce --- /dev/null +++ b/backend-compliance/migrations/152_atom_classification.sql @@ -0,0 +1,40 @@ +-- Migration 152: Atom-level topic classification (Haiku one-time pass) +-- Pro atomarem Control x Use-Case: relevant? + Sub-Thema + kanonische Pflicht. +-- Atom-grain Nachfolger des master-grain mc_use_case_mappings — die Master- +-- Komposition (gpre2 object-only Clustering) ist als Topic-Einheit unbrauchbar +-- (Mega-Cluster). Die Atome sind kohaerent; diese Tabelle traegt das Ergebnis +-- des einmaligen Haiku-Passes (Praezision + Organisation + Dedup). Strikt add-only. +-- Laufzeit liest NUR diese Tabelle (kein LLM live). [migration-approved] + +SET search_path TO compliance, public; + +DO $$ +BEGIN + IF EXISTS (SELECT 1 FROM information_schema.tables + WHERE table_schema = 'compliance' + AND table_name = 'canonical_controls') THEN + + CREATE TABLE IF NOT EXISTS atom_classification ( + control_uuid UUID NOT NULL + REFERENCES canonical_controls(id) ON DELETE CASCADE, + -- Registry-Key; KEIN SQL-CHECK -> neuer Use Case ohne Migration. + use_case VARCHAR(40) NOT NULL, + relevant BOOLEAN NOT NULL DEFAULT TRUE, + sub_topic VARCHAR(60), + canonical_obligation TEXT, + method VARCHAR(20) NOT NULL DEFAULT 'llm' + CHECK (method IN ('auto', 'manual', 'llm', 'seed')), + model VARCHAR(60), + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + PRIMARY KEY (control_uuid, use_case) + ); + CREATE INDEX IF NOT EXISTS idx_atomcls_use_case + ON atom_classification(use_case); + CREATE INDEX IF NOT EXISTS idx_atomcls_uc_rel + ON atom_classification(use_case, relevant); + CREATE INDEX IF NOT EXISTS idx_atomcls_subtopic + ON atom_classification(use_case, sub_topic); + + END IF; +END $$;