---
title: "FR-140 收尾彙整"
---

# FR-140 一輪內走完內稽與外稽：收尾彙整（2026-10-16）

母卡 CM-2765｜收口卡 CM-2834｜交接 [STATE](fr140-STATE.md)／[LOG](fr140-LOG.md)｜設計 [design.md](../design.md)｜推翻紀錄 [analysis](../../../analysis/2026-10-16-fr140-progress-and-rollback-redesign.md)

## 為什麼做

PM 定義「一輪＝一條完整流程」，內部稽核與外部稽核要在同一輪內走完；系統原本一輪只能稽核一次，輪次上的 AP／AR／POA&M／SSP 快照四個欄位是單值，第二次稽核會蓋掉第一次，內稽不合格也沒有「退回原卡重做」的路。

## 做完後的行為

- 流程範本的「稽核計畫填寫」站可標內部或外部；新公版「內外稽核流程」含一條從內部缺失改善回規劃的線（不取名，按鈕印下一站站名）。
- 每走到一次稽核計畫填寫站就建一筆稽核紀錄，分內外與第幾次，各自凍一組 SSP 快照、AP、AR、POA&M。第 2 次起的內稽 AP 只列上次不合格與未判定項；外稽全範圍。
- 內部缺失改善完成，不合格控制項的原任務卡退回原指派人，期限取 POA&M 最早里程碑，卡上留系統留言；重做紀錄保留歷次完成時間。內稽無缺失才進外稽，不提早結案；外稽不過照舊開覆核輪，新卡帶期限。
- 任務卡有完成期限：任務抽屜、我的任務、專案規劃頁（單張與批次）可看可改，手改標「手動調整」；到期前 3 天與當天提醒指派人與 PM。
- 參與人可設可稽核性質，進稽核站時只通知對應稽核員並出現在鈴鐺。
- 專案橫幅、專案清單、總覽稽核紀錄切換列三處統一顯示「第 N 次內部／外部稽核 · 站名」，回規劃後用推算補上正在進行的那一次。
- 流程進度條七站全畫、顏色只講這一次；退回沿實際軌跡、可跨稽核次；時間軸顯示站名並標「退回」；推進按鈕印下一站站名，內部稽核站印「完成本次稽核」。
- 總覽左側控制項導航：群組列短進度條，控制項列外框徽章＋名稱兩行、無進度條、樹狀縮排線。

## 規模

| repo | commit 數（含 FR-140） | 範圍 |
|---|---|---|
| BE | 48（另有首腦 docs commit） | `git log 96cfaab01..HEAD --grep=FR-140` |
| FE | 19 | `git log 983cf2b7^..HEAD --grep=FR-140` |
| 套件 | 16 | jedi-compliance-audit／jedi-flow-engine／jedi-task-platform |

卡片：實作 12（CM-2786～2797）、修正 7（CM-2811～2817，缺號 2814）、測試修正 6（T1～T6，CM-2820／2821／2822／2830／2831／2832）、收口 1（CM-2834）。另有決策者複測時直接裁、首腦自做的 FE 小修 `fd63b703`（導航與稽核紀錄文案）。

## 推翻了什麼

design.md 定稿的三條規則在複測時被推翻：進度條上色、退回目標、尚未建立的那一次怎麼顯示。理由與反悔條件寫在 analysis。決策者另裁：測試回報的問題一律開新卡歸「測試修正」，不退回原卡。

## 端到端驗收

決策者用 DEV 專案 1548 走完：內稽 1（不合格、退 4 張卡）→ 回規劃 → 內稽 2（無缺失、未結案）→ 外稽 1（有缺失）→ 外部改善完成 → 輪次待覆核、第 2 輪已開。未走到兩項，決策者裁不補：覆核輪新卡帶期限（第 2 輪只到規劃站）、手改期限。

## 還沒做（已知 follow-up）

| 項目 | 何時做 |
|---|---|
| SPEC、使用手冊、守衛測試補登記、整個 arc 規範審查 | 收口卡 CM-2834 |
| 四支套件（compliance-audit／flow-engine／task-platform／oscal-v2）還原固定版號並發版 | 下次出安裝包時；目前主專案 `pyproject.toml` 維持 path dependency、不 commit |
| 出貨基線重產：主線 migration 八支（audit-round-passes、job-executions-due-at、job-executions-attempt-no、job-execution-redo-log、task-alert-job-due、participant-audit-scope、task-alert-stage-entered、stage-transitions-station-labels）；seed 六支照 manifest 跑 | 下次出安裝包時，決策者裁示 |
| `.mo` 不入版控：退回留言的翻譯 key 在其他環境要 `pybabel compile -d config/translations` | 部署 STG／POC 時 |
| 資源庫終身一對一（FR-139）讓已刪專案仍鎖住資源庫 | 決策者記錄、未裁 |
| FE `npm run lint` 指錯目錄、無 eslint 設定 | 另案 |
| 既有紅測 15 條（FR-139 輪次凍結查詢相關），非 FR-140 造成 | FR-139 側 |

## 部署交接

只套 DEV（localhost:5432）；STG／POC 未動，上版前需決策者放行。三 repo 都在 `feature/FR-139`、未 push。

## 教訓（濃縮自 LOG）

1. UI 規則先畫正常路徑每一步，再定上色、文字與退回；只對著出錯截圖裁會反覆返工（進度條改了三版）。
2. 凡「猜下一站」的程式在系統判定閘道前都不可信，退回、進度、通知三處同根因，要看實際站卡。
3. 同一個語意只能有一份實作：「第幾次」推算收成 `current_pass_info`、結束文案收成 `closedLabel`。
4. 新 API 欄位要查 serializer 有沒有宣告；marshmallow 會靜默丟掉。
5. 範本連線名會直接變成按鈕文字，建範本時要當動作名取或不取。
6. 狀態判斷先判終態：「先看是不是目前、再看有沒有結束」在整輪結束時會把剛結束的那次說成進行中。
7. 派工 prompt 送出前後都 fetch 卡；STATE 寫「未派」不可信，決策者會自己貼。
