---
title: "FR-139 進度總表（STATE）"
eyebrow: "FR-139 · 進度 · living 文件，就地 Edit"
subtitle: "母卡 CM-2745 · 二十張實作卡 · 五波派工＋複測補強"
---

> **只描述此刻**。每棒回寫後更新本表；沿革進 `FR-139-LOG.md` 與 git log。問「做到哪」看這份。

## 一眼看

- **總進度**：27 / 27 Done（實作卡全收）
- **現在在做**：（無）**FR-139 已收口（2026-10-15）**：27 張實作卡＋收口六卡全 Done，母卡 CM-2745 Done。下一個 FR「資源庫層任務初始化、顧問定任務名稱／描述／指南」走 big-feature-workflow，分析要點在 LOG 2026-10-15 T-24 block。
- **擋住的**：（無）
- **等決策者裁的**：（無）
- **最近更新**：2026-10-15 收口完成（C-1～C-6 全 Done）；出貨前硬條件見「母卡收口待辦」🔴 項

## 波次與平行

| 波 | 卡 | 可同時開 | 條件 |
|---|---|---|---|
| 1 | T-1 | 1 | 地基，先做 |
| 2 | T-2、T-2b、T-3、T-5 | 4 | 都只等 T-1；T-2／T-2b 各開子元件避免撞檔 |
| 3 | T-6、T-7、T-8 | 3 | T-6／T-7 等 T-5；T-8 等 T-2b |
| 4 | T-9 → T-10 | 1（序列） | 同一批守門檔；T-9 等 T-8，T-10 等 T-5＋T-9 |
| 5 | T-11、T-12 → T-12b → T-13 | 2（T-11／T-12 平行） | T-11 等 T-5；T-12 獨立；T-12b 等 T-12；T-13 等 T-11＋T-12。**T-12 的 CRA 整併 migration 等 T-6／T-7 驗收完才套 DEV**（已完成，可套） |
| 隨時 | T-4 | 1 | 等 T-2 上線後任何時候 |

## 卡片狀態

| 卡 | Notion | 做什麼（一句） | 波 | 狀態 | 分支／commit | 備註 |
|---|---|---|---|---|---|---|
| T-1 | CM-2749 | BE props 新鍵＋helper 收斂＋批次存 API＋實施狀態 seed | 1 | ✅ Done | BE f94e9ef99／FE f65e15dc | 批次存 API：`PUT /module-frame/<uid>/control-defaults/<cid>/batch` |
| T-2 | CM-2750 | FE 資源庫控制項區加欄位＋狀態下拉讀 system_menus | 2 | ✅ Done | FE 83c3c20a | 卡片儲存鈕也改走批次只送改過欄位 |
| T-2b | CM-2751 | 建議附件表＋API＋FE 區塊 | 2 | ✅ Done | BE 0f5cd4554／FE 382930bb | 主線 migration 一支，**出貨基線待重產**；複製方法 `clone_by_id_map` 給 T-5／T-8 |
| T-3 | CM-2752 | Excel 兩路徑三欄＋套件 props 逐鍵合併＋資源庫匯入改合併 | 2 | ✅ Done | BE d62513d88／FE 7c78f0c8／套件 dca8e050 | **套件未發版，DEV 靠 path dependency**（pyproject 139 行打開未 commit） |
| T-3b | CM-2760 | 匯入預覽表三欄＋確認框「覆蓋」改「合併」（純 FE） | 隨時 | ✅ Done | FE e1354cee | 首腦 Playwright 實跑兩個預覽流程 |
| T-4 | CM-2753 | 範本 460 缺失回填 | 隨時 | ✅ Done | BE 07eae5758 | 拆 26＋10 條、殘留 0、存 v5；腳本 `scripts/oneoff/` |
| T-5 | CM-2754 | 版本索引表＋存版／暫存／匯入前備份 API＋metadata 同步 | 2 | ✅ Done | BE 2f1036083／FE 254ac4ac | 主線 migration 一支，**出貨基線待重產**；唯讀開舊版＝版本 uid 放資源庫 uid 位置；補料 helper `SspSnapshotExtras` 給 T-7／T-8 |
| T-6 | CM-2755 | FE 版本歷史頁＋暫存／存版鈕 | 3 | ✅ Done | BE f79685514／FE 4e9cbbf4 | 首腦 Playwright 實跑；唯讀模式批次維護匯入項灰掉 |
| T-7 | CM-2756 | 比對（只控制項與 AO）＋整份還原 | 3 | ✅ Done | BE b116c451a／8c65cdfb8／FE 6f291f21 | 首腦實打 429 還原往返；429 現停第 2 版內容共 6 版 |
| T-8 | CM-2757 | 啟動改指向＋終身一對一＋複製資源庫（先盤點複製鏈） | 3 | ✅ Done | BE 5b96e02c6／FE d04f28c2 | 守門 `is not None` 靜默跳過要改成 raise（卡末）；DEV 留 461～463＋專案 1408～1410 |
| T-9 | CM-2758 | 規劃頁唯讀＋範本 SSP 寫入守門分流 | 4 | ✅ Done | BE 790bb7bce／FE b76e28ad | 範本判斷 `template_ssp_id` 直比；`ssp_context_resolver` 刻意不接；T-10 掛點 `before_template_write` |
| T-10 | CM-2759 | 送審鎖版＋稽核中鎖寫＋覆核同套 | 4 | ✅ Done | BE 2297e7de9＋回歸修 06bef3850／FE f50e1100 | 鎖寫實際掛在 `verify_module_frame_exists_by_uid(writable=True)`（T-9 的 `before_template_write` 留空）；`audit_lock` 進資源庫詳情；守門 `is not None` 形狀同卡補強 |
| T-11 | CM-2761 | SSP 匯出依框架群組排序＋補欄位＋版面對齊業界 | 5 | ✅ Done | BE 85d2cd7ef | 狀態標籤先英文（menu 只有英文）、中文留 T-13；字典 `ssp_docx_labels.py` | 等 T-5（Done）；排序 resolver 抽新檔 |
| T-12 | CM-2762 | catalog 三張翻譯表＋套件 repo 接翻譯機制＋讀取端依語言＋CRA 中英整併 | 5 | ✅ Done | BE f248d7f41／套件 163d9ba0＋回歸修 52c2a53d | 010／011 已套 DEV；資源庫 catalog 是深複製品，011 連九份複製品一起翻；213 deprecated | 動 jedi-oscal-v2；整併 migration 先 dry-run 等令；新裝無 2112/2135 要安全跳過 |
| T-12b | CM-2763 | 框架匯入畫面加語言下拉、第二語言寫翻譯表、id 對不上整檔退 | 5 | ✅ Done | BE 6b7b42edf／套件 4f0b1fe9／FE 37c81f17 | 套件 012 加 `framework_versions.language_code`（已套 DEV）；寫翻譯用 `upsert_translations` 不用 `update(locale)`（會改主表）；FE 兩頁守 isPlatformAdmin，首腦注入 session 進不去，留雷門複測 |
| T-14 | CM-2767 | 編輯頁頁首兩顆選單鈕（儲存組／批次維護）＋「暫存」改全頁儲存並改名 | 補強 | ✅ Done | FE c17f7c3f＋133d7bf2 | 另順手做決策者五筆回饋：327d13b6／f07f7b2e／438f4731／56b77b93 | | 決策者 2026-10-15 複測提出；純 FE，新元件 ModuleFrameHeaderActions.vue |
| T-17 | CM-2772 | 任務流程「套用到其他任務」：控制項／AO 樹自選或全專案、只套 TODO、只換 BPMN、重做 job 注入 | 五 | ✅ Done | BE 9129fd196／FE 68805f78 | 新子需求五；清單＋套用兩端點、FE 勾選樹對話框；最大坑是 XML 內 job uid 注入要重做 |
| T-18 | CM-2770 | 輪次流程跑完就凍結：該輪 closed 或主流程 COMPLETED 即整輪唯讀（任務／審閱／分類／問卷） | 補強 | ✅ Done | BE 4a2685214／52029d477，套件 ea554468，FE fb44b3e6／aa64e4c9 | 決策者另開 session 當首腦做的；三套件只加選填掛點未發版 |
| T-24 | CM-2778 | 樣板「適用控制項」分頁與「匯出／匯入現況資料」收斂成同欄位／同 parser／同預覽／同寫入，預覽補與現值差異 | 補強 | ✅ Done | BE 5f56cdd22／FE a6ca2769＋863bf160～44b0ad20 | 樣板 v5.0.0 舊檔要重下；預覽保留 `SheetPreviewControls.vue` 只補欄（沒嵌資源庫元件，runner 判會砍功能）；「配對狀態」欄保留、預覽元件不換（裁示 15） |
| T-23 | CM-2777 | Excel 匯入樣板「適用控制項」：可填欄黃底、控制項資訊欄白底＋工作表保護 | 補強 | ✅ Done | BE fbbf44463／32d0316a2 | 純 BE；ColumnDef 加 user_fillable；鎖定邏輯抽新檔 |
| T-22 | CM-2776 | 批次維護選單「匯入／匯出現況資料」對調；新模式專案規劃頁整顆不顯示「匯入現況資料」 | 補強 | ✅ Done | FE 497c8f45／f409148a | 純 FE；新模式現況在資源庫維護，入口不留反灰鈕（比照 T-18） |
| T-21 | CM-2775 | 三條匯入確認前自動存 import-backup 版（控制項現況 Excel、docx 兩條沒接） | 補強 | ✅ Done | BE 37117b815 | 純 BE；用 T-5 現成 backup_before_import；守門 raise 不靜默 |
| T-20 | CM-2774 | 匯出現況 Excel 順序改走 T-11 resolver（專案側＋資源庫側兩支 writer） | 補強 | ✅ Done | BE 2dfa61c1f | 純 BE；排序抽新檔，兩邊一行呼叫；不加群組列（會動匯入契約） |
| T-19 | CM-2773 | 資源庫「基本資料」六欄進版本（存版記／檢視換值／比對加頁籤；發布狀態不存、還原不動） | 補強 | ✅ Done | BE 6a0fdc4d2／FE 49461344 | 主線 migration 一支→出貨基線待重產；只改 `_version_as_module_frame` 一個入口 |
| T-16 | CM-2769 | 唯讀模式改文字顯示（規劃頁新模式＋檢視舊版頁） | 補強 | ✅ Done | FE 5697c176／f8a5f1dd／35d81f77／12f5aaea | 純 FE；與 T-15 共用表單，著色以欄位容器為單位 |
| T-15 | CM-2768 | 版本差異著色在檢視舊版頁（全頁籤）、收獨立比對頁 | 補強 | ✅ Done | BE c1d3fbc2f／290cf834d／d3a556b04，FE efdf5d2b | | 取代 D11「只比控制項與 AO」；BE compare 擴全頁籤明細（reuse restore_preview 配對）、FE 檢視頁「對照目前」開關、比對路由 enable=0 |
| T-13 | CM-2764 | SSP 匯出三語 zh／en／zh-en | 5 | ✅ Done | BE 244efaeb0／FE 29119cbe | `lang` 與 CRA 的 `locale` 分開；狀態中文進 `messages.po`；FE 匯出改彈窗；順手解 T-11 狀態只印英文 |

