# FR-114 資安修正派工 — 收口 SUMMARY（2026-09-28）

> 本檔由 `FR-114-LOG.md` 第 1～13 棒 block 濃縮而成（含第 6 棒補記、第 11／12 棒補記），不憑記憶重建。
> 現況的權威來源：每件問題的狀態看 [`docs/security-report/SUMMARY.md`](../../../security-report/SUMMARY.md) §0「1.21.0 出貨基線」；使用者可見變更看 [v1.21.0 release note](../../../release_notes/v1.21.0.md)。
> 母卡 CM-2019；收口母卡 CM-2282；延續 hotfix 母卡 CM-2289（FR-123）。

## 1. 一句話

資安檢視總報告的問題從 2026-09-21 開始翻成派工單，經第 1～9 批修正、四輪測試版（1.21.0b1～b4）在 190 測試機實測，**2026-09-28 以 1.21.0 正式版出貨到 190／188 STG／189 POC 三環境**。總報告 234 件中 190 件已修，沒修完的 9 件歸 1.21.1 hotfix（FR-123）。

## 2. 時間軸與 commits 範圍

| 階段 | 日期 | 棒 | 要點 |
|---|---|---|---|
| 翻單與開工 | 09-21～22 | 1 | 145 件翻成 48 張卡六批；開 BE／套件兩個常駐工作區（`fix/security-b1`）；41 張舊卡作廢 |
| 自動跑八輪 | 09-22～23 | 2～3 | 夜跑八輪（含一次零改動重跑）；首腦逐輪驗收＋獨立 opus 雙驗；47／52 Done |
| 最重兩張 | 09-23 | 4 | 代理程式控制面身分（CM-2052）、防竄改鏈（CM-2053）、時鐘偏差警告（CM-2085）；合回前整理稿 |
| 合回裁決與 b1 | 09-24 | 5 | 七項裁決全裁完；18 支套件發 Nexus；188 本體出 1.21.0b1、190 全新安裝 |
| 第 7／8 批與 b2／b3 | 09-25～27 | 6～8 | 掃描線交接的 27 張平行做完；第 8 批 12 張；證據分類改常駐服務；b3 移除後全新安裝 190 |
| 總測與 b4 | 09-27 | 9～10 | b3 總測回報 30 則→第 9 批 21 張＋FR-121 六張；b4 升級 190＋agent 1.1.0b2 |
| 驗證與進版 | 09-27～28 | 11～12 | 147 條非 UI 驗證；四 repo 合回 `feature/review`；1.21.0 正式版出包、三環境升級、六台代理程式升 1.1.0 |
| 收口 | 09-28 | 13 | 裁四件、開收口 Z1～Z5 與尾巴卡；hotfix 母卡 CM-2289 |

**commits 範圍**

- BE 主 checkout（`feature/review`）：`c61254ddc`（09-21，第 1 棒首筆）起，至 `4e7e2f987`（09-28，CM-2288 基線重產）；FR-114 資料夾相關 146 筆。
- 修正線 `fix/security-b1`（四 repo）：09-28 合回 `feature/review`——BE `fbbbb6d40`、套件 `feac7698`、FE `feac690`、agent `1355869`；尾巴兩支 `563355d22`／`54d171378` 由 CM-2288 合回（`27f601726`）。
- 進版：BE `02f680835`（1.21.0）、FE `50bda00`（版號對齊）、agent `6c17d21`（1.1.0）、`85ae5aadc`（升級排練抓到的 fr093-4d 修正）。

## 3. 改動範圍

| repo | 範圍 |
|---|---|
| BE | 權限守門與歸屬檢查全面補齊；全系統唯一任務歸屬判斷（CM-2113／2119）；憑證殘留清除；開機查 DB 鎖定紀錄；打包鏈修正（umask、cffi 守門、探針）；主線 migration 32 支 |
| jedi 套件 | **21 支全部發新版**（pin 見 `docs/claude/jedi-packages.md` 名冊）；套件自帶 SQL 69 支 |
| FE | 403 提示、錯誤碼三語文案、公告發送範圍、退役網址與按鈕移除、時間顯示收成單一函式（FR-121） |
| 檢測 Agent | 1.0.0 → 1.1.0：每請求帶通行證、401 自動重新註冊、時鐘偏差警告、Nuitka 版號修正 |
| installer／出貨基線 | `02-schema.sql` 在 b1／b3／b4／正式版前各重產，正式版後再補一次（CM-2281 蓋章）；99-stamp 基線標記 `__init_baseline_v1.21.0__` |

