接續 2026-06-17 專案規劃頁 v2 遷移弧(已收口,見
2026-06-17-planning-v2-SUMMARY.md)。 本棒:把稽核生命週期從「規劃(planning)」往後推進到「稽核計畫填寫(ap_authoring)」。
稽核輪次生命週期(D5,已 seed):planning → ap_authoring → audit → poam → End。對應 round.status:planning → audit_planning → auditing → remediation → closed。設計依據:round-flow-engine-reintegration-design.md §4.1 / §4.2。
launch_audit:snapshot living SSP → round.ssp_id(frozen)+ 建 AP 草稿(create_draft_for_snapshot)→ status audit_planning。start_auditing:建 AR(assessment result)+ AO 全量判定矩陣(每個 reviewed control 的每個 AO 一列待判定)→ status auditing。為什麼是 auditor:reviewed-controls / subjects / tasks 是「稽核規劃」決策,屬稽核員職責(D3)。
冷接自檢 4 問(答不出回去讀 design §4):
submit_ap → start_auditing:建 AR + AO 全量矩陣,status→auditing)ap_reviewed_controls_set:reviewed-controls 非空)audit.entry_button_label_i18n=「啟動稽核」,已 seed)ap_authoring:handler_key=submit_ap、precondition_key=ap_reviewed_controls_set、main_role=auditor、entry label=「稽核計畫填寫」(本弧補)。SubmitApOnCompleteHandler → audit_round_app_service.start_auditing(round_uid)(建 AR + AO 矩陣)—— 已註冊(register_stage_hooks_to_registry)。ApReviewedControlsSetCheck(reviewed-controls 非空)—— 已註冊。app/grc/service/assessment_plan_app_service.py(create_draft_for_snapshot、set_reviewed_controls、get_ap_for_round 類)。ApReviewedControlsRoute = GET/PUT /ap/<ap_uid>/reviewed-controls(api/project/routes/audit_round_route.py)。PUT …/subjects|tasks,但本弧沒查到對應 route → 下一棒 pre-flight grep 確認是否存在,沒有就補 BE。src/views/project/ 只有 ProjectApListView / ProjectAuditorOverview / ProjectPlanningView)。RoundApAuthoringView.vue(或併入規劃頁的 routed stage ap_authoring):reviewed-controls 多選 + subjects + tasks,接上述 PUT。audit_planning 階段顯示「稽核計畫填寫」routed stage(Banner 已 round-scoped,本弧驗過)。set_reviewed_controls / subjects / tasks 的實際 BE method + route + 是否 alive(非 2A dark)。reviewed-controls 確定有;subjects/tasks 要確認。PUT /ap/<apUid>/reviewed-controls。assessment_results + AO 矩陣列。cd ~/Projects/Billows/Audit-Manager/compliance-manager-be
git branch --show-current # feature/oscal-refactor
git log --oneline -3 | cat # 應見 4e724fea
# AP authoring 端點/服務盤點
grep -rn "set_reviewed_controls\|def.*subjects\|def.*tasks\|create_draft_for_snapshot\|def start_auditing" app/grc/service/assessment_plan_app_service.py app/grc/service/audit_round_app_service.py
grep -rn "reviewed-controls\|/subjects\|/tasks" api/project/ | grep add_resource
# import smoke
set -a; source .env; set +a; export GITLAB_API_VERSION=4 GITLAB_URL=x GITLAB_PRIVATE_TOKEN=x GITHUB_PRIVATE_TOKEN=x
.venv/bin/python -c "import app.grc.service.assessment_plan_app_service; print('OK')"job_export_query / job_import_lookup 2A dark)—未串通。_obj.N)。