狀態符號：⬜ 未開始 ／ 🔵 進行中 ／ 🟡 修正待驗證（runner 回寫完、等決策者驗）／ ✅ Done ／ 🔴 卡住

## 決策者已裁的（已回寫到卡）

5. 子公司**不用**總部分享的資源庫開專案：資源庫可匯出匯入，就不走分享（2026-10-15）。T-9 的「分享庫對子公司唯讀」行為維持，不另開卡。
6. 「完整稽核流程」母範本（`compliance.flow_templates` uid da8c2b81…）2026-10-15 12:21 已由 `admin` 帳號發布回去（決策者指示）；1408～1410 可發起覆核。
7. 資源庫刪除守門維持現狀（2026-10-15 複測時確認）：綁著**活的**專案不准刪，專案先刪（軟刪）資源庫才可刪；刪除是軟刪。不加封存狀態、不放寬成警告後可刪。
8. 暫存擴成全頁（含基本資料）並改名「儲存」；頁首四鈕合成一顆群組鈕照問卷頁（2026-10-15 複測裁示）→ T-14。
9. 版本比對改成「檢視舊版頁上著色，所有頁籤都比」，獨立比對頁收起來（2026-10-15，推翻 D11「只比控制項與 AO」）→ T-15。理由：獨立頁寫「其他頁籤不比」只會被問為什麼沒做。
10. 唯讀模式（規劃頁新模式、檢視舊版）改成文字顯示，不用反灰輸入框（2026-10-15，「真的超醜」）→ T-16。
12. T-15 共用比對誤報（資產欄位兩種拼法、共用信箱配錯人）：docx／Excel 匯入預覽可能同樣漏比，**開一張小卡查證**，有就修、沒有就結案（2026-10-15）。
13. 雷門複測三項（T-12b 語言下拉與 PDF 更新、T-13 匯出彈窗與 CRA 三份文件、T-6 只讀帳號看不到存版還原鈕）**已驗過**（2026-10-15）。
16. review 建議級五裁（2026-10-15）：①docx 匯入資源庫改走合併（與 Excel 一致）②三處守門沒接線改 raise ③規劃頁狀態下拉讀選單表、匯出時 `unknown`→`planned`（D20 的 `unknown` 是產品擴充，DEV 既有 2,133 筆，OSCAL 標準不含）④`ModuleFrame.vue` 這次不拆 ⑤RLS 一條 FOR ALL 認可、改判準文字。①②③＋四小項→C-6 CM-2798。
15. T-24 兩件：預覽表內「配對狀態」欄**不拿掉**；預覽**不換**成資源庫同一套元件（2026-10-15）。
14. 新需求「資源庫層任務初始化、顧問定任務名稱／描述／指南」先裁三條：只給顧問名稱／描述／指南；任務先不進版本；任務匯入 Excel 加描述／指南兩欄資源庫與專案共用（2026-10-15）。收口後另開 FR。
11. 子需求五「任務流程套用到其他任務」併進 FR-139 不開新 FR（2026-10-15）：**不分範圍層、不用「同來源」**，使用者從控制項／AO 樹自己勾，或全選＝全專案（二次確認）；只套 TODO；只換 BPMN、任務層欄位不動；各任務仍持有自己的複製品 → T-17。

