# FR-154 feature/FR-139 合回 main 收尾 — 首腦 STATE（living，只描述此刻）

**日期**：2026-10-22（第 3 棒：arc-review 驗收、七張修正卡＋CM-3009 驗收、2.7.1 發版、基線重產、三 repo push）　｜　**branch**：BE／FE／jedi 皆 `feature/FR-139`　｜　**已 push origin（2026-10-22 決策者放行；BE `ee88d5e6d`、FE `7ba85915`、jedi `223cc823`）；未合 main、未 bump、未出包**　｜　**LOG**：`FR-154-LOG.md`　｜　**母卡**：CM-2975

## 0. 這個 FR 是什麼（接手先懂這個）

`feature/FR-139` 這條 branch 從 2026-10 初做到現在，裝了 FR-139～151 十餘個功能（顧問訪談欄位、稽核計畫／稽核作業／改善計畫逐 AO 工作表、結案報告、資源庫任務說明、任務關卡、SSP 顧問範本、責任分工與風險總表…），BE 領先 main 約 700 個 commit。功能各自做完了，但「整條 branch 能不能合回 main、出 1.27.0」是沒有人負責的空白——總驗收 arc `acceptance-2610-fr139-147` 停在 10-17 且只管到 FR-147。本 FR 就是那個負責人：把發版前所有收尾動作收成一批、派出去、驗收、排順序，直到決策者 push 合 main、188 出包。

**不做的**：各 FR 自己的功能修正（回各 FR 開卡）、STG／POC 上版（決策者放行後另排）。

## 1. 已完成（首腦第 1 棒親做，commit 在 FR-151 時期）

| 項目 | commit | 備註 |
|---|---|---|
| 六支 jedi 套件發版 | jedi `56a2f0de`＋`bdd5b90c` | iam 1.6.0、oscal-v2 2.6.1、compliance-audit 1.3.8（oscal-v2 下限 >=2.6.1）、task-platform 1.3.3、flow-engine 1.4.4、detection 1.2.10。iam 兩條紅在 branch 起點就紅、非本批 |
| 還原 pin | BE `7bc35752c` | 六支固定版號＋lock；守衛＋FR-135～151 測試 438 綠 |
| 出貨基線重產 | BE `8f7cc9bc5` | 188 備份 `guidant_ai_baseline_20261021_0022_before_FR139-151.dump`；補套 38 支；乾淨庫 init＋兩輪 migrate 通過；順手修 04 產生器漏 `is_menu`、FR-144／148 seed 斷言寫死中間態 |
| FR-149.3 派出並驗收 | BE `b6e835785` | CM-2903 修正待驛證，等決策者手測（需重啟 8000） |
| 四題裁定 | — | 見 §2 |

## 2. 決策者裁定（2026-10-21，照首腦建議）

1. 風險 Excel 匯出加「說明／受影響資產／備註」三欄（29→32）、三欄皆可匯入；專案頁「風險等級」只改名「剩餘風險等級」、不加固有等級欄 → CM-2965。
2. `compliance.job_executions.template_id`、`compliance.workflow_templates_trans.workflow_template_id` 兩個 FK 欄索引**這版補**（主線 active migration 1 支，做完出貨基線要再重產一次）→ CM-2966。
3. FR-147 Excel 空格語意（資源庫端清空／專案端不動）**這版不統一**，SPEC 寫明差異 → 併 CM-2971。**驗收時發現前提過期**：4d（`bfda2fe8a`）早已把兩端都改成「空白＝不變動」，差異只剩版面與「專案端無法用 Excel 清掉描述／指南」，SPEC 照現況寫；此題實際無事可裁，FR-147-STATE 過期段已劃掉。
4. FR-138 #69（1.26.0 發行說明補 10-10 重出、出包只從 tag 產生）**併進這次進版** → CM-2973；#71（出包改收 SPEC 站手冊）**下版**。

## 3. 子卡（母卡 CM-2975；spec `handoff/notion-cards.json`、結果 `notion-cards-made.json`）

