| 項目 | 值 |
|---|---|
| 緣由 | AP 稽核計畫填寫頁優化:查核方法可擴充 + 行程(task)鉤稽控制項/受評對象/稽核人員 |
| Branch(三 repo 都同名) | FR-040-AP-improvement(BE / FE / jedi monorepo 皆是) |
| 狀態 | 實作完成、單元測試綠、build 過、DEV DB 已遷移;但未經 user 手測驗收、未 push、套件未發版 |
| 接手前必讀 | 本檔 §0 讀序(design.md 全讀是硬 gate) |
| 預估時間 | 驗收 0.5h;若做 Phase 7(說明改結構化 steps)+2~3h |
| 環境關鍵 | BE 要重啟;jedi_oscal_v2 走 symlink(勿跑 poetry install 會還原 pin 2.0.0 炸掉) |
稽核員在「稽核計畫填寫」頁(/project/projects/:id/round/:roundUid/ap-authoring)規劃一輪稽核。痛點與目標:
system_menu(group AUDIT_METHOD)驅動,後台可增刪。import-ssp 帶入)。metadata.parties,可在 AP 階段就地新增。OSCAL 模型(已用官方範例 oscal-content/examples/ap/json/ifa_assessment-plan.json 證實,務必先懂):
assessment-plan
├── import-ssp → 受評方(SSP parties = 受評對象)
├── reviewed-controls → 受評控制項母體(Tab1)
├── assessment-subjects → 受評對象母體(Tab2)
├── metadata.parties + roles → 稽核團隊(assessor) ← 稽核人員在這!(非 SSP、非專案參與者)
├── local-definitions.activities → 一個「方法 + 一組控制項」的查核程序
│ └ related-controls(控制項) / props.method(方法) / steps(查核步驟)
└── tasks → 行程(timing)
├ associated-activities[].activity-uuid → 引用 activity
├ subjects[] → 該行程受評對象
└ responsible-roles[] → 該行程稽核人員(role-id=assessor + party-uuids)
1 task = 1 activity(本期 1:1)。method 放
activity.props(OSCAL 標準,非硬塞)。
docs/features/FR-040-2606-ap-authoring-improvement/design.md(全讀,尤其 §4 儲存落點、§10 稽核人員=AP parties)docs/analysis/2026-06-20-ap-task-control-subject-linkage.md(決策軌跡:為何 props/link 表/AP parties,被排除選項)docs/features/FR-040-2606-ap-authoring-improvement/implementation-plan.md(Phase 0~6 + Phase 7 提案)冷接自檢 4 問(答不出回去讀):
整個 FR-040 已 end-to-end 實作,分四塊:
AUDIT_METHOD(6 法:檢視/訪談/測試/文件檢查/電腦設定比對/門禁系統設定比對)。GET /system/menu/AUDIT_METHOD,label 走 i18n(method_<value>)fallback DB key。ap_assessment_activities.related_controls(profile in-scope,Tab1 子集)ap_task_subjects(新 link 表;Tab2 子集;下拉/chip 已依類型分組+小標)metadata.parties(oscal.parties scope=ap.metadata_id),per-task 存 ap_task_participants;可「+新增」就地建 party(固定 person、role=assessor 隱藏、含 email/電話)ap_assessment_activities.props(name=method) / 時間 → ap_tasks.timing卡片化:卡頭(序號+標題+類型+時間+刪)+ 卡身標籤式欄位(方法/控制項/受評對象/稽核人員/說明)。說明已改多行 Textarea。
scripts/sql/2026-06-20-audit-method-menu.sql(AUDIT_METHOD seed)scripts/sql/2026-06-21-fr040-ap-task-link-tables.sql(oscal.ap_task_subjects / ap_task_participants)oscal.parties/roles,零新表。1e8c231(稽核人員=SSP parties)存過的行程,participants 是 SSP party uuid,在現行 AP-parties 下拉解析不到 → dev 重存即可。activity.steps,step↔︎method 用 props 綁定,step.description=該方法看什麼怎麼看)。目前是多行 Textarea(commit 0103997)當過渡。欄位 ap_assessment_activities.steps 已存在、零新表。BE/FE 改動步驟見 design §11.6 / plan Phase 7。直接照 design §11 開工即可。ap_assessment_activities/ap_tasks/link 表/AP parties → OSCAL JSON(local-definitions.activities / task.subjects / responsible-roles / metadata.parties)。本期未做匯出。ap_assessment_activities model(steps 欄),再 FE 動態 per-method 指引欄 + BE set_tasks 寫 steps。BE(~/Projects/Billows/Audit-Manager/compliance-manager-be/)
app/grc/service/assessment_plan_app_service.py — 核心:set_tasks(寫 activity+task+link)/_ap_detail(還原)/list_ap_parties/add_ap_partyapi/project/routes/audit_round_route.py — ApTasksRoute / ApPartiesRouteapi/project/serializers/audit_round.py — _TaskItem / ApPartyAddRequesttest/test_fr040_ap_task_linkage.py — 9 測試(orchestration + AP party)套件(~/Projects/Jedicogy/module/jedi-python-package/jedi-oscal-v2/)
jedi_oscal_v2/infra/model/ap/oscal_ap_task_subjects.py / oscal_ap_task_participants.py(+ entity/mapper/repo 同名)oscal_party.py / party_repo_impl.py(metadata-scoped)FE(~/Projects/Billows/Audit-Manager/compliance-manager-fe/)
src/views/project/RoundApAuthoringView.vue — Tab3 行程 UI + options + 新增 party dialogsrc/config/locales/i18n/{zh-tw,en}/ap-authoring.json# branch / 乾淨度(三 repo 應都 FR-040-AP-improvement、clean)
for d in ~/Projects/Billows/Audit-Manager/compliance-manager-be ~/Projects/Billows/Audit-Manager/compliance-manager-fe ~/Projects/Jedicogy/module/jedi-python-package; do echo "== $d"; git -C "$d" branch --show-current; git -C "$d" status --short; done
# ⚠️ 套件 symlink 必須在(指向源碼,勿 poetry install)
ls -l ~/Projects/Billows/Audit-Manager/compliance-manager-be/.venv/lib/python3.11/site-packages/jedi_oscal_v2
# BE 單元測試(應 9 passed)
cd ~/Projects/Billows/Audit-Manager/compliance-manager-be && .venv/bin/python -m pytest test/test_fr040_ap_task_linkage.py -q
# FE build(應 exit 0)
cd ~/Projects/Billows/Audit-Manager/compliance-manager-fe && npx vite build --mode development && rm -rf dist手測(user 自己起服務;改 BE 後請 user 重啟):
jedi_oscal_v2 = symlink(site-packages → 源碼),BE 重啟即用新碼;原 pin 備份 jedi_oscal_v2.pinbak。勿 poetry install(會還原 pin 2.0.0、缺新表 model → BE 炸)。-am。BE(FR-040 相關,新→舊):e1131c31(person+email/phone) 27ed00cb(Phase6 AP parties) 12189f38(B design) 6286db0e(源更正) f09d71a2(DONE-verify handoff) 7fb60037(set_tasks 鉤稽) 5d05a5da(design/plan/analysis) 8de251b6(AUDIT_METHOD seed) eae77461(vw_user_job_queue 控制群組,順手修)
註:同 branch 另有
b1211299/e0041bfd/cf4e68f7/3814c57c/e8a2666a是 FR-038/FR-039 的早期修正,非 FR-040。
FE:0103997(說明多行) 0e780e6(chip 類型小標+去角色) 9861654(受評對象分組) e1ca5aa(party person+email/phone) ea42fa4(隱藏 role) e614b56(Phase6 AP parties) 1e8c231(過渡:SSP parties,已被取代) 1996432(名稱修+改名稽核人員) d043fcf(卡片化 UI) d955f7d(鉤稽) f1b2052(method system_menu) 27c66a1/6282fb0/ce3b810(早期 dashboard/輪次 fix,非 FR-040)
套件:8684658(ap_task_subjects/participants link 表)
接手 FR-040「稽核計畫填寫優化」。請先讀
docs/features/FR-040-2606-ap-authoring-improvement/handoff/2026-06-21-FR040-ap-authoring-handoff.md
全文(尤其「🧭 原始需求」+ §0 讀序 + design.md 全讀),答得出 §0 冷接自檢 4 問再動工。
現況:已實作完成、未驗收、未 push、套件走 symlink(勿 poetry install)。
先跑 §6 pre-flight + 手測 checklist 驗收;要做 Phase 7(說明改結構化 steps)等我確認。
不切 branch、不自動 push、收尾等我下令。