1. T-8：舊模式專案也算，驗收時複製三份新資源庫再啟動。
2. T-10：鎖寫看最新一輪（不分主輪／覆核子輪），沿用既有當前輪次函式。
3. T-4：拆得出來就拆，拆不出來留著，不列對照表等確認。
4. 子需求四（2026-10-15）：英文版連控制項標題也要（走 catalog 翻譯表）；套件可動；框架匯入加語言下拉；CRA 現有中（213／catalog 2135）英（207／2112）兩版整併成英文主表＋中文翻譯表，460／459 改指 207。

## 留給 T-9 的（T-8 盤點標出、本卡不碰）

- `ssp_context_resolver.py:98` 先試資源庫再試專案：指向後同一份 SSP 兩邊命中、一律判成範本，專案端寫入會走資源庫守門；目前 DI 未接這支 resolver（oscal_containers.py:345），現況影響有限，T-9 要處理。
- `ssp_project_resolver.py:153 resolve_round_for_ssp`：範本 SSP 會解到專案當前輪，資源庫編輯頁控制項樹會走「本輪工作」路徑顯示專案的收證據工作；T-9 決定要不要在資源庫頁擋掉。

## 接手指引（arc 已收口；只剩出貨前兩件）

**先做這三件，做完停下等令：**
1. 讀本檔全部＋ `FR-139-LOG.md` 最後六個 block。
2. 盤點：`git fetch` 三 repo 確認 `origin/feature/FR-139` 與本機對齊；Notion 查母卡 CM-2745 與子需求 CM-2746～2748 狀態（應仍 Not started）；pyproject 四支 path dependency 是否仍打開。
3. 回報盤點，等決策者發令。收口項目逐條見「母卡收口待辦」，每項單獨發令單獨做；**比對誤報查證小卡**（裁示 12）收口時一起開。

**冷接自檢（答得出才算讀懂）：**
- 新模式專案跟舊模式專案差在哪？為什麼新模式規劃頁不能匯入現況資料？（T-9／T-22）
- 「匯出現況資料」的 Excel 跟完整樣板的「適用控制項」分頁是什麼關係？T-24 要收斂成誰？（決策者原話：那個 sheet 就是現況資料拔出來）
- 輪次什麼時候算「結束」？凍結看的是哪一輪？（T-18）
- 存版快照包含什麼、不包含什麼？基本資料六欄為什麼不含發布狀態？還原為什麼不動基本資料？（D11＋T-19）
- 為什麼 T-23 退回過一次？（標頭與內文同一條規則，首腦卡分開寫就分開做）