| 卡 | 需求編號 | 做什麼 | Stage | Model | 狀態 |
|---|---|---|---|---|---|
| CM-2965 | FR-154.1 | 風險 Excel 加三欄且可匯入；風險等級改名（FR-151） | 1 | sonnet／high | ✅ 驗收通過待確認（BE `fcbf9793f`、FE `bdbdeaa5`） |
| CM-2966 | FR-154.2 | 兩個 FK 欄補索引，主線 migration 1 支 | 1 | sonnet／medium | ✅ 驗收通過待確認（BE `75053e163`；**基線待重產**） |
| CM-2967 | FR-154.3 | 權限矩陣與 FE 權限常數重產 | 1 | sonnet／medium | ✅ 驗收通過待確認（BE `2e8f791b8`；守衛 3 紅 → 衍生 CM-2976） |
| CM-2968 | FR-154.4 | FR-142 SPEC＋手冊 | 1 | sonnet／high | ✅ 驗收通過待確認（BE `8be4fffa1`） |
| CM-2969 | FR-154.5 | FR-143 SPEC | 1 | sonnet／high | ✅ 驗收通過待確認（BE `99e09040d`） |
| CM-2970 | FR-154.6 | FR-144 SPEC 稽核計畫清單頁 | 1 | sonnet／medium | ✅ 驗收通過待確認（BE `7816bff28`） |
| CM-2971 | FR-154.7 | FR-147 SPEC＋手冊，寫明空格語意差異 | 1 | sonnet／high | ✅ 驗收通過待確認（BE `185e328b6`；空格語意前提過期，見 §2.3） |
| CM-2972 | FR-154.8 | FR-148 SPEC | 1 | sonnet／high | ✅ 驗收通過待確認（BE `8afcd67f5`） |
| CM-2973 | FR-154.9 | FR-138 #69 發行說明與出包規矩 | 1 | sonnet／medium | ✅ 驗收通過待確認（BE `8d2077900`） |
| CM-2976 | FR-154.11 | FE 權限守衛紅燈六條（CM-2967 衍生）：批次設定負責部門／任務卡證據與留言鈕掛對權限、三顆寫入鈕補 v-can、散寫判斷收掉、掃描器盲區登記；改完重產對照表 | 1 | sonnet／medium | ✅ 第 2 輪驗收通過待確認（FE `f989b200`＋`0eb060f5`、BE `783338bb0`＋`223bd7738`）。第 1 輪退回：② `<template v-can>` 編譯成真 `<template>` 元素；第 2 輪改掛子元件根 div，首腦編譯三 SFC 確認 0 個 template 元素。~~待裁：顧問角色無 `grc.raci.manage`~~ **此題作廢**（arc-review 重要級 1 推翻）：那顆鈕打的是 `control-org-units/batch`（後端守 `oscal.ssp.update`）不是 RACI 端點；① 改掛 `GRC_RACI_MANAGE` 是改錯，正解是入口鈕改回 `OSCAL_RESOURCE_LIBRARY_UPDATE`＋後端路由放行兩顆（照 `ssp_risk_route.py:35` 先例）。併入 arc-review 修正卡 |
| CM-2974 | FR-154.10 | arc-review 整條 branch（BE `888fdbc17..96cef7a80`、FE `01fb4acd..0eb060f5`、套件 `bd73429b..c2bc7f7c`），報告 `docs/review/2026-10-21-fr140-154-merge-review.md`，不自動修 | **2** | opus／high | ✅ 驗收通過待確認（BE `afa7f52de`）。阻斷 8／重要 24／輕微約 35；八條阻斷首腦逐條開檔皆屬實，無誤報。**修正卡待決策者圈範圖**，見 §3.1 |

**Stage 1 十張＋Stage 2 arc-review 全部驗收通過待確認（2026-10-22 04:xx）。**

### 3.1 arc-review 修正卡（決策者 2026-10-22 圈定；spec `handoff/notion-cards-review-fixes(.json|-made.json)`，Stage 1，全掛 CM-2975）

決策者裁定：阻斷 8 條全修；重要級修 12 條（1、2、3、4、5、6、7、8、16、17、19、21、22）；其餘重要級與輕微級登記下版。B1 修法採「從讀取權進來的矩陣不帶處理人」；B8 裁「DI 註冊檔豁免」（CLAUDE.md 補例外）；FR-150 D7 改合併決策者知情、只改文件；ISO 27002 PDF 不隨包，改 ISO 官網連結（英文版）。

