2026-10-17 · 四方實測 · 同一份 232 檔

先看你的 codebase 怎麼寫,再挑程式碼圖譜

同一份 ai_family_backend(commit a6fb1d3e,backend/src/services 加上 tsconfig),四個工具吃同一份碼,用同一份 grep 真值、同一題流程解說。最大的發現不在哪個工具比較強,而在於每個確定性工具都有自己解析不了的寫法。這個 codebase 剛好大量使用其中一種,兩個工具因此幾乎看不到跨 service 的呼叫。

⚠️ 2026-10-17 再驗證修正(細節見 10-18 的跨 repo 報告)獨立 subagent 改用 TypeScript type checker 當真值重新驗證後:
  • 「邊的精確度都是 30/30」被推翻。原判定只檢查名稱有沒有出現在那一行,抓不到同名錯連。嚴格判定後:codegraph 1.4.1 整體 76%、跨檔 60%(1.6.2:90%/76%),GitNexus 99%,graphify 87%。
  • 「codegraph 抓不到 export const x = new X()」只限 1.4.1,1.6.2 已修好。
  • default singleton 召回率的結論成立:另抽 50 個,結果 49/0/0/37。
原文保留,下面被推翻的格子都已就地標註。

最重要的發現 · 呼叫寫法決定一切

services 裡 232 個檔有 183 個用 export default new XService(),別處再 import xService 呼叫方法。我從原始碼隨機抽 30 個這類跨檔呼叫點(共 265 個不重複點,seed 7),逐一檢查每個工具有沒有建出那條邊。

CODEGRAPH
30/30
方法層級全中
UNDERSTAND-ANYTHING
24/30
只到 class 層級(LLM 讀碼建邊)
GITNEXUS
0/30
跨檔 calls 邊全庫只有 151 條
GRAPHIFY
0/30
跨檔 calls 邊全庫只有 87 條

對照:codegraph 的跨檔 calls 邊有 854 條。

最小重現:在 3 個檔裡各放一種寫法,由同一個函式呼叫,看各工具建出哪些邊。

呼叫形式codegraphGitNexusgraphify
export default new X()✅❌❌
export const x = new X()❌(1.4.1;1.6.2 已修)✅❌
export function f()✅✅✅
這不是排名,是「你的寫法撞不撞到它的盲點」換成大量使用 export const x = new X() 的 codebase,codegraph 和 GitNexus 的結果可能整個對調。選工具前,先用自己 codebase 最常見的 2–3 種呼叫寫法做一個 3 檔的最小重現,每個工具跑一次只要幾秒。

總表

不加總分。UA 的數字沿用同日的雙方報告(範圍相同)。

codegraphGitNexusgraphifyUnderstand-Anything
版本CLI 1.4.11.6.120.9.92(--code-only)2.9.7
建圖時間/LLM token2.1 秒/022 秒/04.2 秒/0約 10 分鐘/約 156 萬
節點/邊3,405/6,2714,038/8,0612,058/4,440519/1,061
顆粒度方法方法+屬性+執行流+分群方法+可信度標記檔案/class+摘要+分層+導覽
assertWithinQuota caller(真值 5)5/50/50/5class 層級 4/5,另有 2 個假陽性
handleUserText caller(真值 2)2/22/2(精確到巢狀的 onMessage/onUserTurn)1/2(抓到的那條標 INFERRED)class 層級 2/2
singleton 跨檔呼叫(抽 30)300024(class 層級)
邊的精確度(抽 30 條 calls)
⚠️ 已被推翻(判定太鬆)
原 30/30 → 嚴格判定 24/30;整體 76%、跨檔 60%30/30 → 整體 99%30/30 → 整體 87%(INFERRED 28/28 成立)30/30(class 層級,未重驗)
重現性(重建一次比對邊)1.01.01.00.79(calls 邊)
介面 dispatch(transport.isOpen/sendJson)沒列沒列沒列(另外有把 callback 介面成員以 INFERRED 指到宣告)沒有邊
流程解說:事實抽查10/1010/1010/1010/10
流程解說:token/工具呼叫8.5 萬/711.2 萬/177.9 萬/107.8 萬/10

各自的觀察