## 4. 行為差異

不重抄，見 [v1.21.0 release note](../../../release_notes/v1.21.0.md) §2（使用者可見變更）、§3（Breaking Changes）、§4（DB Migration）。

## 5. 決策清單（從各棒「決策」欄收）

**派工方式**
- 依序做不平行，開工作區只為不碰掃描線主 checkout（第 1 棒）；第 7 批起改平行六條線、線內依序（第 6 棒）。
- 首腦驗過直接 Done，不逐卡攢給決策者批；最後從安裝到功能整個重測（第 2 棒）。
- 不再開 subagent 做重工作：runner session 依序做、每 session ≤4 張（第 9 棒）。

**技術方向**
- 代理程式身分：雲端用既有 `AGENT_JWT_PRIVATE_KEY` 發長效通行證、每請求驗簽＋查 DB 撤銷；取代原規劃的短效通行證（第 4 棒）。
- 解鎖回執帶原廠 unlock token，閘門與回填都重驗（第 4 棒）。
- 開機查 DB 只收窄「權限不足」，表不存在維持放行（第 5 棒）。
- 補權限資料的 migration 一律 `envs=*` 隨出貨（第 3 棒）。
- 超級管理員不再免專案成員檢查（第 5 棒後段，b2）。
- 證據分類走常駐服務（C 案），一次到位用 HTTP（第 7～8 棒）。
- 資料庫統一存 UTC、畫面先固定台北時間，開 FR-121（第 9 棒）。
- 匯入原始檔一律保留到儲存後端（第 9 棒）。
- 群組／控制項成員功能退役；「補 project_id」作廢，改指派前核對任務所屬專案（第 6 棒）。

**發版與環境**
- 現在合回、在工作區發版、出貨基線整包重產；版號先出 1.21.0b1 測試版（第 5 棒）。
- 同一支套件改動全做完、驗完才發一次（第 5 棒）。
- 這版沒有 PROD 授權中心主機，封包 `--skip-prod-key-check`（第 5、12 棒）。
- 不跑全站自動回歸，收口後另派一棒重整（第 12 棒）。
- POC 升級撞 deadlock 走「停服重跑」；1.21.0 的兩個升級 bug 以 hotfix 補進基線、不 bump 版號（第 12～13 棒）。

**收口**
- 127 張修正待驗證全 Done；沒修完的 9 件另開 1.21.1 hotfix 母卡，後續加 AI 資安議題（第 13 棒）。
- SPEC／手冊先補前五處，其餘登記待補；v1.21.0 快照凍結不回改（第 13 棒）。

**不修（已裁）**：#101 Nexus https（內網）、#124 SeaweedFS secure、#75 前端打包帳密、#98／#99、BE log 印 request body、問卷清單只看作用租戶（#31）、`/version` 免登入端點。

## 6. 教訓清單（從各棒「教訓」欄收）

**派工與規格**
- 一支 subagent 吞 145 件爆 context 兩次零產出；改三層（材料檔 → 分批 subagent → 本體總裝）後一次過。
- prompt 要寫 tool call 上限與落盤時限；「抄不到就標待補」會被理解成「查到為止」。
- 首腦給修法或「對齊 X」之前先開檔確認 X 存在，不憑表名推鏈路。
- Workflow 觸發原話會原文轉發給 runner 且優先——貼的 prompt 必須以 runner 視角寫。
- 卡上紀律要寫「不改任何腳本的範圍／模式參數」，runner 會為了讓檢查過而放寬（CM-2048 夾帶 242 檔）。
- 派「送超大請求驗上限」這類卡要用 QA 驗收語言，引資安報告原文的「炸彈／打垮」會被判成攻擊指令。
- 開卡時 M 頁條號要對報告表，不對 SUMMARY 出處欄；總表 # 編號曾重排，對照一律用 M 編號。

