本卡屬 FR-090(母卡 CM-1682)第 3 棒。動 app/auth/service/ 六檔、app/user_auth_provider/service/ 一檔、jedi-iam 套件。重量驗證。含套件異動,決策者 2026-09-12 已裁「開 identity port」。第 2 棒(CM-1684)已把兩個 port 實作搬到 infra/iam/,本卡接續。

問題是什麼(白話)

jedi-iam 抽出來的時候,主專案在 app/auth/ 留了六個檔做三種事:兩支「轉發殼」(套件的服務外面再包一層,只為了塞產品知識)、兩支「薄殼」(只做接線,跟 core/iam_wiring.py 職責重疊)、兩支 wrapper(把帳號換成暱稱顯示,順便做 root admin 保護與 license 守門)。jedi-asset 的做法是這些全部不存在:port 實作放 infra/、接線放 core/、補暱稱套件自己做。本卡把 iam 收成同一種形狀。

首腦核對(2026-09-12,每檔讀過、每個 caller grep 過):

在哪裡

主專案:/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/
  app/auth/service/tenant_provisioning_service.py     殼刪;三張 port 搬 infra/iam/provisioning_ports.py
  app/auth/service/user_batch_import_app_service.py   殼刪;兩張 port 搬 infra/iam/account_message.py
  app/auth/service/login_service.py                   併進 core/iam_wiring.py
  app/user_auth_provider/service/user_auth_provider_service.py   併進 core/iam_wiring.py
  app/auth/service/user_app_service.py                拿掉補暱稱;守門三支留,改名 root_admin_guard.py 搬 infra/iam/?(見怎麼修 ⑤)
  app/auth/service/role_app_service.py                拿掉補暱稱;license 守門留(同上)
  di_containers/auth/auth_containers.py               改 provider
  di_containers/login/login_containers.py             改 provider
  core/iam_wiring.py                                  接收薄殼邏輯、填 identity
  common/util/audit_nickname.py                       第 4 棒動,本卡不碰

套件:/Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/jedi-iam/
  jedi_iam/plugin.py:208                              IdentityAdapters 加 identity 欄位
  jedi_iam/app/service/user_service.py:41             __init__ 加 identity=None;四支 get_* 回傳前補暱稱
  jedi_iam/app/service/role_service.py:17             同上,三支 get_*
  jedi_iam/app/service/_audit_names.py                新建,照抄 jedi-asset 那支
  jedi_iam/infra/models/user.py:89                    association_proxy 那行:見 ⑥
  tests/                                              補 identity 注入的 case

怎麼修(六組,各一 commit,套件先於主專案)

① jedi-iam 開 identity port(套件,path dependency 開發)