本卡屬 FR-091(母卡 CM-1690)第三批,是三批裡最重的一張:九張表、5 條 route、22 個 entity 檔(19 個非 dataclass)、4 支 app service 直接 import jedi_iam(套件間反向依賴,要改走 D8 identity port),且主專案接線在 api/flow_control/__init__.py 與 flow-engine 共用一檔、不在 CM-1689 的 11 支內——本卡 G 組把兩支一起收進 core/plugins/。與 flow-engine 卡(CM-17xx)不可並行派(flow-engine 卡改套件內部、本卡 G 組改主專案接線,主專案那檔只有本卡動,但兩張的驗收都要起 BE,錯開)。

問題是什麼(白話)

jedi-compliance-audit(稽核輪次、POA&M、審閱、AP/AR 解析)套件側:plugin.py 236 行 6 dataclass;api/ 有 __init__.py(ctx 13 處)與 guard.py(license/project role/identity 三道守門)分兩檔;22 個 entity 只有 3 個 dataclass;logger 一半掛 common.jedi_compliance_audit 一半 __name__;48 處施工日誌。最要緊的audit_round_app_servicepoam_servicepoam_app_servicereview_service 四支直接 from jedi_iam.domain... import UserDomainService / UserQueryEntity 查暱稱——套件不准認識別的套件,這是 FR-069 D16 的違規,也是 STATE §2「compliance-audit 要開 identity port」的由來。主專案側:接線在 api/flow_control/__init__.pycreate_module(),同時 register 本套件與 flow-engine、還混著 task-platform 的 task type 宣告,翻三個地方才看得懂這支接了什麼。

首腦核對(2026-09-13):plugin.py 236 行 6 dataclass;api/init.py 86 行(ctx 13)+guard.py(7 個函式);route 5;entity 檔 22(3 dataclass);表 project_audit_rounds/poams/review_marks/round_stage_transitions/round_rollback_supersessions/ap_docx_parse_jobs/ar_xlsx_parse_jobs/ssp_reference_documents/ssp_reference_document_mappings;migration 0(表由主專案建);tests 只 12 支(error code/URL/plugin 三支契約測試,沒有行為測試);harness 有 dev_app.py 無 compose 無 --smoke;施工日誌 48 處;jedi_iam 直接 import 6 處分布 4 檔;有吐 created_user_name(AP DTO、audit_round_app_service:171 手寫批次補名);tests/test_plugin_contract.py 無 PKG_ROOT(用別的寫法,runner 看它掃的範圍對不對)。主專案 49 檔 import(僅次於 flow-engine);venv 指工作樹。

在哪裡

套件:/Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/jedi-compliance-audit/
  app/service/audit_round_app_service.py:25,171-185(UserQueryEntity+手寫補名)
  app/service/poam_service.py:9-10、poam_app_service.py:219、review_service.py:3(UserDomainService)
  api/guard.py(三道守門要併進 guards.py 或留為 guards.py 的一部分,runner 判斷)
identity port 範例:jedi-iam CM-1686 commit 1668abb(plugin 開 identity 欄位+app/service/_audit_names.py fill_user_names);jedi-asset plugin/contract.py:83-84+app/service/_audit_names.py;D8 標準件 jedi-common/jedi_common/identity/context.py IdentityContext(resolve_user_names / resolve_user_ids)
SOP:extraction-sop.md §3.2(斷線四種手法)/§4.3/§5.1/§5.2;說明:plugin-anatomy.md「port 與 adapter」「主專案怎麼接」
主專案(本卡 G 組允許動的範圍):
  api/flow_control/__init__.py           → create_module() 裡 register 本套件與 flow-engine 的兩段搬去 core/plugins/,主專案自己的 flow_control route 留在原檔(那些是主專案的 route 不是套件的)
  core/plugins/compliance_audit.py       → 新建,三段:① identity 等 adapter ② build_adapters ③ mount
  core/plugins/flow_engine.py            → 新建,同形;ISettingsReader/INotifier 的主專案實作搬進 ① 段
  core/plugins/__init__.py               → PLUGINS 加兩列(位置:沿用原 blueprint 載入順序附近)
  di_containers/(compliance_audit/flow_engine 相關)→ 只改 import 路徑,瘦身不做
  test/test_module_boundaries.py         → 守衛清單更新
現成範本:core/plugins/evidence_classification.py(CM-1700,同樣從 api/ 舊接法搬來)

怎麼修(套件側 A~F 各一 commit;主專案側 G 一個 commit;兩 repo 分開)

要寫測試

手測(驗證等級:重——稽核主流程)