本卡屬 FR-092(母卡見母案),四棒之一。純刪 53 檔約 2,900 行,不改行為。
FR-038 把後端從舊版 OSCAL 套件(v1)全切到 v2 之後,api/oscal/serializers/ 底下五個子目錄的回傳格式定義(ap/ar/base/catalog/profile)沒有任何路由再掛;app/oscal 與 domain/oscal 底下 SSP 版本複製(versioning)、v1 文件比對(docx_diff)、reconciliation、import_pipeline 幾組服務被掏成空殼或零呼叫者。這些檔案留著會讓人以為還在用。
首腦核對:
api/oscal/routes/ 只 import serializers 的 ssp/framework/framework_parse_job/framework_version_edit 四個子目錄;ap/ar/base/catalog/profile 零 route 引用(grep 2026-09-12)。api/oscal/serializers/__init__.py 第 3-24 行 re-export 這批 class,但 re-export 出去的名字在 api/ app/ 全專案零使用。app/oscal/service/ssp_versioning_service.py:36-38 docstring 自承「FR-038 2A 停用、2B 重建」,_clone_* 全空存根;全專案零 caller、di_containers/ 零 wiring。domain/oscal/gateway/i_ssp_versioning_cloner.py+infra/oscal/clone/ssp_versioning_cloner_impl.py 只被它引用。app/oscal/service/ssp_docx_diff_service.py(862 行):v2 的 import_diff/ssp_diff_service.py:4 自承「ported from v1」,v1 本體零 caller。app/project/service/project_system_info_service.py:di_containers/project/project_containers.py:61-66 註解明寫 2026-06-18 FR-038 拆線,檔案未刪。api/project/serializers/project.py:5 仍 import api.oscal.serializers.ap.assessment_plan.AssessmentPlanResponseSchema——刪 ap/ 前要先看這個 class 在該檔是否真的被用到;若有,把該 class 搬進 api/project/serializers/project.py 內再刪 ap/。api/common/serializers/pager.py
api/oscal/serializers/ap/__init__.py
api/oscal/serializers/ap/assessment_plan.py
api/oscal/serializers/ap/assessment_plan_control.py
api/oscal/serializers/ap/assessment_plan_group.py
api/oscal/serializers/ap/assessment_plan_task.py
api/oscal/serializers/ap/assessment_task_control.py
api/oscal/serializers/ar/__init__.py
api/oscal/serializers/ar/assessment_result.py
api/oscal/serializers/ar/assessment_result_control.py
api/oscal/serializers/ar/assessment_result_data.py
api/oscal/serializers/ar/assessment_result_evidence.py
api/oscal/serializers/ar/assessment_result_finding.py
api/oscal/serializers/base/__init__.py
api/oscal/serializers/base/oscal_document.py
api/oscal/serializers/base/oscal_link.py
api/oscal/serializers/base/oscal_location.py
api/oscal/serializers/base/oscal_metadata.py
api/oscal/serializers/base/oscal_party.py
api/oscal/serializers/base/oscal_prop.py
api/oscal/serializers/base/oscal_remarks.py
api/oscal/serializers/base/oscal_responsible_party.py
api/oscal/serializers/base/oscal_role.py
api/oscal/serializers/catalog/__init__.py
api/oscal/serializers/catalog/catalog.py
api/oscal/serializers/catalog/catalog_control.py
api/oscal/serializers/catalog/catalog_control_assessment.py
api/oscal/serializers/catalog/catalog_control_parameter.py
api/oscal/serializers/catalog/catalog_control_part.py
api/oscal/serializers/catalog/catalog_group.py
api/oscal/serializers/profile/__init__.py
api/oscal/serializers/profile/profile.py
api/oscal/serializers/profile/profile_control.py
api/project/serializers/project_system_info.py
api/report/serializers/schemas.py
app/oscal/dto/ssp/ssp_control_impl_list_dto.py
app/oscal/service/ssp_docx_diff_service.py
app/oscal/service/ssp_versioning_service.py
app/project/dto/__init__.py
app/project/dto/project_dto.py
app/project/dto/project_system_info_dto.py
app/project/service/project_system_info_service.py
domain/oscal/gateway/__init__.py
domain/oscal/gateway/i_ssp_versioning_cloner.py
domain/oscal/import_pipeline/confirm_service.py
domain/oscal/import_pipeline/normalizer.py
domain/oscal/import_pipeline/warnings.py
domain/oscal/service/reconciliation/ssp_entity_orchestrator.py
domain/oscal/service/reconciliation/system_characteristic_reconciler.py
domain/oscal/strategy/__init__.py
domain/oscal/strategy/i_ssp_docx_write_strategy.py
infra/oscal/clone/__init__.py
infra/oscal/clone/ssp_versioning_cloner_impl.py
grep -rn "<dotted 模組名>" --include='*.py' api app domain infra common config di_containers core scripts test,命中 0 → git rm。命中不為 0 的只允許是本清單內另一檔或 api/oscal/serializers/__init__.py;其他命中先回寫本卡。api/oscal/serializers/__init__.py 內指向 base/catalog/profile/ar 的 re-export 行,保留 ssp/framework 的。test/test_ssp_versioning_service.py 測的是要刪的服務,整檔一起 git rm。test/test_fr032_excel_device_roundtrip.py 與 test/test_decision_merge.py 分別 import domain.oscal.import_pipeline.bundle_restore 與 domain.oscal.strategy.i_ssp_docx_write_strategy——這兩支不在清單內、不刪(bundle_restore 被 v2_bundle.py 當契約參照)。domain/oscal/gateway/、infra/oscal/clone/、api/oscal/serializers/{ar,base,catalog,profile}/)連 __init__.py 一起刪。不寫新測試(純刪)。跑守衛三檔+刪掉的 test 檔以外的 oscal 相關既有測試:python -m pytest test/test_module_boundaries.py test/test_error_code_uniqueness.py test/test_build_integrity_manifest.py test/test_decision_merge.py test/test_fr032_excel_device_roundtrip.py -q。
python main.py 起得來 → curl -s localhost:8000/api/1.0/version 200 → 前端開任一 SSP 頁、框架版本頁、專案 AP 頁各點一次,正常。