You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Node id memuat nomor baris (checkout.py:6). Akibatnya menambahkan satu komentar di atas file — tanpa menyentuh satu pun fungsi — membuat SETIAP fungsi di file itu dilaporkan ditambah DAN dihapus, plus new_dead / resolved_dead PALSU.
Repro terisolasi (graph identik, semua baris turun 5 karena komentar ditambahkan):
[] — fungsi ini sudah dead sejak sebelumnya, tidak "baru mati"
resolved_dead
['handle_checkout']
[]
Fungsi yang sama muncul di added_nodesdanremoved_nodes sekaligus — tanda pasti kunci identitasnya salah.
Terverifikasi juga lewat CLI penuh pada workspace nyata: satu komentar header + satu rewire → impact --check diff melaporkan added: 3, removed: 3, new_dead: 2 padahal yang berubah cuma satu edge.
Bentuk output tidak boleh berubah — added_nodes/removed_nodes/changed_nodes tetap {"name","file",...}. commands/diff.py, dashboard, formatter, MCP mengonsumsinya. Yang berubah cuma anggota daftarnya.
Fungsi yang benar-benar pindah file harus tetap terhitung removed+added (file bagian dari kunci) — itu benar, bukan bug.
Fungsi yang benar-benar ditambah/dihapus tetap terdeteksi
Fungsi yang benar-benar berubah dead → muncul di new_dead; yang sudah dead sejak awal → TIDAK muncul
changed_nodes (ref_count/status) tetap bekerja lintas geser baris — sekarang node yang bergeser tak pernah dibandingkan sama sekali, jadi perubahan rc-nya luput
Test regresi: gagal kalau kunci dikembalikan ke n["id"]
Bentuk output tidak berubah; _diff_frontend tak regres; suite tak regres
Mengapa (falsifiable — repro dijalankan 2026-07-17)
Ditemukan saat verifikasi #297 (edge-diff), bukan scope PR #298 — jadi tidak di-fix di sana.
_diff_backend()(scripts/diff_engine.py) mengunci node dengann["id"]:Node id memuat nomor baris (
checkout.py:6). Akibatnya menambahkan satu komentar di atas file — tanpa menyentuh satu pun fungsi — membuat SETIAP fungsi di file itu dilaporkan ditambah DAN dihapus, plusnew_dead/resolved_deadPALSU.Repro terisolasi (graph identik, semua baris turun 5 karena komentar ditambahkan):
Hasil aktual — perubahan nyata: NOL:
added_nodes['handle_checkout', 'send_receipt'][]removed_nodes['handle_checkout', 'send_receipt'][]new_dead['handle_checkout'][]— fungsi ini sudah dead sejak sebelumnya, tidak "baru mati"resolved_dead['handle_checkout'][]Fungsi yang sama muncul di
added_nodesdanremoved_nodessekaligus — tanda pasti kunci identitasnya salah.Terverifikasi juga lewat CLI penuh pada workspace nyata: satu komentar header + satu rewire →
impact --check diffmelaporkanadded: 3, removed: 3, new_dead: 2padahal yang berubah cuma satu edge.Konteks
_endpoint_key()→(file, impl_for, fn), terbukti menurunkan derau geser-baris dari 3.178 laporan palsu jadi 0 pada registry nyata 12.982 edge.new_deadpalsu. Agent yang membaca "fungsi X baru saja jadi dead" bisa menghapus kode hidup. Ini kelas bug yang sama dengan fix(parser): Go/Java/PHP call graph absent/broken → every function false-flagged dead #293 (Go/Java false-dead) dan fix(dead-code): JSX prop function references (onClick={fn}) not counted as usage → React handlers false-flagged dead #294 (JSX handler false-dead) — tool berbohong ke agent soal dead code.summary.added/summary.removed/summary.new_dead, danimpact --check diff --git-awareyang mengonsumsi jalur sama._diff_frontend()TIDAK kena: dia mengunci denganc["name"], bukan id berbaris.Tujuan
Node diff kebal geser-baris: hanya fungsi yang benar-benar muncul/hilang yang dilaporkan, dan
new_deadhanya untuk fungsi yang benar-benar baru mati.Constraint
_endpoint_key()dari feat(diff): compare call-graph edges in snapshot diff — 25,876 edges saved to disk but never compared #297 — sudah ada di file yang sama, sudah teruji, kuncinya sudah diukur (2.429 node:(file,fn)→ 38 tabrakan;(file,impl_for,fn)→ 9, dan ke-9 nya sudah ditandaiduplicate_define). Jangan bikin skema identitas ketiga.added_nodes/removed_nodes/changed_nodestetap{"name","file",...}.commands/diff.py, dashboard, formatter, MCP mengonsumsinya. Yang berubah cuma anggota daftarnya.Definition of Done
added_nodes,removed_nodes,new_dead,resolved_deadsemuanya kosongdead→ muncul dinew_dead; yang sudah dead sejak awal → TIDAK munculchanged_nodes(ref_count/status) tetap bekerja lintas geser baris — sekarang node yang bergeser tak pernah dibandingkan sama sekali, jadi perubahan rc-nya luputn["id"]_diff_frontendtak regres; suite tak regres