範圍:把專案/稽核生命週期的 FE 從舊
/grc/project/<uid>/ap/<uid>/*引擎,遷到新的 audit-round(稽核輪次)引擎(/oscal-project/start、/projects/<id>/audit-rounds/*、/audit-round/<id>/*、/ap/<id>/*、/ar/*、/poam*)。 原則:大部分 FE 沿用,只動 4 塊;漸進式、每 Step 可獨立 ship + 手測。 撰寫日:2026-06-16 BE 端新引擎 API 已上線(見fr038-api-inventory.md§3)。
| # | 決策 | 影響 |
|---|---|---|
| D1 | 路由參數從 apUid 改為 roundUid(新引擎輪次為核心;AP 沿 engagement 多輪共用) |
所有 ap-scoped route + 麵包屑 meta.breadcrumb.parent + 側欄高亮要跟著改 |
| D2 | 舊 /grc/project/ap 引擎漸進退場:新 view 全接新 API;舊 route 先留但拔掉入口(避免使用者誤入依賴退役表的舊 AR/task-setup);全綠後再刪舊 route + service |
過渡期新舊並存,但使用者只走得到新的 |
| 區塊 | 現行檔 | 動作 | 難度 |
|---|---|---|---|
| ① Audit Round 列表 | ProjectApListView.vue |
重構(AP 清單 → 輪次清單) | 中 |
| ② AP 維護 | (無) | 新建 | 大 |
| ③ AR 維護 | AuditReviewView.vue + AuditVerdictPanel.vue |
重構(控制項層 → AO 層 + risk) | 大 |
| ④ POA&M | PoamView.vue + PoamDetailDrawer.vue |
重構(扁平 → 三層) | 中大 |
| 保留 | MyTasksView / TaskSetupView / RoundSwitcherBar / AuditTreeNav / AuditControlRef / FlowPhaseBanner / StatusBadge / JobExecutionDrawer | 驗證即可 | 小 |
目標:常數 + 路由 + 輪次切換器就位,讓後續 Step 有地基。
src/config/api/api.js:新增端點常數
OSCAL_PROJECT_START = /oscal-project/startAUDIT_ROUNDS = /projects(+ /<id>/audit-rounds[/list])AUDIT_ROUND = /audit-round(+ /<id> + 動詞 /launch-audit|launch-reverify|start-auditing|close-round)AP = /ap(+ /<id>/reviewed-controls|assessment-subjects|tasks)、AUDIT_ROUND_AP = /audit-round/<id>/ap[/generate-draft]AR_FINDINGS /audit-round/<id>/ar/findings、AR_FINDING /ar/finding/<id>、AR_RISKS /audit-round/<id>/ar/risks、AR_RISK_FINDINGS /ar/risk/<id>/findings、AR_OBSERVATIONS、AR_FINALIZEPOAM_ITEMS /audit-round/<id>/poam-items、POAM_ITEM /poam-item/<id>、REMEDIATION_MILESTONES /remediation/<id>/milestones、POAM_MILESTONE /poam-milestone/<id>src/config/router/index.js:新增 round-scoped route(D1)
/project/projects/:id/round/:roundUid/{plan,audit,poam} 等;舊 :apUid route 先留(D2)menu.json 補新 route name;meta.breadcrumb[0].parent 指對 owning 列表頁RoundSwitcherBar.vue:改接 POST /projects/<id>/audit-rounds/list(payload 對齊 round_no / status / parent)目標:ProjectApListView 改成列輪次 + 生命週期動詞按鈕。
ProjectApListView.vue:
POST /projects/<id>/audit-rounds/list;欄位 round_type / status(七態)/ parent 血緣 / start_atPOST /projects/<id>/audit-rounds(initial / surveillance)round.status 七態(取代舊 flow stage 判斷):
planning → 啟動稽核 POST /audit-round/<id>/launch-auditaudit_planning → 進 AP 維護(Step 2)auditing → 進 AR 維護(Step 3);start-auditing 動詞remediation → POA&M(Step 4)pending_reverify → 發起覆核 launch-reverifyclosed → 唯讀目標:launch-audit 後,稽核員編 AP 的全新畫面。
AuditPlanView.vue(route /round/:roundUid/plan):
GET /audit-round/<id>/ap;可 POST .../ap/generate-draft 重生PUT /ap/<id>/reviewed-controls(可重用 AuditTreeNav 當控制項勾選器)PUT /ap/<id>/assessment-subjects(subject_type ∈ component/inventory-item/location/party/user,全量覆寫)PUT /ap/<id>/tasks(timing + methods EXAMINE/INTERVIEW/TEST)目標:AuditReviewView 判定下沉到 AO 層 + 新增 risk。
AuditReviewView.vue + AuditVerdictPanel.vue:
GET /audit-round/<id>/ar/findings(控制項導覽 + 展開 AO;每 AO 一筆 finding)PUT /ar/finding/<id>,met/not_met/pending)POST /audit-round/<id>/ar/observationsRiskPanel.vue:
GET|POST /audit-round/<id>/ar/risks(severity low/medium/high/critical)PUT /ar/risk/<id>/findings(多對多勾 finding,全量覆寫)POST /audit-round/<id>/ar/finalize → 無 not_met 結案 / 有 not_met 轉 remediation + 自動生 POA&M目標:PoamView 從扁平改成三層。
PoamView.vue + PoamDetailDrawer.vue:
POST /audit-round/<id>/poam-items/list(讀 deadline_warning / days_remaining,BE 已回)GET /poam-item/<id>(封面 + risk/remediation/milestone)POST /ar/risk/<id>/remediationsPOST /remediation/<id>/milestones、PUT /poam-milestone/<id>(per-milestone assignee + target_date)POST /audit-round/<id>/close-round(POA&M 全 closed 才可)My Jobs(MyTasksView,任務引擎獨立)、Task Setup(TaskSetupView,控制項→AO→job 階層,驗 context 傳遞)、JobExecutionDrawer、共用元件庫(StatusBadge / AuditTreeNav / AuditControlRef / FlowPhaseBanner)。
Step 0 → 1 → 2 → 3 → 4(依賴遞增、風險遞增)。每 Step 獨立 commit + 手測 + 不破壞既有;Step 1 一通整條生命週期入口就活。BE 新引擎 API 已上線,FE 可直接接。
對應後端設計:engagement 模型 / 七態狀態機 / 四 clone-snapshot 邊界見
design.md§3、api-contract.md§3~§8。