跳到主內容

Theme / v0.9.103

Graphify

Codebase 知識圖譜

基礎觀念

v0.9.98~v0.9.99:路徑信心誠實化——最弱跳與 also_seen 證據

v0.9.98 與 v0.9.99(皆 2026-10-30 發布)聯手把最短路徑的信心回報做誠實:整體路徑信心以最弱跳(weakest hop)計算、多條等長路線取最保守者、path/explain/neighbors 輸出顯示每條邊的 confidence_score,折疊邊並以 also_seen 保留較弱證據;另有 Go/Python 呼叫解析、C# 方法標籤與安裝位置修正。附互動測驗與檢查清單。

概述

v0.9.98 與 v0.9.99 於 2026-10-30 連續發布(22:55 與 23:42 UTC)。兩版合起來的主軸是最短路徑的信心誠實化:

  1. 整體路徑信心=最弱跳(v0.9.98):graphify path 與 MCP shortest-path 輸出以鏈上最弱的一跳回報整體信心。
  2. 等長路線取最保守者(v0.9.99):多條最短路徑並列時,回報「最弱跳最弱」的那條,不再任意挑一條。
  3. confidence_score 進入輸出(v0.9.99):path、explain 與 neighbors 在邊的標籤旁印出儲存的分數。
  4. also_seen 保留較弱證據(v0.9.98):折疊邊時,輸家副本的出處不再被丟棄。

其餘是 Go/Python 的呼叫解析推進、C# 方法標籤、安裝位置修正,以及一批抽取與管線修正。

