| 項目 | 內容 |
|---|---|
| 緣由 | 接續 交接 #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,一切結論看這份)。 |
508 條坑 = 279 條已處理/確定不管(SEC 守門 75 條已完工手測 + 其他 204 條已二次歸類定調)+ 237 條待排的 6 桶(其中 DEAD 桶派發 prompt 已交 user、尚未有 session 執行)。真正還要動手的遠少於 237(大量是設計告知 no-action + 同 root pattern 重複)。
| 桶 | 條數 | 狀態 | 落點 |
|---|---|---|---|
| ① 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 |
整個授權守門不只 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 支逐支狀態,後續改權限先看這份)。FR-048 未竟 follow-ups(部署前必辦):
79c0133)——全等 user 明示才 push。scripts/sql/2026-07-07-fr048-phase4a-capability-seed.sql 只套了 DEV。A 族原本 3 條「未認證端點」的下場:user-log#1 已修(
182bb2f7,恢復 @jwt_required);OSCAL 下載 + otp-qrcode 因「瀏覽器原生 GET 帶不了 bearer」不能盲加 JWT,改走 4b signed-token 解掉。
核心發現: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 各幾條),下一棒接哪桶時,把該桶對應的『其他歸入』條目一起納入定調即可——不必另外搬動,清單已備好。
都還沒做「分族 + 逐條定調」的前置(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):
[] 清空」跨 job/公告/參與者多頁、STATE 桶「SSP 寫入無 phase guard ×6 頁」、UX 桶「date-only 時區 ×10+ 頁」。合併後 237 條實際塌縮成幾十個決策點。抽桶指令(把 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]}')
PY30 條(25 primary + 5 歸入)。本棒已產出完整派發 prompt 交給 user(在對話中,user 要派下去)。若下一棒是來執行 DEAD 桶的,重點:
這桶不是「一律刪」,混了五種性質,prompt 已要求先分類再動手:
users.topt_secret、v1 表殘留引用)。maintain_log_partitions() 已寫但無排程,刪掉=永久失去該功能)。DEAD 桶最大價值不是「刪很多」,而是把混在裡面的 5 條真 bug 撈到正確桶。
討論)——https://app.notion.com/p/396346da4cd081969e5af4b42661a270 。結論:機制合格,但 access token 8.3h 太長、access/refresh 分工失衡(P1 只動 config);另 login_tokens 無清理、死 is_admin claim 等技術債。尚未落 docs/analysis/(本棒問過 user 是否要寫、未確認)。docs/claude/notion-issue-tracker.md 的 schema 表把 新增日期 標成可寫 date,實際是系統欄(created_time)不能寫——建 JWT case 時踩到、拿掉才成功。等收尾令時改。docs/specs/v1.8.0/html.zip、docs/交付文件/v1.8.0/*.docx、docs/features/ddd-layer-audit/。fix/v1.8.0-bugs);push 永遠等 user 明示;commit 顯式 git add 檔名、禁 -am。log/app.log。fix/v1.8.0-bugs,不切)