CREATE TABLE IF NOT EXISTS directory_scope_rules ( source_connection_id VARCHAR(36) NOT NULL REFERENCES source_connections(id) ON DELETE RESTRICT, directory_path TEXT NOT NULL DEFAULT '', visibility VARCHAR(20) NOT NULL CHECK (visibility IN ('internal', 'external')), updated_by VARCHAR(128) NOT NULL, reason VARCHAR(500) NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), PRIMARY KEY (source_connection_id, directory_path) ); CREATE TABLE IF NOT EXISTS source_item_scope_overrides ( source_item_id VARCHAR(36) NOT NULL REFERENCES source_items(id) ON DELETE RESTRICT, visibility VARCHAR(20) NOT NULL CHECK (visibility IN ('internal', 'external')), updated_by VARCHAR(128) NOT NULL, reason VARCHAR(500) NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), PRIMARY KEY (source_item_id) ); CREATE TABLE IF NOT EXISTS scope_change_events ( id VARCHAR(36) PRIMARY KEY, target_type VARCHAR(16) NOT NULL CHECK (target_type IN ('directory', 'item')), source_connection_id VARCHAR(36) REFERENCES source_connections(id) ON DELETE RESTRICT, directory_path TEXT NOT NULL DEFAULT '', source_item_id VARCHAR(36) REFERENCES source_items(id) ON DELETE RESTRICT, action VARCHAR(16) NOT NULL CHECK (action IN ('set', 'clear')), previous_visibility VARCHAR(20) CHECK (previous_visibility IS NULL OR previous_visibility IN ('internal', 'external')), decided_visibility VARCHAR(20) CHECK (decided_visibility IS NULL OR decided_visibility IN ('internal', 'external')), operator_ref VARCHAR(128) NOT NULL, reason VARCHAR(500) NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CHECK ( (target_type = 'directory' AND source_connection_id IS NOT NULL AND source_item_id IS NULL) OR (target_type = 'item' AND source_connection_id IS NULL AND source_item_id IS NOT NULL) ), CHECK ( (action = 'set' AND decided_visibility IS NOT NULL) OR (action = 'clear' AND decided_visibility IS NULL) ) ); CREATE INDEX IF NOT EXISTS idx_scope_change_events_target ON scope_change_events (target_type, source_connection_id, source_item_id, created_at DESC);