Skip to content

fix(dead-code): same-file-usage tracking missing for 14 languages, causes false-positive registry_dead #220

Description

@Wolfvin

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

  1. const RED di rekening-dev-mode/regrets/verify.rs TIDAK lagi muncul di registry_dead/unused_exports findings
  2. Re-run dead-code di Rust project yang sama — registry_dead count turun signifikan dari 100 (verifikasi manual sample yang tersisa benar-benar dead)
  3. Tidak ada regresi di Python (same_file_usages Python tidak boleh disentuh) dan JS/TS (local_export heuristic tidak boleh disentuh)
  4. Minimal 1 unit test baru per bahasa yang di-fix, reproduce pattern "const/fn dipakai hanya di file sendiri"

Checklist Laporan Worker

  • Bahasa yang di-fix + collector function baru yang ditambahkan
  • Before/after count registry_dead di rekening-dev-mode (atau project Rust lain kalau lebih representatif)
  • Sample 5 finding yang tersisa setelah fix — verifikasi manual bahwa itu genuine dead code
  • Hasil test suite lengkap (0 regresi baru)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions