本卡屬 FR-091(母卡 CM-1690)第三批。中量:五張表、沒有 api/ 目錄(純 service 插件,BPMN 執行引擎)、8 個 entity 檔全非 dataclass。主專案 venv 裡這支是 Nexus wheel,主專案側驗證必帶 PYTHONPATH。主專案接線在
api/flow_control/__init__.py(與 compliance-audit 共用同一檔,不在 CM-1689 的 11 支內)——本卡不動主專案,主專案側收進 core/plugins/ 由 compliance-audit 那張卡(CM-17xx)一併做,因為兩支的接線在同一個檔裡拆兩張卡會撞。
jedi-flow-engine(流程引擎:BPMN 範本、流程執行、任務執行、元素變數)plugin.py 261 行 5 dataclass;沒有 api/ 目錄(route 都在主專案 api/flow_engine/),所以沒有 ctx();8 個 entity 檔全是手寫 __init__;logger 只有一處且掛 jedi_flow_engine.bpmn(不在主專案 dictConfig 的樹下,log 落不到 app.log);施工日誌 7 處(少);沒有整合測試。整成 jedi-asset 那個樣子,api/ 因為沒有 route 只建 guards.py 放 runtime()(給日後 route 或主專案取用)。
首腦核對(2026-09-13):plugin.py 261 行 5 dataclass(ISettingsReader/INotifier 是 Protocol 型 port 也在 plugin.py 裡,要搬去 domain/ports.py);api/ 無;ctx() 0;entity 檔 8(0 dataclass);表 workflow_templates/workflow_templates_trans/workflow_executions/job_executions/element_variables;migration 0(表由主專案建);tests 207 支(另有套件內 jedi_flow_engine/test/ 目錄,看是什麼、該不該在正式碼裡);harness 有 compose、無 --smoke;施工日誌 7 處;不吐 created_user_name;tests/...:118 _PKG_ROOT = Path(plugin.__file__).parent(拆檔後指錯,一併改)。主專案 45 檔 import(最多的一支,flow_control/associations/oscal 大量直接用它的 domain service);venv 是 wheel。
套件:/Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/jedi-flow-engine/
範例:jedi-asset/;純 service 插件的 guards.py 參考 jedi-notification(CM-1692 做的,無 route 只留 runtime())
SOP:extraction-sop.md §4.3/§3.4/§8
主專案 import 面:grep -rn "from jedi_flow_engine\|import jedi_flow_engine" compliance-manager-be --include='*.py' --exclude-dir=.venv(45 檔——拆檔後必須 AST 掃全部逐一實跑,這支 import 面最大)
主專案接線(本卡不動):api/flow_control/__init__.py 的 create_module() 同時 register flow-engine 與 compliance-audit
plugin.py → plugin/ 五檔(無 migration 不建 migrations.py);兩個 Protocol port(ISettingsReader/INotifier)搬去 domain/ports.py,plugin/contract.py 只 import 它們;新建 api/__init__.py+api/guards.py(只有 runtime())。對外 import 路徑一字不改:from jedi_flow_engine.plugin import FlowEngineAdapters, FlowEngineConfig, register, ...——主專案 45 檔的 import 面用 AST 掃出來逐一實跑。PKG_ROOT 改 Path(jedi_flow_engine.__file__).resolve().parent+突變。jedi_flow_engine.bpmn → common.jedi_flow_engine(這是真 bug:現在 BPMN 解析的 log 落不到 app.log);domain service 屬性名統一 self._repo。inspect.signature 逐欄對照預設值——流程狀態的預設值錯了會讓執行中的流程判定變。jedi_flow_engine/test/ 目錄在正式碼裡,看內容決定歸 tests/ 或刪,回寫說明。--smoke(起 test client 不夠——這支沒 route,smoke 改成「載一支最小 BPMN 範本、建一次 workflow execution、推進一步、斷言 job_executions 多一列」,需要 compose 的 DB);pyproject.toml 加 addopts = "--import-mode=importlib";README 補新結構。tests/integration/test_service_behaviour.py(目錄新建,表用 Base.metadata.create_all):真 postgres,範本建立→執行建立→推進一步→查元素變數一輪。test_plugin_contract.py 凍結集合同綠。.venv/bin/python -c "import jedi_flow_engine;print(jedi_flow_engine.__file__)"——首腦已查是 wheel,主專案側每一條驗證都要 PYTHONPATH=/Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/jedi-flow-engine,帶與不帶各印一次貼進回寫。不改 pin。pytest tests/ --import-mode=importlib(需 docker);harness --smoke;主專案 PYTHONPATH=... pytest test/test_module_boundaries.py;主專案 45 檔 import 用 AST 掃逐一實跑,貼出「N 條全通」的數字。