FR-114 每張修正子卡都要帶的共同段(建卡 spec 時逐字併入)

§1

卡片 title 格式

FR-114.<批>-<序> <做什麼一句話>(SUMMARY #<號>,<嚴重度>) 例:FR-114.1-3 專案成員與任務指派寫入時先反查填進來的東西是不是這個專案的(SUMMARY #41/#109/#110,中) requirement 欄一律 FR-114。

§2

開頭 quote(每張第一個 block)

本卡屬 FR-114 資安修正(母卡 CM-2019),第 <N> 批「<批名>」卡 <批-序>,修 SUMMARY #<號>(出自 <Mxx-n>)。<嚴重度>。修法規格來自內化卡 <CM-xxxx>,計畫在 docs/features/FR-114-2609-security-fix-dispatch/batches/plan-b<N>.md「卡 <批-序>」段。

§3

「工作區」段(h2,放在「在哪裡」之前)

  • BE 側:在 /Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/.claude/worktrees/wt-fix-security(branch fix/security-b1)改,不要碰主 checkout(掃描線正在讀它)。跑服務用 PORT=8001。
  • 套件側:在 /Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/.claude/worktrees/jedi-wt-fix-security/<套件目錄>(branch fix/security-b1)改,只動自己那支套件的子目錄、只 git add 該子目錄下的檔。
  • 跨 repo 的卡:BE 工作區 pyproject.toml 把該套件的 pin 改成 jedi-xxx = { path = "/Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/.claude/worktrees/jedi-wt-fix-security/jedi-xxx", develop = true },poetry update jedi-xxx。這個 path 改動不 commit(git add 時跳過 pyproject.toml)。
  • FE 卡:/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-fe/.claude/worktrees/wt-fix-security(branch fix/security-b1;不存在就 git worktree add .claude/worktrees/wt-fix-security -b fix/security-b1 開)。
§4

「做完要回寫報告」段(h2,放在「手測」之後)

程式 commit 之後、Notion 回寫之前,順手改報告狀態(在 BE 工作區改,跟程式同一個 branch 另一個 commit):

  • docs/security-report/M<NN>-<模組>.md:本卡那幾條在「問題一覽」表的狀態欄改成「✅ 已修(FR-114.<批-序>)」,「怎麼修」欄最後加一句實際修法(一句,白話)。只動狀態欄與那一句,不重寫段落。
  • docs/security-report/SUMMARY.md:問題總表對應 # 的狀態欄改「✅ 已修」,批欄改「—」。
  • 重 build:python scripts/deliverables/render_index.py docs/security-report/ --site-root docs/security-report/,把產出的 html 一起 git add。
  • 若本卡修法與內化卡記的修法不同(實查後改了做法),在模組頁那一句寫實際做的,並在 Notion 回寫段講清楚為什麼。
§5

「紀律」段(h2,固定尾巴,每張最後一段)

  • 只改本卡「在哪裡」列的檔與它們直接牽動的檔;發現範圍外的問題不修,回寫本卡記下來。
  • 先查再寫:補守門一律用 common/authz/(BE)或套件既有的 assert_*/guard port,不另立 helper;新增 error code 照 GRC_<HTTP><序號>。
  • 功能不能壞(原則三):手測段每條都要親手點過;安全措施不可擋正常客戶(原則十一):拿不準時往「安全的預設值」倒,不擋啟動。
  • 每個入口都要改:「在哪裡」列的每個 file:line 都是驗收項,漏一個驗收不過。
  • 🔴 套件卡跑 pytest 一律顯式帶 PYTHONPATH=<套件工作區路徑>——BE 的 pyproject 對套件是 pin,不帶 PYTHONPATH 驗的是 site-packages 的舊版、改動沒被測到還全綠(CM-2023 踩到)。
  • 不寫新 unit test(CLAUDE.md 測試政策);改動模組若有既有測試檔,跑那一檔確認沒弄壞,把指令與結果寫進回寫。
  • 檔案內註解只寫「為什麼」與「陷阱」(一到兩行);「做了什麼/哪一棒」進 commit message。
  • 動到已超過 800 行的檔,新邏輯一律新開檔再從原檔一行呼叫。
  • 顯式 git add <檔名>,禁用 -am;pyproject.toml 的 path 改動不 add。commit message 寫清楚做了什麼/為什麼/驗證了什麼/踩了什麼坑,結尾 Co-Authored-By: Claude <model> <noreply@anthropic.com>。
  • 做完立刻:① commit ② 改報告狀態+重 build+commit ③ 本卡 append 白話補充(做了什麼、關鍵決定與理由、commit hash、跑了哪些測試、手測清單)④ 狀態改「修正待驗證」。不等令、不停下來問;卡住就 commit 已完成部分並回寫卡在哪。
  • 不 push、不切 branch、不發版、不套 STG/POC、不改 DEV 以外任何環境。
  • 若本卡新增主線 migration:回寫時明講「出貨基線待重產」,不自己動 188 基線庫。
  • 卡上寫「先回寫問決策者」或做到一半發現修法與現況對不上:回寫本卡「🔴 需首腦裁:<在哪裡/發生什麼/選項/我的建議>」,狀態留 Not started,停,不要自己選。首腦(不是決策者)會回寫「首腦裁定」段,你下一輪讀到照做。