本卡屬 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 個方法零呼叫,值得逐條核。

重點看什麼

這些是首腦初掃時看到的熱點,是起點不是清單:

已知背景

首腦初掃輸出(未核對、只是參照):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