Mengapa
Ditemukan saat audit audit --check dead-code terhadap codebase Rust nyata (rekening-dev-mode, 109 file .rs). registry_dead (zero references) melaporkan 100 dari 108 total dead-code findings — proporsi ekstrem yang mencurigakan.
Verifikasi konkret: const RED: &str = "�[31m" di regrets/verify.rs:22 di-flag registry_dead ("zero references (marked dead in registry)"), tapi grep membuktikan RED dipakai 10+ kali di file yang sama (regrets/verify.rs:78,87,101,134,164,178,186,199,343,...). False positif nyata.
Root cause di scripts/deadcode_engine.py: fungsi _detect_unused_exports() menerima parameter same_file_usages (dict per-file berisi nama yang dipakai di dalam file itu sendiri) untuk exempt symbol yang dipakai internal walau tidak pernah di-import cross-file. Tapi hanya Python yang punya collector _collect_py_same_file_usages() (line ~1004) yang mengisi dict ini. Untuk 14 bahasa lain (Go, Rust, C, Lua, PHP, Elixir, Ruby, Nim, Java, C#, Swift, Scala, Dart, Shell) — semua yang punya _collect_<lang>_exports_imports() tapi TIDAK punya _collect_<lang>_same_file_usages() — same_file_usages selalu dict kosong untuk file bahasa tersebut, jadi SEMUA symbol yang dipakai hanya di dalam file sendiri (tidak pernah cross-file import) akan salah ke-flag dead.
(JS/TS punya proteksi terpisah lewat export_type == "local_export" heuristic yang exempt export lokal tanpa from, jadi JS/TS relatif aman — tapi 14 bahasa lain sama sekali tidak punya proteksi.)
Konteks
Ini precision bug besar untuk dead-code/audit di semua bahasa non-Python non-JS. Kalau confidence tinggi diberikan ke hasil registry_dead (lihat confidence_distribution: {"0.75": 100} di output KDS/Rust — confidence 0.75 cukup tinggi untuk auto-suggest deletion), false positive ini bisa menyebabkan orang menghapus kode yang genuinely dipakai.
Tujuan
Tambah same-file-usage tracking untuk minimal Rust, Go, Java, PHP, Ruby, C, C++ (7 bahasa yang paling sering dipakai — sudah didukung tree-sitter penuh per issue #198). Bahasa lain (Lua, Elixir, Nim, C#, Swift, Scala, Dart, Shell) boleh menyusul di issue terpisah kalau scope terlalu besar untuk 1 PR.
Constraint
- Ikuti pattern
_collect_py_same_file_usages() (baca dulu implementasinya) sebagai referensi — tapi regex-nya perlu disesuaikan per sintaks bahasa (Rust guna: pemanggilan fungsi, referensi const/static, macro invocation seperti format!)
- Jangan ubah
_detect_unused_exports() inti — cukup tambah collector baru per bahasa dan pastikan dipanggil di titik yang sama seperti Python (line ~135 populate_graph_tables/detect_dead_code main loop)
- False negative (skip flagging simbol yang benar2 dead) lebih baik daripada false positive untuk fitur ini — kalau ragu, jangan flag
Definition of Done
const RED di rekening-dev-mode/regrets/verify.rs TIDAK lagi muncul di registry_dead/unused_exports findings
- Re-run dead-code di Rust project yang sama —
registry_dead count turun signifikan dari 100 (verifikasi manual sample yang tersisa benar-benar dead)
- Tidak ada regresi di Python (same_file_usages Python tidak boleh disentuh) dan JS/TS (local_export heuristic tidak boleh disentuh)
- Minimal 1 unit test baru per bahasa yang di-fix, reproduce pattern "const/fn dipakai hanya di file sendiri"
Checklist Laporan Worker
Mengapa
Ditemukan saat audit
audit --check dead-codeterhadap codebase Rust nyata (rekening-dev-mode, 109 file .rs).registry_dead(zero references) melaporkan 100 dari 108 total dead-code findings — proporsi ekstrem yang mencurigakan.Verifikasi konkret:
const RED: &str = "�[31m"diregrets/verify.rs:22di-flagregistry_dead("zero references (marked dead in registry)"), tapi grep membuktikanREDdipakai 10+ kali di file yang sama (regrets/verify.rs:78,87,101,134,164,178,186,199,343,...). False positif nyata.Root cause di
scripts/deadcode_engine.py: fungsi_detect_unused_exports()menerima parametersame_file_usages(dict per-file berisi nama yang dipakai di dalam file itu sendiri) untuk exempt symbol yang dipakai internal walau tidak pernah di-import cross-file. Tapi hanya Python yang punya collector_collect_py_same_file_usages()(line ~1004) yang mengisi dict ini. Untuk 14 bahasa lain (Go, Rust, C, Lua, PHP, Elixir, Ruby, Nim, Java, C#, Swift, Scala, Dart, Shell) — semua yang punya_collect_<lang>_exports_imports()tapi TIDAK punya_collect_<lang>_same_file_usages()—same_file_usagesselalu dict kosong untuk file bahasa tersebut, jadi SEMUA symbol yang dipakai hanya di dalam file sendiri (tidak pernah cross-file import) akan salah ke-flag dead.(JS/TS punya proteksi terpisah lewat
export_type == "local_export"heuristic yang exempt export lokal tanpafrom, jadi JS/TS relatif aman — tapi 14 bahasa lain sama sekali tidak punya proteksi.)Konteks
Ini precision bug besar untuk
dead-code/auditdi semua bahasa non-Python non-JS. Kalau confidence tinggi diberikan ke hasilregistry_dead(lihatconfidence_distribution: {"0.75": 100}di output KDS/Rust — confidence 0.75 cukup tinggi untuk auto-suggest deletion), false positive ini bisa menyebabkan orang menghapus kode yang genuinely dipakai.Tujuan
Tambah same-file-usage tracking untuk minimal Rust, Go, Java, PHP, Ruby, C, C++ (7 bahasa yang paling sering dipakai — sudah didukung tree-sitter penuh per issue #198). Bahasa lain (Lua, Elixir, Nim, C#, Swift, Scala, Dart, Shell) boleh menyusul di issue terpisah kalau scope terlalu besar untuk 1 PR.
Constraint
_collect_py_same_file_usages()(baca dulu implementasinya) sebagai referensi — tapi regex-nya perlu disesuaikan per sintaks bahasa (Rust guna: pemanggilan fungsi, referensi const/static, macro invocation sepertiformat!)_detect_unused_exports()inti — cukup tambah collector baru per bahasa dan pastikan dipanggil di titik yang sama seperti Python (line ~135populate_graph_tables/detect_dead_codemain loop)Definition of Done
const REDdi rekening-dev-mode/regrets/verify.rs TIDAK lagi muncul diregistry_dead/unused_exportsfindingsregistry_deadcount turun signifikan dari 100 (verifikasi manual sample yang tersisa benar-benar dead)Checklist Laporan Worker