# FR-047 全站已知坑處理 — 交接 #2（2026-07-07）

| 項目 | 內容 |
|------|------|
| 緣由 | 接續 [交接 #1](2026-07-07-known-pits-remediation-handoff.md)。508 條已知坑逐桶處理中。本棒把「目前為止做完 / 進行中 / 還沒動」的全貌交給下一棒。 |
| branch | **`fix/v1.8.0-bugs`**（不要切；不對就停下問 user）。 |
| 母清單 | `docs/analysis/2026-07-07-spec-known-pits-inventory.md`（508 條原始坑，keyword 粗分，**只讀不改分類**）。 |
| 追蹤表 | `docs/analysis/2026-07-07-known-pits-remediation-tracker.md`（**定調 living tracker，一切結論看這份**）。 |

---

## 🧭 一句話現況

508 條坑 = **279 條已處理/確定不管**（SEC 守門 75 條已完工手測 + 其他 204 條已二次歸類定調）+ **237 條待排的 6 桶**（其中 DEAD 桶派發 prompt 已交 user、尚未有 session 執行）。**真正還要動手的遠少於 237**（大量是設計告知 no-action + 同 root pattern 重複）。

---

## 📊 508 條全局狀態表

| 桶 | 條數 | 狀態 | 落點 |
|----|------|------|------|
| **① SEC 授權守門** | 75（67+8 漏網）| ✅ **完工手測通過** | FR-048（見下方 §1）|
| **⑧ 其他** | 204 | ✅ **二次歸類定調完** | ~175 no-action + ~25 可行動（見 §2）|
| ② SCHEMA | 60（+7 待併）| ⬜ 未分族未定調 | §3 |
| ③ UX | 47 | ⬜ 未分族未定調 | §3 |
| ④ ECODE | 39 | ⬜ 未分族未定調 | §3 |
| ⑤ STATE | 33 | ⬜ 未分族未定調 | §3 |
| ⑥ REPLACE | 33（+4 待併）| ⬜ 未分族未定調 | §3 |
| ⑦ DEAD | 25（+5 待併）| 🟡 **派發 prompt 已交 user、待執行** | §4 |

---

## §1 SEC 守門桶 — ✅ 完工（FR-048）

**整個授權守門不只 A 族 3 條，是全站 373 支端點都掛上守門了**，衍生成獨立 feature FR-048。

- **成果**：`common/authz/` 單一守門機制（五軸模型：capability / platform-admin / super-admin break-glass / project-role / signed-token）。RBAC capability 從「只藏 FE 按鈕」變成 BE 真 enforce。
- **完工文件**：`docs/features/FR-048-2607-unified-auth-guard/handoff/2026-07-07-FR-048-SUMMARY.md`（六波落地、行為差異、follow-ups 全在此）。
- **設計**：`docs/analysis/2026-07-07-unified-auth-guard-design.md`。
- **台帳**：`docs/features/FR-048-2607-unified-auth-guard/endpoint-authz-matrix.md`（373 支逐支狀態，**後續改權限先看這份**）。
- **user 已逐項手測通過**（含 4b signed-token 五件、4a capability 語意變化）。

**FR-048 未竟 follow-ups（部署前必辦）**：
- **未 push**：BE 57 commits 領先 origin、FE 1 commit（`79c0133`）——全等 user 明示才 push。
- **STG/POC migration 未套**：`scripts/sql/2026-07-07-fr048-phase4a-capability-seed.sql` 只套了 DEV。
- **BE/FE 必須同版部署**：4b 的 token 流程 BE/FE 成對，只上一邊會壞 QR 顯示 / 框架下載。
- **e2e 兩條**（test repo）：QR 顯示 / 框架下載的前科件 + 負向案（登出直打→401）。
- 頁面 spec §權限矩陣批次對齊（67 頁，量大另排）；api-spec 補登 4b 新 token 端點。

> A 族原本 3 條「未認證端點」的下場：user-log#1 已修（`182bb2f7`，恢復 @jwt_required）；OSCAL 下載 + otp-qrcode 因「瀏覽器原生 GET 帶不了 bearer」不能盲加 JWT，改走 4b signed-token 解掉。

---

## §2 其他 204 — ✅ 二次歸類定調完

**核心發現：204 條裡約 85%（~175 條）不是缺陷，是「設計/行為告知」（②類）。**（`_obj.N` 識別碼、BPMN 驅動狀態、快照脫鉤、verdict API↔DB 映射…都是寫給工程師的地雷提示。）

**user 拍板政策（2026-07-07）**：設計/行為告知類，**確認不會危害系統 → no-action，不用管**。少數「無害」是 spec 自己斷言（`bulletin-view#3`、`my-audits#8`、`project-dashboard#8`）——建議快速 confirm 一次再放生，不要純假設。

細分統計 + ~25 條可行動清單全在追蹤表 **§其他二次歸類** 段。

**⚠️ 本棒未完的一步（下一棒接手）**：user 已同意「把其他撈出的 ~25 可行動項正式併進對應原生桶」，但**尚未實際併入各桶段落**（被交接需求打斷）。追蹤表 §其他二次歸類「可行動清單」已列好分類（BUG/SCHEMA/DEAD/REPLACE 各幾條），**下一棒接哪桶時，把該桶對應的『其他歸入』條目一起納入定調即可**——不必另外搬動，清單已備好。

---

## §3 未動的 5 桶（SCHEMA / UX / ECODE / STATE / REPLACE）— ⬜ 待分族定調

**都還沒做「分族 + 逐條定調」的前置**（SEC 桶是先分六族才逐條，這幾桶也該比照）。

| 桶 | 條數 | 一句話 | 其他歸入 |
|----|------|--------|---------|
| SCHEMA | 60 | 重複索引、無 UNIQUE、命名漂移、跨環境 id、comment 與型別不符 | +7（device-manage#8, information-system-manage#9, smtp-config#5, department-manage#9, my-audits#3, _overview#4, role-manage#6）|
| UX | 47 | date-only 時區、i18n 漏譯、toast、分頁、即時刷新 | — |
| ECODE | 39 | 例外型別與碼不一致、共用碼語意不清、碼未定義 | — |
| STATE | 33 | 前置檢查不對稱、可繞過、凍結時機 | 少數 |
| REPLACE | 33 | full-replace 清空關聯、ORM cascade vs DB FK、硬軟刪除 | +4（user-import#2, role-manage#2, user-form#3, department-manage#7）|

**接這幾桶的建議節奏**（同 SEC/DEAD）：
1. 抽出該桶條目（腳本見下方「抽桶指令」）。
2. 逐條讀內文分性質：真缺陷 / 設計告知 no-action / 同 root pattern 重複。
3. **同 root pattern 重複要合併談**——例如 REPLACE 桶「full-replace 送 `[]` 清空」跨 job/公告/參與者多頁、STATE 桶「SSP 寫入無 phase guard ×6 頁」、UX 桶「date-only 時區 ×10+ 頁」。合併後 237 條實際塌縮成幾十個決策點。
4. 定調結果寫追蹤表對應段，跟 user 討論再動手。

**抽桶指令**（把 `SCHEMA` 換成目標桶）：
```bash
cd ~/Projects/Billows/Audit-Manager/compliance-manager-be
python3 - <<'PY'
import re
lines=open("docs/analysis/2026-07-07-spec-known-pits-inventory.md",encoding="utf-8").read().split("\n")
for i,l in enumerate(lines):
    m=re.match(r'- \*\*\[([^\]]+)\]\*\*\s+(\S+)\s+(.*)$', l)
    if m and m.group(3).strip().startswith("`SCHEMA`"):
        b=next((lines[j].strip() for j in range(i+1,len(lines)) if lines[j].strip()),"")
        print(f'{m.group(1):48s} {re.sub(r"[*`]","",b)[:80]}')
