手冊首頁 / 專案與任務 / 專案管理 功能群總覽

專案管理 功能群總覽

本檔放「本功能群多個頁面共用的知識」:頁面地圖、稽核輪次狀態機、角色權限基調、核心資料模型。

各頁面 spec 引用本檔,只寫自己頁面的差異——改共用邏輯時改這裡一份

1. 頁面地圖

頁面 FE route 用途一句話 spec
專案列表頁 /project/projects 專案清單、建立入口 專案列表頁
專案建立 /project/projects/new 三步精靈成立專案(clone 資源庫三件組) 專案建立
專案總覽頁 /project/projects/:id/round/:roundUid 單一專案儀表板、輪次切換與階段導覽中樞 專案總覽頁
專案規劃頁 /project/projects/:id/round/:roundUid/planning planning 階段主工作區:SSP 現況 + 任務指派 + 程序書 專案規劃頁
稽核計畫填寫頁 /project/projects/:id/round/:roundUid/ap-authoring(屬稽核執行群) audit_planning 階段:AP 行程 / 查核方法 →稽核執行群

頁面 × 階段對應:每個稽核輪次階段有一個「主場頁面」——

planning        → 專案規劃頁(本群)
audit_planning  → 稽核計畫填寫頁(稽核執行群)
auditing        → 稽核執行頁(稽核執行群)
remediation     → POA&M 頁(稽核執行群)
closed          → 各頁唯讀

2. 稽核輪次狀態機(本群與稽核執行群共用的核心)

模型:一個專案 = 一輪主稽核 + N 輪覆核(close-out);輪次實體是 compliance.project_audit_rounds,狀態由綁定的 BPMN workflow(jedi-flow-engine)驅動。

round_state_machine start planning planning 專案規劃頁(本頁) start->planning  建立輪次(manager) audit_planning audit_planning 稽核計畫填寫頁 planning->audit_planning  啟動稽核 launch-audit(manager)  ・把目前 SSP 凍結成快照  ・產生稽核計畫(AP)草稿 auditing auditing 稽核執行頁 audit_planning->auditing  開始稽核 start-auditing(auditor) remediation remediation POA&M 整改 auditing->remediation  完成判定 finalize-audit(auditor)  有未通過項 → 自動建改善計畫(POA&M) closed closed 結案 auditing->closed  完成判定 finalize-audit  全部通過 → 直接結案 pending_reverify pending_reverify 待覆核 remediation->pending_reverify  結束本輪 close-round(manager)  前置:改善計畫全部完成 closeout close-out 覆核子輪 (新輪回到 planning) pending_reverify->closeout  啟動複驗 launch-reverify(auditor) closeout->closed  覆核子輪完成且全部通過  → 母輪自動結案
稽核輪次狀態機:7 態與轉換動作(動作後的英文 = API endpoint,括號 = 允許角色)

轉換權限與前置條件(BE 強制,enforcement 在 app/grc/service/audit_round_app_service.py):

轉換 誰能按 前置條件 失敗 error code
建立輪次 → planning manager 專案有 living SSP GRC_ROUND_LIVING_SSP_MISSING
啟動稽核 launch-audit → audit_planning manager status=planning、living_ssp_id 非空 GRC_ROUND_PHASE_READONLY
開始稽核 start-auditing → auditing auditor(manager 可代行) status=audit_planning、AP 已存在
結束本輪 close-round manager POA&M 全部 closed
啟動複驗 launch-reverify auditor(manager 可代行) status=pending_reverify

通用 phase guard:寫入 API 用 common/util/round_guard.pyassert_round_phase(round, {允許階段}),階段不符回 GRC_ROUND_PHASE_READONLY(412)。新增本群寫入 API 時必加

3. 角色權限基調

角色是誰

  • manager(專案負責人)——開專案、定範圍、指派任務,時機到了啟動稽核輪次。「身為 manager,我要規劃這輪稽核要涵蓋哪些控制項、指派誰負責,準備好就啟動稽核。」
  • auditor(稽核員)——規劃期可協助編修稽核計畫,主戰場在稽核執行群。「身為 auditor,我要在規劃期先看到專案範圍與 SSP 現況,為稍後的判定做準備。」
  • viewer(一般參與者,如受評方成員)——只能檢視進度。「身為 viewer,我要能查看目前規劃到哪,不需要編輯權限。」

專案層角色compliance.project_participants.role):manager / auditor / viewer(一般參與者)。

動作類型 manager auditor viewer
輪次生命週期(建立 / launch / close)
稽核規劃寫入(AP / 任務指派) ✓(全域代行)
檢視

manager 全域 override 慣例:BE 檢查 auditor 的地方一律允許 manager 代行(role not in ("auditor", "manager") 才拒絕)。

頁內三層遞進(專案規劃頁特有,FE 判定):專案 manager → 控制群組 manager → 控制項 manager,任一層即可編輯該層以下內容;詳見 專案規劃頁 §3。

4. 核心資料模型

pm_core_data_model cluster_compliance compliance(業務層) cluster_oscal oscal(合規資料層) projects projects 專案主檔 project_extensions project_extensions 專案擴展(1:1) projects->project_extensions 1:1 project_participants project_participants 參與者(user_id+role) projects->project_participants 1:N rounds project_audit_rounds 稽核輪次(7 態) projects->rounds 1:N(soft ref) module_frames module_frames 範本(預設 BPMN) project_extensions->module_frames module_frame_id ssp_living system_security_plans living SSP(可編輯) project_extensions->ssp_living living_ssp_id wf_templates workflow_templates BPMN 範本(master+快照) rounds->wf_templates flow_template_snapshot_uid wf_executions workflow_executions BPMN 執行實體 rounds->wf_executions workflow_execution_uid (驅動狀態機) ssp_frozen system_security_plans 凍結快照(per 輪) rounds->ssp_frozen ssp_id (launch-audit 快照) ap assessment_plans 稽核計畫(AP) rounds->ap assessment_plan_id module_frames->wf_templates 預設範本 ssp_living->ssp_frozen launch-audit snapshot
專案管理核心資料模型(藍 = compliance 業務層、黃 = oscal 合規資料層)

living vs 凍結 SSP(本群最重要的概念)

  • living SSPproject_extensions.living_ssp_id)=專案「現在」的控制項實作狀態,專案規劃頁編輯的就是它
  • 凍結快照project_audit_rounds.ssp_id)= launch-audit 當下拍的快照,稽核後續階段(AP / AR)都基於快照,living 繼續演進不影響本輪稽核
  • 讀控制項結構一律從 projects.uid → living_ssp_id → profile_imports → catalog_controls 解析(不要繞舊 v1 表)

5. 本群共用的已知坑

  1. AO 識別碼是 _obj.N 格式(非 UUID),由 SSP 實作記錄衍生(app/grc/service/ao_derivation.py);三套識別碼(tree / SSP / AR)都以 _obj.N 為 canonical
  2. 任務名稱/描述的真相來源是 BPMN 範本的 userTask,不是 DB 任意欄位;改任務文案要動範本
  3. v1 殘留profile_controlscatalog_control_assessments 等 v1 表已 drop,看到舊 code 引用是死路,不要照抄
  4. 輪次狀態是 BPMN 驅動:直接 UPDATE project_audit_rounds.status 會跟 workflow 脫鉤,一律走 API