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

## 卡片 title 格式
`FR-114.<批>-<序> <做什麼一句話>（SUMMARY #<號>，<嚴重度>）`
例：`FR-114.1-3 專案成員與任務指派寫入時先反查填進來的東西是不是這個專案的（SUMMARY #41／#109／#110，中）`
requirement 欄一律 `FR-114`。

## 開頭 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「卡 <批-序>」段。`

## 「工作區」段（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` 開）。

## 「做完要回寫報告」段（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 回寫段講清楚為什麼。

## 「紀律」段（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，停**，不要自己選。首腦（不是決策者）會回寫「首腦裁定」段，你下一輪讀到照做。