PY
```

---

## §4 DEAD 桶 — 🟡 派發 prompt 已交 user、待執行

**30 條（25 primary + 5 歸入）。本棒已產出完整派發 prompt 交給 user**（在對話中，user 要派下去）。若下一棒是來執行 DEAD 桶的，重點：

**這桶不是「一律刪」**，混了五種性質，prompt 已要求先分類再動手：
- **(A) 真死碼可刪**（約 5 條）：FE demo JSON service 檔（UserForm.vue / UserLogService.js / BulletinService.js / FeedbackService.js）+ 死 error code（SURVEY_409003）。grep 全 repo 零引用才刪。
- **(B) 死欄/死表** → 走 CLAUDE.md「DROP 前安全四查」，查完提建議、先不刪（`users.topt_secret`、v1 表殘留引用）。
- **(C) 誤歸的真 bug**（5 條）→ 標記歸正確桶、不在此刪：project-dashboard#1（進度條 wiring bug）、role-manage#3（改名不查 + 碼型別不符）、feedback-management#1（巡檢會炸 TypeError）、department-manage#6（no-op 欄）、issue-integrate-config#1（REPLACE 性質）。
- **(D) no-action 占位頁/設計** → 標記不動：tool-plugin-manage#1、bulletin-view#1、reporting/_overview#3、cloud-integrations#8、evidence-classification-validation#5 等。
- **(E) 該接卻沒接** → 回報不刪：user-log#6（retention `maintain_log_partitions()` 已寫但無排程，刪掉=永久失去該功能）。

> DEAD 桶最大價值不是「刪很多」，而是把混在裡面的 5 條真 bug 撈到正確桶。

---

## 🧷 附帶產出（本 arc 順手做的，非坑清單主線）

1. **JWT 用法安全評估**（user 要求）：Notion case 已建（狀態 `討論`）——https://app.notion.com/p/396346da4cd081969e5af4b42661a270 。結論：機制合格，但 **access token 8.3h 太長、access/refresh 分工失衡**（P1 只動 config）；另 login_tokens 無清理、死 is_admin claim 等技術債。**尚未落 `docs/analysis/`**（本棒問過 user 是否要寫、未確認）。
2. **統一守門機制設計** = FR-048（已完工，見 §1）。

---

## ⚠️ Loose ends（跨 arc，別漏）

- **未 push**：BE 57 + FE 1 commit（含 FR-048 全部 + user-log#1 修正 + 追蹤表），全等 user 明示。
- **STG/POC migration 未套**：FR-048 capability seed 只套 DEV。
- **notion-issue-tracker.md 有個小錯待更正**：`docs/claude/notion-issue-tracker.md` 的 schema 表把 `新增日期` 標成可寫 date，實際是系統欄（created_time）不能寫——建 JWT case 時踩到、拿掉才成功。等收尾令時改。
- **untracked（user 的，別動別 commit）**：`docs/specs/v1.8.0/html.zip`、`docs/交付文件/v1.8.0/*.docx`、`docs/features/ddd-layer-audit/`。

---

## 📏 規範提醒（本 arc 適用）

- **不切 branch**（已在 `fix/v1.8.0-bugs`）；**push 永遠等 user 明示**；commit 顯式 `git add` 檔名、禁 `-am`。
- **不甩 caveat**：坑內文標「刻意不檢查 / 設計如此 / RLS 類 / 只記錄不修」要當真——本 arc 已證兩次盲加 auth 會打爆下載（OSCAL / otp-qrcode）。
- **派發前先驗真實程式碼 + FE 呼叫方式**，別憑 keyword 徽章或清單摘要刻 prompt（這紀律本 arc 屢次擋掉誤判）。
- **權限檢查放 service 層**（透過 domain service）；動 jedi-* 套件前先提醒 user 決策。
- **改 BE service code 提醒 user 重啟**（無 hot reload）；BE 異常先自己看 `log/app.log`。
- **收尾（spec / SUMMARY / FIXED / Notion / memory）一律等 user 明確下令**，plan approve ≠ 自動收尾。

---

## 🧊 冷接自檢（動手前先答）

1. 508 條現在哪些已收？→（SEC 75 完工手測 + 其他 204 定調完＝279；剩 6 桶 237 待排）
2. SEC 桶為何算完？→（衍生成 FR-048，全站 373 支端點掛守門、user 已手測；只剩 push/migration/e2e follow-up）
3. 其他 204 的處理原則？→（~175 設計告知 no-action，user 拍板「確認無害不管」；~25 可行動已備好待併桶）
4. DEAD 桶能不能一律刪？→（不能。五種性質，只刪真死碼；5 條其實是 bug 要撈到正確桶；1 條要接不要刪）
5. 接下一個桶的前置動作？→（抽桶 → 逐條分性質 → 同 root pattern 合併談 → 寫追蹤表 → 跟 user 討論再動手）
6. 你在哪個 branch？→（`fix/v1.8.0-bugs`，不切）
