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

項目 內容
緣由 接續 交接 #1。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,一切結論看這份)。

§1

🧭 一句話現況

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


§2

📊 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

§3

§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 解掉。


§4

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

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

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

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

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


§5

§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 換成目標桶):

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

§6

§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 撈到正確桶。


§7

🧷 附帶產出(本 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)。

§8

⚠️ 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.zipdocs/交付文件/v1.8.0/*.docxdocs/features/ddd-layer-audit/

§9

📏 規範提醒(本 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 ≠ 自動收尾。

§10

🧊 冷接自檢(動手前先答)

  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,不切)