| 卡 | 需求編號 | 做什麼 | Model | 狀態 |
|---|---|---|---|---|
| CM-3002 | FR-154.12 | 修正 A（資安）：B1 矩陣從讀取權進來不帶處理人＋重要 3 任務說明同；B2 舊結案報告 PUT／DELETE／還原改驗 manager | sonnet／high | ✅ 驗收通過待確認（BE `c63ace808`、FE `ba3f54a4`；重要 3 寫入端待裁） |
| CM-3003 | FR-154.13 | 修正 B（資料錯）：B3 只填改善建議不算風險；B4 後端擋未送出推進；B5 定稿遇讀取失敗拋錯、預覽標降級；重要 16 四處 savepoint；重要 17 close_round 三依賴改必填 | opus／high | ✅ 驗收通過待確認（BE `f571a1cbc`、FE `496addbf`；新碼 GRC_412078；B3 套件縮範圍判準 follow-up） |
| CM-3004 | FR-154.14 | 修正 C（小修）：B6 GOV_404003 三語；重要 1 批次設定負責部門三處對齊（撤銷 CM-2976 ① 的改法）；重要 2 提醒鈕 v-can；重要 4 FR-144 D3；重要 7 上傳者暱稱；重要 8 風險編輯頁讀失敗不變新增；FR-150 design D7 改文件；B8 CLAUDE.md 補 DI 檔豁免 | sonnet／medium | ✅ 驗收通過待確認（BE `ff6c91f50`、FE `c2365a4e`） |
| CM-3005 | FR-154.15 | 修正 D：B7 `ProjectPlanningView.vue` 抽 `usePlanningQuickConfigMenu` | sonnet／medium | ✅ 驗收通過待確認（FE `ace21838`，2,632→2,591） |
| CM-3006 | FR-154.16 | 修正 E：重要 21／22 標籤改讀 system_menus；重要 6 風險部門歸屬驗證；重要 5 範例角色稽核員補 export（基線待重產） | sonnet／high | ✅ 驗收通過待確認（BE `6eb2087a7`；基線待重產） |
| CM-3007 | FR-154.17 | 修正 F：重要 19 FR-149 範本 docx 清 7 處客戶字樣＋產生器錨點改中性 | sonnet／high | ✅ 驗收通過待確認（BE `9326fe785`） |
| CM-3008 | FR-154.18 | 修正 G：jedi-oscal-v2 019 不帶 ISO 27002 PDF，加 reference_url 欄；FE 版本頁說明卡＋ISO 官網連結；套件 2.7.1（發版推 Nexus 等令） | sonnet／high | ✅ 驗收通過待確認（套件 `6533a9e8` 2.7.1、BE `2cfd880e5`、FE `632e1b17`）。**🔴 等令：發版推 Nexus**——BE pin 已 ==2.7.1 但 Nexus 沒有，新 clone／build 機 poetry install 會失敗；發版後 `poetry update jedi-oscal-v2` 再 commit lock |

**七張全部驗收通過待確認（2026-10-22）。** 守衛全套在七張 commit 後 667 過 4 紅 12 skip；4 紅在 `fd84e5943`（動手前）即存在，屬平行 session 殘留（survey／review-step 路由未登記、closing report 解析點、jedi data-access 規則鏡像、Redis key 前綴），不是本批造成，但**合 main 前要有人收**（見 §3.2）。

### 3.2 合 main 前還要收的（等令）

| 項 | 誰 | 內容 |
|---|---|---|
| ~~發版 jedi-oscal-v2 2.7.1 推 Nexus~~ | ✅ 已做（2026-10-22 決策者放行） | wheel 內無 ISO PDF；`poetry publish -r nexus` 完成；BE lock 切回 Nexus `00d90a396` |
| ~~守衛 4 紅收掉~~ | ✅ CM-3009 驗收通過待確認（BE `5dc01bcd6`、jedi `223cc823`；守衛 576 綠 0 紅） | survey 兩支＋review-step-templates GET 登記或掛守門；`closing_report_*`／`ap_docx_generator`／`ar_docx_generator`／`ap_workbook_reader` 解析點量大小後登記；jedi `data-access.md` 規則本文鏡像同步；Redis key 前綴補 ACL。這些是 FR-145／148／155 留的，不屬任一修正卡 |
| ~~出貨基線重產一次~~ | ✅ 已做（2026-10-22 決策者裁「重產」） | 備份 `~/backup/guidant_ai_baseline_20261022_1206_before_FR154_regen.dump`；基線庫套索引；稽核員 export 改進 `shipped-roles.json`（04 是 gen 產物，手改會沖掉）；三支 gen 重產 `834d2f811`，02 零刪除、gate (a) 綠。套件 019 走 flatten 不進 02 |
| bucket 清舊 PDF | 決策者手動 | `20261021000000_29ee8d07-….pdf` |
| ~~重要 3 寫入端~~ | ✅ 決策者裁「是本意」 | FR-147 design D2 補一句 `a2c5eac6c`；本來 D2 就寫明不要求 manager，arc-review 列為疑慮是沒對到 D2 |
| `GET /grc/review-step-templates` 無 read 能力點 | **決策者裁**（CM-3009 帶出） | 已登記 PENDING_GUARD_ROUTES。(a) 新增 `grc.review-step-template.read` 能力點（seed migration＋對照表重產）／(b) 改附錄 C 列 JWT_ONLY。首腦建議 (b)：樣板清單無敏感資料 |
| CM-3006 三條未動 | follow-up | ①稽核結果 Excel `VERDICT_LABELS`／`RISK_LEVEL_LABELS` 是匯入契約（6 處共用），verdict 屬狀態機枚舉可維持程式表，首腦接受；②`risk_status`／`risk_source`／合規狀態／嚴重度 system_menus 無 seed，要進選單另開 seed 卡；③`closing_report_risks.py:18` 另一份 `TREATMENT_LABEL` 寫死 |
| B3 套件縮範圖判準 | follow-up | jedi-compliance-audit `assessment_result_app_service.py:339-341` 改用 has_risk 同源 |
| `docs/spec-site/site/` 統一重 build、`_overview.md` 頁面地圖、audit-review「三條→四條」 | 收尾棒 | 見下方小尾巴 |

