# FR-047 已知坑處理 — UX 桶 + 整個 508 arc 完結 SUMMARY（2026-07-09）

> **唯一進度真相**：[`docs/analysis/2026-07-07-known-pits-remediation-tracker.md`](../../../analysis/2026-07-07-known-pits-remediation-tracker.md)。本檔是 arc 完結的彙整 + 部署 handover + follow-up，逐條定調/銷帳一律以 tracker 為準。
> **branch**：`fix/v1.8.0-bugs`（三 repo 皆未 push）。

## 這個 arc 是什麼

FR-047 spec 手冊全站 67 頁 §12「邊界情況與已知坑」彙整成 **508 條清單**。核心認知：**§12 是寫給工程師的邊界告知，不是 508 個待辦**——混了「①可修 bug/缺口 / ②刻意設計只是提醒 / ③文件澄清」三種。arc 目標＝逐桶把①挑出來修、②③維持 no-action。

**八桶全數收口**（tracker 進度總覽為準）：① SEC(75→FR-048) / ② SCHEMA(60，DDL 5 項 DEV+STG) / ③ **UX(47+歸入~10，本 session)** / ④ ECODE(39，真缺陷 7) / ⑤ STATE(33) / ⑥ REPLACE(34) / ⑦ DEAD(30) / ⑧ 其他(204，~175 no-action)。**至此 508 arc 完結。**

---

## 本 session 產出（UX 桶 + review 後衍生三批 + 發版）

### A. UX 桶（③，最後一桶）

3 路唯讀 agent 平行 live 驗證 + 主導親驗每個肯定/否定判定。47+歸入~10 條塌縮成：

- **真缺陷 6 決策點 U-1~U-6 全修**：
  - U-1 部門父層下拉吃分頁資料 → 改吃全量 `orgUnitMenu`（一行）
  - U-2 EC 驗證/裁決報表 404 後空白 → 補 error state + 重試
  - U-3 資訊系統「刪除」實為軟刪除 → 文案改「停用」語彙
  - U-4 批次刪除 `not_found` 未呈現 → 補計數
  - **U-5 TOTP/MFA 啟用**（本 arc 最曲折，見 B 段）
  - U-6 稽核員總覽 header 原始 ISO 字串 → 格式化
- **誤報/已做 3 條**（my-audits toast 其實有跳、ap-authoring i18n 全齊、批次刪除已報兩類）
- **date-only 時區族 7 條**：live wire 實測，TW 部署+TW 瀏覽器全對 → no-action（非 UTC+8 才觸發，國際化再做）
- **告知類 ~33 no-action** + `role-manage#5`（ui_routes 重名）已被 SCHEMA 桶 UNIQUE 收

### B. U-5 演進（TOTP/MFA 即時切換）— 一條坑滾出一串

原定「啟用前強制驗證」，經 4 次 user 定調演進：
1. TOTP verify-before-enable 端點 + 修 otp-resend `type`/`mfa_type` key bug（BE `c61cb9e0`）
2. 生效模型改 **B 案：MFA 開關即時生效**（不依附基本資料儲存）（FE `da0ce32`）
3. root cause 修：`update_user` 需完整 payload → 新增 jedi-auth `update_user_mfa_type` + 主專案 `PUT /user-mfa-type` 輕量端點（BE `9e60bf37` + jedi-auth `2b3cf7b`）
4. Dialog 先開再載（切開關即時回饋）（FE `430ea54`）

連帶 UX 打磨：個人資料頁**拆卡**（帳號安全獨立即時生效卡 + hint-bar，`37a3ccc`）、banner 角色/租戶/部門加類型標示（`3b321e9`）、MFA 關閉確認框、LDAP loading 收斂。順手修兩個既有 bug：**重整直達 auth 頁 data-theme 未套、OTP 輸入框露暗色底**（`1477092`）、我的稽核任務「進入稽核」按鈕改 info 明亮藍（`1ef17c8`）。

### C. Review 後新開三批（收尾前逐族複核 no-action，user 拍板轉「要做」）

| 批 | 內容 | 狀態 |
|----|------|------|
| **① OTP 發送節流** | jedi-mfa redis 節流（`otp_cooldown:{user_id}`，防 email bombing，登入首發+resend 共用，60s env）+ FE localStorage 吃 429 | ✅ 已發版 |
| **② 六項設計調整** | 權限即時生效（本人 session）/ device 停用 UI / 匯入連動下拉 / 判定後刷新 / 摘要報表放寬進行中 / device_type 標準下拉 | ✅ 手測待驗 |
| **②-bis notification.test 退役** | 做 #1 時發現角色矩陣 TEST 死欄 + notify-config 測試端點裸奔 → 退役 capability + 補守門（「能維護就能測試」） | ✅ 手測待驗 |
| **③ 專案狀態機 B 案** | project.status 維護半套（只掛 close_round）→ 建立即 in_progress + 補同步點 + 回填 migration；篩選/規劃 gate 改輪次驅動 | ✅ 手測通過 |

### D. 發版（user 明示）

jedi-auth **0.1.26**（`update_user_mfa_type`）+ jedi-mfa **0.0.12**（OTP 節流）已 `poetry publish` 到 Nexus（monorepo bump `fe5556a`、主專案 pin 還原 `7f2244d1`）。已驗 venv symlink 已清、artifact 含新碼。

---

## Commits 索引

**BE `compliance-manager-be`**（15，`f57fad0b..HEAD`）：`c61cb9e0` TOTP verify+otp-resend / `aadbe2ce` UX 抽桶定調 / `17a34e9a`+`9e60bf37` U-5 B 案+端點 / `3aac0109`+`351ad86c` review 登記 / `c574f7ca` 狀態機 B 案 / `a3bcf6f3` OTP 429 handler / `4504e2e3` device_type seed / `6a9a5c60` notification 退役 / `dc216424`+`d070340c` 銷帳 / `7f2244d1`+`0a46918f` 發版收尾

**FE `compliance-manager-fe`**（12，`ae225f5..HEAD`）：`ae225f5` U-1~4/6 / `bfe8ac1`~`430ea54` U-5 系列（拆卡/banner/data-theme/dialog）/ `1ef17c8` 按鈕 / `6cd28aa` 狀態機 FE / `3c3e24c` OTP FE / `f0b47de` 六項

**jedi monorepo**（3）：`2b3cf7b` update_user_mfa_type / `099808f` OTP 節流 / `fe5556a` bump

## 規範文件盤點

- ✅ **tracker**（唯一真相）：八桶 + review 三批全銷帳
- ✅ **spec §12 全站同步完成（2026-07-10 收尾，commit `383b418a`）**：14 頁 spec + html 逐頁對照 tracker，把真修的坑改寫成新行為 / 註已修，no-action 條目保留。涵蓋 user-profile（MFA B 案）、project-list/overview/dashboard（狀態機 + R1）、information-system / device（停用文案 + ECODE + SCHEMA）、user-import（R-3 + 六#3）、role-manage + _overview（六#1 + R5 + UNIQUE + notification.test 退役）、evidence 驗證/裁決（U-2）、audit-review（六#4）、summary-report（六#5）、auth/login（otp-resend + OTP 節流 + data-theme）。原「spec 待補」follow-up **全部已補**。
- ✅ **analysis**：狀態機 root cause 在 tracker §UX「Review 後新開項 ③」+ 本 SUMMARY

---

## 🚚 部署 handover（未做，等 user 明示）

0. **進版 v1.8.1（2026-07-10 收尾）**：arc 定調為 **v1.8.0 上線前的獨立 BUG 版 1.8.1**（非折進 1.8.0）。BE `pyproject` → 1.8.1 + 新 release note `docs/release_notes/v1.8.1.md`（彙整整個 arc）、`v1.8.0.md` 維持原本只涵蓋 FR-043/044/045；FE `package.json` → 1.8.1。⚠️ **git 狀態注意**：目前 checkout 在 `main`（非 `fix/v1.8.0-bugs`，兩者曾同一 commit），一個 merge 曾把 arc 內容灌回 v1.8.0.md、已於 `204d31ca` 還原乾淨。相關 commit：spec `383b418a`、v1.8.1 bump+RN `5bac6a3c`、v1.8.0 還原 `204d31ca`（BE）；FE `d53b3ee`。
1. **BE 重啟**：jedi 套件換版（0.1.26/0.0.12）+ 多處 service/route 改動，無 hot reload，**這批要生效必須重啟 BE**。
2. **push**：仍全未 push（等 user 明示）。
3. **POC migration ✅ 已套（2026-07-10）**：8 支 arc migration（SCHEMA 5 + device_type seed + notification.test 退役 + project.status 回填）全數套用 POC（`cmmgr` / `--single-transaction` / `ON_ERROR_STOP=1`，各檔 self-record schema_migrations），**POC == STG**。驗證：POC `compliance.projects` 已無 `pending`（archived:25 / completed:1 / in_progress:9）、`system_menus` DEVICE_TYPE 11 筆、`uq_ui_routes_name` 在；三 UNIQUE 套前預檢 POC 零重複。notification.test 在 POC 本就不存在（DELETE 0，no-op）。
   - **FR-048 phase4a 能力點對齊（2026-07-10 一併處理）**：原 `2026-07-07-fr048-phase4a-capability-seed.sql` 僅 DEV 有，且其中 `notification.test` 已被 FR-047 退役——重放原檔會復活它。改以新檔 `2026-07-10-fr048-phase4a-caps-align.sql` 只 seed 非退役子集（`system_config.{create,update,delete}`[is_platform] + `feedback.export`）+ 配給 Administrator，套 DEV(no-op)/STG/POC。驗證三環境 caps4 齊、`notification.test`=0、Administrator grants=4。殘留 filename diff：歷史 `fr048-phase4a` 仍 DEV-only（有效能力狀態三環境一致）。
4. **FE 部署**：六項 + U 系列 + 狀態機 FE 需重 build 部署；BE+FE 需同版（otp-resend 修正後舊 FE fallback 會 400）。

## 📋 Follow-up（arc 外，待 user 排）

- **DB 死表盤點**（本 session 掃描，未定調）：A 類垃圾表（`system_logs_old` 10 萬列 / `api_logs_old` / backup 表 / `operations` 8 筆孤兒 / device_monitor 死功能）可退役（走 DROP 前安全四查）；B 類未接線 feature（`oscal.component_definitions` 6 表 cluster / jedi-issue `members`）待確認計畫中還廢棄；命名不一致（`_mapping` vs plural link 表、跨 schema 同名 poams/roles）技術債。詳見對話紀錄。
- **硬刪除 / 回收站**：user 知悉，要做另開 FR（級聯面大、GRC 稽核留存衝突，建議配打字確認 + 限管理員）。
- **權限即時生效範圍**：② #1 只做「當前 session 本人」即時；admin 改他人、對方另一 session 即時＝需 socket，依「別過度」未做。
- **② / ②-bis 手測待驗**：六項（尤其權限即時的情境）+ notification 退役，重啟後手測。
- **SCHEMA 桶 no-action 三候選**（user review 時列出）：可翻譯欄位 locale 對稱驗證 / project-list#7 排序白名單 / department-manage#3 命名不一致——維持 no-action 或另排。
