# FR-103 交接現況（living，就地更新）

> **這個檔只描述「此刻」。** 每棒只 Edit 變動的節，決策脈絡與教訓寫進
> [`fr103-LOG.md`](fr103-LOG.md)（append-only）。
>
> 最後更新：2026-09-16 接手首腦收工（七棒全收；後續 arc FR-104／105／106 見各自 README）

---

## §0 接手讀序（先懂需求再看現況）

1. **本檔 §1 原始需求** ← 先讀，不懂 WHY 會把「清乾淨」當成目標而忽略風險
2. **本檔 §2-§5**（現況／待辦／紅線）
3. [`fr103-LOG.md`](fr103-LOG.md) Block 1 的「推翻了什麼」與「教訓」← **必讀**，
   首腦在這個 arc 判斷錯三次，形狀相同
4. 母卡 [CM-1829](https://app.notion.com/p/FR-103-3dd346da4cd081c3b33ad78672464766)
5. 要動哪一棒才讀那張子卡

**冷接自檢題**（答不出來就回頭讀，不要開工）：
- 為什麼 `views/workflow/` 不能整包刪？
- `workflow.*` 那四個能力點為什麼刻意留著？
- `jedi-iam` 1.2.0 發版前為什麼「乾淨環境跑不起來」？（已解，見 LOG Block 3）

---

## §1 原始需求（WHY）

決策者 2026-09-16 問：「**為什麼我看還有很多 route 在主專案？我以為像 system_config
等東西應該全部抽出去了**」，接著說明動機：

> 「我要的就是**乾淨的 code**，因為我後面要去開發新功能了，不要再留一堆無意義的東西。」

所以本 arc 的目標不是「把東西搬進套件」，是**讓主專案只剩該留的**。判準有三層：

| 該留的 | 該清的 | 該搬的 |
|---|---|---|
| 本產品獨有的業務（oscal、module_frame、cloud_integration） | 沒人用的死碼 | 主專案只剩殼、實體已在套件 |
| 只有這個產品才對的規則（多租戶、產品知識） | 功能退役後的殘留 | 接線該在 `core/plugins/` 而非 `api/` |

⚠️ **「清乾淨」不等於「刪掉」**——本 arc 有三處查證後決定不動：`evidence_classification`
（原型腳本的資料檔）、`associations`（v1 退場 v2 未接的中間狀態，341 筆真實資料）、
`COMMON_PASSWORD_TOO_SHORT`（號碼不可讓出，見 LOG D4）。

---

## §2 當前狀態

> 盤點時間：2026-09-16 16:43｜盤點者：subagent｜全部唯讀
>
> ⚠️ 表 A 已由接手首腦整表更新（2026-09-16，三 repo 皆已 push）；其餘各表為盤點當下狀態，
> 表 F 的 CM-1836／1837／1823 三列另有註記。

## 表 A：三 repo git 現況

| Repo | 當前 branch | push 狀態 | 工作區未 commit 檔 | 最近 3 筆 commit |
|------|------------|----------|------------------|----------------|
| **BE**<br>`compliance-manager-be` | `feature/review` | 已全部 push（2026-09-16） | （乾淨；`jedi-iam` pin 已升 `1.2.0`，path dependency 已還原）| `7683b45b` docs(FR-101.2) J2 驗收落地（CM-1827）<br>`a54eccf0` fix(deliverables) plugin_metrics 接線清單改指 core/plugins/detection.py<br>`22bb4dba` docs(FR-101.2) J2 掃描結果（CM-1827）|
| **FE**<br>`compliance-manager-fe` | `feature/review` | 已全部 push（2026-09-16） | （乾淨，無未 commit 檔）| `ea74482` 清掉指向已退役後端端點的前端殘骸（CM-1841 FE 段）<br>`3d35229` 標註舊版 BPMN 編輯器不是死碼（CM-1836）<br>`0dc93e1` 退役三條零引用路由與孤兒頁面（CM-1835）|
| **套件**<br>`jedi-python-package` | `feature/review` | 已全部 push（2026-09-16） | （乾淨，無未 commit 檔）| `3cc966f` chore(release) jedi-iam 1.2.0<br>`edc9118` 帳號匯入改必填＋修密碼產生器少一碼<br>`589d034` 吸收第三方登入綁定與 LDAP 連線測試（CM-1832）|

---

## 表 B：FR-103 相關 commit 清單

### BE repo

| Commit | 卡號／關鍵字 | 一句話說明 |
|--------|------------|-----------|
| `86d62988` | CM-1830、FR-103 | 退役排程報表整條線（report_downloader ＋ schedule-report API）——決策者裁不需要 |
| `e5548de8` | CM-1833、FR-103、出貨基線 | 退役 12 個 enable=0 舊選單的 DB 側——選單／綁定／16 個能力點／回饋標籤 |
| `0c7e4e38` | CM-1832、FR-103 | 第三方登入綁定與 LDAP 連線測試上移 jedi-iam——主專案只留接線（第 3 棒）|
| `33709786` | CM-1834、FR-103 | 問卷接線收進 `core/plugins/survey.py`——主專案側 23 支套件全部同形（第 5 棒）|
| `08d1267f` | CM-1833、FR-103、出貨基線 | 重產出貨基線——收斂 CM-1833 的 12 個舊選單退役 |
| `90be71f6` | CM-1830／CM-1832／CM-1834、重產 Postman | 重產 Postman collection 與 route 清單——反映 FR-103 四棒的端點異動 |
| `11773fde` | FR-102、FR-103 | FR-102 地圖加失效警示——FR-103 四棒落地後四項狀態已變 |

**BE 查無命中**：`CM-1831`（該棒為純 FE 工作，commit 在 FE repo）

### 套件 repo

| Commit | 卡號／關鍵字 | 一句話說明 |
|--------|------------|-----------|
| `589d034` | CM-1832、FR-103 | 吸收主專案的第三方登入綁定與 LDAP 連線測試——四條 route＋設定來源 port（第 3 棒）|

**套件 repo 查無命中**：`CM-1830` / `CM-1831` / `CM-1833` / `CM-1834`

### BE 追加關鍵字（FR-100 / FR-102 / 出貨基線 / 重產 Postman）

| Commit | 關鍵字 | 一句話說明 |
|--------|--------|-----------|
| `a2812d90` | FR-100 | 更正 flow_engine 歸屬敘述——226 檔是 flow_control 的數字，兩份舊數字皆失效 |
| `326e8b14` | FR-100、重產 Postman | 重產 Postman collection 與 route 清單——反映 FR-099／FR-100 的端點異動 |
| `b1cef859` | FR-100 | 兩棒完成＋report 改判為活的——盤點方法補第四層（CM-1820/1821/1822）|
| `0c8fbbbb` | FR-100 | 清理 `gen_postman_collection.py` 殘留的 `api.translate` 項（CM-1821）|
| `16ff211c` | FR-100 | 退役 translate 端點——前端零入口、四方查證皆無呼叫者（CM-1821）|
| `2cd7e624` | FR-100 | 主專案剩餘 route 逐支盤點結論——三支待處理，純記錄不派工（CM-1820）|
| `808af30c` | FR-102 | 主專案全模組現況地圖——26 模組逐一盤完，只給現況不給建議（CM-1824）|

> 註：`出貨基線` 關鍵字在 BE repo 全歷史共 28 筆命中，上表只列 FR-103／FR-100／FR-102 區段內的；其餘屬 FR-065／FR-092／FR-094 等歷史 arc，與本 arc 無關。

---

## 表 C：主專案模組現況（驗證退役是否落地）

| 目錄 | git 追蹤檔數 | 判定 |
|------|------------|------|
| `api/report` | 0 | 0 檔＝已清空 |
| `app/report` | 0 | 0 檔＝已清空 |
| `bin/report_downloader` | 0 | 0 檔＝已清空 |
| `api/translate` | 0 | 0 檔＝已清空 |
| `api/user_auth_provider` | 0 | 0 檔＝已清空 |
| `app/user_auth_provider` | 0 | 0 檔＝已清空 |
| `api/survey` | 0 | 0 檔＝已清空 |
| `api/task_survey` | 0 | 0 檔＝已清空 |
| `api/feedback` | 0 | 0 檔＝已清空 |
| `api/label` | 0 | 0 檔＝已清空 |
| `app/feedback` | 0 | 0 檔＝已清空 |
| `domain/feedback` | 0 | 0 檔＝已清空 |
| `infra/feedback` | 0 | 0 檔＝已清空 |

**13 個目錄全部 0 檔，退役皆已落地。**

---

## 表 D：DEV DB 現況

連線：`localhost:5432 / cmmgr / guidant_ai_dev`（查詢成功）

| # | 查詢 | 實際值 | 預期 | 判定 |
|---|------|-------|------|------|
| 1 | `ui_routes where enable=0` | **0** | 0 | ✅ 相符（關閉選單已全數退役）|
| 2 | `ui_routes where enable=1` | **43** | —（僅記錄）| — |
| 3 | `capabilities where name in ('bulletin.read','feedback.read')` | **2** | 2 | ✅ 相符（共用點留存）|
| 4 | `capabilities where name like 'workflow.%'` | **4** | 4 | ✅ 相符（刻意保留待 CM-1836）|
| 5 | `capabilities` 退役族群<br>（`cruise-project*` / `resource.*` / `dashboard.*` / `report`）| **0** | 0 | ✅ 相符（已清乾淨）|

---

## 表 E：188 出貨基線庫現況

存取：`ssh jedi@192.168.50.188` → `docker exec postgres psql -U cmmgr -d guidant_ai`（查詢成功）

| 查詢 | 實際值 | 預期 | 判定 |
|------|-------|------|------|
| `ui_routes where enable=0` | **0** | 0 | ✅ 相符（本 session 已重產）|
| `ui_routes where enable=1` | **43** | —（加查對照）| ✅ 與 DEV 的 43 完全一致 |

---

## 表 F：Notion 卡狀態

| 卡號 | 狀態 | 是什麼（任務名稱前段）|
|------|------|---------------------|
| CM-1829 | Not started | FR-103 主專案殘留清理——四件確定要整理的（母卡，三棒）|
| CM-1830 | 修正待驗證 | FR-103 第 1 棒 report 整條線退役 ＋ translate 本機殘留清除 |
| CM-1831 | 修正待驗證 | FR-103 第 2 棒 cruising 舊回饋頁退役——選單已關但路由仍掛著 |
| CM-1832 | 修正待驗證 | FR-103 第 3 棒 user_auth_provider 搬進 jedi-iam——地圖唯一的殼 |
| CM-1833 | 修正待驗證 | FR-103 第 4 棒 退役 12 個關閉的舊選單——含權限點、前端孤兒頁、出貨基線同步 |
| CM-1834 | 修正待驗證 | FR-103 第 5 棒 survey／task_survey 接線收進 core/plugins |
| CM-1835 | Not started | FR-103 第 6 棒 退役三條確定無人引用的前端路由——乙案 |
| CM-1836 | 修正待驗證→驗收通過 | FR-103 第 7 棒 新舊兩代 BPMN 編輯器整併——五支活頁面改用 flow-template（丙案）。決策者裁不遷、加註記（FE `3d35229`／BE `98d756bb`）|
| CM-1837 | 已作廢 | 使用者 Excel 匯入：租戶／單位／角色三欄的名稱從未被解析成 id——決策者重走流程證實正常 |
| CM-1823 | 驗收通過 | FR-104 流程疆界重新分析——舊設計稿全部數字失效（一棒，只分析不動程式）。見 FR-104 README |
| CM-1824 | 修正待驗證 | FR-102 主專案全模組現況地圖——636 檔逐模組盤點（一棒，唯讀）|
| CM-1820 | Not started | FR-100 主專案剩餘 route 逐支盤點結論——三支待處理，純記錄不派工 |
| CM-1816 | Not started | FR-099 意見回饋與標籤併入 jedi-issue——主專案側整組退場（三棒，實作）|

> 母卡 CM-1829 狀態仍為 `Not started`，七張子卡（CM-1830～1836）皆已驗收通過（Notion 狀態以實際卡為準）。

---

## §3 待辦（下一棒可能要做的）

### 🟡 已開卡待派

| 卡 | 做什麼 | 建議 model | 卡在哪 |
|---|---|---|---|
| [CM-1823](https://app.notion.com/p/FR-101-3dd346da4cd0813ba829c2730ee5a81d) | ✅ 已完成，見 FR-104（流程疆界重新分析） | — | — |
| 後續 arc | FR-104／FR-105／FR-106 見各自 README（`docs/features/FR-104-*`／`FR-105-*`／`FR-106-*`） | — | — |

✅ CM-1835（乙案）已於 2026-09-16 完成並驗收通過（FE `0dc93e1`）。
✅ CM-1836（丙案）已於 2026-09-16 驗收通過——決策者裁不遷、加註記（FE `3d35229`／BE `98d756bb`）。

### 🔴 等決策者裁示

| 項目 | 為什麼卡著 |
|---|---|
| `oscal`／`module_frame` 內部逐檔分類 | 已由 FR-105 三棒完成並驗收（母卡 CM-1838），見該案 README |

### 📋 記錄在案、未排期

- **`license_readonly_mw.py:110`** 白名單列著 `/schedule-report/file-list`，但那條路徑
  從來沒註冊過（CM-1830 退役 report 時已順手移除該行，此項已解）
- **`user_batch_import_service.py` 的 `policy=None` 語意問題**（見 LOG 教訓 4）——
  不影響功能，未改
- **單筆新增使用者的自產密碼路徑未實測**（見 LOG「未驗證的假設」）

---

## §4 🔴 行為紅線（動手前必看）

### 不可刪的東西

| 東西 | 為什麼 |
|---|---|
| `src/views/workflow/` 整包（16 檔含 55KB BPMN 編輯器） | **五支活頁面用 `window.open`／`router.push` 開它**。FE 路由守衛只擋 `requiresAdmin`，不依 `ui_routes` 擋直入——選單關了不代表進不去 |
| `capabilities` 的 `workflow.*` 四個 | jedi-flow-engine 的 plugin 契約仍宣告它們，刪掉 seed 會讓 `test_plugin_capabilities_are_seeded` 變紅。要收得連套件一起收 |
| `capabilities` 的 `bulletin.read`／`feedback.read` | 公告與意見回饋兩個**活功能**共用，刪了整個功能 403 且無錯誤訊息 |
| `COMMON_PASSWORD_TOO_SHORT`（`error_code.py:145`） | 號碼是 CM-1802 特地分出來的，刪掉會被回收重用、重蹈覆轍 |
| `src/views/bulletins/` 另外四支 | 活的公告功能（只有 `UserGuide.vue` 是孤兒） |
| `src/views/flow-template/` | 新一代流程範本，`ui_routes` 的 `flow-template-manage` enable=1 |

### 環境

- **開發只動 DEV**（`localhost:5432/guidant_ai_dev`），**絕不碰 STG／POC**
- ⚠️ DEV DB **2026-09-13 起在本機 localhost:5432**，不是 188:25432
- 出貨基線庫在 **188 的 `guidant_ai`**（port 25432）——動它前必先 `pg_dump` 備份，
  且屬決策者裁示範圍
- 主線 `phase=active`／`envs=*` 的 migration 寫完要**回報「出貨基線待重產」**，不自己動

### 套件

- `jedi-iam` 已發 `1.2.0`、pin 已升（`pyproject.toml:64`），path dependency 已還原為註解（`:115`）
- 開發期改套件走 path dependency，**path 改動不 commit**
- **不發版、不推 Nexus** 除非決策者當次明示

### 平行作業

本 repo 2026-09-16 當天發生過 commit 夾帶事故（CM-1821 夾走 CM-1818 在
`config/app_modules.py` 的改動）。**顯式 `git add` 檔名、禁用 `-am`、commit 前跑
`git status` 逐檔確認。**

---

## §5 座標

| 什麼 | 在哪 |
|---|---|
| 母卡 | [CM-1829](https://app.notion.com/p/FR-103-3dd346da4cd081c3b33ad78672464766) |
| 全模組地圖（26 模組現況） | `docs/features/FR-102-2609-host-module-map/README.md` ⚠️ 檔頭有失效警示 |
| route 盤點結論 | `docs/features/FR-100-2609-host-route-inventory/README.md` |
| 意見回饋併入 jedi-issue | `docs/features/FR-099-2609-feedback-label-into-jedi-issue/README.md` |
| 終局形狀定義 | `docs/features/FR-080-.../FINAL-SPEC.md`「主專案怎麼接」 |
| 接線樣板 | `core/plugins/issue.py`（三段形狀）、`core/plugins/remote_agent.py`（一個 mount 掛多個） |
| 出貨基線重產步驟 | `.claude/skills/sql-migration/SKILL.md`「首腦重產的步驟」 |
