建議 model:Sonnet 5,effort:low——規則現成、純開開關+補一條 OR 分支,難點只在「造一個跨租戶樣本」。本卡屬 FR-094(母卡見兄弟卡段),.2 開隔離的第 1 棒(整案第 3 棒)。無前置棒,可立即派。吸收 CM-1453。

問題是什麼(白話)

兩張表的隔離規則早就寫好,只是開關被關了:客戶雲端硬碟串接設定(tenant_drive_integrations)與專案清單(projects)。projects 是 2026-06-25 做 POC 對齊 STG 時「以 STG 為主」順手關的(commit e7709295),不是產品決策,而且它的 4 條規則沒有平台管理員分支——直接打開,平台管理員(blsadmin)會看不到不屬於自己路徑的專案。所以要先補分支再開。

首腦核對(2026-09-13 DEV localhost 實查):

在哪裡

~/Projects/Billows/Audit-Manager/compliance-manager-be/scripts/sql/2026-09-XX-fr094-cm<本卡號>-enable-rls-projects-drive-integrations.sql   (新)本棒 migration
~/Projects/Billows/Audit-Manager/compliance-manager-be/scripts/sql/manifest.tsv                              加一列 active / *
~/Projects/Billows/Audit-Manager/compliance-manager-be/scripts/init/02-schema.sql:24061-24085               projects 四條 policy 現況(重產後應多 is_super_admin 分支+ENABLE)
~/Projects/Billows/Audit-Manager/compliance-manager-be/scripts/sql/2026-06-25-align-poc-to-stg-view-eventtrigger-projects-rls.sql:124   當初關掉的那行(不改歷史檔)
~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/system-design/database/RLS_DESIGN.md              若有列 projects 為停用,改成現況

怎麼修

-- Date: 2026-09-XX
-- 1. projects 四條 policy 補 super_admin 分支 (2026-09-XX)
ALTER POLICY projects_select ON compliance.projects USING (COALESCE(current_setting('app.is_super_admin', true),'f')='t' OR public.app_tenant_allowed_for_session(tenant_id));
ALTER POLICY projects_update ON compliance.projects USING (...同上...) WITH CHECK (...同上...);
ALTER POLICY projects_delete ON compliance.projects USING (...同上...);
-- insert 維持 WITH CHECK (app_tenant_allowed_for_session(tenant_id)),比照 tenant_drive_integrations 亦可放寬為 true——先查同族表慣例(surveys_insert 是 tenant AND org)再定
-- 2. 開開關 (2026-09-XX)
ALTER TABLE compliance.projects ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.tenant_drive_integrations ENABLE ROW LEVEL SECURITY;  -- schema 以實查為準
INSERT INTO public.schema_migrations(filename, note) VALUES ('<本檔名>', 'FR-094 .2a ...') ON CONFLICT (filename) DO NOTHING;

先查再寫ALTER POLICY 語法對 USING/WITH CHECK 要分開寫;若 DEV 與基線的 policy 名不同(\d+ compliance.projects 看),用 DROP POLICY IF EXISTSCREATE POLICY 重建更穩。

要寫測試

手測