手冊首頁 / 專案與任務 / POA&M 矯正頁

POA&M 矯正頁(Plan of Action & Milestones)

功能群:稽核執行|階段轉換、AP→AR→POA&M 資料模型、角色基調先讀 功能群總覽

事實基準:2026-07-05 從 FE / BE code 掃出(FR-038 v2 round-based,POA&M 由 AR finalize 生成);API schema 逐條對照 api/project/serializers/audit_round.pyapp/grc/service/poam_app_service.py

1. 功能描述

POA&M 矯正頁是稽核輪次 remediation 階段的主工作區:AR finalize 時把 not_met 缺失自動生成 POA&M items,本頁由專案經理管理每項缺失的矯正計畫(remediation / response)與里程碑(milestone),追蹤到全部結案後 close-round。POA&M 內容承接 AR 的 findings / risks / observations(見 _overview §4),本頁只在 remediation 階段可寫。

主要使用者:專案經理(manager)。里程碑可指派給任何使用者執行整改,但編輯 POA&M 結構是 manager 的職責。

角色速覽(完整定義見 _overview §3):

角色 一句話
manager 專案經理 — POA&M 矯正計畫與里程碑的管理者、close-round 的擁有者
(里程碑負責人) 被指派執行整改的使用者(不必是 manager)

1.1 功能總覽(本頁全部功能)

# 功能 說明 位置 詳述
1 POA&M 概況統計 總項數 / 進行中 / 已結案 / 完成度 % + 進度條 Header 概況區 §10
2 POA&M 項目清單 表格:標題(control_id + 嚴重度點)/ 嚴重度 / 狀態 / 目標日(逾期警示)/ 進度(里程碑 done/total) 主表格 §5
3 狀態篩選 全部 / 進行中 / 已結案 表格工具列 §5
4 項目明細抽屜 點列開右側抽屜(36rem)三 tab:矯正措施 / 缺失脈絡 / 證據 右抽屜 UC-PM-01
5 新增矯正計畫(remediation) 對某風險新增 response(標題 / 說明) 矯正措施 tab → dialog UC-PM-01
6 刪除矯正計畫 刪除自建 response(recommendation 型受保護不可刪) 矯正措施 tab UC-PM-03
7 新增 / 編輯里程碑 標題 / 負責人 / 目標日 / 狀態;狀態點可循環 open→in_progress→done 矯正措施 tab 里程碑卡 UC-PM-01
8 刪除里程碑 移除單一里程碑 里程碑卡 UC-PM-01
9 缺失脈絡檢視(唯讀) 缺失描述 + 觀察(方法 / 對象),承接 AR 缺失脈絡 tab §5
10 證據檢視(唯讀) 檔案 / 連結 / 問卷(開預覽) 證據 tab + EvidencePreviewDialog §5
11 完成改善(close-round) 全部 POA&M item 結案後推進,關閉本輪 FlowPhaseBanner UC-PM-02
12 唯讀模式 非 remediation 階段整頁唯讀 全頁 §4

UC(§2)已展開本頁所有具實質後端邏輯的功能:矯正計畫 + 里程碑管理(5/7/8,UC-PM-01)、刪除矯正計畫含 recommendation 保護(6,UC-PM-03)、完成改善 close-round(11,UC-PM-02)。純顯示 / 唯讀 / 導覽類(1 概況、2 清單、3 篩選、4 抽屜開啟、9 缺失脈絡、10 證據、12 唯讀模式)見 §5 / §10;缺失脈絡 / 證據是承接 AR 的唯讀檢視、於此不重複展開。

2. Use Case

角色速覽(完整定義見 _overview §3):

角色 一句話
manager 專案經理 — POA&M 矯正計畫與里程碑的管理者、close-round 的擁有者
(里程碑負責人) 被指派執行整改的使用者(不必是 manager)

流程圖視覺慣例:菱形 = 判斷、橘底 = 例外/擋下、紅框 = 錯誤(標 error code)、綠框 = 成功終點、虛線 = 可選路徑。

UC-PM-01 管理矯正計畫與里程碑

