本卡屬 FR-114 資安修正(母卡 CM-2019),掃描線分析 CM-2108 第 3 件,決策者 09-24 裁同批到位。只重建一個資料庫檢視表,不改任何資料表、不回填資料。🔴 主線 migration(phase=active/envs=*)→ 出貨基線待重產。只改 BE。
「我的任務」清單和儀表板待辦數讀的是檢視表 public.vw_user_job_queue。它從指派表起頭列出「指派給我的任務」——這是對的;但「屬於哪個專案」那欄也直接拿指派表的專案欄,和其他地方的判斷不同源。決策者要求全系統只有一套任務歸屬判斷,所以這一欄改成跟 CM-2113 同一條輪次鏈。
首腦 DEV 唯讀實查(09-24 11:00):指派表 12,573 列,其中屬於未軟刪專案的 77 列,輪次鏈全部查得到且 0 列不一致——改了之後現行畫面內容不會變,這張卡是讓來源統一、不是修畫面錯。
BE scripts/sql/view/vw_user_job_queue.sql view 的 canonical 定義檔
:21-24 陷阱註解+WITH (security_invoker = true)——CREATE OR REPLACE VIEW 不保留 reloptions,漏寫就靜默以 owner(BYPASSRLS)身分查=繞過全部隔離
:32 a.project_id, ← 專案欄來源
:75-83 FROM task_assignees a … LEFT JOIN job_executions b … LEFT JOIN projects d ON a.project_id = d.id …
LEFT JOIN public.workflow_execution_control_mapping m ON m.workflow_execution_id = b.workflow_execution_id
LEFT JOIN compliance.project_extensions pe ON pe.project_id = a.project_id …
:99-100 WHERE d.status NOT IN ('archived')
最後一次改:scripts/sql/2026-09-14-fr094-cm1771-rls-workflow-executions-view-security-invoker.sql(:81 ALTER VIEW … SET (security_invoker = true))
讀者:infra/readmodel/tasks/my_grc_jobs_query.py:141-142(以 project_uid 過濾)
出貨基線:scripts/init/02-schema.sql 內有這個 view 的定義
⚠️ 掃描首腦原話說「它已經 LEFT JOIN 了 wecm 與 project_audit_rounds r」——首腦實查只 JOIN 了 wecm(m),沒有 JOIN project_audit_rounds,要自己補。
BE /Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/.claude/worktrees/wt-fix-security branch fix/security-b1
🔴 主 checkout 不動。與 CM-2113 同一工作區但不同檔,不衝突;不碰 pyproject/lock。
m.round_id → compliance.project_audit_rounds r_b,查無再 COALESCE(b.main_workflow_execution_id, b.workflow_execution_id) → workflow_executions.uid → project_audit_rounds r_c;專案欄 COALESCE(r_b.project_id, r_c.project_id) AS project_id。a.project_id 的地方(projects d 的 JOIN、project_extensions pe 的 JOIN、SELECT 欄)都改用新的專案 id;FROM task_assignees a 起頭不動(「指派給我的」本來就該從指派表起頭)。注意 m 可能一個流程實例對多列(多個控制項)——r_b 要確認不會因此把一個指派列展開成多列(對照改前改後 view 總列數必須相同)。scripts/sql/view/vw_user_job_queue.sql,保留 WITH (security_invoker = true) 與 :21-22 那段陷阱註解。scripts/sql/2026-09-24-fr114-vw-user-job-queue-project-from-round.sql:照 sql-migration skill 規範(檔頭 -- Date:、每語句日期註解、psql --single-transaction -v ON_ERROR_STOP=1 可跑、結尾 INSERT schema_migrations、manifest.tsv 登記 phase=active/envs=*)。重建方式照 2026-09-14 那支(先看它怎麼 DROP/CREATE 或 CREATE OR REPLACE、有沒有相依物件),建完再 ALTER VIEW … SET (security_invoker = true) 雙保險。cmmgr)。STG/POC 不碰。project_id IS NULL 列數、以 5 個不同 user 身分(SET app.user_id 等 RLS 變數,照 session_scope 注入的方式;或用 cm_app 連)各查一次列數(前後相同)。SELECT reloptions FROM pg_class WHERE relname='vw_user_job_queue' 必須含 security_invoker=true。