本卡屬 FR-162(母卡見「母卡」欄),批 5,等 2b。官方只對到控制項層,評估目標層由 AI 補。主要改 BE repo;FE 只有工作台一顆按鈕與一個動作,若 FE 改動超過兩檔就停下回寫請首腦另開 FE 卡。
官方的對照只說「CMMC 的 AC.L2-3.1.1 跟 ISO 的 A.5.15、A.5.16、A.5.18 有關」,沒說底下 6 個評估目標跟 7 個評估目標哪個對哪個。這張卡做一個背景工作:對每一組已經對上的控制項,把兩邊評估目標的句子丟給 AI 兩兩比,回「等價/部分重疊/不相關」與信心度,寫進對照庫標「AI 建議」。顧問在工作台看得到、按「確認」就轉成正式。不做全部評估目標的全配(會是幾萬對),只在已對上的小範圍內比。
~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-162-2610-cross-framework-control-mapping/design.md(決策表 D1~D11、詳細設計含 DDL、拆分表);盤點與官方資料分析:~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/analysis/2026-10-24-cross-framework-control-mapping.md。本卡已帶足開工所需細節,不必先讀完。背景工作登記:app/background_job/handler_registry.py @register_job_handler(job_type);handler(payload, ctx) 自己開交易、ctx.report_progress
入列:app/background_job/service/background_job_app_service.py enqueue(job_type, payload, max_attempts)
AI 閘道呼叫範式:core/plugins/_source_scan_ai.py _gateway() / select_model_for_current_tenant() / build_call_context() / gateway.complete(req)
prompt 取法:jedi_ai_gateway.get_prompt("<group>", "<key>", BUILTIN) ← 預設文字放程式、可被閘道設定覆寫
配額:core/plugins/_ai_quota_adapter.py check / consume
worker 要另起:RUN_MODE=worker python main.py(沒起單子停在 queued)
AO 文字:oscal.catalog_control_parts WHERE name='assessment-objective'(prose;繁中在 catalog_control_parts_trans)
範例(DEV 真實資料):CMMC AC.L2-3.1.1 6 個 AO ↔ ISO A.5.15/5.16/5.18 7 個 AO,人工可配出 4 對等價/部分重疊、2 個無對應
core/plugins/_control_mapping_ai_suggest.py:JOB_TYPE='control_mapping_ai_suggest',payload {{mapping_id, only_missing: true}}。handler:取該 mapping 所有 active 控制項層列 → 每列抓兩邊 AO(代號+prose,有繁中附上)→ 一列一次 gateway.complete,prompt 由 get_prompt("control-mapping","ao-pair", BUILTIN_PROMPT),要求回 JSON [{{source_part_id, target_part_id, relationship, confidence, reason}}],relationship 限 equivalent-to/intersects-with/not-related-to → 走套件匯入服務寫 origin='ai-suggested'、remarks=reason、method='tool-assisted';同鍵已有 curated 或 ai-suggested 列(only_missing)跳過。每列 report_progress。AI 回非 JSON 或代號不在該控制項底下 → 該列記 error 繼續,不中斷整批。配額走 _ai_quota_adapter。POST /oscal/control-mappings/<id>/ai-suggest(manage 能力點;加在 2a 的 route 檔)→ 回 job_uid;進度用既有背景工作查詢端點。override_entry 已能把 ai-suggested 列轉 curated(新列 overrides 指回 AI 列),不另寫;若 2a 的 override 不接受「不改內容只確認」,加 confirm_entry(entry_id)。only_missing 跳過既有。only_missing → 新增 0。select_model_for_current_tenant,不另讀設定、不新增環境變數(先 grep config/config.py 確認)。