項目 內容
角色 manager
前置條件 輪次 = remediation;POA&M item 已由 AR finalize 生成
產出 / 後置條件 oscal.assessment_remediations(response)/ oscal.poam_milestones 增改刪;item 狀態由里程碑全 done 推導為 closed
poam_uc_01 start gate 輪次 = remediation?(canEdit) start->gate ro 唯讀 banner 編輯禁用 gate->ro pick 選 POA&M 項目 開明細抽屜 → 矯正措施 tab gate->pick rem (可選)新增矯正計畫 POST /ar/risk/{riskUid}/remediations pick->rem ms 新增/編輯里程碑 POST/PUT milestones 負責人/目標日/狀態 pick->ms rem->ms perm BE 檢查:manager +phase = remediation? ms->perm deny 403 GRC_NOT_MANAGER /412 GRC_ROUND_PHASE_READONLY perm->deny ok assessment_remediations / poam_milestones 更新 里程碑全 done → item 自動 closed perm->ok
UC-PM-01 流程:remediation 才可編輯;建 response → 加里程碑 → 循環狀態;BE 檢查 manager + phase guard

UC-PM-02 完成改善(close-round)

項目 內容
角色 manager
前置條件 輪次 = remediation;全部 POA&M item 已結案(所有里程碑 done)
產出 / 後置條件 輪次 close(見 _overview §2);未全結案 → GRC_POAM_NOT_ALL_CLOSED(412)
poam_uc_02 start click FlowPhaseBanner「完成改善」 POST /audit-round/{uid}/close-round start->click perm BE 檢查:manager? click->perm deny1 403 GRC_NOT_MANAGER perm->deny1 gate 全部 POA&M item 已結案? (所有里程碑 done) perm->gate deny2 412 GRC_POAM_NOT_ALL_CLOSED gate->deny2 ok 輪次 close (見 _overview §2) gate->ok
UC-PM-02 流程:FlowPhaseBanner「完成改善」→ BE 檢查全部 item closed → close-round,否則 412 擋下

UC-PM-03 刪除矯正計畫(recommendation 保護)

項目 內容
角色 manager
前置條件 輪次 = remediation;矯正計畫(response)已存在
產出 / 後置條件 自建(lifecycle=planned)response 連其里程碑一併刪除(assessment_remediations / poam_milestones);稽核建議(lifecycle=recommendation)受保護 → GRC_POAM_RECOMMENDATION_PROTECTED(409)
poam_uc_03 start gate 輪次 = remediation?(canEdit) start->gate ro 唯讀 banner 編輯禁用 gate->ro pick 矯正措施 tab 選一筆矯正計畫 → 刪除 DELETE /remediation/{uid} gate->pick perm BE 檢查:manager +phase = remediation? pick->perm deny 403 GRC_NOT_MANAGER /412 GRC_ROUND_PHASE_READONLY perm->deny prot lifecycle = recommendation? (稽核建議,受保護) perm->prot block 409 GRC_POAM_RECOMMENDATION_PROTECTED (稽核建議不可刪) prot->block 是(受保護) ok 刪除 response + 其里程碑 assessment_remediations / poam_milestones 移除 prot->ok 否(自建 planned)
UC-PM-03 流程:矯正措施 tab 刪矯正計畫→BE 檢查 manager + phase→再檢 lifecycle,recommendation 受保護回 409,planned 才連里程碑一併刪

3. 權限矩陣

專案層角色基調見 _overview §3。本頁編輯者是 manager(與 AP/AR 頁的 auditor 不同):

操作 FE 判定 BE 強制 BE 檢查位置
讀 POA&M items / 明細 參與者即可(JWT) 無額外角色檢查 poam_app_service.py::list_items / get_item
矯正計畫 / 里程碑 寫入 canEdit = roundStatus==='remediation'(RoundPoamView.vue:45) _check_manager + assert_round_phase({remediation}) poam_app_service.py_require_round_poam(writable=True) :72、_check_manager :91-96)
close-round banner user_can_advance _check_role(..., "manager") + 全 item closed audit_round_app_service.py::close_round

本頁 FE / BE 權限對齊良好:兩端都以 remediation 階段 + manager 判定;BE assert_round_phase 硬擋過階段寫入(見 _overview §5 坑 2)。

