FR-139 · 進度 · living 文件,就地 Edit
母卡 CM-2745 · 二十張實作卡 · 五波派工+複測補強
只描述此刻。每棒回寫後更新本表;沿革進
FR-139-LOG.md與 git log。問「做到哪」看這份。
| 波 | 卡 | 可同時開 | 條件 |
|---|---|---|---|
| 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-12 | CM-2762 | catalog 三張翻譯表+套件 repo 接翻譯機制+讀取端依語言+CRA 中英整併 | 5 | ✅ Done | BE f248d7f41/套件 163d9ba0+回歸修 52c2a53d | 010/011 已套 DEV;資源庫 catalog 是深複製品,011 連九份複製品一起翻;213 deprecated |
| 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 |
| 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 | |
| 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 / 🔴 卡住
子公司不用總部分享的資源庫開專案:資源庫可匯出匯入,就不走分享(2026-10-15)。T-9 的「分享庫對子公司唯讀」行為維持,不另開卡。
「完整稽核流程」母範本(compliance.flow_templates uid da8c2b81…)2026-10-15 12:21 已由 admin 帳號發布回去(決策者指示);1408~1410 可發起覆核。
資源庫刪除守門維持現狀(2026-10-15 複測時確認):綁著活的專案不准刪,專案先刪(軟刪)資源庫才可刪;刪除是軟刪。不加封存狀態、不放寬成警告後可刪。
暫存擴成全頁(含基本資料)並改名「儲存」;頁首四鈕合成一顆群組鈕照問卷頁(2026-10-15 複測裁示)→ T-14。
版本比對改成「檢視舊版頁上著色,所有頁籤都比」,獨立比對頁收起來(2026-10-15,推翻 D11「只比控制項與 AO」)→ T-15。理由:獨立頁寫「其他頁籤不比」只會被問為什麼沒做。
唯讀模式(規劃頁新模式、檢視舊版)改成文字顯示,不用反灰輸入框(2026-10-15,「真的超醜」)→ T-16。
T-15 共用比對誤報(資產欄位兩種拼法、共用信箱配錯人):docx/Excel 匯入預覽可能同樣漏比,開一張小卡查證,有就修、沒有就結案(2026-10-15)。
雷門複測三項(T-12b 語言下拉與 PDF 更新、T-13 匯出彈窗與 CRA 三份文件、T-6 只讀帳號看不到存版還原鈕)已驗過(2026-10-15)。
review 建議級五裁(2026-10-15):①docx 匯入資源庫改走合併(與 Excel 一致)②三處守門沒接線改 raise ③規劃頁狀態下拉讀選單表、匯出時 unknown→planned(D20 的 unknown 是產品擴充,DEV 既有 2,133 筆,OSCAL 標準不含)④ModuleFrame.vue 這次不拆 ⑤RLS 一條 FOR ALL 認可、改判準文字。①②③+四小項→C-6 CM-2798。
T-24 兩件:預覽表內「配對狀態」欄不拿掉;預覽不換成資源庫同一套元件(2026-10-15)。
新需求「資源庫層任務初始化、顧問定任務名稱/描述/指南」先裁三條:只給顧問名稱/描述/指南;任務先不進版本;任務匯入 Excel 加描述/指南兩欄資源庫與專案共用(2026-10-15)。收口後另開 FR。
子需求五「任務流程套用到其他任務」併進 FR-139 不開新 FR(2026-10-15):不分範圍層、不用「同來源」,使用者從控制項/AO 樹自己勾,或全選=全專案(二次確認);只套 TODO;只換 BPMN、任務層欄位不動;各任務仍持有自己的複製品 → T-17。
T-8:舊模式專案也算,驗收時複製三份新資源庫再啟動。
T-10:鎖寫看最新一輪(不分主輪/覆核子輪),沿用既有當前輪次函式。
T-4:拆得出來就拆,拆不出來留著,不列對照表等確認。
子需求四(2026-10-15):英文版連控制項標題也要(走 catalog 翻譯表);套件可動;框架匯入加語言下拉;CRA 現有中(213/catalog 2135)英(207/2112)兩版整併成英文主表+中文翻譯表,460/459 改指 207。
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 決定要不要在資源庫頁擋掉。先做這三件,做完停下等令:
FR-139-LOG.md 最後六個 block。git fetch 三 repo 確認 origin/feature/FR-139 與本機對齊;Notion 查母卡 CM-2745 與子需求 CM-2746~2748 狀態(應仍 Not started);pyproject 四支 path dependency 是否仍打開。冷接自檢(答得出才算讀懂):
驗收做法(本棒固定用法,照抄):
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 就炸。/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。node_modules/playwright/index.mjs,注入 localStorage cm_store={accessToken},FE localhost:5180。平台管理員頁注入進不去,留決策者。本棒留給收口的(除「母卡收口待辦」段外):
5be32fc9a)。62be9edc4(任務指派先選部門)決策者在 runner 視窗直裁,沒核過。test_ssp_excel_import_project_ssp::test_confirm_module_frame_source_merges_with_update_mode 紅(T-21 備份守衛,測試沒注入 ssp_version_service),收口 reviewer 時補。big-feature-workflow 第一棒寫討論稿+可點雛形。舊手冊 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.md 討論稿:../discussion.md 雛形:../prototype/index.htmlnotion-cards.jsonfeature/FR-139;本 arc 決策者授權首腦與 runner push 自己 branch