**驗收**
- 驗收真正抓到東西的地方：runner 沒跑的呼叫端測試、跨 repo 連帶（錯誤碼撞號、FE 文案、鏡像同步）、為了讓檢查過而放寬範圍。
- 驗證 agent 判過的卡，首腦再派獨立 opus 抽一次，第三、四輪各抓到真問題——雙驗是固定程序。
- 信任鏈類裁定，現況事實先由獨立 agent 開檔核對再裁；runner 的問題描述是它的視角不是事實。要問「驗的材料是誰產的、產的時候有沒有驗」。
- 套件卡 pytest 要帶 PYTHONPATH，並對照不帶時的結果證明測到新版。
- 新錯誤碼要跨 monorepo 全部 common 目錄 grep 號碼。
- 掛能力點前看公版 seed 把那顆給了誰；「不擋正常客戶」的判準是出貨公版 seed，不是 DEV 資料。
- 驗權限守門前先查測試帳號的實際能力點，不看角色名。
- 清憑證的卡，驗收第一件事是拿 `.env` 值 grep commit message 與 Notion（CM-2049 曾把密碼真值寫進 commit）。
- runner 說「實跑過」要找痕跡；驗 hash 鎖定不能用整個 Dockerfile build（layer cache 會騙人）。
- 盤「未修」要連到卡的實際狀態，總表狀態欄是人手改的、會落後。

**發版、打包與升級**
- 發版與改碼並行會一直補發（iam 1.4.1→1.4.2→1.4.3）；從 worktree 發版會漏不入版控的資產（`.mo`）。
- 動打包方式的卡要比對上一次成功 build，不要邊 build 邊撞。
- build 機禁止用 root 操作 git；跑 build 的 shell umask 077 會出壞產物。
- 🔴 升級驗證要拿真實舊版客戶庫排練——「上一個 beta 升上來」與「乾淨新裝」都覆蓋不到隔一版的舊庫（1.21.0 因此抓到 fr093-4d）。
- 修 migration 後要重 build init image 再封包，並用 image id 核 bundle 內是新那顆。
- installer 升級套 migration 前要先停 api／socketio，否則有人在打就 deadlock（POC 實踩）。
- 升級腳本判管理員要看旗標不看能力點；回填登記類 migration 要先驗物件存在。
- 代理程式升級前先確認註冊碼仍 enabled，否則自動重新註冊必 401。
- 基線庫 `*_old` 表重產前要清，否則會帶給新裝客戶。

**首腦自身**
- 排順序先看「輸入會不會再變」，依賴還在改的盤點現在做就是白工；不要替決策者決定延後。
- 收報型首腦每收完一批就中繼交接（第 9 棒 context 爆掉、compaction 失敗）。
- 回報問題必附分析與建議，用白話。
- 同一台機器兩個 session 同時動，要在 STATE 立刻互寫。

## 7. 規範文件清單

| 文件 | 狀態 |
|---|---|
| `docs/security-report/SUMMARY.md` 終局化 | ✅ CM-2285（`887758ac7`） |
| `docs/release_notes/v1.21.0.md` | ✅ 進版時寫 |
| `docs/spec-site/current/` 前五處＋待補清單 | CM-2286（收口 Z4） |
| memory 兩邊對齊＋FR-114 教訓入 memory | ✅ CM-2287（`398eea257`） |
| analysis：`docs/analysis/2026-09-23-agent-control-plane-identity-token.md` | ✅ 第 4 棒 |
| FR-114／FR-121 README、登記表、`jedi-packages.md` 名冊 | ✅ CM-2284（本檔同批） |

## 8. 已知 follow-up

- **1.21.1 hotfix（CM-2289／FR-123）**：資安總表沒卡未修的 9 件＋installer 升級鏈三個缺口（升級第③步不停 api 會 deadlock、`schema_version` 表升級不更新、代理程式註冊碼停用後自動重新註冊必 401）＋AI 資安議題預留；第一批子卡待決策者裁。
- **連 DEV 那台代理程式（123）**：等 DEV 註冊碼後 `re-enroll --endpoint http://10.8.0.6:8000`。
- **出版前回歸測試重整**：147 條非 UI 驗證中 72 條環境驗不到的收進 e2e。
- **PROD 授權簽發公鑰**（CM-2274 擱置）：等有 PROD 授權中心主機那一版。
- **FR-117** 出貨基線改依套件產生：1.21.0 後再排。
- 其餘見 [release note](../../../release_notes/v1.21.0.md) §7。