**驗收做法（本棒固定用法，照抄）：**
- token：`scratchpad/mk_token.py`（在 session scratchpad，不在 repo），**在 repo 根目錄跑、用乾淨 env 載 .env**：`env -i PATH=$PATH HOME=$HOME python3 -c "from dotenv import load_dotenv;load_dotenv(override=True);import runpy,sys;sys.argv=['mk','eac362ed-1fc7-48ac-b7e5-88c71f412c03'];runpy.run_path('<scratchpad>/mk_token.py',run_name='__main__')"`，否則 Fernet 鍵讀不到 create_app 在 DI 就炸。
- 路由前綴：SSP 控制項 `/api/1.0/ssp/...`（無 /oscal）、資源庫 `/api/1.0/module-frame/...`、任務與輪次 `/api/1.0/grc/...`、審閱標記 `/api/1.0/grc/project/<p>/ap/<round>/control/<cid>/review`。Excel 現況匯出走 `require_participant`，資源庫範本 SSP 的 uuid 直接打會 404，要用專案的 `ssp.id`。
- Playwright：test repo 的 `node_modules/playwright/index.mjs`，注入 `localStorage cm_store={accessToken}`，FE `localhost:5180`。平台管理員頁注入進不去，留決策者。
- 固定驗收資料：資源庫 469「首腦 T-16 驗收庫」＋專案 1497（新模式、活）；專案 1321（第 1 輪流程 COMPLETED、第 2 輪進行中，驗輪次凍結）；專案 1484（決策者自己的新模式專案）；舊模式 1404；429 有 6 版。**探針寫入要原路清掉**（本棒建的批次、審閱標記、改的描述都清了）。

**本棒留給收口的（除「母卡收口待辦」段外）：**
- T-12 同型回歸掃過一遍，只剩任務匯出那處已直修（`5be32fc9a`）。
- 無卡號 commit `62be9edc4`（任務指派先選部門）決策者在 runner 視窗直裁，沒核過。
- 既有測試 `test_ssp_excel_import_project_ssp::test_confirm_module_frame_source_merges_with_update_mode` 紅（T-21 備份守衛，測試沒注入 ssp_version_service），收口 reviewer 時補。
- 新需求已釐清（裁示 14），收口完走 `big-feature-workflow` 第一棒寫討論稿＋可點雛形。

## 母卡收口待辦（已拆成 CM-2780～2784 五張卡，本段留作對照）

- 舊手冊 `docs/user-manual/lifecycle-and-use-cases.md`（v3.0／2026-03）決策者 2026-10-16 裁**退役重寫** → CM-2801（屬 FR-139；派工時機等 FR-140 畫面複測過，prompt 到時由 FR-139 首腦給）。
- **🔴 出貨前必做：jedi-compliance-audit 發版＋主專案 pin 還原**（C-2 因 FR-140 占用未發；pyproject 第 70 行 pin 仍註解、第 124 行 path 仍打開；1.3.7 沒有 T-18「輪次結束擋寫入」掛點，裝到舊版該守門靜默消失）。發版時一併補 `GRC_403069`／`ssp_source` 鏡像。歸 FR-140 收口。
- 無卡號 commit `62be9edc4`（任務指派先選部門再選人，新端點 participants/org-units）：runner 視窗由決策者直接裁示，首腦未核、未開卡；收口 reviewer 一併掃。
- **T-12 同型回歸掃一遍**：`grep -rn "locale=locale" app/ infra/` 逐處確認所在方法有定義 `locale`（任務匯出已炸過一次，首腦直修）。
- 守門「沒注入就靜默放行」：T-8 兩處已改 raise（9e4c1c9e1）；**T-10 的 `module_frame_domain_service._audit_lock` 仍是跳過**，收口 reviewer 時一起改，不再退卡。
- T-15 runner 抓到共用比對誤報兩處（`current_inventory_view` 資產欄位兩種拼法、`match_parties` 共用信箱配錯人），只在版本比對側補；**決策者已裁開一張小卡查證 docx／Excel 匯入預覽**（裁示 12），收口時開。
- **「基本資料」頁籤沒進版本**（決策者 T-15 實測；runner 分析在 CM-2768 卡尾）：七個欄位在 `compliance.module_frames` 本列，存版不複製、檢視舊版只換範本 SSP、比對比不到；設計範圍從頭沒定義。首腦建議另開一卡：版本表加 JSONB 存六欄（發布狀態排除，它是假三態）、檢視舊版在 `_version_as_module_frame` 換值、compare 加 `basic_info` 頁籤、還原不換基本資料、舊版本顯示灰字「存版時尚未記錄」。**決策者已裁（2026-10-15）：照首腦建議開 T-19（CM-2773）**，T-15 維持 Done。
- 雷門複測清單三項**已驗過**（裁示 13），母卡可收。
- ddd-compliance-reviewer 掃整個 arc 的 diff（十六張卡、三 repo）＋ arc-review skill 多 agent review；本 FR 碰到的超標檔至少拆一支（`ssp_control_implementation_service.py` 已 959→875，`ProjectPlanningView.vue` 2,616→2,585，`ModuleFrameTemplateEditView.vue` 2,106→2,078，都還超標）。
- e2e 回歸到 test repo（母卡收口動作，另開一棒）。
- 使用手冊與 spec-site 頁面 spec 更新（`writing-feature-specs` skill）。

- **jedi-oscal-v2 發版**（dca8e050 合併規則）＋主專案還原 pin 升版號（決策者裁示才動）。
- jedi-oscal-v2 發版時機：決策者 2026-10-15 裁 arc 收口時一起發（T-3 合併規則＋T-12 翻譯表一起）。
- CRA 套件 seed 007／008 **保留不併入 002**：011 需要 007 當翻譯來源，新裝 002→007→010→011 即終局（T-12 runner 結論，首腦認可）。
- 權限矩陣重跑 `scripts/deliverables/gen_permission_matrix.py`（T-5／T-6／T-7／T-9 累積 46+ 列待補）。
- `GRC_403069` 與專案詳情 `ssp_source` 欄位：下次發 jedi_compliance_audit 一起補鏡像碼表與 schema。
- follow-up 記錄不開卡：批次存 API 送空字串不清空備註（T-1 契約），比對頁如實標差異；框架版本編輯頁平面清單 sort_order 每群組各自編號、順序不固定（改前即如此，畫面分節不受影響）。
- **出貨基線待重產（C-4 已產清單，188 等決策者排）**：依序 `2026-10-14-fr139-ssp-control-attachments.sql` → `2026-10-14-fr139-ssp-versions.sql` → `2026-10-15-fr139-ssp-version-basic-info.sql`；步驟照 sql-migration skill「出貨基線同步」段（備份→套三支→gen_schema／gen_stamp→diff 零刪除）。T-12 的 010／011 在套件 migrations 不進基線。
- 上版檢查項新增：STG／POC 套 011 前先 dry-run 看 NOTICE 筆數；套後查各自的 CRA 資源庫改掛 207、213 deprecated。
- 守衛既有 3 紅（survey 兩條 GET 未登記、FE 權限矩陣要重跑 `scripts/deliverables/gen_permission_matrix.py`）收口時處理。
- **本機 BE 8000 已由首腦 17:10 重啟**（pid 8486，載入 T-19＋當時 T-20／T-21 runner 未 commit 的工作樹）；runner 回寫「沒重啟共用 BE」時，首腦驗收前要先重啟再讓決策者看。
- DEV 驗收殘留：461～463 與專案 1408～1410 **已由決策者軟刪**（14:35／14:44）；468「只有軟刪專案」（T-8 runner 建）；**469「首腦 T-16 驗收庫」＋專案 1497（新模式，活）**可當新模式複測資料；429 停第 2 版共 6 版。
- `test/security` 既有 3 紅（survey 兩支路由未登記、FE 權限矩陣漂移）與本 arc 無關，收口時確認歸屬。

## 座標

- design：`../design.md`　討論稿：`../discussion.md`　雛形：`../prototype/index.html`
- 母卡：https://app.notion.com/p/FR-139-3f9346da4cd081e0afbce457d08bea06
- 建卡結果：`notion-cards.json`
- branch：BE／FE／jedi-python-package 三 repo `feature/FR-139`；本 arc 決策者授權首腦與 runner push 自己 branch
