本卡屬 FR-114 資安修正(母卡 CM-2019),是 CM-2059(5B-3)拆出來的後半:卡上⑥「起輪次要求範本已發布」該棒只查證沒動手,首腦第 2 棒裁定補做、另開此卡(落點在另一支套件)。中。
問題是什麼(白話)
#88 後半:起一輪稽核時會去複製一份流程範本當快照,取範本的查詢只過濾「啟用中」、沒過濾「已發布」——一份從沒被檢查過的草稿也能被複製去啟動一輪真實的稽核流程。CM-2059 已讓新增/修改都過驗證,所以現在草稿也是驗過的,但「草稿可以起輪次」這件事本身仍是產品規則漏洞。
首腦核對(CM-2059 runner 2026-09-22 在 DEV 查證,首腦認可):
- DEV 537 筆稽核輪次中 536 筆有綁流程範本,回推來源範本後 536 筆全部來自 published+啟用中的範本,0 筆來自草稿——加這個條件不會擋到任何既有資料。
- 取範本的三條路徑都在 jedi-compliance-audit/jedi_compliance_audit/app/service/audit_round_app_service.py:262 _resolve_flow_template_uid:(a) 呼叫端明指 uid、(b) 沿用前一輪的來源範本、(c) 資源庫預設 module_frames.audit_flow_template_uid。三條都沒有狀態過濾。真正的守門點在這裡,不在 BE 的 workflow_template_snapshot_service(那支接的是 raw xml,看不到狀態)。
- 出貨基線不受影響:scripts/init/ 的 seed 斷言 workflow_templates 必須為空(建資源庫時才產生),內建 4 份流程範本全都是 published。
- 錯誤碼用既有的 GRC_FLOW_TEMPLATE_NOT_PUBLISHED(GRC_400063,jedi_compliance_audit/common/error_code.py:322,目前全 codebase 無人使用),不新增。
工作區
套件側:在 /Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/.claude/worktrees/jedi-wt-fix-security/jedi-compliance-audit(branch fix/security-b1)改,只動這支套件的子目錄、只 git add 該子目錄下的檔。BE 工作區 pyproject.toml 若尚未把 jedi-compliance-audit 改成 path 指到套件工作區,改一下(poetry update jedi-compliance-audit),這個 path 改動不 commit。絕不碰主 checkout。
在哪裡
jedi-compliance-audit/jedi_compliance_audit/app/service/audit_round_app_service.py:262-290 _resolve_flow_template_uid,三條路徑的匯合點,resolve 出 uid 後補「該範本必須已發布」檢查
jedi-compliance-audit/jedi_compliance_audit/app/service/audit_round_app_service.py:247 呼叫點(起輪次)
jedi-compliance-audit/jedi_compliance_audit/app/service/audit_round_app_service.py:638 呼叫點(另一條,自己看是什麼情境,同樣要守)
jedi-compliance-audit/jedi_compliance_audit/common/error_code.py:322 GRC_FLOW_TEMPLATE_NOT_PUBLISHED,直接用
怎麼修
- ① 先查再寫:workflow_templates 的「已發布」是哪個欄位/哪個 enum(去 jedi-flow-engine 的 entity 或 BE scripts/sql/2026-05-12-flow-template-management-schema.sql 看),以及 jedi-compliance-audit 手上有沒有既有的 workflow_template domain service/port 能查範本狀態——有就用,沒有再看 CM-2059 的 BE 側怎麼拿範本、比照接一支 port。不要在 compliance-audit 直接 import flow-engine 的 ORM model。
- ② _resolve_flow_template_uid 回傳 uid 之前(三條路徑匯合處一次守)補:查該 uid 的範本狀態,不是已發布就 raise BadRequestError(GRC_FLOW_TEMPLATE_NOT_PUBLISHED)。查無範本維持既有行為(不要把「找不到」變成「未發布」)。
- ③ 兩個呼叫點(:247、:638)確認都經過②,不要只守一條。
- ④ 新開專案還沒發布任何範本、走到 (c) 資源庫預設而那份預設是草稿 → 會起不了輪次,錯誤訊息就是 GRC_400063「流程範本尚未發布,無法套用至稽核案」,這是預期行為,回寫時寫明。
手測
- DEV:用已發布範本起輪次 → 成功,行為與修前一致。
- DEV:把一份範本改回草稿(或新建一份不發布),用它起輪次 → 被擋,畫面顯示「流程範本尚未發布」。