# FR-114 夜跑執行首腦——交接 prompt

> 用法：開一個新 Claude Code session（model **Opus**、effort **medium**），工作目錄 BE repo 根目錄，把下面 code block 整段貼進去（把「第 N 輪」換成實際輪次）。它會跑 Workflow：一張卡派 runner → 派驗證 → 過才下一張，不過就攢著、發桌面通知。掛了用 `resumeFromRunId` 從斷點接，已完成的卡不重做。**code block 的內容會被 Workflow 原文轉發給每個 runner**，所以它寫的是「做卡」而不是「跑腳本」——執行首腦自己怎麼操作見下方「執行首腦操作」段。
>
> 開跑前要確認：①機器不睡（`caffeinate -i` 或系統設定）②這個 session 所在的工作目錄有 `.claude/settings.local.json` 的 `defaultMode: bypassPermissions`（目前 BE 主 checkout 有；工作區 `.claude/worktrees/wt-fix-security/` 沒有 `.claude/settings.local.json`，runner 在那裡跑 git／poetry 會撞權限——**開跑前把主 checkout 的 `.claude/settings.local.json` 複製一份到工作區同路徑**）。

```
這是 FR-114 資安修正第 N 輪自動跑。目標：把 `docs/features/FR-114-2609-security-fix-dispatch/night-run/cards.json` 列的每一張 Notion 卡做完——每張卡的工作內容以卡片本文與卡尾最新一段「首腦裁定」為準；被派到某張卡的人就做那張卡的程式修正、commit、Notion 回寫，照派給你的任務文字裡「先做」「紀律」「最後回報」三段執行。不 push、不切 branch、不合回主線、不發版、不套 STG/POC、不動 docs/security-report/。

若你是收到這整段、且手上有 Workflow 工具的執行首腦：照 `docs/features/FR-114-2609-security-fix-dispatch/night-run/HANDOFF.md`「執行首腦操作」段做（跑 workflow.js、args 傳 cards.json 內容、跑完總結 append 母卡 CM-2019 並發桌面通知）。若你手上沒有 Workflow 工具，你就是被派來做單張卡的 runner，忽略上一句，直接做派給你的那張卡。
```

### 執行首腦操作（只有貼上面那段的那個 session 要看；不會被轉發給 runner）

- model **Opus**／effort **medium**，工作目錄 BE repo 根目錄。
- 跑：`Workflow({ scriptPath: "docs/features/FR-114-2609-security-fix-dispatch/night-run/workflow.js", args: <cards.json 用 Read 讀進來的 JSON 物件，不是字串> })`。腳本自己會：一張卡派 runner（model 照 cards.json）→ 派驗證 agent（opus，只讀）→ 驗過才下一張；驗不過、需裁的跳過攢著、不停整批，只有 agent 死掉才停。
- 你不自己修程式、不自己驗、不改任何檔。
- 跑完（或停）後：① 讀回傳 `results`，寫成白話總結（哪幾張過／需裁／失敗為什麼／剩哪幾張）append 到母卡 CM-2019 `https://app.notion.com/p/SUMMARY-145-worktree-3e2346da4cd0816a87fde3fc8a7eb10c`（`python scripts/notion_case.py append <母卡 URL> --file <md>`）② 發桌面通知 `terminal-notifier -title "FR-114 自動跑" -subtitle "<過幾張／停在哪>" -message "<一句>" -sound Glass` ③ 在對話裡回報同一段。
- 中途掛掉（API 500、context）：用回傳 runId `Workflow({ scriptPath, args, resumeFromRunId: "wf_xxx" })` 接續，**最多兩次**，第三次還掛就停下回報。
- 跑完就停，不往收尾跑。

> 🔴 **為什麼貼的那段不能寫「你只要跑 Workflow 腳本」**（第六輪事故，2026-09-23）：Workflow 工具會把觸發它的那段原話**原文轉發給每一個 runner**，並告訴 runner「原話優先於腳本給你的任務」。原話若寫「你只負責跑腳本」，runner 就以為自己要跑 Workflow，沒這工具便回報做不到、零改動（第四輪 CM-2048、第六輪 CM-2048＋CM-2042 都是這樣）。前幾輪多數卡沒中招只是 runner 剛好選聽腳本那段。所以貼的那段主體必須是「做卡」，執行首腦自己的操作放這一節、不進被轉發的主體。

## cards.json 怎麼填（大首腦已填第一波；要改順序或加卡改這裡）
每張：`{ "id": "1-3", "caseNo": "CM-20xx", "url": "...", "title": "...", "model": "opus", "effort": "medium", "repo": "pkg", "batch": 1 }`
- `model`／`effort` 照 dispatch-plan 各卡建議欄。
- 順序＝執行順序；相依的卡（1-1→1-2、1-9→1-6、5A-4→5C-7）要前後排對。
- 「先回寫問決策者」的卡（1-1、1-5a、1-7、5A-1、5A-2、4-1、4-2、4-4、5C-2、5C-6）**不要排進夜跑**，白天派。