4. 狀態機與前置條件

輪次狀態機見 專案管理群 _overview §2;本群階段轉換見 _overview §2。本頁相關 gate:

條件 效果 出處
roundStatus === 'remediation' canEdit=true:矯正計畫 / 里程碑可寫 RoundPoamView.vue:45
其餘狀態 canEdit=false:唯讀 banner + 編輯禁用 同上(:391-393)
BE 寫入 phase guard POA&M 寫入一律 assert_round_phase({remediation}),過階段回 412 poam_app_service.py:72
POA&M item 狀態 不存 DB,讀時由里程碑推導(全 done → closed,否則 open) poam_app_service.py:196-197
close-round 前置 有 item 未結案 → GRC_POAM_NOT_ALL_CLOSED poam_app_service.pyall_items_closed 檢查)
目標日警示 最早里程碑目標日 ±30 天內 → deadline_warning poam_app_service.py_DEADLINE_WARNING_DAYS=30

5. UI 設計

版面骨架與區塊職責(左 POA&M 項目表,點列開右明細抽屜三 tab;彩色區塊可點跳對應小節錨點,API 僅標代表性):

Header 概況:總項數/進行中/已結案/完成度 % + 進度條 GET /audit-round/{round_uid}/poam-items 跳至 §2 Use Case(UC-PM-02 完成改善 / close-round) FlowPhaseBanner「完成改善」 POST …/close-round(前置:全 item 結案) → §2 UC-PM-02 唯讀 banner(僅 roundStatus ≠ remediation 時出現 → 整頁編輯禁用) 主工作區 — 左 POA&M 項目表;點列開右抽屜 POA&M 項目表 狀態篩選:全部/進行中/已結案 欄:標題(control_id+嚴重度點)|嚴重度 狀態|目標日(逾期警示)|進度(done/total) 點列 → 開右抽屜(36rem) GET /audit-round/{round_uid}/poam-item/{item_uid} 跳至 §2 Use Case(UC-PM-01 管理矯正計畫與里程碑;UC-PM-03 刪除保護) 右抽屜 Tab1 矯正措施 風險問題條 ▸ remediation(response)+進度 ▸ 里程碑卡(狀態點循環/負責人/目標日) +新增里程碑 | +新增矯正計畫 | 刪除(保護) POST …/risk/{risk_uid}/remediations PUT/DELETE …/poam-milestone/{milestone_uid} → §2 UC-PM-01 / UC-PM-03 Tab2 缺失脈絡 / Tab3 證據(皆唯讀) 缺失描述+觀察(承接 AR)|檔案/連結/問卷 → 預覽 GET …/poam-item/{item_uid}(明細含缺失脈絡/證據) 彩色=可點跳本頁小節錨點(框內標錨點+代表性 API)|灰=本頁描述|虛線框=點列才開的抽屜/條件顯示層 API 僅列代表性 2~3 條,完整規格見 §6
POA&M 矯正頁版面 wireframe:Header 概況+進度、FlowPhaseBanner 完成改善、POA&M 項目表、右抽屜三 tab(矯正措施可編輯/缺失脈絡·證據唯讀)

實機截圖(STG,亮色模式,2026-07-05,帳號 blsadmin,專案「亞○ CMMC L1 合規」/ auditing 輪次):

整頁空狀態:本輪判定全數符合,尚無 POA&M 項目(稽核 finalize 後不符合項才會自動產生)

項目明細抽屜(矯正措施 tab)、里程碑編輯、缺失脈絡 / 證據 tab 三張截圖從缺:2026-07-05 盤點 STG 全庫,目前無任何存活專案的輪次有 POA&M 項目(project_audit_rounds.poam_id 全為空),暫無真實資料可拍;待有缺失改善資料再補。

狀態呈現:里程碑狀態點三態色(open / in_progress / done),可點循環(canEdit 時);目標日逾期 / 近期加警示樣式;per-操作後重載明細 + 列表(無 socket)。負責人以頭像 + nickname 顯示(BE 層 enrich,見 §11)。

6. API 規格

Envelope:成功 {"code": 1, "data": …}、失敗 {"code": 0, "msg": "…"}

