| 項目 | 內容 |
|---|---|
| 緣由 | 接續 FR-038 round-flow,把生命週期最後兩階段(audit / poam)的 FE 遷到 v2 round-scoped,並補 AP→AR 溯源、風險 CRUD、我的稽核 |
| BE branch | feature/oscal-refactor(勿切 branch) |
| FE branch | 同名 feature/oscal-refactor(~/Projects/Billows/Audit-Manager/compliance-manager-fe/) |
| 套件 | jedi-oscal-v2(~/Projects/Jedicogy/module/jedi-python-package/jedi-oscal-v2/,editable .pth,改完重啟 BE 生效) |
| 🔴 狀態 | 三 repo 全部未 commit、未 push(working tree);BE 已於 2026-06-17 以最新改動重啟(可直接測 POA&M);收尾文件(changelog/SUMMARY/Notion)尚未做(等 user 令) |
| 下一棒 | POA&M 階段端到端實測(finalize → 缺失改善 → 結案),+ 補里程碑負責人指派 |
| 接手前必讀 | 本文件全讀 + implementation-plan-final-stages.md |
大圖:FR-038 把 OSCAL v1→v2。本弧處理生命週期最後兩階段 FE 遷移 + AR 溯源。OSCAL 評估鏈:Catalog→Profile→SSP→AP→AR→POA&M。
這弧拍板的關鍵決策:
result.assessment-subjects[](新建 child table);風險鉤稽寫 OSCAL 原生 finding.related_risks[](dual-write)。冷接自檢 4 問(答不出回去讀):
oscal.ar_assessment_subjects(result.assessment-subjects)/ finding.related_risks(OSCAL 原生)+ join table assessment_finding_risks(查詢索引)。_check_role)。generate_from_findings(not_met finding → poam item,related_findings 軟引用)。docs/features/FR-038-2606-oscal-redesign/implementation-plan-final-stages.md(本弧 plan)count_reviewed_controls len bug、audit_round_app_service._to_dto datetime 序列化、stage_advance_service manager override(line 110/286)domain/oscal/service/ssp_project_resolver.py 加 _resolve_project_id(living + frozen round 兩鏈);DI oscal_containers.py 注入 project_audit_round_domain_service;repo/domain 加 get_by_ssp_idoscal.ar_assessment_subjects(migration scripts/sql/2026-06-17-ar-assessment-subjects.sql 已套 DEV;stg/poc/prod 待辦)+ 套件 6 新檔(model/entity/query/mapper/repo if+impl)+ assessment_result_service.add_result(assessment_subjects=) / list_result_subjectsinit_ar_matrix_for_round 把 AP 受評對象→AR subjects、AP tasks→ar_results.assessment_log;判定收斂控制層(init_finding_matrix(control_ids))assessment_subjectsassessment_plan_app_service._check_auditor、assessment_result_app_service._check_auditor、audit_round_app_service._check_role 全放行 managerinfra/grc/repository/auditor_dashboard_query.py 2A dark→查 v2 audit_round(+ verdict 統計);serializer 加 round_uidupdate_risk/delete_risk + 套件 assessment_risk_service.update_risk/delete_risk;route PUT/DELETE /audit-round/<r>/ar/risk/<risk_uid> + UpdateRiskRequestlink_risk_findings/delete_risk 同步寫 OSCAL finding.related_risks[](_set_finding_related_risk helper)+ join table;list_risks 回 linked_findings(finding_uid+control_id)RoundAuditReviewView.vue(新):三欄(沿用 AuditTreeNav+AuditControlRef + v2 控制層判定面板);判定 Tab(符合/不符合/待判定 + 說明 + 觀察帶受評對象)+ 風險 Tab;左樹預設全展開 + 判定圓點(met→pass/not_met→fail);字型放大一級;證據接真實來源(檔案/連結 from job-evidences、問卷 from job detail task_surveys 去重);AO 級舊輪用聚合相容(任一 AO not_met→控制 not_met,判定寫回全部 AO finding)RoundPoamView.vue(新):三層(項目→矯正措施→里程碑),尚未 runtime 測RoundApAuthoringView.vue(本弧+前;受評控制項/對象/行程;唯讀模式 by user)MyAuditsView.vue:導 round-scopedproject-audit-review-round / project-poam-round;總覽按鈕 isRoundRoute 派發audit_round_app_service._check_role → start_auditing 報「不具稽核員角色」)。_check_role(round) vs _check_auditor(AP/AR) vs stage _resolve_main_roles。target_status_state 欄 = OSCAL product token(satisfied/not-satisfied/pending);target_status.product_state JSONB = FindingState 值(met/not_met/pending)。get_findings 的 state 用後者;FE 用 met/not_met/pending。AuditTreeNav 圓點吃 v1 詞彙(pass/fail) → 需 toTreeVerdict 對應。/job-evidences?job_execution_uid= 只回檔案/連結,問卷在 job detail 的 task_surveys(一份問卷多指派=多 task_survey,需去重)。finding.related_risks(已封裝在 link_risk_findings/delete_risk)。重啟 BE + 用新控制層輪:planning → ap_authoring →(啟動稽核)→ audit(判定不符合 + 風險鉤稽)→(finalize)→ 缺失改善:
round.status=remediation、round.poam_id 有值、oscal.poam_items 筆數 = not_met 控制數、poam_item.related_findings 指回 findingall_items_closed)→ closedRoundPoamView.addMilestone 目前只送 {title, target_date}。BE add_milestone 的 assignee_user_id 是 int user_id,但 FE 手上的 participants 是 user_uid 字串 → 型別不一致,需做 user_uid→user_id 對應(查 users 或讓 BE 收 uid)。assignee_user_uid(內部轉 id),FE 用 participants 當候選;或 FE 拿 user_id。cd ~/Projects/Billows/Audit-Manager/compliance-manager-be
git branch --show-current # 應 feature/oscal-refactor
git status --short | grep -vE '^\?\? ' # 對照 §6 我的改動清單
# import smoke(sandbox 無法完整 boot)
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 api.project, app.grc.service.assessment_result_app_service; print('OK')"cd ~/Projects/...-fe && npm run build:DEVBE:assessment_result_app_service.py(AR 判定/觀察/風險/溯源核心)、audit_round_app_service.py(start_auditing/finalize/close_round/launch_reverify + _check_role)、ssp_project_resolver.py(frozen SSP 反查)、auditor_dashboard_query.py(我的稽核)、assessment_plan_app_service.py(AP 寫入 + _check_auditor)、stage_advance_service.py(推進 override) 套件:ar/assessment_result_service.py(add_result/list_result_subjects)、ar/assessment_risk_service.py(update/delete_risk)、ar/oscal_ar_assessment_subjects*(新 child table 6 檔) FE:RoundAuditReviewView.vue(稽核三欄主檔)、RoundPoamView.vue(POA&M)、MyAuditsView.vue、ProjectAuditorOverview.vue(按鈕派發)、AuditTreeNav.vue(expandAll + 圓點)
BE(M):api/grc/serializers/auditor_dashboard.py、api/project/__init__.py、api/project/routes/audit_round_route.py、api/project/serializers/audit_round.py、app/flow_engine/service/stage_advance_service.py、app/grc/service/{assessment_plan,assessment_result,audit_round}_app_service.py、di_containers/oscal/oscal_containers.py、domain/grc/repository/i_project_audit_round_repo.py、domain/grc/service/project_audit_round_domain_service.py、domain/oscal/service/ssp_project_resolver.py、infra/grc/repository/{auditor_dashboard_query,project_audit_round_repo_impl}.py(??)scripts/sql/2026-06-17-ar-assessment-subjects.sql
⚠️ BE 的
pyproject.toml/docs/features/README.md/proposal.html不是我改的(pre-existing / user in-flight)— 勿一起 commit。
套件(M):jedi_oscal_v2/app/service/ar/assessment_result_service.py、.../assessment_risk_service.py;(??)jedi_oscal_v2/{domain/entity/ar,domain/repository/ar,infra/mapper/ar,infra/model/ar,infra/repository/ar}/*ar_assessment_subjects*(6 檔)
⚠️ 套件的
catalog_service.py、oscal_io_service.py、tests/、../jedi-*/CLAUDE.md不是我改的 — 勿一起 commit。
FE(M):src/components/grc/AuditTreeNav.vue、src/config/locales/index.js、src/config/router/index.js、src/views/project/MyAuditsView.vue、src/views/project/ProjectAuditorOverview.vue;(??)src/views/project/{RoundApAuthoringView,RoundAuditReviewView,RoundPoamView}.vue、src/config/locales/i18n/{en,zh-tw}/{ap-authoring,round-audit-poam}.json
-am{"severity":...},非 likelihood×impact facets)— user 已知,列 follow-up2026-06-17-ar-assessment-subjects.sql讀 docs/features/FR-038-2606-oscal-redesign/handoff/2026-06-17-final-stages-audit-poam-handoff.md,
先答冷接自檢 4 問(判定=控制層 / 溯源存哪 / manager override 4 處 / POA&M item 來源)再開工。
本弧已完成稽核+POA&M FE(v2 round-scoped)+AR 溯源+風險 CRUD+我的稽核(全在 working tree、未 commit)。
下一棒:請 user 重啟 BE → 用「新控制層輪」端到端實測 POA&M(finalize→缺失改善→結案),
查 round.status/poam_id/poam_items/related_findings;再補里程碑負責人指派(user_uid→user_id 對應,見 §3.2)。
不切 branch、push 等 user、收尾等 user 令。