一句話:本卡屬 FR-105(母卡見卡尾「母卡」段),第 2 棒:oscal 模組 163 檔/19,996 行逐檔分類——每一支判給「真業務/轉接殼/共用設施/死碼」四類之一並附依賴證據。只分析不動程式。

這一棒在做什麼(白話)

oscal 是主專案裡最大的模組之一。裡面同時住著兩種完全不同的程式:一種是本產品自己的業務(例如把客戶上傳的 Word/Excel 解析成 OSCAL 資料、比對兩份文件差異),另一種是轉接殼(主專案自己不做事,只是把前端的請求轉給 jedi_oscal_v2 套件、再把套件回的資料換成前端要的欄位名)。這兩種混在同一個 service 目錄裡,看目錄分不出來。

決策者要開發新功能了,要的是「乾淨的 code」。乾淨不等於刪——真業務本來就該留在主專案;轉接殼是「主專案回答套件問題」的必要接線,也不是垃圾。但兩種混住,接手的人不知道哪支可以動、哪支動了會影響套件契約。 這一棒的產出是一張逐檔的分類表,讓之後要動刀的人有正確的圖。

為什麼切這一塊

FR-102 全模組地圖(docs/features/FR-102-2609-host-module-map/README.md)已把 26 個模組盤到「模組層級」,但明講 oscal 與 module_frame 兩支「單一標籤蓋不住內部差異」需另開卡逐檔判。兩支共 244 檔/30,938 行,佔主專案四層一半,一棒做不完,故按模組切兩棒。第 2 棒接在 module_frame 之後,對照第 1 棒結果標兩模組的鏡像與重複實作。開工先讀第 1 棒產出 module-frame-classification.md。

範圍(首腦 2026-09-16 於 HEAD 98d756bb 實查,用 git ls-files)

api/oscal      67 檔 / 3,984 行   59 條 route(routes/framework/ssp/module_frame_template_ssp_route/oscal_export_route/resource_library_route)
app/oscal      46 檔 / 10,964 行  子目錄 import_diff/import_adapter/excel_parser/export
domain/oscal   36 檔 / 4,549 行   parser/adapter/import_pipeline/service(resolver/reconciliation)
infra/oscal    14 檔 /   499 行   自持表 framework_parse_jobs / ssp_docx_parse_jobs / ssp_excel_parse_jobs
合計          163 檔 / 19,996 行
另:di_containers/oscal/oscal_containers.py

對外 route 59 條(AST 數 add_resource 得出,regex 會漏抓換行寫法)。開工先重跑一次確認數字沒變(指令見「怎麼做」步驟 0)。

首腦已查出的證據(可直接用,但判定仍要自己看檔)

重點看什麼