CODEGRAPH
  • 在這個 codebase 上的 caller 召回率最高。答流程題最省,6 次指令就夠,只讀 1 個檔。
  • 盲點:export const x = new X() 這種具名實例(1.4.1;1.6.2 已修)。同名方法會退化成名稱比對,跨檔精確度只有 60%(1.6.2 是 76%),常見名稱的 caller 要用 grep 篩。
  • 8 月報告說它「漏巢狀 caller」,這次重現不出來。
GITNEXUS
  • impact 會依深度分組,並標出受影響的執行流。查不到 caller 時回 risk: UNKNOWN,還附註「沒有邊不代表沒人用,請用文字搜尋確認」,說的是實話。
  • caller 名稱最精確,會寫到巢狀的 onMessage@179。
  • 這次踩到的限制:
    • 全文搜尋要連網下載擴充,沒裝起來就停用。
    • 562 個入口候選裡有 362 個沒有追成執行流(它自己警告的)。
    • rename 在 1.6.12 的 CLI 裡沒有,只有 MCP 有。
    • README 上的 --skip-embeddings 這版不存在。
    • 答題 agent 有 3 次 cypher 語法不支援。
  • 非商用授權。
GRAPHIFY
  • 每條邊都標可信度:4,412 條 EXTRACTED、28 條 INFERRED,抽查的 INFERRED 都正確。
  • path 遇到呼叫邊斷掉時,會改走 import 邊連到檔案層級。
  • 盲點:兩種 singleton 都解析不了;barrel index.ts 建不出符號;.proto 直接跳過。
  • 這次只測純程式碼模式,它真正的強項(文件也進圖)在這裡用不到。
UNDERSTAND-ANYTHING
  • 唯一由 LLM 讀碼建邊的工具,所以它不受寫法盲點影響(24/30),但只到 class 層級,重跑也會飄。
  • 有分層、導覽和每檔摘要,適合給人看全貌。
  • 成本高了好幾個數量級。

給新人看懂 · 同一題四份答案

題目:「解說一通語音通話從接通到結束、講話怎麼變成語音回覆、額度在哪裡檢查和扣」。每份答案抽 10 條事實用 grep 驗證,四份都是 10/10。

  • 答案品質差不多,差別在要繞多少路。工具查不到的關係,答題 agent 就回頭讀原始碼補,所以準確度被讀碼補平了,代價轉成 token 和工具呼叫次數。
  • GitNexus 最貴(11.2 萬、17 次)。額度檢查、計時、token 驗證這些全走 default singleton,它一條都查不到,只能讀 13 段原始碼補。
  • graphify 的第一次 query 就找到所有入口,但「額度在哪裡檢查」也只能靠 import 邊加讀碼。
  • UA 靠導覽選了較新的 WebRTC 路徑,涵蓋面最廣;codegraph 在單一路徑上答得最深,讀碼最少。

怎麼選

第 0 步 · 每次都要做
用自己 codebase 最常見的呼叫寫法做 3 檔最小重現,看每個工具能不能建出邊。只花幾秒,卻決定了下面的選擇還成不成立。
AGENT 做影響分析
寫法沒撞到盲點的那個確定性工具。這個 codebase 是 codegraph。
要執行流、Cypher、改名預覽
GitNexus,前提是你的寫法它解析得了,而且授權允許。
文件、需求也要進圖
graphify,可信度標記好用。純程式碼時,跨檔呼叫的召回率要先驗過。
給人看全貌
Understand-Anything,前提是建圖成本分攤得掉。不要拿它問方法層級的 caller。

條件與限制

  • 單一 codebase、單一範圍(232 個 TS 檔,大量使用 default singleton)。結論高度依賴這個 codebase 的寫法,換一個 codebase 排序可能完全不同。最小重現只測了 3 種寫法。
  • N=1:流程題每個工具只答一次。重現性只做了一次重建(確定性工具)或一批重跑(UA)。
  • graphify 只測 --code-only,它的語意抽取(文件、PDF、圖片,需要 LLM)沒測。
  • GitNexus 用 --index-only 跑(不裝 skills、hooks、AGENTS.md)。沒有 embedding,全文搜尋也沒裝起來,查詢能力可能被低估。MCP 工具(例如 rename)沒測。授權是 PolyForm Noncommercial,用在公司程式碼上是否構成商業使用由使用者自行判斷。
  • codegraph 是 CLI 1.4.1(已有 1.6.2);Understand-Anything 的管線是手動照 SKILL.md 編排的,細節見同日的雙方報告。
  • 評分由本次實驗執行者自評;事實抽查每份只有 10 條,不是全文查證。