本卡屬 FR-090(母卡 CM-1682)第 6 棒 CM-1696 拆出的第 1 子卡,套件側。決策者 2026-09-13 裁 B 案。動 jedi 5 支(asset 定形+4 支照抄),併進 CM-1559 那個套件版(1.1.0),本卡不發版。第 2 子卡(主專案側)等本卡 commit 後才派。

這一棒在做什麼(白話)

主專案其他模組要用某支套件的 service(例如 oscal 匯入要用檔案上傳 service),現在的寫法是直接伸手進套件的 DI container(依賴注入容器,就是「誰負責建哪個 service」的組裝表)拿 Provide[upload_file_container.file_upload_service]。這等於主專案知道套件內部怎麼組裝——套件改一個 service 簽名,主專案 48 處要跟著改。

B 案:每支套件在自己的 plugin/ 開一個正式的「宿主取用口」——一支 host_services(app) 函式,回傳套件 register() 時已組好的 service provider 名冊(<Pkg>Services dataclass,欄位是「呼叫就給一個」的 provider)。主專案要用套件的東西,一律從這個口拿,不碰套件的 domain/infra 層。之後套件內部怎麼重構,主專案不受影響。

首腦核對(2026-09-13,jedi HEAD ac9c152 / BE HEAD 3bf476a9):

在哪裡

~/Projects/Jedicogy/module/jedi-python-package/  branch feature/FR-075
  jedi-asset/jedi_asset/plugin/{__init__.py,contract.py,assembly.py}   定形:host_services() + 測試
  jedi-file-upload/jedi_file_upload/plugin/{contract.py,assembly.py,__init__.py}   照抄+補 upload_file_domain_service
  jedi-system-core/jedi_system_core/plugin/...   照抄+補 tenant_storage_config_seeder/storage_config_restore_app_service/security_policy_app_service
  jedi-survey/jedi_survey/plugin/...             照抄+補 survey_snapshot_domain_service(已有 survey_domain_service/survey_question_domain_service/task_survey_service)
  jedi-notification/jedi_notification/plugin/... 照抄+補 notification_service

主專案 48 處引用(第 2 子卡改,本卡只需知道要開哪些欄位):
  upload_file 23:file_upload_service 14/upload_file_domain_service 8/containers.py:178 override 1
    consumer:oscal×5 flow_control×2 detection_tools×8 module_frame×2 feedback flow_engine cloud_integration
  system_core 14:system_config_service 9/tenant_storage_config_seeder 2/storage_config_restore_app_service 2/security_policy_app_service 1
    consumer:notify_config auth setup feedback×2 task_survey flow_engine + api/system_config 兩支 route 六處 Provide[]
  survey 4:survey_domain_service 2/survey_question_domain_service 1/survey_snapshot_domain_service 1(task_survey_container 那 7 處是主專案自己的 container,不算)
  notification 1:notification_service(feedback)

怎麼修

需決策者裁的已裁:B 案。本卡不需再問。若做到一半發現某支 build_services() 自組某 provider 需要主專案的 port(例如 storage_config_restore_app_service 要讀主專案 storage 設定),那個 provider 維持由宿主 services= 傳入,取用口照樣回它——回寫本卡標記哪幾個是「宿主必填」,第 2 子卡據此保留對應 container provider。

要寫測試