本卡屬 FR-092(母卡 CM-1703),第 5 棒盤點。只盤不修。
第 1~4 棒清的是「整個檔沒人用」。這一棒往下一層:檔案活著,但裡面有些方法、class 沒人呼叫。vulture 這個工具在 60% 信心下報了 217 個 method、147 個 class、30 個 function 沒人用,但它看不懂這個專案大量的動態呼叫(DI 容器用字串組 provider、marshmallow schema 用字串引用巢狀 schema、SocketIO handler 靠註冊表載入),所以雜訊很高。你要做的是把這 364 條逐一對照真實呼叫路徑,分成「確定沒人用」與「疑似」兩份清單。
這層的廢碼最會誤導人:檔案還在被 import,看起來活著,改的人會以為每個方法都有人用而不敢動。首腦 2026-09-12 初掃看到 api/*/serializers 下大量 schema 定義了沒掛 route,workflow_execution_service.py 有 10 個方法零呼叫,值得逐條核。
這些是首腦初掃時看到的熱點,是起點不是清單:
api/project/serializers/audit_round.py 18 個 class 未使用、api/flow_control/serializers/job.py 7 個、api/project/serializers/project.py 6 個——marshmallow schema 可能被 fields.Nested('ClassName') 字串引用,vulture 抓不到,要 grep 字串。app/flow_engine/service/workflow_execution_service.py 10 個 method、app/oscal/service/ssp_versioning_service.py 9 個(此檔第 1 棒會整檔刪,跳過)、app/flow_control/service/assessment_plan_app_service.py 5 個。infra/survey/adapters.py、infra/detection_tools/adapters.py、infra/evidence_classification/adapters.py 各 5~6 個——這些是 jedi 套件 port 的實作,方法名由套件介面決定,vulture 看不到套件端呼叫,大概率全是誤報,但要開套件介面檔對一次。core/app_factory.py 6 個、core/plugins/*.py 各 3~6 個——可能被 main.py 或 register() 動態呼叫。domain/*/service/*.py 內的 domain service 方法——被 DI Factory 注入後由 app service 呼叫,vulture 應該抓得到,零呼叫的可信度較高。首腦初掃輸出(未核對、只是參照):vulture api app domain infra common config di_containers core --min-confidence 60 共 1,386 行,其中 unused method 217/class 147/function 30/attribute 127/variable 847(variable 多為 marshmallow field 與 kwargs,不用看)。80% 信心下只剩 16 import+10 variable。
第一步:裝 vulture 到 scratchpad 不進 pyproject:
S=<你的 scratchpad>
poetry run python -m pip install -q --target "$S/tools" vulture
PYTHONPATH="$S/tools" poetry run python -m vulture api app domain infra common config di_containers core --min-confidence 60 | grep -E 'unused (method|class|function)' > "$S/v60.txt"; wc -l "$S/v60.txt"
第二步:先排除第 1~3 棒會整檔刪的檔(清單 docs/features/FR-092-2609-dead-code-cleanup/dead-files.txt+CM-1706 的 subtask_status_history 模組)。
第三步:每條做三個 grep 再定案:
# 1. 直接呼叫(含 self.xxx、Class.xxx)
grep -rn "\b<name>\b" --include='*.py' api app domain infra common config di_containers core scripts test main.py | grep -v '<定義所在檔>'
# 2. 字串引用(DI provider、Nested schema、getattr、importlib)
grep -rn "['\"]<name>['\"]" --include='*.py' . | grep -vE 'CLAUDE-SECURITY|docs/'
# 3. jedi 套件端(port 實作的方法名)
grep -rn "\b<name>\b" --include='*.py' ~/Projects/Jedicogy/module/jedi-python-package/*/ | head