---
title: 資安掃描 LOG — FR-075 ＋ FR-076（append-only）
---

# 資安掃描 LOG（append-only，每棒追加一 block）

## 第一任首腦（2026-09-05 ～ 09-06，Fable 5.1 主 session）

**做了什麼**：從零建立兩個掃描 arc，跑出可行的方法，驗收七棒，開 21 張修正卡，把接手需要的東西入版控。

**commits**（BE repo，`feature/FR-075`）：f926090f 開 FR-075 → 9a5acc8d 建站 → ed6d70a9 拆六棒 → 4da50a64 改垂直切 → 4b2fb9f6 S2/S3 驗收開 3 卡 → 91c022f7 S1 驗收開 5 卡 → 80428720 CM-1561 裁決 → 854f01c9 S4-S7 全滅判定 → 7bef0159 開 FR-076 → 726b4536 L1 驗收 → 96028e11 S4 驗收含 CRITICAL → 03d169aa L2 驗收 → 97979547 CM-1579 裁決 → d176423e 公鑰議題 → 1fb25e97 L4 驗收 → 7d388a19 memory 入版控 → 本 block 的 commit（skill＋STATE＋建卡腳本）

**決策**：
- 工具選 claude-security plugin（決策者堅持要工具而非人工，理由「工具出來一定有它的知識在」）
- 第一輪 medium 派 40 agent 手動停掉；第二輪 low 額度耗盡零產出；才定案 low
- 切棒從「6 棒混合切」改成「7 棒按模組垂直切」（決策者指出水平切看不到接縫）
- S4～S7 首輪 Sonnet 全滅後改 Opus 1M，S4 第二輪 3.5 小時跑完含 CRITICAL，方法論定案
- L1（10 檔 55 分）、L2（33 檔 90 分）、L4（43 檔 110 分）三度確認 Opus 1M＋小範圍可行

**教訓**（已入 skill 第一、二節）：
1. 研究員繼承主 session 模型與 context 上限，effort 管不到這層
2. 工具被註解說服（S2）、越界（S7/L1/L2）、只驗成立不驗範圍——三個固定盲點
3. 工具找 LOW 人找 HIGH（L2）——卡片「重點看什麼」要靠 runner 追
4. 掃描定時檢查不耗 token，驗收才耗；Monitor 不適合（無事件流可掛）
5. 修正與掃描可平行但同套件要錯開，決策者裁「先修 FR-076 再動 FR-075」

**推翻了什麼**：
- 「主 session 切便宜模型再啟動掃描」（scan-methodology 早先建議）→ 推翻，便宜模型的 context 上限跟著繼承
- 「把 S4-S6 切更細維持 Sonnet」→ 推翻，S7 證明研究員為追脈絡一定往外讀，切小不減量
- 「掃描完再修」→ 推翻，不同套件可平行

**未完成交棒**：S5 掃描中、S6 狀態不明、S7 核心未掃、L3 未派、CM-1572/1580 待驗、四項待決策者裁。全在 STATE。

## 第二任首腦（2026-09-06 傍晚～晚，Sonnet 5 主 session）

**接手原因**：第一任首腦（Fable 5.1）遇到間歇性 400 錯誤中斷，本任接手繼續驗收與派工。

**做了什麼**：驗收 S5 掃描棒＋L3 掃描棒；驗收並推動 16 張修正卡從待派到 Done（含兩輪驗收批次）；改裁三項先前決策（CM-1561 拔除→關閉、CM-1579 SaaS 前暫緩→現在做、CM-1560 TLS .env→設定頁欄位）；派出 CM-1559 第一步盤點；收尾更新 STATE/LOG。

**commits（各 repo，散落在多輪驗收裡，完整清單見母卡 CM-1546／CM-1566 尾段驗收表）**：
- jedi-iam：`b51b914`（1557）`2bf2003`（1558）`6a13d96`（1563）`4c7579c`（1565）`9b353ee`→`20c6713`（1560）`4984e1e`（1585）`dbb96aa`（1586）`7cf3cf2`（1576）`76a8c2d`（1562）`608d077`（1578）`d28e364`（1561）`eaa8de7`（1577）`a9edf1d`（1575）
- BE（本 repo，`feature/FR-075`）：`83c5b118`（1565）`3ad876ae`→`f503fba3`（1560）`d08bc34c`（1561）`d4d1b0e4`（1564）`f867540f`+`2ea76ef7`（1587）`7097774`（1586）`b67e9cdd`（1577）
- FE：`d3283e5`（1557）`52a40c4`（1558）`78903b2`（1560）`2268571`（1585）`0f1d0ed`（1564）`21157820`（1587）
- License Center：`a68200c`（1583）`58c0e98`（1584）
- jedi monorepo：`ed62d8a`（1573）
- 更早已驗但非本任新增：`4b527704`（1581，前任 runner commit，本任僅驗收）

**決策（改裁三項）**：
1. **CM-1561 Google 登入殼**：原裁「從 factory 拔除」，改裁「關閉不拔除」——理由未在 LOG 逐字記錄，但已落地為關閉 provider 白名單而非移除程式碼路徑
2. **CM-1579 停權可被換照解除**：原裁「綁 SaaS 上線前，方案 A 定案」屬暫緩，改裁「現在做，方案 A」——不再等 SaaS 時程
3. **CM-1560 LDAP TLS 設定**：第一輪 runner 做成 `.env` 環境變數（`LDAP_CA_CERT_FILE`），首腦判定這是客戶自助功能設定不該走基礎設施變數，退回重做成設定頁欄位（`verify_cert`／`ca_cert_pem`），對齊既有 LDAP 連線設定的其餘欄位

**教訓**（已入 STATE「教訓」段）：
1. `.env` 變數 vs 設定頁欄位的判準——客戶自助頻繁調整的功能設定走設定頁，部署期定死的基礎設施設定才走 `.env`；CM-1560 TLS 項因此退回重做一次
2. 驗收要親自跑測試不能信 runner 自述——CM-1587 漏登「凍結 error code 基準表」就是這樣抓到的，光看 commit message 看不出來
3. runner 自行偏離卡片建議的數字/範圍時，要看理由是否站得住腳（如具體實測證據）再決定認同或打回；CM-1583 的 64KB→16MB 是合理調整的例子

**推翻了什麼**：
- CM-1561「拔除」→「關閉」
- CM-1579「暫緩到 SaaS 上線」→「現在做」
- CM-1560 TLS「`.env` 變數」→「設定頁欄位」

**未完成交棒**：
- S6（CM-1555）：原掃描是失敗記錄非乾淨結果，待改 Opus 1M 重派
- S7（CM-1556）：核心範圍（middleware／domain service／plugin.py 預設值／login_log／ui_route）從未真正掃過，決策者已裁定重跑，排 2026-09-06 深夜（token 排程）
- CM-1559：已派出做第一步盤點，等回寫後裁第二三步範圍
- 上版：jedi-iam 10 張＋LC 2 張＋BE 1 個 migration 待批次發版部署 STG/POC，細節見 STATE「上版待辦」段
- 兩個母卡（CM-1546／1566）狀態欄仍是「Not started」，等全部子卡收尾才收 Done

---

## 第三任首腦（2026-09-07 ～ 09-08）：FR-077 遠端 Agent 控制鏈 — R1 完成後暫停

**這一棒做了什麼**：開 FR-077、切棒、開卡、驗收 R1、開修正卡、拆 R2、備妥全套件排名。**未派任何後續掃描棒**（決策者 09-08 裁暫停）。

### 開的卡（11 張，CM-1591～1601）

| 卡 | 內容 | 結局 |
|---|---|---|
| CM-1591 | FR-077 母卡 | 進行中（子卡多數暫停） |
| CM-1592 | R1 agent 身分與註冊（42 檔） | ✅ **Done**，7 條發現，首腦驗收通過 |
| CM-1593 | R2 → **收窄為 R2a**（29→18 檔） | ⏸ 暫停未派 |
| CM-1594 | R3 主專案宿主接線（17 檔，BE repo） | ⏸ 暫停未派 |
| CM-1595 | 修 控制面四端點不驗身分（F1+F2+F3+F5） | ⏸ **CRITICAL，未派**（首腦建議不該跟著停） |
| CM-1596 | 修 健康檢查 SSRF（F4） | ⏸ 未派 |
| CM-1597 | 修 enroll token 永久有效＋重註冊接管（F6） | ⏸ 未派（依賴 1595） |
| CM-1598 | 處置 `jedi-common/.env` 受版控（F7 越界） | ⏸ 未派 |
| CM-1599 | R1b 補掃密碼學核心（10 檔） | ⏸ 暫停未派 |
| CM-1600 | 文件：彙整進 FR README ＋ build HTML | ✅ **Done** |
| CM-1601 | R2b 檔案取用與 agent 連線（13 檔，R2 拆出） | ⏸ 暫停未派 |

