FR-069 模組化抽取 · 全案收官 · 2026-09-01
本檔是 FR-069 整個 task arc 的收口彙整,逐 block 濃縮自 fr069-LOG.md(append-only 歷程檔)而非憑記憶重建。內容含四階段帳、26 支套件終態、18 條教訓精選、未結 follow-up 與部署 handover。
fr069-LOG.md 七個 block 逐一濃縮;數字全部實跑指令核對,不沿用文中舊值把後端 40 個模組裡「別的產品也用得到」的能力,一支支抽成可獨立安裝的 jedi-* 套件—— 現役 25 支、退役 10 支、對外契約零漂移、主專案淨刪約 16,500 行。
| 項目 | 數字 | 怎麼得到的 |
|---|---|---|
| BE commits | 155(fe56ab6a..HEAD) |
git log --oneline | wc -l |
| BE 檔案變動 | 1,456 檔、+57,776 / −74,308(淨刪 ~16,500 行) | git diff --shortstat |
| monorepo commits | 64(bc0f2b86..HEAD) |
同上 |
| monorepo 檔案變動 | 2,137 檔 | 同上 |
| 現役套件 | 25 支 | 磁碟目錄數 = pyproject.toml pin 數(差集為空) |
| 完全體插件(自帶 route) | 16 支 | 逐支數 api.add_resource 活行 |
| 退役刪除 | 10 支/塊 | 見 §3 |
| 本 arc 發版 | 18 支(CM-1473 十一支+CM-1499 七支) | 對照 release-plan-p4.md |
| Notion 卡 | CM-1435 母卡+約 65 張子卡 | CM-1436~CM-1502 連號區間 |
對外契約凍結面(D5):231 個 error code 值/424 條 URL/藍圖名, arc-review 機器 diff 逐字比對零漂移。
extraction-sop.md 七階段 SOP。GRC_*(FE i18n key,實地驗過 8 筆翻譯靠它)。插曲(值得記):首腦把 jedi-common 頂層 7 行的
base_repository.py誤判為「舊代待汰換」發了清理棒, 子棒查繼承鏈發現它是被完整版繼承的 session 底座——按紀律煞車、未改任何檔。結論改為「不汰換、正名 SessionMixin」。
_ext_/_extlike_/…)+身分脈絡包+SessionMixin 正名,全「用加的」。X-Tenant-ID: 0 觸發 is_super_admin 繞過全 RLS(含 socket 整數 0 falsy 變體),皆修。identity(「只涵蓋你是誰半邊,太狹隘」);jedi_identity 不留轉發殼直接死名。api/auth/ 26 檔刪除、四殼退役、D16 port 化。 三個照抄要點成為後續 11 支的範本: ① route 取 service 走 ctx().service(name) 而非 @inject(存 provider 不存實例——存實例是併發才爆的壞); ② 缺認證接線拒絕掛載(跳過的後果是身分端點全變公開而健康檢查照樣綠); ③ 切分判準「換一個產品,這段還會一樣嗎」。pip install -e,poetry install 即可。完整終態表在 architecture-handbook/modularization-roadmap.md §套件族譜 (25 支逐支列版號/來源/形態+10 支退役去向)。此處只放摘要:
| 分類 | 支數 | 內容 |
|---|---|---|
| 本 arc 新抽/合併 | 8 | iam(四合一)/task-platform/compliance-audit/participant/detection/evidence-classification/ai-dashboard/survey(吸收作答層) |
| 第一階段新生 | 5 | ai-bot/integrity/license-runtime/log-forwarding/remote-agent |
| 老套件升級(完全體) | 5 | file-upload/system-menu/log/issue/notification |
| 老套件補殼(半體) | 4 | bulletin/system-config/device/information-system |
| 引擎/領域/地基 | 3 | flow-engine/oscal-v2/common |
| 退役刪除 | 10 | auth/login/mfa/captcha(→iam)/project(→task-platform)/flow-control(→compliance-audit)/identity(改名)/oscal v1(→v2)/department/resource-store/jedi_system_log |
「半體」不是沒做完——是第三階段逐支實查後誠實聲明不搬的理由 (route 的 service 實際住在主專案,硬搬會變成套件反向 import)。
零套件反向 import:arc-review AST 全掃 25 支(含 lazy/函式層)確認。
四類,完整版(含 15 條實例路徑)在 modularization-roadmap.md §產品本體:
① 報表櫃檯(infra/readmodel/,八支跨疆界純讀聚合) ② 接線盤(ports + adapters) ③ 組裝根(core/app_factory.py/各 *_wiring.py/config/app_modules.py) ④ 業務加工(app/oscal//app/module_frame//app/cloud_integration//app/project_summary_report/)
base_repository 誤判(憑檔名大小推斷新舊兩代)、 detection 綁定表歸屬(只憑語意沒跑 grep/pg_constraint)、 CM-1487「226 檔比照 P12 機械搬」(P12 能機械搬因 out-degree 8,flow_control 纏五疆界)。mount_api=False 簽名有、行為缺一半, 於是「不掛路由」與「拿得到 context」在套件裡綁死成二選一,宿主端補不出來。 runner 照卡片邊界停手回報,是這次沒被繞成「在 socket 模式掛 REST」(會倒退 FR-063.1c)的原因。git stash 抽掉改動跑同一份指令對照, 不先量就會把存量債記在自己頭上(3.2 的 16 ERROR、jedi-survey 的 48 failed 皆是)。.env 連錯庫。git add 防不了「別人已 staged 的混進來」; commit 前必 git diff --cached --stat 核清單(已入所有後續 prompt)。POST /login, 挖出四道宿主前提。其中 PROPAGATE_EXCEPTIONS 最陰:flask-restful 的 Api 包掉 handle_user_exception,於是 register_error_handlers 註冊成功卻完全不生效,401/403/404 一律變 500。JWT_IDENTITY_CLAIM/get_jwt_identity()/ Accept-Encoding: identity 都不能改(改 JWT claim 名會讓所有既有 token 當場失效)。pg_views +表名字串,人工列冊。python -m pytest,直呼 pytest 會 ModuleNotFoundError: common 假紅。Not started)| 卡 | 內容 |
|---|---|
| CM-1484 | jedi-participant 六支 ORM 直連身分表改走 IUserDirectory port(+主專案 10 支同病 repo 評估) |
| CM-1495 | 任務綁定表孤兒定期清理 job——CM-1490 D-10 償債的配套,尚未建置(現有防線=顯式刪+讀取降級) |
| CM-1445 | RLS 覆蓋缺口:user_roles/user_tenants/user_org_units 三張授權關聯表未啟用 RLS(獨立安全債,不掛 FR-069) |
| CM-1461 | 裸路徑死端點追蹤——剩 bulletin/device/system-config 9 支未拔(route 未上移) |
| CM-1463 | roles.is_admin 舊管理員旗標收斂(消費端改道 capability 後拆除) |
test_audit_event_instrumentation 併跑汙染——CM-1498 查明是既有債,建議開卡。| 套件 | 改了什麼 | 不補發的後果 |
|---|---|---|
| jedi-detection | C-1 撞號(碼表+contract pin) | 已發版 0.0.1 仍帶撞號——唯一有實際使用者影響(檢測工具 uid 報錯在 FE 顯示 DOCX 文案) |
| jedi-compliance-audit | C-1 鏡像碼表同步 | 同上;PENDING_REPUBLISH 例外表目前有一列 |
| jedi-survey | I-8 port 收斂+接線錯誤 log | 純防禦性,無 live 影響 |
| jedi-task-platform | 守衛+URL 契約+註解 | 測試與註解,不影響 runtime |
補發後:① 主專案 bump pin;② 刪 PENDING_REPUBLISH 那列(test_no_stale_pending_entries 會主動變紅提醒)。
四張 hi_* 歷史表 0 筆留另議/flow_template API 欄位併 FE 拿掉/兩套件 harness 待型別償還後補/ 存量紅燈一批(8 紅 guard 未接線+AI dashboard 舊測試 metadata_builder 不存在)/ readmodel 按語境分子資料夾(規格已寫,搬檔未做)。
poetry install 即可起 BE(path override 已全清,venv 內無 editable jedi 套件)。 守衛 77 綠(python -m pytest)。user 2026-09-01 裁:e2e 暫不做,改「dev server 直跑功能驗證」。
docker stop (資料卷保留可復原);兩組 agent 容器刻意留跑(檢測派工可能用到); 機上無 BE/FE git clone(歷來跑 image);資源充裕(RAM 31G/碟 142G)。feature/FR-069 分支 push 已委任(memory feedback_fr069_push_delegated_branch_only)。本 SUMMARY 屬材料性收官(CM-1502 第一段)。下列結論性動作尚未做,等 user 令:
Donefeedback_* 條目落檔