本卡屬 FR-114 資安修正(母卡 CM-2019),接 CM-2113(全系統唯一的任務歸屬判斷)的範圍外評估,決策者 2026-09-24 裁:前四處同批換、發版前做完。只改 BE,不動套件。
CM-2113 把「這張任務屬於哪個專案」統一成一支判斷(走輪次鏈),但還有四處沒換,仍然去翻指派表。任務還沒指派人時指派表沒有它,於是:完成/退回任務、佐證增刪改、檢測套件的守門查不到專案 → 一律拒絕(誤擋);輪次凍結的判斷查不到 → 放行(該擋沒擋)。FR-050 當初就是因為這支對輪次主流程恆查無,才另開了 known_project_id 旁路繞過它。
① BE app/flow_engine/service/workflow_execution_service.py (1,385 行,超標)
:159-173 _resolve_project_id_from_workflow:流程實例 → 任一 USER 任務 → task_assignees.project_id ← 換
呼叫點::139 assert_project_participant、:157 resolve_project_id_from_workflow(公開入口,job_operator_guard.py:36 用)、:190 _assert_round_not_frozen_for_workflow
② 同檔 :175-196 _assert_round_not_frozen_for_workflow(呼叫①,換了①就跟著對)
③ BE infra/flow_control/repository/flow_control_job_repo_impl.py:327-345 _is_round_frozen_for_job:job.id → TaskAssignee.project_id ← 換(本檔超標,只准改成一行呼叫)
④ 同檔 :986 附近 current_round_status_by_workflow_execution 的第二條 fallback(task_assignees.project_id → 最新輪) ← 換
唯一判斷:infra/readmodel/tasks/job_project_ownership_query.py:JobProjectOwnershipQuery(CM-2113,commit f52a53f1e)
resolve_project_id_for_workflow_execution(workflow_execution_id) / resolve_project_id_for_task_id(task_id) / resolve_project_id_for_job(job_uid)
FR-050 旁路:workflow_execution_service.py:127/139(known_project_id 參數)、:824/852 revert_job、job_operator_guard.py:22-35、stage_rollback_service.py:160
BE /Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/.claude/worktrees/wt-fix-security branch fix/security-b1
🔴 主 checkout 不動;不碰 pyproject/lock。起服務借主 checkout .venv 時要把套件工作區各 jedi-* 目錄加進 PYTHONPATH(CM-2113 踩過),別碰 8000/8001 port。
_resolve_project_id_from_workflow 改成一行委派 JobProjectOwnershipQuery().resolve_project_id_for_workflow_execution(workflow_execution_id)(照 CM-2113 在 repo 的接法;若 app 層不宜直接 import infra,改走既有 domain service 入口——先看 CM-2113 怎麼讓 app 層拿到,照同一條路,不另立)。docstring 拿掉「刻意不走輪次」那段(理由已不成立:第一段 wecm.round_id 涵蓋 per-control 任務),改一兩行說明新來源。_is_round_frozen_for_job 取 project_id 改用 resolve_project_id_for_task_id(job.id),後面「取最新輪 status」照舊;fail-open 語意(查無回 False)不變。docstring 同步。resolve_project_id_for_workflow_execution 取專案再查最新輪;第一條(wecm.round_id)不動。known_project_id:本卡不拿掉,只評估——換完後輪次主流程的任務反查是否已查得到(CM-2113 DEV 驗過輪次主流程任務走第二段查得到),回寫「可以拿掉/不能拿掉+理由」。拿掉屬另一張卡。test/test_fr048_workflow_guard_revival.py、test/test_workflow_execution_service_revert_job_bypass_gate.py(mock 了 _resolve_project_id_from_workflow,應不受影響)、FR-050 stage rollback 相關測試全跑。