### commits（BE repo，`feature/FR-075`，**已 push**）

- `d58a95fc` 開 arc、三棒開卡
- `882782f7` R1 掃描結果（runner 產出）
- `eff97fbd` R1 驗收＋開六張卡
- `5286f839` 彙整進 FR README ＋ build HTML 站（CM-1600 runner 產出，首腦代 commit）
- `87c0e39c` README 加「一頁看完」白話總覽
- `2364887f` R1 報告開頭加「七條一覽」總覽表
- `8d160984` R2 拆成 R2a／R2b
- （本次交接 commit：STATE ＋ LOG）

### 決策（決策者 2026-09-08 裁，共 6 項）

1. **F1 升 CRITICAL**（原 runner 判 HIGH）——無認證＋跨租戶＋洩漏客戶自己基礎設施的憑證，三條件全中
2. **F1+F2+F3+F5 併一張修正卡**——修法是同一套 agent 認證機制，分卡會讓兩個 runner 各寫一套互相打架
3. **nginx 併進 CM-1595 當「連帶」不另開卡**——它只驗「是不是我們發的憑證」，驗不出「是不是你宣稱的那台」，不能當唯一防線；獨立開卡會讓人誤以為補了就算修好
4. **補掃 R1b**——密碼學核心零發現在面板未跑的前提下不可信
5. **R2 拆兩棒＋每棒上限改 15 檔**——見教訓
6. **🔴 FR-077 暫停，改從其他套件開始掃**——理由見 STATE「FR-077 暫停的來龍去脈」段

### 推翻了什麼

- **每棒 10～45 檔 → ≤15 檔**（skill 第一節的表過時了，STATE 已記，**skill 本身尚未改**）
- **R2 一棒 29 檔 → 拆兩棒 18＋13，且刻意重疊兩支檔**（原則不變：垂直切不水平切；但發現「切在接縫上」時要用重疊處理，不是硬切）
- **報告格式**：從「執行概況開頭」改成「白話總覽表開頭」（決策者評 R1 首版「連工程師都不想看」）

### 教訓（已入 STATE「教訓」段第 4～6 條）

1. **面板全滅時要分兩層答「能不能用」**——「這幾條存在嗎」（人核可答，比面板可靠）vs「只有這幾條嗎」（只有面板能答）。混在一起講，接手者不是誤重掃就是誤以為乾淨
2. **報告開頭必須白話總覽表**——這是硬規則，新卡的「交付什麼」段都要寫進去
3. **卡片不要寫「用瀏覽器開 X 確認」**——CM-1600 的 Sonnet runner 因瀏覽器工具 server error 無限退避重試，卡住整棒。改寫成「跑 render 後 grep 關鍵段落存在即可」
4. **面板成本是掃描的真正瓶頸**——候選數×3 個 verifier、每個從零讀檔，比研究階段更貴。控制範圍大小是唯一有效的槓桿（effort／模型都已調到極限）

### 未完成交棒

- **FR-077 四棒卡都開好、範圍寫死，隨時可續**（CM-1599 10 檔／CM-1593 18 檔・**看卡尾收窄段**／CM-1601 13 檔／CM-1594 17 檔・**scanRoot 是 BE repo**）
- **CM-1595（CRITICAL）要不要照派，決策者未明示**——首腦建議掃描停、修正照做
- **全套件排名已備妥**（STATE「全套件掃描排名」段，25 支／111 棒／133 小時），建議第一批 jedi-common 或 jedi-integrity
- **`security-scan-lead` skill 尚未更新**：第一節的「每棒 10～45 檔」與第三節的掃描卡必含項（缺「報告開頭白話總覽表」）都過時了，下一任首腦開新 arc 前應先改 skill
- FR-075 的 S6／S7／CM-1559、上版待辦——狀態同前任，未動
