本卡屬 FR-161(母卡見「母卡」欄),修 CM-3043/CM-3045 的帶入規則:改成顧問在資源庫挑選引用,不再預設全部帶入;並放寬同名比對。決策者 2026-10-23 裁示。BE+FE 一張卡做完。
目前客戶在「事前準備資料」上傳一份檔案,系統會自動把它塞進這家公司「每一個」合規資源庫的程序書池。專案頁用的就是資源庫那一份程序書池(FR-139 一對一),所以每個專案的程序書管理也會一起變多。
決策者在 DEV 專案 1619「鈞拓 JT-EP700 SEMI E187 送驗查核」的規劃頁看到:程序書管理原本是顧問整理的 9 份 SEMI E187 文件,現在多了 13 份別家公司(宏碩精密)的範例檔,共 22 份。原因是 DEV 一個租戶(Billows Tech,102)底下有好幾家客戶的資源庫,自動帶入讓每家都被塞滿。正式落地版一台一家公司不會這麼嚴重,但 SaaS 或顧問公司自己架一台服務多家時一模一樣。
決策者原話:「專案程序書那邊不是說要用引用的嗎,為什麼變成全部載入?」——要的是:顧問選了哪些,這個框架才有哪些。
pre_engagement_file_id、category_id、file_id=最新版)。file_id 換成新版;搬大類→category_id 跟著改;客戶刪除→那列刪除;標過時→那列 is_excluded=true(畫面淡化+「已過時」Tag),不自動移出(顧問可能已掛在控制項上,由顧問決定移不移)。這幾條本來就只動「已有的列」,不用大改。is_excluded 欄位保留,語意縮成「引用中但客戶標了過時」。顧問不再能手動把列設成 excluded(PUT/DELETE .../exclusion 端點拿掉或改成 404,FE 不再呼叫)。back-matter 匯出(infra/readmodel/oscal/ssp_oscal_back_matter_query.py)照舊跳過 excluded 的列。canEditSspContent=false),只是內容變成「資源庫選用了哪些」。選用入口只在資源庫頁。BE
app/pre_engagement/service/pre_engagement_pool_sync_service.py(193 行)
52 on_created ← 改成不落列(保留函式、回 0,或刪掉呼叫端)
60 on_new_version ← 照舊(只動已有的列)
63 on_updated ← 照舊
70 on_deleted ← 照舊
91 backfill_template_ssp ← 拿掉自動補齊
111 backfill_for_ssp ← 拿掉自動補齊
154 _writable_template_ssp_ids / 160 _rows_in_writable_libraries ← 照舊用
呼叫端:
app/pre_engagement/service/pre_engagement_file_app_service.py:82 on_created
app/oscal/service/ssp_document_pool_service.py:67 backfill_for_ssp(list_pool 時)
app/module_frame/service/module_frame_reference_document_service.py:90 backfill_for_ssp(資源庫頁 list)
app/oscal/service/resource_library_app_service.py:633 backfill_template_ssp(新建資源庫)
api/oscal/routes/ssp/ssp_document_pool_route.py exclusion PUT/DELETE(要拿掉)
FE
src/components/grc/ModuleFrameDocumentPoolPanel.vue(231 行)
src/components/grc/document-pool/DocumentPoolCategoryGroups.vue(113 行) ← 「這框架不用」改「移出」
src/components/grc/document-pool/useDocumentPoolGroups.js(53 行)
src/components/grc/DocumentLinkDialog.vue、src/components/grc/module-frame/MfRefDocList.vue ← 有讀 is_excluded,確認語意
① BE:拿掉自動帶入
on_created 不再落列;三個 backfill 呼叫點拿掉(resource_library_app_service.py:633、ssp_document_pool_service.py:67、module_frame_reference_document_service.py:90)。backfill_* 兩個函式若沒有其他呼叫端就刪掉,不要留空殼(CM-3047 剛因為空殼誤判吃過虧)。② BE:新增選用端點(先 grep 既有能力,程序書池已有 add_to_pool、掛載有 add_control_mappings,能 reuse 就 reuse)
GET /module-frame/<uid>/reference-documents/pre-engagement-candidates
回這家公司(資源庫的 tenant)所有未過時的事前準備資料,照大類分組,每份帶
{ pre_engagement_file_uid, title, category_uid/name, latest:{version_no,file_name,file_uid,created_at},
is_referenced: 此資源庫範本 SSP 是否已有列 }
POST /module-frame/<uid>/reference-documents/pre-engagement-references
{ pre_engagement_file_uids: [...] } → 每份在範本 SSP 程序書池加一列(已有的跳過),回新增筆數
DELETE /module-frame/<uid>/reference-documents/<doc_uid>
既有刪除端點;客戶事前資料列現在也要允許刪(=移出),連帶刪掛載。回傳帶 mapping_count 讓 FE 先確認