6.1 總清單(本頁呼叫的全部 endpoint)

分類 Method + Path 說明 完整規格
載入 GET /grc/project/{project_uid} 專案 + 參與人員 GAI-SD-02
載入 GET /audit-round/{round_uid} 輪次 status(決定 canEdit) GAI-SD-02
載入 GET /audit-round/{round_uid}/poam-items POA&M 項目清單(狀態 / 進度 / deadline 警示) §6.2
載入 GET /audit-round/{round_uid}/poam-item/{item_uid} 項目明細(風險 / remediations / milestones / 缺失脈絡 / 證據) §6.2
矯正計畫 POST /audit-round/{round_uid}/ar/risk/{risk_uid}/remediations 對風險新增 response §6.3
矯正計畫 DELETE /audit-round/{round_uid}/remediation/{remediation_uid} 刪 response(recommendation 受保護) §6.3
里程碑 POST /audit-round/{round_uid}/remediation/{remediation_uid}/milestones 新增里程碑(per-milestone 負責人) §6.3
里程碑 PUT /audit-round/{round_uid}/poam-milestone/{milestone_uid} 更新(狀態循環 / 編輯) §6.3
里程碑 DELETE /audit-round/{round_uid}/poam-milestone/{milestone_uid} 刪里程碑 §6.3
結案 POST /audit-round/{round_uid}/close-round 全 item closed 後關閉本輪(FlowPhaseBanner 觸發) _overview §2

以下 §6.2~6.3 為核心 endpoint 完整規格(欄位逐條對照 serializer / service 組裝碼,出處標在各段末);標 GAI-SD-02 者屬常規 CRUD。

6.2 載入類

[GET] /audit-round/{round_uid}/poam-items

Response data.poam_items[](陣列,每項):

欄位 型別 說明
uid string 項目識別碼(key 為 uid,非 item_uidreturn_response 直吐原始 dict、無 response serializer 改名)
title string 標題
description string 說明
control_id string 控制項編號
verdict string not_met(POA&M 項目源於 not_met 判定)
status string open / closed(推導,全里程碑 done → closed)
risk_count int 關聯風險數
severity string 嚴重度(取關聯風險最高級)
target_date date 目標完成日
days_remaining int 距目標日剩餘天數
deadline_warning bool 目標日 ±30 天警示
milestone_count int 里程碑總數(key 為 milestone_count,非 milestone_total
milestone_done int 已完成里程碑數

出處:app/grc/service/poam_app_service.py::list_items(回傳 dict :256-270、狀態推導 :196-197、deadline :200-206)

[GET] /audit-round/{round_uid}/poam-item/{item_uid}

Response data:項目明細,含 risks[](每風險其 remediations[],每 remediation 其 milestones[])、observations[](缺失脈絡)——證據承接 AR、巢狀掛在每筆 observations[].relevant_evidence[],無頂層 evidence[] key(poam_app_service.py:301-309)。

milestone 物件(已 enrich 負責人):

欄位 型別 說明
uid string 里程碑識別碼
title string 標題
description string 說明
status string open / in_progress / done
task_type string milestone / action
assignee_user_id int 負責人 user_id
assignee_user_name string 負責人 nickname(enrich)
assignee_login_name string 負責人 login_name(enrich)
assignee_user_uid string 負責人 user_uid
assignee_org_unit_id int 負責單位 id
assignee_org_unit_name string 負責單位名稱(enrich)
target_date date 目標完成日
completed_at datetime 完成時間

出處:poam_app_service.py::get_item(milestone enrich :237-245、脈絡 :140-158)

6.3 寫入類

[POST] /audit-round/{round_uid}/ar/risk/{risk_uid}/remediations

Request:

{
  "title": "string",       // 必填
  "description": "string",  // 必填
  "lifecycle": "planned",   // 預設 planned
  "uuid": "string"          // 選填,upsert
}

Response:

{
  "uid": "string",
  "risk_uid": "string",
  "title": "string",
  "description": "string",
  "lifecycle": "string",
  "milestone_count": 0
}

出處:serializer CreateRemediationRequestaudit_round.py:190-198)、service add_remediation

