Skip to content

fix(formatters): markdown registry-diff renders every function name empty (reads 'fn', producer emits 'name') #299

Description

@Wolfvin

Mengapa (falsifiable — repro dijalankan 2026-07-17)

Ditemukan saat navigasi untuk #297 (edge-diff), bukan scope task itu — jadi tidak di-fix di PR #298.

--format markdown pada registry diff selalu mencetak nama fungsi kosong. Producer dan consumer memakai key berbeda:

  • Producer diff_engine._diff_backend() mengemit: {"name": "freshFn", "file": "a.py", "status": "active"}
  • Consumer scripts/formatters/markdown.py:1158-1161 membaca: node.get('fn', '')selalu jatuh ke default ''

Repro:

old = {'nodes':[{'id':'a.py:1','fn':'goneFn','file':'a.py','status':'active'}],'edges':[]}
new = {'nodes':[{'id':'a.py:9','fn':'freshFn','file':'a.py','status':'active'}],'edges':[]}
to_markdown({'status':'ok','frontend':{},'backend':_diff_backend(old,new)}, 'diff')

Output aktual:

### Backend — +1 / -1 / ~0
- + `` (a.py)
- - ``

Diharapkan: - + `freshFn` (a.py) dan - - `goneFn`.

Konteks

  • Mengenai _md_diff() di scripts/formatters/markdown.py (~baris 1153-1165), blok if be:.
  • Tiga tempat kena: added_nodes, removed_nodes, changed_nodes — ketiganya .get('fn').
  • Sisi frontend blok yang sama BENAR (cls.get('name')) — jadi ini murni ketidakcocokan di sisi backend.
  • Dampak: impact --check diff --format markdown melaporkan jumlah yang benar tapi identitas kosong — user/agent tahu "1 fungsi ditambah" tanpa tahu fungsi mana. Diam-diam tak berguna, tidak crash, jadi tak pernah ketahuan.
  • diff_engine.py tak punya test sama sekali sebelum feat(diff): compare call-graph edges in snapshot diff — 25,876 edges saved to disk but never compared #297; _md_diff() juga belum tertutup test.

Tujuan

Diff markdown menampilkan nama fungsi backend yang sebenarnya, dan mismatch ini tak bisa terulang diam-diam.

Constraint

  • Perbaiki di sisi consumer (markdown.py baca name), JANGAN ubah bentuk output _diff_backend()commands/diff.py, dashboard, dan MCP sudah mengonsumsi name; mengubah producer memecah mereka.
  • Jangan sekalian rombak _md_diff() — scope-nya key mismatch saja.
  • Zero dead code. Command count tetap 12.

Definition of Done

  • _md_diff() mencetak nama fungsi untuk added_nodes / removed_nodes / changed_nodes
  • Test yang gagal sebelum fix dan lolos sesudahnya (assert nama muncul di output markdown, bukan hanya jumlah)
  • Bentuk output _diff_backend() tidak berubah
  • Blok frontend tak regres

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions