本卡屬 FR-090(母卡 CM-1682)第 6 棒 CM-1696 拆出的第 3 子卡,純文件。前置:第 6-1、6-2 棒都已 commit,文件要照實際落地的寫法寫,不憑卡上想像。
接一支套件的教學文件現在教人「如果主專案別的模組要用套件的 service,就在 di_containers/ 自己再建一份」。第 6-1/6-2 棒之後這個教法是錯的——正確做法是從套件開的取用口 host_services(app) 拿。這一棒把兩份教學改過來,讓下一個接套件的人不會照舊教法走回頭路。
首腦核對(2026-09-13):
docs/features/FR-069-2608-jedi-module-extraction/extraction-sop.md:467-468「第四步只有在『主專案其他模組要直接用套件的 domain service』時才做:di_containers/ 加一顆 provider」——要改。docs/features/FR-089-2609-package-shape-unification/plugin-anatomy.md:502-640 新手教程::514 mermaid 節點「④ 看情況 di_containers/」、:602-632 整節「④(看情況)di_containers/:只有別的模組要用才加」含 AssetContainer 範例碼——要改;:642 起「DI 與 runtime 的關係」節也描述同一件事,要對齊。extraction-sop.md:388-398 階段 ⑤ 盤 DI 註冊點的判準「grep <mod>_container. 看有幾個別的 container 用它」——B 案後這個 grep 應為零,判準要改成「grep host_services( 看誰在用」。docs/features/FR-069-2608-jedi-module-extraction/extraction-sop.md §5 第四步(:467-468)、階段 ⑤ 判準(:388-398)、變更紀錄表加一行
docs/features/FR-089-2609-package-shape-unification/plugin-anatomy.md 新手教程 ④(:502-640)、DI 與 runtime 節(:642-)
docs/features/FR-090-2609-host-side-residue-cleanup/README.md status 行「第 6 棒 CM-1696」改 Done、總進度表
docs/claude/architecture-details.md 若第 6-2 棒回寫標記有段落要改
jedi_<pkg>.plugin.host_services(app) 拿;用第 6-2 棒落地的 core/plugins/_host.py helper(名稱以實際 commit 為準)包成 lazy provider 給 consumer container;不得在 di_containers/ 建套件的 repo/service,守衛 test_di_containers_do_not_build_package_services 與 test_di_containers_do_not_reach_into_package_containers 會擋」。附一段真實程式碼(從第 6-2 棒 commit 抄,例如 oscal container 的 file_upload_service 那行)。build_adapters() 傳給套件、套件 build_services() 自組時帶進 service,寫清楚新的注入點在哪(照第 6-2 棒實際碼)。「DI 與 runtime 的關係」節同步。host_services(」。doc-site-build skill:FR-069、FR-089、FR-090 三個資料夾各跑一次),HTML 一併 commit。不寫。驗收=grep -n "di_containers/ 加一顆 provider\|只有別的模組要用才加\|AssetContainer(containers.DeclarativeContainer)" docs/features/FR-069*/extraction-sop.md docs/features/FR-089*/plugin-anatomy.md 零命中;grep -n "host_services" 同兩檔 各至少一處。