Context
Ditemukan saat audit CodeLens terhadap codebase nyata (Coretax-Auto-Downloader, vps-deploy/api/kds backend). reference_count (field rc di output search) yang menjadi basis banyak command (dead-code, impact, trace ref_count) ternyata SALAH — undercounting parah, bukan cuma di kasus edge (0 vs beberapa).
Mengapa
Dua bukti konkret dari real codebase:
-
requirePermission (middleware factory, src/middleware/permission-gate.ts:56) — rc: 0 di output search --mode symbol. Ground truth: dipanggil di 13+ file sebagai requirePermission('admin') yang dipassing sebagai argument ke route registration (router.post(path, requirePermission('admin'), handler)). Verified via SQLite langsung: SELECT * FROM graph_edges WHERE target_id LIKE '%requirePermission%' → 0 rows. Tidak ada satupun CALLS edge terbentuk.
-
hasPermission (src/lib/permissions.ts:75) — rc: 1. Ground truth via grep (exclude comment lines): 7 real call sites di assignments.ts (3x) dan task-templates.ts (3x) plus 1x di permission-gate.ts. rc seharusnya 7, bukan 1.
Kedua kasus menunjukkan call-graph builder (scripts/callgraph_engine.py, Phase 3 _resolve_call() dan resolusi edge di sekitar baris 590-610) tidak reliable untuk cross-file call counting — entah under-resolve import cross-file, entah dedup logic yang salah collapse banyak call site jadi satu edge, atau miss calls yang dipassing sebagai argument ke call lain (middleware factory pattern).
Konteks
Field ref_count/rc dipakai di banyak tempat: search result ranking, dead-code (ref_count == 0 sebagai basis "possibly dead"), impact (jumlah dependent). Kalau undercounting ini luas, confidence semua command tersebut ikut tidak reliable — worker perlu investigasi apakah ini kasus terisolasi (khusus middleware-factory-argument pattern) atau sistemik (semua cross-file call undercounting).
Tujuan
- Investigasi root cause: kenapa CALLS edge tidak terbentuk untuk call yang dipassing sebagai argument (
requirePermission('admin') di dalam router.post(...)), dan kenapa hasPermission yang dipanggil 7x hanya tercatat 1x
- Fix root cause di
callgraph_engine.py — kemungkinan di traversal (_walk recursion ke argument dari call_expression lain), resolusi (_resolve_call), atau edge dedup logic
- Pastikan fix tidak regress command lain yang depend pada graph (impact, trace, dead-code sudah baru saja di-fix minggu ini — jangan buat regresi baru di sana)
Constraint
- Baca dulu
_parse_calls_treesitter (baris ~1589) dan _resolve_call (baris ~2055) sebagai starting point — TAPI investigasi mandiri, jangan asumsikan lokasi bug ada di situ tanpa verifikasi
- Test terhadap 2 kasus di atas sebagai regression test minimal
- Jangan ubah command files (commands/*.py) kecuali memang diperlukan — fix seharusnya cukup di callgraph_engine.py atau file engine terkait
- Setelah fix, re-run
dead-code, impact, trace di codebase yang sama untuk pastikan tidak ada regresi (angka-angka boleh berubah karena lebih akurat, tapi commandnya harus tetap jalan tanpa crash)
Definition of Done
search "requirePermission" <kds-path> --mode symbol menunjukkan rc >= 13 (atau jumlah real call site yang benar)
search "hasPermission" <kds-path> --mode symbol menunjukkan rc == 7 (atau jumlah real call site yang benar, exclude comments)
- Root cause didokumentasikan di PR description — bukan cuma "sudah fixed" tanpa penjelasan kenapa
python -m pytest tests/ -k "callgraph or ref_count" — 0 regresi baru
- Minimal 1 unit test baru yang reproduce kedua kasus di atas (middleware-factory-argument pattern + multi-site same-file calls)
Checklist Laporan Worker
Context
Ditemukan saat audit CodeLens terhadap codebase nyata (Coretax-Auto-Downloader, vps-deploy/api/kds backend).
reference_count(fieldrcdi outputsearch) yang menjadi basis banyak command (dead-code, impact, trace ref_count) ternyata SALAH — undercounting parah, bukan cuma di kasus edge (0 vs beberapa).Mengapa
Dua bukti konkret dari real codebase:
requirePermission(middleware factory,src/middleware/permission-gate.ts:56) —rc: 0di outputsearch --mode symbol. Ground truth: dipanggil di 13+ file sebagairequirePermission('admin')yang dipassing sebagai argument ke route registration (router.post(path, requirePermission('admin'), handler)). Verified via SQLite langsung:SELECT * FROM graph_edges WHERE target_id LIKE '%requirePermission%'→ 0 rows. Tidak ada satupun CALLS edge terbentuk.hasPermission(src/lib/permissions.ts:75) —rc: 1. Ground truth via grep (exclude comment lines): 7 real call sites diassignments.ts(3x) dantask-templates.ts(3x) plus 1x dipermission-gate.ts. rc seharusnya 7, bukan 1.Kedua kasus menunjukkan call-graph builder (
scripts/callgraph_engine.py, Phase 3_resolve_call()dan resolusi edge di sekitar baris 590-610) tidak reliable untuk cross-file call counting — entah under-resolve import cross-file, entah dedup logic yang salah collapse banyak call site jadi satu edge, atau miss calls yang dipassing sebagai argument ke call lain (middleware factory pattern).Konteks
Field
ref_count/rcdipakai di banyak tempat:searchresult ranking,dead-code(ref_count == 0sebagai basis "possibly dead"),impact(jumlah dependent). Kalau undercounting ini luas, confidence semua command tersebut ikut tidak reliable — worker perlu investigasi apakah ini kasus terisolasi (khusus middleware-factory-argument pattern) atau sistemik (semua cross-file call undercounting).Tujuan
requirePermission('admin')di dalamrouter.post(...)), dan kenapahasPermissionyang dipanggil 7x hanya tercatat 1xcallgraph_engine.py— kemungkinan di traversal (_walkrecursion ke argument dari call_expression lain), resolusi (_resolve_call), atau edge dedup logicConstraint
_parse_calls_treesitter(baris ~1589) dan_resolve_call(baris ~2055) sebagai starting point — TAPI investigasi mandiri, jangan asumsikan lokasi bug ada di situ tanpa verifikasidead-code,impact,tracedi codebase yang sama untuk pastikan tidak ada regresi (angka-angka boleh berubah karena lebih akurat, tapi commandnya harus tetap jalan tanpa crash)Definition of Done
search "requirePermission" <kds-path> --mode symbolmenunjukkanrc >= 13(atau jumlah real call site yang benar)search "hasPermission" <kds-path> --mode symbolmenunjukkanrc == 7(atau jumlah real call site yang benar, exclude comments)python -m pytest tests/ -k "callgraph or ref_count"— 0 regresi baruChecklist Laporan Worker