FR-047 全站已知坑處理 — 交接(剩餘桶,2026-07-08)

項目 內容
緣由 508 條「已知坑」逐桶處理 arc。SEC/SCHEMA/DEAD/其他/ECODE 已收口,剩 UX / STATE / REPLACE 三桶待處理。本棒交接給下一棒續做。
branch fix/v1.8.0-bugs(不要切;不對就停下問 user)
唯一進度真相 🔴 docs/analysis/2026-07-07-known-pits-remediation-tracker.md —— 只有這一份追蹤表。一切定調/銷帳/桶狀態看它、寫它。絕對不要另建第二份清單/checklist(上一棒交接曾出現兩份追蹤表造成混亂,已刪除,勿重蹈)。
收口 SUMMARY docs/features/FR-047-2607-feature-spec-handbook/handoff/2026-07-08-known-pits-remediation-SUMMARY.md(已完成部分的彙整)
母清單 docs/analysis/2026-07-07-spec-known-pits-inventory.md(508 條原文,只讀不改分類
預估 剩 3 桶約 113 條,但照塌縮率實際動手估 一二十個決策點(~85% 是告知類 no-action)

🧭 這個 arc 在解決什麼(WHY,先讀再動手)

FR-047 spec 手冊全站 67 頁的 §12「邊界情況與已知坑」被彙整成 508 條清單關鍵認知:這 508 條不是 508 個待辦——§12 是寫給工程師的「邊界情況告知」,混了三種東西:

  1. 可修 bug / 缺口(安全守門、真 bug、死碼)
  2. 刻意設計、只是提醒(full-replace、best-effort、date-only 時區慣例)—— 知道就好,不是要改
  3. 文件/schema 澄清

arc 的目標=逐桶把「①可修」挑出來修,②③ 一律 no-action(維持現狀)。 前 5 桶實證:真正動手的遠少於總數(SCHEMA 60 條真動手 5 個 DDL、其他 204 條 ~25、ECODE 25 條真缺陷 7 條)。下一棒的三桶同理——大部分會是 no-action,別把每條當 bug 修。


§0 接手讀序(按順序,讀完才動手)

  1. 🔒 本文件全讀(懂 WHY + 現況 + SOP)
  2. 🔒 docs/analysis/2026-07-07-known-pits-remediation-tracker.md 全讀(唯一進度真相;看已收桶的定調模式、剩桶的預收歸位條目)
  3. 2026-07-08-known-pits-remediation-SUMMARY.md(已完成彙整、loose ends、部署狀態)
  4. CLAUDE.md 權限/DDD/DB transaction/error code/jedi 套件異動/DROP 前四查規範
  5. 母清單 2026-07-07-spec-known-pits-inventory.md(要抽桶時查原文,只讀)

冷接自檢(答不出回去讀,別碰 code)

  1. 508 條的核心認知是什麼?→(§12 是邊界告知非待辦,~85% no-action,只挑①可修)
  2. 進度真相在哪一份文件?可以另開清單嗎?→(唯一 tracker,絕不另開第二份
  3. 接一個桶的 SOP 五步是什麼?→(見 §3)
  4. 動手前對每條坑要先做什麼?→(live 驗證真實碼/DB,spec 文字常過時誤報)
  5. 你在哪個 branch?發版/merge 能自己做嗎?→(fix/v1.8.0-bugs,發版/push/merge 全等 user 明示)

§1 現況:508 條桶層總帳(細節看 tracker 進度總覽)

狀態
① SEC (75) ✅ 收口(→ FR-048)
② SCHEMA (60) ✅ 收口(DDL 5 項 DEV+STG 已套;升級 2 條已修;告知類 no-action)
④ ECODE (39) ✅ 收口(真缺陷 7 條已修+發版;告知類 no-action)
⑦ DEAD (30) ✅ 收口(死碼刪、v1 鏈退役、C 族改桶;B 族 topt_secret 待定調)
⑧ 其他 (204) ✅ 三次複核(~175 no-action、25 歸桶、1 誤報)
③ UX (47) 待抽桶
⑤ STATE (33) 待抽桶
⑥ REPLACE (33) 待抽桶

已收的 5 桶不要重做。 三桶各有「從其他桶歸位進來」的預收條目,寫在 tracker 各桶段落 + §其他二次歸類「可行動清單」——抽桶時把該桶的歸位條目一起納入。


§2 前棒教訓(別重蹈)

  • 絕不建第二份追蹤表:上棒出現兩份 checklist(docs/features/FR-047.../known-pits-remediation-tracker.md vs docs/analysis/...)造成混亂,已刪前者。只用 docs/analysis/ 那份
  • 動手/升級前一律 live 驗證:spec 文字常過時。本 arc 抓到多條誤報——system_owner comment 早修好、info-system#4 route 早回 404、tenant-manage#5 marshal apply=False 不影響 response。先 grep 真碼 / 查 DB 再定調
  • 改套件 ≠ 授權發版:發版(bump + 推 Nexus)不可逆,一律等 user 明示。本 arc 執行 session 曾自行 bump 超前。
  • 不甩 caveat:坑內文標「刻意不檢查 / 設計如此 / RLS 類」要當真——盲改會打爆(FR-048 那批 2 次盲加 auth 打爆下載的前科)。
  • 告知類收攏成族群索引 no-action,別逐條;但 spec 自斷言「無害」的條目快速 confirm 一次再放生。

§3 接一個桶的 SOP(五步,每桶照做)

  1. 抽桶:跑下方腳本把該桶條目 + 內文全撈出來。
  2. 逐條讀內文分性質:真缺陷 / 設計告知 no-action / 同 root pattern 重複 / 屬別桶。每條可行動的先 live 驗證(grep 真碼、查 DB)。
  3. 同 root pattern 合併談:例如 REPLACE「送 [] 清空」跨多頁、STATE「SSP 寫入無 phase guard ×N 頁」、UX「date-only 時區 ×10+」——合併後塌縮成幾個決策點。
  4. 寫進 tracker(唯一那份):開 §UX / §STATE / §REPLACE 段,逐族定調(比照已收桶的寫法)。
  5. 跟 user 討論定調 → 才動手絕不自己開修——本 arc 全程「先定調、user 拍板、才派工」。

抽桶腳本(把 UX 換成 STATE / REPLACE):

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")
n=0
for i,l in enumerate(lines):
    m=re.match(r'- \*\*\[([^\]]+)\]\*\*\s+(\S+)\s+(.*)$', l)
    if m and m.group(3).strip().startswith("`UX`"):
        n+=1
        b=next((lines[j].strip() for j in range(i+1,len(lines)) if lines[j].strip()),"")
        print(f'{n:2d}. [{m.group(1)}] {re.sub(r"[*`]","",b)[:100]}')
print(f"\nTOTAL = {n}")
PY

三桶各自的預收方向(詳細內文抽桶後才有;這裡只給定位):

  • UX (47):date-only 時區 ×多頁(同 root)、i18n 漏譯、toast、分頁、即時刷新。歸入:user-profile#1(TOTP 未驗證就啟用會自鎖)、device#5/department#5(status 欄無 UI)。跨 FE repo(~/Projects/Billows/Audit-Manager/compliance-manager-fe/)。
  • STATE (33):前置檢查不對稱、可繞過、凍結時機。大宗=「SSP 寫入無 phase guard ×6 頁」(先對 FR-048 端點授權矩陣查哪些已被收,可能塌縮剩幾條)。歸入:import-docx#3(phase guard)、問卷填答狀態機 2ffec
  • REPLACE (33):full-replace 送 [] 清空、非單一交易、FK 級聯、硬/軟刪。歸入:user-import#2(批次非單一交易)、role-manage#2/user-form#3(全量取代漏帶=刪授權)、department-manage#7(刪部門 FK 未查證)、issue-integrate-config#1(DEAD C 族改桶)。

§4 零星 loose ends(未修 / 未定調,桶外)

在 tracker §各段有記,摘要如下——這些是 arc 尾巴,不急,user 排

  • otp-resend type/mfa_type 未修api/auth/routes/otp_route.py:148kwargs.get("mfa_type") 但 serializer MfaResendRequest 宣告 type → TOTP 使用者靜默走 email。標了「→BUG/ECODE」但沒派工。Notion case 61db 維持 Not started。
  • AUTH_401009 文件漂移:ECODE#4 改碼後舊碼殘在 8 檔(docs/reference/error_code.jsondocs/system-design/scripts/data/_all_error_codes.json、specs 的 auth/forget-password + system-admin/user-profile 的 md/html/dot)→ 應 AUTH_401009AUTH_400003。純文件 spec-sync。
  • spec §12 更正tenant-manage#5 誤報、storage-config#5 無害澄清(走 writing-feature-specs skill)。
  • DEAD B 族 topt_secret drop:DEV 查乾淨(0 資料零引用),待 STG/POC 確認 + user 拍板(跟 POC 一起等)。
  • locale 對稱輕量驗證:可翻譯欄位 update 路徑是否都有傳 locale(SCHEMA ⑤ 列的待辦,非 bump)。
  • FR-048 e2e ×2(test repo):QR 顯示 / 框架下載前科件 + 負向案。

§5 檔案座標

  • 進度/定調docs/analysis/2026-07-07-known-pits-remediation-tracker.md(唯一)
  • 508 母清單docs/analysis/2026-07-07-spec-known-pits-inventory.md(只讀)
  • 收口彙整docs/features/FR-047-2607-feature-spec-handbook/handoff/2026-07-08-known-pits-remediation-SUMMARY.md
  • FR-048 端點授權矩陣(STATE 桶查 phase guard 用):docs/features/FR-048-2607-unified-auth-guard/endpoint-authz-matrix.md
  • FE repo(UX 桶):~/Projects/Billows/Audit-Manager/compliance-manager-fe/(改前讀其 CLAUDE.md)
  • jedi 套件(若某坑在套件層):~/Projects/Jedicogy/module/jedi-python-package/

§6 Pre-flight(開工前必跑)

cd ~/Projects/Billows/Audit-Manager/compliance-manager-be
git branch --show-current          # 應為 fix/v1.8.0-bugs,不是就停下問 user
git status --short | grep -v '^??'  # working tree 應乾淨(?? untracked 的 docx/zip 是 user 的別動)
git rev-list --count @{u}..HEAD     # 領先 upstream 數(本 branch 已 push 到 origin/fix/v1.8.0-bugs)
lsof -i :8000 | grep LISTEN         # BE 是否在跑(BE 由 user 起)

§7 已完成的不要重做(verify 已收桶)

已收的 5 桶 fix 都已 landed + 部分手測 + jedi 套件已發版(Nexus pin)。不要回頭追已修的坑。若懷疑某條狀態,查 tracker 那一列(不是重新調查)。已修清單見 SUMMARY §3。


§8 行為規範(本 arc 適用)

  • 不切 branch(已在 fix/v1.8.0-bugs);push / 發版 / merge to main / 主專案進版 全等 user 明示,不自動做。commit 顯式 git add 檔名、禁 -am
  • 絕不建第二份追蹤表(見 §2)。定調一律寫 docs/analysis/ 那份。
  • 每條可行動坑先 live 驗證再定調(spec 常過時誤報)。
  • 權限檢查放 service 層(透過 domain service);動 jedi-* 套件前 path dep 開發、發版等明示。
  • 改 BE service code 提醒 user 重啟(無 hot reload);BE 異常先自己看 log/app.log
  • 不甩坑內 caveat(刻意不檢查/設計如此/RLS 類要當真)。
  • 收尾(spec/SUMMARY/Notion/memory)等 user 明確下令,plan approve ≠ 自動收尾。
  • 跨 FE repo 先讀 FE CLAUDE.md;不晶晶體。

§9 收尾流程(每桶定調完 / fix 完)

  • 桶定調完 → 寫 tracker 對應 §段(不另開檔)→ 跟 user 討論。
  • fix 完 → 給 user 一句話 status + 手測 checklist,,等 user 下令才做 SUMMARY / Notion / spec / memory。
  • closing-and-handoff skill 的收尾 SOP。

§10 不在本期 scope(別順手做,會 scope creep)

  • 不做主專案進版 / merge to main——arc 沒完(還 3 桶),branch 繼續累積,等 user 決定。
  • 不重推發版 / 不 push——已發版/已 push 的別動;新 commit 的 push 等 user 明示。
  • 不套 POC migration——user 明確按住(先等等)。
  • 不重做已收 5 桶
  • 零星 loose ends(§4)非本期主線——user 點才做。

§11 本 arc commits(對照用)

  • 主 repo compliance-manager-be:已 push 到 origin/fix/v1.8.0-bugs(領先 origin/main ~93,待未來 merge)。含 FR-048 全批 + BUG 池 + SCHEMA(DDL+升級) + ECODE(#1/#2) + DEAD + 追蹤表/SUMMARY。
  • jedi monorepo:5 套件已發版 Nexus(system-menu 0.0.9/auth 0.1.24/information-system 0.0.3/survey 0.0.24/device 0.0.12),主 pyproject 已 pin 新版。
  • FE compliance-manager-fe:FR-048 4b 79c0133、DEAD 死碼刪 7afeb49、ECODE#4 i18n b7a9929
  • 詳見 SUMMARY §3。

§12 給下個 session 的超短 prompt

接手 FR-047 已知坑 arc 剩餘桶(UX/STATE/REPLACE)。先讀交接文件全文:
docs/features/FR-047-2607-feature-spec-handbook/handoff/2026-07-08-known-pits-remaining-buckets-handoff.md
再讀唯一追蹤表 docs/analysis/2026-07-07-known-pits-remediation-tracker.md(進度真相,絕不另開第二份清單)。
答完交接檔 §0 冷接自檢 5 題再動手。branch fix/v1.8.0-bugs 不切、push/發版/merge 等我明示。
接哪桶等我指定:照 §3 SOP「抽桶→逐條 live 驗分性質→同 root 合併→寫追蹤表→跟我定調」,別自己開修。