本卡屬 FR-089(母卡 CM-1688),修 arc review CM-1738 的 I-3,Important。建議 model:Sonnet 5,effort:medium——搬法有 oscal-v2 現成先例照抄,難的是新守衛的白名單要一條條寫得出理由。
主專案守衛 test_package_imports_only_lower_layers 只比「套件之間」的層級,if target == source: continue 讓套件「自己 import 自己」完全不受檢查。CM-1725 把 jedi-iam 頂層 ports/ 併進 domain/ports/ 時,auth_provider.py:5 與 auth_factory.py:7-8 那幾行 import jedi_iam.infra 原封搬過去——搬家前那個檔不在 domain 層所以合規,搬家後就是 domain 反向依賴 infra。同一批作業的 jedi-oscal-v2 做對了(domain/ports.py:8-14 寫明 factory 會 import 具體 adapter,故只搬抽象 port 進 domain)。
jedi-iam/jedi_iam/domain/ports/auth_provider/auth_factory.py:7-8 import infra.adapter.authenticate_adapter.{ldap,password}
jedi-iam/jedi_iam/domain/ports/auth_provider/auth_provider.py:5 import infra.dto.user_info_dto.UserInfoDTO
jedi-iam/jedi_iam/infra/dto/user_info_dto.py:6 UserInfoDTO(5 個純值欄位、零 infra 相依,放 infra/dto 是分類錯誤)
jedi-iam/jedi_iam/infra/adapter/ 既有 adapter 目錄(authenticate_adapter/ 在這)
jedi-oscal-v2/jedi_oscal_v2/domain/ports.py:8-14 做對的先例
BE test/test_module_boundaries.py:1036 test_package_imports_only_lower_layers;:987 _LAYER_EXCEPTIONS 白名單形態
主專案 caller:app/user_auth_provider/service/ldap_service.py:18 import jedi_iam.ports.auth_provider.auth_factory(走頂層相容殼,I-5 那批)
auth_factory.py 整支搬到 jedi_iam/infra/adapter/auth_factory.py(它 import 兩個具體 adapter,本來就是 infra 的東西)。domain/ports/auth_provider/ 留 auth_provider.py(抽象)與 repositories.py。UserInfoDTO 搬到 jedi_iam/domain/dto/user_info_dto.py(或 domain 既有放 DTO 的位置,先 ls domain/ 看慣例);infra/dto/user_info_dto.py 留一行 re-export;ldap_adapter.py:14、auth_provider.py:5 改指 domain。jedi_iam/ports/auth_provider/auth_factory.py(若存在)改指新位置,主專案 ldap_service.py:18 這次不動(歸 I-5 那張卡一起收),但要確認殼指對。test/test_module_boundaries.py test_package_imports_only_lower_layers 旁加一條 test_package_internal_layers_do_not_import_upward:對每支 jedi 套件 AST 掃 domain/ 下所有檔的 import,目標若是同套件的 app./infra./api./plugin. 就是違規。既有違規先跑一次全列出來,每條進 _INTRA_LAYER_EXCEPTIONS 白名單時要寫得出「為什麼合法/哪張卡會收」,寫不出理由的就是要修的。iam 這兩處修完不該在白名單。domain/ports/auth_provider/auth_provider.py 暫時加回 from jedi_iam.infra.dto.user_info_dto import UserInfoDTO → 新守衛紅。還原。tests/ 全量在自己 commit 的 worktree 跑(基線是 506 passed,CM-1725 驗收數字),tail -1 貼上。pytest test/test_module_boundaries.py -q,新守衛綠且白名單每條有理由。POST /api/1.0/login blsadmin 登入成功(password adapter 路徑);若 DEV 有 LDAP 設定就打一次 LDAP 登入,沒有則回寫「LDAP 路徑未實測,改動僅搬檔」。git mv 保留歷史。註解只留為什麼與陷阱。改完重啟 BE。git add(新檔要加,commit -- 路徑 不納未追蹤檔)、commit -- <路徑>;append 白話(搬了什麼、新守衛白名單幾條各理由、突變、兩 repo hash);狀態改「修正待驗證」。push 等令。feature/FR-075 不切。不派 subagent。