建議 model:opus/effort:medium — 跨主專案與套件、要刪既有靜態檔並確保舊資料的報表不會壞。
本卡屬 FR-107(母卡 CM-1843)第 .5 棒(子需求卡 CM-1848),子任務 T-5.2:讓檢查點清單帶上系統內的正式代號與領域資訊,並把套件裡寫死 CMMC 的靜態檔刪掉。
系統送給 AI 的「檢查點清單」(目標集)現在用字母當代號:AC.L1-3.1.1[a]。但系統內部的任務用的是另一種代號 AC.L1-3.1.1_obj.2(叫 part_id)。兩邊對不起來,所以分類完沒辦法自動找到對應的任務。
這張卡讓檢查點清單同時帶上 part_id(配對用)與 ao_letter(顯示用),並多帶 group_id/group_title(領域資訊,現在是靠切控制項編號的第一段硬猜出來的)。
同時把套件裡兩支寫死 CMMC 的靜態檔刪掉:cmmc_l1_aos.json(檢查點清單)與 cmmc_l1_canon.json(正解答案)。報表改成:
catalog_snapshot),不再讀靜態檔。evidence_classification_ground_truth。⚠️ 舊的分類結果沒有快照,報表要回明確錯誤訊息「此 run 無目標集快照」,不是 500。
主專案
app/oscal/service/ssp_control_implementation_service.py:237
build_classifier_catalog_by_ssp_id(ssp_id) ← 已經是動態的,但輸出要補欄位
每個 AO 多帶:part_id(AC.L1-3.1.1_obj.2)
ao_letter(原本的字母,改成只給顯示用)
每個控制項多帶:group_id、group_title
套件(走 path dependency 開發)
~/Projects/Jedicogy/module/jedi-python-package/jedi-evidence-classification/
.../report/report_common.py
:60 load_catalog ← 改讀 run 的 catalog_snapshot
:193 load_canon ← 改只讀正解表 evidence_classification_ground_truth
.../catalog_builder.py:15 build_catalog(只認 'cmmc-l1',:17) ← 🔴 整支刪除
.../resources/cmmc_l1_aos.json ← 🔴 刪除
.../resources/cmmc_l1_canon.json ← 🔴 刪除
.../app/service/evidence_classification_service.py
:733 put_state / :875 archive_run 內巢狀 ensure_ao_folder 的 [a] 解析
← 🔴 只留在舊 route 的路徑上(Drive 資料夾命名要用),新線不走
part_id 的格式與任務側一致。任務側的 key 在 infra/readmodel/oscal/ssp_control_implementation_query.py:74 get_jobs_by_round_id 回傳的 ao_part_id——兩邊必須是同一個字串,否則歸檔永遠對不到任務。這是本卡最關鍵的一點,要實際比對 DEV 資料。ao_letter 保留但降級為顯示用。不要直接刪掉字母,前端審閱頁還要顯示它給人看(T-3.4 已經改成用 part_id 配對、ao_letter 顯示)。load_catalog 改讀快照的路徑會動(對新 run 測過)→ 再刪靜態檔 → 再驗舊 run 回明確錯誤訊息。順序反了會有一段時間報表全壞。PreconditionFailedError + error code,不要 raise ValueError。catalog_builder.py 前先 grep 全部呼叫者(套件內外都要 grep),確認都改完了才刪。ensure_ao_folder 的字母解析只留在舊 route 的路徑上——那是 Google Drive 資料夾命名要用的,新線不建 Drive 資料夾。不要整個刪掉(舊 route 還要能用,D3)。build_classifier_catalog_by_ssp_id 對 DEV 的 catalog 2.13 回傳的每個 AO 都有 part_id,格式形如 AC.L1-3.1.1_obj.2。