整體路徑信心=最弱跳(v0.9.98,#4885、#4892)

graphify path 與 MCP shortest-path 輸出現在把整體路徑信心回報為最弱跳(weakest hop)——先比最低的信心層級(confidence tier)、再比最低分數——並附一行點名該跳的摘要(summary line naming that hop)。

一條路徑的可信度取決於最弱的一環:就算九成邊是 EXTRACTED,只要有一跳是低信心的 INFERRED,整體答案就不該假裝很確定。

等長路線取最保守者(v0.9.99,#4881 下半場)

當多條路線等長時,graphify path 與 MCP shortest_path 工具回報最保守的一條:在所有最短路徑中,選「最弱跳最弱」的路線,摘要並註明它是 N 條等長路線中最弱者(the weakest of N equal-length routes)。

官方說明動機:過去任意回傳一條等長路線,「the confidence could overstate how sure the connection is」——信心可能高估這條連線的確定程度。

confidence_score 進入 serve 輸出(v0.9.99,#4882、#4888)

path、explain 與 neighbors/get_neighbors 現在在邊的標籤(tag)旁印出儲存的 confidence_score,例如 [INFERRED 0.75]。規則:

  • EXTRACTED 維持裸標——定義上它的信心是 1.0,不需要附分數。
  • 缺失或非有限(non-finite)的分數也維持裸標。
  • 可與最弱跳路徑摘要及 also_seen 證據標籤組合呈現。

折疊邊保留較弱證據:also_seen(v0.9.98,#4881、#4891)

重複的同關係(same-relation)邊折疊時,過去輸家——信心較弱的那份副本——的出處(provenance)直接被丟棄。現在它被保留在存活邊的 also_seen 清單上:

  • 較弱證據不再靜默流失。
  • 該欄位序列化至 graph.json。
  • 跨重建冪等(idempotent)——反覆重建不會重複累積。

Type.Member 端點解析(v0.9.98,#4884、#4893)

graphify path 的端點寫成 Type.Member 時,現在解析到 member 節點而非包含它的型別——graphify path "Exporter.Run" "PdfReport.Build" 找到真實的呼叫路線。邊界行為不變:精確名稱與檔名仍優先;member 不存在的 Type.Member fail closed(寧可失敗不猜)。

C# 方法標籤帶擁有型別(v0.9.98,#4883、#4889)

C# method 節點現在以擁有型別標示——MyClass.Method——而非裸 Method,跨型別的同名方法因此可區分。注意:節點 id 與邊完全不變,這只是顯示標籤(display label)的改變。

Go 呼叫解析系列

v0.9.99 一次修三個(皆感謝 @nothariharan):

  • package 層級 var 初始化器中的呼叫(#2360、#4867):含 func-literal closure 內的呼叫(常見的 swappable-hook 模式)歸功到檔案節點,不再被丟棄。
  • method value 作為函式引數(#1566、#4868):Wrap(s.Health) 這種以 method value 當參數的寫法連結為 indirect_call——Go 在 callback-by-method-value 上與 Python/JS 看齊;並保守防範 field-access 的誤判(false positives)。
  • 跨檔 struct 型別(#3368、#4866):receiver 欄位的 struct 宣告在同 package 的兄弟檔時可定其型別——成員呼叫跨「struct 在此、methods 在彼」的常見 Go 佈局解析,且欄位型別跨增量重建保存。

v0.9.98 另修(#4843,感謝 @ayushcodes10):以 composite literal 綁定的 receiver——var x = T{} 或 var x = &T{}——型別定為 T,與 x := T{} 形式一致,其成員呼叫因此可解析。

Python dispatch table(v0.9.99,#1566、#4773)

dispatch table 中列出的 module.func 值——{"a": mod.func_a},含巢狀集合——現在解析到被引用的函式並發出 indirect_call,不再被丟棄。不可呼叫(non-callable)、class 與 local-receiver 的值則維持不動。

安裝位置修正(v0.9.99)

  • gemini 的全域 skill 目錄(#2800、#4770):Windows 上 gemini 有自己的目錄 ~/.gemini/skills/graphify,不再與 agents 平台的目錄碰撞;既有的 agents skill 會被註記而非刪除。
  • OpenCode 全域 plugin 位置(#3398、#4771):改寫入 ~/.config/opencode(與全域 skill 同處)而非當前目錄;install/uninstall/refresh 保持對稱,legacy 位置仍被清理。

產生 skill 的措辭修正(v0.9.99,#4061、#4721)

skill 中的「Follow these steps in order. Do not skip steps.」(依序執行、不得跳步)改寫為「unless the fast path above applies」(除非上方的快速路徑適用)——解決與既有圖譜快速路徑(existing-graph fast path)的矛盾,套用到所有產生 host。

v0.9.98 其他抽取與管線修正

範圍 修正 PR
extract 檔案 id 與每宣告 id 保持區分——與檔案同名的頂層宣告(class Js in a.js)不再因 id 碰撞被靜默丟棄;跨檔引用綁到宣告 id #4854、#4857
dedup 跨檔 document mention 與 AST 節點在 defining id 碰撞時,AST 節點保留 id;同檔 enrichment、extension twins 與 single-definer 不動 #4859、#4872
build 兩檔 import cycle(a imports b、b imports a)在預設無向 build 中被回報;stamp 在 incremental/watch 重建正確清除,丟掉的 import 不再留下過期 cycle #4839、#4841
js 帶 ?query 或 #fragment 後綴的相對 import(./mod.js?v=1)解析到真實模組而非幻影節點;Node #subpath imports 不動 #4860、#4876
verilog SystemVerilog class constructor(function new(...),無回傳型別)有自己的節點、method 邊與參數型別引用 #4848
powershell using module/using assembly:帶副檔名的去掉副檔名(Helpers.psm1 → helpers);無副檔名的點狀模組名保留(Az.Accounts) #4847
solidity 自由函式 using {a, b} for T 集合對每個具名函式發出 uses 邊,不再只有 using Lib for T 單一形式 #4846
commonlisp superclass 在同檔稍後定義的 defclass 綁到該本地節點,不再鑄無來源 stub #4845
pascal inherited 與 inline 形式的 component blocks(.lfm/.dfm)被辨識;後續 object block 不再被損壞的巢狀堆疊重新掛父 #4844
serve 兩節點在 lookup 平手且僅大小寫不同時,與查詢拼法完全相同者勝出(其餘在下一層仍可達),不再全部拒為歧義 #4870
export Cypher 文字匯出以穩定節點 id 鍵 MERGE、label 分開設定——label 變更後重新匯入會更新節點而非建立重複 #4878
pdf 轉換文字快取以解析後的來源路徑為鍵——不同 root 中同名相對路徑的兩個 PDF 不再互相污染 #4851
隨堂測驗

v0.9.99 起,多條路線在最短路徑查詢中等長時,`graphify path` 會回報哪一條?

💡 想先看個提示?

保守優先:等長不代表等可信。

隨堂測驗

v0.9.98 起,重複的同關係邊折疊時,較弱(輸家)副本的出處會如何處理?

💡 想先看個提示?

關鍵字是 also_seen 與「不靜默流失」。

動手升級檢查清單

升級 v0.9.99:動手檢查清單

逐項勾選,確認你已完成升級必要的步驟(進度會保存在此瀏覽器)

0 / 7

延伸閱讀