[POST] /audit-round/{round_uid}/remediation/{remediation_uid}/milestones

Request:

欄位 型別 必填 說明
title string 里程碑標題
description string 說明
assignee_user_uid string 負責人 user_uid(FE 傳 uid,BE 轉 user_id)
assignee_user_id int 負責人 user_id(內部用)
assignee_org_unit_id int 負責單位
target_date date('%Y-%m-%d') 目標完成日

Response:enrich 後的 milestone(同 §6.2)。出處:serializer AddMilestoneRequestaudit_round.py:200-210)、service add_milestone(assignee 解析 :75-89)

[PUT] /audit-round/{round_uid}/poam-milestone/{milestone_uid}

Request(全欄選填 partial):

欄位 型別 必填 說明
title string 里程碑標題
description string 說明
status string OneOf open / in_progress / done
assignee_user_uid string 負責人 user_uid(FE 傳 uid,BE 轉 user_id)
assignee_user_id int 負責人 user_id(內部用)
assignee_org_unit_id int 負責單位
target_date date 目標完成日

狀態循環(狀態點點擊)= 只送 {status}。出處:serializer UpdateMilestoneRequestaudit_round.py:212-224)、service update_milestone

DELETE /poam-milestone/{uid}(刪里程碑)、DELETE /remediation/{uid}(刪 response + 其里程碑,recommendation 型回 GRC_POAM_RECOMMENDATION_PROTECTED)同檔。

7. 前端檔案地圖(compliance-manager-fe/)

檔案 角色
src/views/project/RoundPoamView.vue 主檢視(約 640 行;項目表、明細抽屜三 tab、remediation/milestone CRUD)
src/config/router/index.js:830-835 route project-poam-round(path /round/:roundUid/poam
src/components/grc/FlowPhaseBanner.vue remediation 階段推進(close-round)
src/components/grc/EvidencePreviewDialog.vue 證據預覽(檔案 / 連結 / 問卷)
src/service/BaseService.js axios 封裝(POA&M endpoint 直接呼叫)
src/config/api/api.js 端點常數(AUDIT_ROUND
src/config/locales/i18n/{zh-tw,en}/round-audit-poam.json 頁面 i18n(namespace lang.round_poam.*

8. 後端檔案地圖(本頁核心鏈路)

鏈路 Route App Service 底層
項目清單 / 明細 api/project/routes/audit_round_route.py::AuditRoundPoamItemsRoute / AuditRoundPoamItemRoute app/grc/service/poam_app_service.py::list_items / get_item(狀態推導 + deadline + milestone enrich) jedi_oscal_v2 poam repo(PoamItemRepoImpl / PoamMilestoneRepoImpl)
矯正計畫 同檔 RiskRemediationsRoute / PoamRemediationRoute add_remediation / delete_remediation_check_manager + assert_round_phase({remediation});recommendation 保護) assessment_remediations repo
里程碑 同檔 RemediationMilestonesRoute / PoamMilestoneRoute add_milestone / update_milestone / delete_milestone(assignee uid→id 解析 + enrich) poam_milestones repo
close-round 同檔(audit round lifecycle route) app/grc/service/audit_round_app_service.py::close_round_check_role manager + all_items_closed project_audit_rounds

DDD 提醒:POA&M 寫入 API 照層級走(route 不碰 DB、app service @transaction_check_manager + assert_round_phase 雙檢查)——與 AP/AR 頁一致的 phase-guard 樣板。負責人 nickname / org_unit name 在 app service 層 enrich(不存 DB、不在 infra JOIN,符合 CLAUDE.md 審計欄規範)。

9. DB

9.1 資料表總清單(本頁讀寫的全部表)

讀/寫 說明 欄位詳述
compliance.project_audit_rounds 讀/(close-round 改 status) 稽核輪次主檔(poam_id 指向本輪 POA&M) 見 project-planning §9.3
oscal.poams POA&M 文件 root(AR finalize 生成) §9.3
oscal.poam_items 矯正項目(一 not_met 控制項一 item) §9.3
oscal.assessment_findings POA&M owner findings(poam_id 見 audit-review §9.3
oscal.assessment_risks POA&M owner risks(poam_id 見 audit-review §9.3
oscal.assessment_observations 缺失脈絡(觀察) 見 audit-review §9.3
oscal.assessment_remediations 矯正計畫(response,milestone 父層) §9.3
oscal.poam_milestones 里程碑(per-milestone 負責人 / 目標日 / 狀態) §9.3

9.2 ER 圖(本頁讀寫範圍)

poam_er cluster_ar 承接 AR(唯讀) cluster_poam POA&M(本頁寫入) find oscal.assessment_findings not_met finding(owner=poam_id) poam oscal.poams POA&M root find->poam owner poam_id risk oscal.assessment_risks 系統風險(owner=poam_id) risk->poam owner poam_id rem oscal.assessment_remediations 矯正計畫(response) risk->rem 1:N(response) obs oscal.assessment_observations 缺失脈絡(觀察) items oscal.poam_items 矯正項目(狀態推導) obs->items 脈絡 poam->items 1:N ms oscal.poam_milestones 里程碑(負責人/目標日/狀態) rem->ms 1:N round compliance.project_audit_rounds poam_id / status(close-round) round->poam poam_id
POA&M 讀寫鏈:POA&M root(橘)承接 not_met findings/risks;risk → remediation(response)→ milestone;缺失脈絡走 observations

9.3 核心表欄位(取自 DEV DB dump,含 DB comment)

oscal.poams — POA&M 文件 root

追蹤評估後待矯正的缺失;內容多由 AR 的不符合 findings 轉入。required=[uuid, metadata, poam-items];import-ssp 選填。

欄位 型別 說明
uuid uuid POA&M 文件識別碼
metadata_id bigint → oscal.metadata
import_ssp_id bigint|null 選填,指向系統 SSP
local_definitions jsonb components / inventory-items / assessment-assets

oscal.poam_items — 矯正項目

plan-of-action-and-milestones.poam-items[]。required=[description, title](uuid 選填)。

欄位 型別 說明
poam_id bigint containment → poams
title / description text 標題 / 內容
related_findings / related_risks / related_observations jsonb 關聯(finding-uuid 等)

oscal.assessment_remediations — 矯正計畫(response)

risk.remediations[](response)關聯化:milestone 掛在 response 下(OSCAL-faithful),非直接掛 risk。CMMC 多為一風險一整改計畫。

欄位 型別 說明
risk_id bigint → oscal.assessment_risks
uuid uuid response 身分
lifecycle varchar(20) recommendation(稽核建議,受保護)/ planned(已排定)/ completed(設計預留,目前查無實際寫入路徑)
title / description text 標題 / 內容

oscal.poam_milestones — 里程碑

response.tasks[](type=milestone)。掛在 remediation(response) 下。per-milestone assignee 支援跨部門整改拆分。

欄位 型別 說明
remediation_id bigint → oscal.assessment_remediations
uuid uuid task 身分
task_type varchar(20) milestone(預設)/ action
title / description text 標題 / 說明
assignee_user_id bigint|null 負責人(回傳層 enrich nickname / login_name,不存 DB)
assignee_org_unit_id bigint|null 負責單位(回傳層 enrich name)
target_date date 預計完成日(CMMC 180 天追蹤點)
status varchar(20) open / in_progress / done(item 結案需全 done)
completed_at timestamptz|null 完成時間

10. 頁面邏輯與資料對應

載入時序

poam_load_sequence cluster_par 並行 mounted onMounted proj GET /grc/project/{id} 專案+參與人員 mounted->proj round GET /audit-round/{roundUid} → roundStatus(canEdit) mounted->round items GET /poam-items 項目清單+推導狀態+deadline mounted->items ready 頁面就緒(項目表) items->ready detail (lazy)點列 → GET /poam-item/{itemUid} 風險 / remediations / milestones / 脈絡 / 證據 ready->detail 選列
頁面載入時序:並行 project / round / poam-items;選列 lazy 載 poam-item 明細

關鍵欄位對應(畫面 ↔︎ API):

畫面元素 FE state API 欄位
概況統計 計算自 items {status, milestone_done, milestone_total} 聚合
項目表狀態 tag item.status(推導) poam-items status(全里程碑 done → closed)
目標日警示 item.deadline_warning poam-items deadline_warning(±30 天)
里程碑狀態點 ms.status PUT poam-milestone status(循環)
負責人 ms.assignee_user_name milestone enrich assignee_user_name(nickname)

儲存流程:各寫入後重載明細(loadDetail)+ 列表(fetchItems)以刷新推導狀態;狀態點循環 = 單一 PUT {status}。close-round 由 FlowPhaseBanner 觸發(先 BE 檢查全 item closed)。

錯誤對應:BE error envelope → toast;常見碼 GRC_NOT_MANAGER(403)、GRC_ROUND_PHASE_READONLY(412,過階段)、GRC_POAM_NOT_ALL_CLOSED(412,close 前置)、GRC_POAM_RECOMMENDATION_PROTECTED(409,刪稽核建議)、GRC_PROJECT_PARTICIPANT_NOT_FOUND(404,指派非參與者)。

11. 背景行為與外部依賴

類型 內容
通知 本頁站內通知(里程碑指派通知屬 follow-up,未實作即不寫)
審計欄 enrich milestone 負責人 nickname / login_name / org_unit name 在 app service 層批次 enrich(不存 DB、不在 infra JOIN,符合 CLAUDE.md 審計欄規範)
BPMN close-round = remediation 階段推進;all_items_closed 為前置;handler 副作用同 transaction
Socket 本頁 socket / 輪詢;各動作後重載
jedi-* 套件 jedi-oscal-v2(POA&M / remediation / milestone repo)、jedi-flow-engine(close-round)、jedi-auth(JWT)
系統參數 deadline 警示門檻 _DEADLINE_WARNING_DAYS=30(硬編碼常數)

12. 邊界情況與已知坑

  1. POA&M item 狀態不存 DB、讀時推導:全里程碑 done → item closed,否則 open;改最後一個里程碑成 done 會讓 item 自動結案(無「結案 item」單獨動作)
  2. recommendation-lifecycle response 受保護:稽核員在 AR 階段建的矯正建議(lifecycle=recommendation)不可在 POA&M 刪,回 GRC_POAM_RECOMMENDATION_PROTECTED;只有自建(planned)可刪
  3. phase guard BE 硬擋:POA&M 寫入只在 remediation,過階段直接打 API 也回 412(見 _overview §5 坑 2
  4. close-round 前置全 item closed:任一 item open 即 GRC_POAM_NOT_ALL_CLOSED;close-round 由 banner 觸發、非本頁按鈕
  5. assignee 傳 uid 不傳 id:FE 送 assignee_user_uid,BE 轉 user_id(非參與者 → GRC_PROJECT_PARTICIPANT_NOT_FOUND);回傳 enrich nickname
  6. 里程碑父層是 remediation 不是 risk:OSCAL-faithful,加里程碑要先有 response;CMMC 常一風險一 response,UI 建風險時可帶預設 response
  7. 證據 / 缺失脈絡承接 AR:POA&M 的 observations / findings owner = poam_id,內容源自 AR finalize 轉入;本頁唯讀不改
  8. date-only 目標日顯示:target_date 為 date 型(無時間),顯示留意時區慣例(見 專案管理群 _overview

13. 開發與驗證

  • 跑起來:BE python main_socketio.py(port 8000,log 在 log/app.log);FE 在 compliance-manager-fe/ 起 Vite dev server。BE 改 service code 後必須重啟(無 hot reload)
  • 測試帳號:dev 環境專案經理角色帳號(密碼見 .env / 部署文件)
  • 導航路徑:登入 → 專案 → 進入 remediation 狀態的輪次 → POA&M 矯正
  • 前置資料:輪次需已 AR finalize 且有 not_met 缺失(才會生成 POA&M items);沒有 not_met 則輪次直接 closed、不進本頁
  • E2Ecompliance-manager-test/ repo(Cucumber + Playwright);以 POA&M / poam / 矯正 搜尋
  • 相關文件:FR-038(v2 遷移,POA&M 生成);前置稽核判定見 稽核執行頁 / AR 判定;DB / API 全量見 GAI-SD-02/03