**登記下版（follow-up，不進 1.27.0）**：重要 9（FR-142 Excel 說明與改判衝突）、10（FR-143 D4 多目標共用任務只同步一半）、11～15、18（讀失敗降級有 log 不寫壞資料）、23（函式超標累積）、24（app service 自己 new RepoImpl）；輕微級約 35 條見報告 §3。

**驗收留下的小尾巴（不擋卡，收尾棒或 arc-review 後一起收）**：
- `docs/spec-site/current/audit-execution/_overview.md` 頁面地圖第 22、88 行仍寫「POA&M 矯正頁」，要改「改善計畫工作表」並補「我的改善計畫」一列（CM-2969／2970 互讓沒碰）。
- `audit-execution/audit-review.md` 四處「結案守門三條」（第 11、87、108、161 行）要改「四條」（程式 `ar_objective_view.py::close_blockers` 回四種；其 docstring 也寫「三條」過期）。
- `docs/spec-site/site/` 建置產物約 190 檔未 commit（CM-2969 只提交自己三頁），SPEC 卡全收口後統一重 build 一次 commit。
- `risk-register.md` 2026-10-20 那行舊變更紀錄的「29 欄」被 CM-2965 改成「32 欄」（歷史紀錄不該回改，一字之差未退）。

## 4. 之後的順序（每項等令）

> 2026-10-22 決策者裁：**先 push 一版、bump 之後再做、安裝包先等**。下列 1～2 進行中，3 起等令。


1. Stage 1 十張跑完 → 首腦逐張抽查（開檔、跑測試、mkdocs build），卡尾 append 驗收註記。
2. 決策者複測：FR-151 21 張「修正待驗證」子卡、CM-2903（要重啟 8000，重啟前先問）。
3. CM-2974 arc-review → 阻斷級另開修正卡掛 CM-2975。
4. **出貨基線再重產一次**（CM-2966 的索引 migration；步驟見 `sql-migration` skill「出貨基線同步」段，寫 188 基線庫屬決策者裁示）。
5. 收各 FR 母卡 Done：FR-142 CM-2818、FR-143 CM-2840、FR-144 CM-2837、FR-145 CM-2854、FR-147 CM-2864、FR-148 CM-2880、FR-149 CM-2889、FR-150 CM-2902、FR-151 CM-2914（決策者改）。
6. 進版 1.27.0：`version-bump` skill（release note、BE／FE 版號、spec-site 凍結快照、`99-stamp.sql`）；site-regression 不當 gate。
7. 決策者 push 三 repo、合 main、打 tag 並推 tag。
8. 188 `/opt/guidant-ai-be` `git pull` 到 tag → `build_all.sh --all` → `build_bundle.sh`；STG／POC 上版等放行。

## 5. 行為規範（本 arc 特有）

- 8000 的 BE 是決策者另一個 session 在用：首腦與 runner 一律不重啟，要重啟先問。
- 同一工作樹有平行 session 的未提交改動（`docs/features/FR-144/design.html`、FR-151 `index.html`／`nav-data.*` 等）：改檔前 `git status`，只 `git add` 自己的檔、用 `git commit <檔...>`；commit 前 `git diff --cached --stat` 核對。
- 工作坊派工：子卡四欄（母卡／Stage／Model／Effort）必填、狀態只往前走；首腦不寫派工 prompt、不自己開 session，決策者在狀態頁選 CM-2975 派。
- **建卡腳本陷阱**：agent-workshop 的 `notion_create_case.py` 指向工作坊自己的任務庫（`904346da…`）不是 CM 庫（`23c346da…`），直接用會建到錯的庫、卡號不是 CM-、專案欄預設 Agent Workshop。要用它的 spec 格式配 BE `scripts/notion_case.py` 的 `DATASOURCE_ID`。BE 自己的 `scripts/notion_create_case.py` 不支援四欄，開卡前要先補。
- 一批要一起派的卡就要同一張母卡；「這張不屬任何 FR 的功能」是該另開 FR 與母卡的訊號，不是掛到最近的 FR 底下湊合。
- 說明文件只寫現況；沿革進 `FR-154-LOG.md` 與 commit message。
