FR-089 · 需求索引 · 本頁由 build 掃資料夾生成

FR-089 套件結構統一(jedi-asset 定形 → 主專案側收斂 → 21 支套件套用)

✅ 全案 Done,隨 v1.20.0 出版(2026-09-15)。母卡 CM-1688。三段全收(jedi-asset 定形/FR-090 七棒/FR-091 28 卡)+ arc review + 六張修正卡 + 三張收尾卡;21 支套件統一 1.1.0 推上 Nexus(jedi-oscal-v2 走自身序列 2.4.0),後續修正八支進 1.1.2、兩支 1.1.1。主專案 v1.20.0 已出版並於 190 e2e 測試機手測通過。

狀態:✅ 已完成 文件 2 份 handoff 4 份

🔴 一頁看完

結論三段:

  1. jedi-asset 定形(已完成)。拿資產管理套件當範例,把它整理成「標準形狀」並寫進 SOP §4.3:CM-1676 結構整理(清施工日誌註解、plugin.py 拆五檔、api 拆 guards+routing、統一 device/information_system 兩型別寫法、entity 改 dataclass、刪零呼叫者模組);CM-1677 收尾(刪 upsert_by_name、引用計數改明確分派、補 18 支 testcontainers 整合測試、README 落差表、ctx() 改名 runtime());CM-1678 資訊系統表補 RLS 四條 policy+FORCE、devices.tenant_id NOT NULL、enum 值域統一小寫——修好「五個系統狀態只有兩個存得進去」的真 bug。零對外行為變更。
  2. 主專案側殘留收斂(FR-090,七棒 Done)。母卡 CM-1682:空殼清理、port 實作歸位、iam 宿主側收斂、補審計暱稱走 D8、接線收成 core/plugins/<pkg>.py 一支一檔、主專案自有 35 筆能力點開申報處。20 支套件全部從 core/plugins/ 掛載,形狀一致。剩 DI 瘦身走 B 案(套件開 host_services() 取用口,主專案不再直綁套件 DI):CM-1749(套件側)→ 1750(主專案 48 處)→ 1751(文件),併 jedi 1.1.0。詳見 FR-090 README。
  3. 21 支套件套用(FR-091,28 卡 Done)。三批+三張大卡+oscal-v2/common 輕量版;另兩條線:能力點宣告(21 支 80 筆 CAPABILITIES+主專案 35 筆,五條守衛對 seed 零未歸類)、版面殘留(頂層平鋪/ports 位置/api 四件)。收口後 arc review 兩 Critical 六 Important 全修,21 支出版 1.0.1。詳見 FR-091 README。
§1

定案的統一形狀

套件側(jedi-asset 版,SOP §4.3)

  • plugin/ 五檔:__init__/contract/runtime/assembly/migrations
  • api/ 拆 guards.py(runtime()+三個 lazy decorator)與 routing.py
  • 取用執行期組件的函式一律叫 runtime(),不叫 ctx()
  • logger 掛 common.jedi_<pkg>
  • entity 一律 dataclass,並用 inspect.signature 對照 ORM 欄位(守衛測試維持形狀)

主專案側(FR-090 定案,SOP §5.1)

  • 一支套件一個檔 core/plugins/<pkg>.py:port 實作(adapter)、填表、掛載三段同檔,接手的人一個檔看完
  • 掛載一律走 core/plugins/__init__.py 的 PLUGINS 清單,app_factory 一個迴圈掛全部;Plugin(..., capabilities=) 必帶
  • 套件上移後 app/<pkg>/ 整個刪,不留殼
  • 補審計暱稱只有一條路:套件側 jedi_common.identity.fill_user_names、主專案側 common/util/audit_nickname.py,都經 D8 IdentityContext
  • 主專案 DI 不重複建套件 service,只給 port(DI 瘦身 B 案落地後改由 host_services() 取用)
§2

與 FR-080 的關係

FR-080(母卡 CM-1619,八棒 Done、收口中)是插件化第一、二階段(合併四組、補實五支空殼、清套件間直接依賴)。本案是 FR-069 D8 定的第三階段「既有套件升級插件模式」。2026-09-12 已把 FR-080 的「發版推 Nexus、pin 還原、SPEC 頁更新、release note」四項移出歸本案,等 18 支整理完一次做(已寫進 CM-1619 末段);FR-080 只收 code review、e2e 假綠、母卡與 design.md 收 Done。

§3

兩條從本案長出去的線

  • 出貨升級鏈(FR-093):本案查出出貨 image 只讀主專案 scripts/sql/,套件自帶的 migrations/ 客戶端永遠套不到,能力點與選單也不會自動到位。已獨立成 FR-093(母卡 CM-1752,十棒),進行中。
  • 租戶隔離(FR-094):jedi-asset 002 補 RLS 時連帶盤出 13 張表隔離沒開,獨立成 FR-094(母卡 CM-1766,八棒),待派。
§4

需求討論紀錄

2026-09-12 決策者裁定(起因:看到 app/auth/ 下九個檔問「不是已經拆成 iam 了嗎,怎麼還在」):

  • 全部做法統一——套件側 19 支各長各的、主專案側四種並存做法,都收成 jedi-asset 那一種。
  • enum 值域走 A 案「統一小寫」——DB CHECK 與程式端寫入值對齊小寫,migration 只加不破。
  • 先做主專案側再做 18 支——18 支每支都要確認主專案有沒有重複給工廠/port,主專案先清乾淨卡才寫得準。
  • ctx() 改名 runtime()——「取執行期組件」比「context」貼切,且避免與 jedi-iam 的 IdentityContext 撞名。
  • FR-080 四項移出歸本案——發版、pin 還原、SPEC、release note 等 18 支整理完一次做。
§5

進度

段 卡 狀態 備註
一、jedi-asset 定形 CM-1676/1677/1678 ✅ Done 形狀寫進 SOP §4.3
二、主專案側收斂(FR-090) CM-1682(母)+1683/1684/1686/1687/1689/1737/1748 ✅ 七棒 Done 20 支全從 core/plugins/ 掛載;主專案 35 筆能力點有申報處
二之尾、DI 瘦身 B 案 CM-1749 套件側/CM-1750 主專案 48 處/CM-1751 文件 ✅ Done 套件開 host_services() 取用口;iam 只瘦不刪(34 處引用);併 jedi 1.1.0
三、21 支套件套用(FR-091) 28 卡 ✅ Done 見 FR-091 README
arc review CM-1738 ✅ Done 報告 docs/review/2026-09-13-fr089-arc-review.md;同形 runtime() 21/21、接線 20/20、能力點四層零落差
review 修正六卡 CM-1739~1744 ✅ Done 兩 Critical(system-menu 三端點 500、四支假測試)、四 Important 全修,守衛族全綠
收尾三卡 CM-1745 ports 殼+M 項/1746 註解收斂/1747 既有紅測試 ✅ Done 三支頂層 ports/ 刪除;survey/issue 測試全綠
套件出版 jedi ac9c152/BE 3bf476a9 ✅ Done 21 支 Nexus 1.0.1(oscal-v2 2.3.1);主專案 pin 正式版、無 editable 殘留;守衛 152 綠、十端點實打正常
主體進版 — ✅ Done version-bump 1.19.0→1.20.0、FE 對齊、release note、spec 快照;發前跑 site-regression 全站
§6

座標

  • 套件:~/Projects/Jedicogy/module/jedi-python-package/(形狀範本 jedi-asset/),branch feature/FR-075
  • 主專案:core/plugins/<pkg>.py(20 支)、core/host_capabilities.py、守衛 test/test_module_boundaries.py,branch feature/FR-075
  • 設計源頭:FR-069 design.md D8;FR-080
  • skill:jedi-package-dev(path dependency)、sql-migration
§7

文件

  • for-pm.md — 給 PM 的白話說明:零技術名詞,講系統長什麼樣、零件怎麼裝、對交付的意義與還沒做的事
  • plugin-anatomy.md — 插件解剖(工程師版):五個詞、袋子比喻、guards.py、每個檔放什麼、主專案怎麼接、port 與 adapter、新手教程、DI 與 runtime、複雜度、設計模式、harness、一個 request 的旅程
§8

文件

以下全部由 build 掃資料夾產生,新增檔案重 build 即自動出現。標題連結指向渲染後的 HTML,md 連向源檔。

說明與手冊

文件 類型 標題 最後更新
for-pm / md 說明/手冊 零件是怎麼裝進系統的 2026-09-13
plugin-anatomy / md 說明/手冊 jedi-asset 插件解剖 2026-09-15

交接與收口時間軸(handoff/,4 份)

由新到舊。每份是某一棒次交接當下的完整現況快照,看某個時間點「當時知道什麼」請從這裡進。

日期 文件 標題
2026-09-15 FR-089-STATE / md FR-089 交接現況(STATE)
2026-09-15 FR-089-LOG / md FR-089 交接日誌(LOG,append-only)
2026-09-15 2026-09-15-post-release-HANDOFF / md 首腦交接:v1.20.0 出版後(2026-09-15)
2026-09-15 2026-09-15-arc-SUMMARY / md FR-089 arc 收尾 SUMMARY — 套件體系收整、出貨升級鏈、租戶隔離(隨 v1.20.0 出版)
§9

Notion 卡

卡片內容(決策紀錄、驗收條件)以 Notion 為準,本頁只記座標。

關係 卡號 標題 狀態
母案 CM-1688 FR-089 套件結構統一——用 jedi-asset 定一種標準形狀,先收主專案側殘留,再把 18 支 jedi-* 套件整成同一個樣子(三段,實作) —
子卡 CM-1676 jedi-asset 結構整理——當作 19 支套件的範例(A~F 組) Done
子卡 CM-1677 jedi-asset 收尾修正——刪 upsert_by_name、引用計數改分派、testcontainers 測試、README、ctx()→runtime() Done
子卡 CM-1678 資訊系統表補 RLS+設備表 tenant_id 收緊+enum 值域統一小寫(002 migration) Done
子卡 CM-1682 FR-090 主專案側殘留收斂(母卡,八棒) 七棒 Done、DI 瘦身三卡待派
子卡 CM-1690 FR-091 21 支套件套用標準形狀(母卡,28 卡) Done