本卡屬 FR-091(母卡 CM-1690)第二批。中量偏重:套件側整理之外,這支的主專案接線不在 CM-1689 收的 11 支內(它走
config/app_modules.py的 blueprint 載入迴圈,adapter 在infra/evidence_classification/adapters.py),本卡順手照 CM-1689 定的形狀收進core/plugins/evidence_classification.py。STATE §4 已預告「FR-091 對應批次時順手收進 core/plugins/」。
jedi-evidence-classification(證據 AI 分類)套件側 plugin.py 304 行 6 dataclass,api/init.py 104 行含 ctx() 23 處,logger 三種名,2 個 entity 是 dataclass、2 個不是(半套)。主專案側則是「舊接法」:api/evidence_classification/__init__.py 組 adapters、infra/evidence_classification/adapters.py 放四張 port 實作、di_containers/evidence_classification/ 再 import 那些 adapter——接手的人要翻三個地方。兩邊一起整成標準形狀。
首腦核對(2026-09-12):套件側 plugin.py 304 行 6 dataclass;api/init.py 104 行;route 10;entity 檔 4(2 dataclass);表 evidence_classification_ground_truth、evidence_classification_runs;migration 2 支;tests 36 支(無 integration);harness 有 compose、無 --smoke;施工日誌只 4 處(少);ctx() 23 處;logger common.jedi_evidence_classification/jedi_evidence_classification/name;不吐 created_user_name → 不開 identity port。主專案側:api/evidence_classification/__init__.py(create_module)、infra/evidence_classification/adapters.py(四張 port adapter,自行延遲解析 DI)、di_containers/evidence_classification/evidence_classification_containers.py(import 那四張 adapter)、config/app_modules.py:93 註冊;主專案 8 檔 import 套件;venv 指工作樹。
套件:/Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/jedi-evidence-classification/
範例:jedi-asset/;SOP:extraction-sop.md §4.3/§3.4/§5.1/§5.2;說明:plugin-anatomy.md「主專案怎麼接」「新手教程」
主專案(本卡允許動的範圍):
api/evidence_classification/__init__.py → 內容併進 core/plugins/evidence_classification.py 後刪
infra/evidence_classification/adapters.py → 四張 adapter 併進同檔 ① 段後刪(除非別的層也 import,見 SOP §5.1 第 1 條例外)
di_containers/evidence_classification/… → 改 import 新位置;DI 瘦身不在本卡(CM-1696)
config/app_modules.py:93 → 拿掉 "evidence_classification"(改走 PLUGINS)
core/plugins/__init__.py → PLUGINS 加一列(位置:沿用原 blueprint 載入順序附近,不要重排其他)
test/test_module_boundaries.py → 白名單/收斂目錄清單對應更新
test/test_fr048_evidence_classification_guards.py → 引用路徑跟著改
scripts/deliverables/plugin_metrics.py:56 → 路徑跟著改
現成範本:core/plugins/bulletin.py、core/plugins/survey.py(都是 CM-1689 產物)
plugin.py → plugin/ 五檔(含 migrations.py);api/__init__.py(含 mount_routes() URL 對照表)→ guards.py+routing.py。對外 import 路徑一字不改。common.jedi_evidence_classification;命名統一。@dataclass,inspect.signature 逐欄對照。--smoke;pyproject.toml 加 addopts = "--import-mode=importlib";README 補新結構與接線路徑。core/plugins/evidence_classification.py 固定三段——① 四張 adapter class(從 infra/ 搬來)、② build_adapters(container)+需要的 build_config()、③ mount(app, container, host) 呼叫套件 register()+檔尾 PLUGIN;PLUGINS 加一列;app_modules.py 拿掉註冊;刪 api/evidence_classification/ 與 infra/evidence_classification/adapters.py;改 di_containers/兩支 test/plugin_metrics 的引用;守衛清單更新。adapters 內若拿 DI 物件必須延遲解析(SOP §5 紅線,原 adapter 已是 lazy,搬過去要保住)。先用 AST 掃全部 import找齊誰在用舊路徑,不用 grep 符號名。tests/integration/test_service_behaviour.py(目錄新建):真 postgres 套 001/002,ground truth 寫入讀取、run 建立與查詢各一輪,斷言 grant 生效。AI 呼叫用假 classifier 頂替,不打真模型。test_every_plugin_file_has_three_parts、test_plugin_names_match_file_names 吃到新檔自然覆蓋;test_converged_plugin_adapters_do_not_return_to_infra 把 infra/evidence_classification/ 加進已收斂清單(突變:把 adapter 放回去 → 紅)。test_plugin_contract.py 凍結集合同綠;主專案 test_fr048_evidence_classification_guards.py 同綠。