本卡屬 FR-088(母卡見 FR-088 母案),第 5 棒 H4:主專案 1,559 行的流程執行 service、DI 接線、向 AI 儀表板申報的查詢 API、控制項對應表(BE repo)。只掃不修。
流程「跑起來」的所有事——啟動一個稽核流程、建立每個任務、任務完成後決定下一個是誰、寄通知、把任務跟控制項對起來——全在主專案這支 1,559 行的 service 裡,套件只提供零件。這一棒掃這支 service 與它的接線共 21 檔:守門有沒有每條路都包住、向 AI 儀表板申報的查詢有沒有漏租戶過濾、通知內容會不會外洩。只找問題、不修問題。
H2 掃的是入口,這一棒是入口後面的實作:守門函式 assert_project_participant 與反查鏈都住在這裡;而且這支 service 把三支查詢 API 申報給了 AI 儀表板(FR-083 D2 證實那條路 27 支零守門),其中兩支是 **kwargs 形狀(FR-079 F13 證實過這種形狀會讓租戶過濾被默默丟掉)。
行號已開檔核對,是思考起點不是檢查清單:
di_containers/dashboard_apis/flow_engine.py 申報 get_main_workflow_executions 等三支(RET_WORKFLOW_EXECUTION_LIST)。對應 app/flow_engine/service/workflow_execution_service.py:1124 get_ext_main_workflow_executions_and_pager(self, page, sorts, **kwargs) 與 :1140 get_main_workflow_executions_and_pager(self, page, sorts, **kwargs)、:1157 get_main_workflow_executions(query_entity=None)。要驗:這三支被儀表板呼叫時有沒有租戶/專案過濾?**kwargs 裡的過濾條件是不是「申報單沒宣告就被丟掉」(FR-079 F13 同款)?workflow_executions 隔離關閉、缺 SELECT 規則(FR-087 第 4 項),所以資料庫層零兜底。:122-135 assert_project_participant(workflow_execution_id, known_project_id=None)——known_project_id 由 caller 傳入就跳過反查直接用;:137-153 _resolve_project_id_from_workflow() 對輪次主流程恆回 None。要驗:所有 known_project_id 的來源(revert_job :806 起、stage_rollback_service)是否都是伺服器端解析、沒有任何一條是請求可控。:155-176 _assert_round_not_frozen_for_workflow() 在「沒注入 round service/解析不到 project/無輪次」三種情況全部放行(註解自陳「主 gate 在顯示層」);revert_job 有 bypass_round_frozen_gate 參數(:806-839)。要驗:誰能把 bypass_round_frozen_gate=True 傳進來;「顯示層才是主 gate」等於 API 直打可繞過。:429-466 _patch_template_xml_job_uids()/_inject_job_execution_uid() 用 xmltodict 解析後回寫範本(P1 的 :511-568 那幾支)。要驗:改寫的是凍結副本還是母版?由誰觸發?params: dict(:179 start_workflow_execution)怎麼進到流程變數。:1265-1465 notify_users_batch_assigned/notify_user_todo_job/notify_control_reviewers_on_task_complete——信件或站內通知裡帶了哪些欄位(任務名、專案名、留言原文?),收件人怎麼算(有沒有可能把通知寄給別租戶的人)。:1466-1495 process_survey_property() 從 BPMN 任務屬性取問卷 uid 建關聯——屬性來自範本 XML(H3 已證實存入時不驗),要驗指到別租戶問卷 uid 會怎樣。:1208 add_workflow_execution(**kwargs)、:1217 update_workflow_execution(uid, user, **kwargs)、:1227 delete_workflow_execution(uid) 沒有守門——列出所有呼叫者(BE 內 grep),確認沒有任何 route 直達。domain/flow_engine/*control_mapping* 與 infra/flow_engine/repository/workflow_execution_control_mapping_repo_impl.py——查詢有無範圍條件;ext_workflow_executions 表隔離狀態(本棒自己用 DEV 唯讀查一次)。**kwargs 導致租戶/部門過濾被丟掉(F13 同款成因);flow_engine.* 三支在那 27 支之內,D2 沒有逐支進去看。workflow_executions 缺 SELECT 規則且關;第 5 項 job_executions 零規則且關、03:10 排程依賴 CM-1559 的 fail-open。common/authz/workflow.py 但不重報它的三個放行分支。