概述
七個 patch(v0.9.80 ~ v0.9.86,2026-10-07~10-11)延續 v0.9.78 起的兩條主線——解析正確性與輸出確定性——並補上平台整合與安全。各版定位:
| 版本 | 一句話 |
|---|---|
| v0.9.80 | 更多 clone 相同確定性;MCP 查詢加速(shortest_path 最高約 300 倍);graph_stats 回報落後 HEAD |
| v0.9.81 | Python/TS/C#/Elixir/PHP 大批次解析修正;AMBIGUOUS 邊降權防社群誤聚合 |
| v0.9.82 | Rust impl 綁定;SVG 清除非法控制字元;Cloud 一次性提示 |
| v0.9.83 | C# 泛型 arity、member-chain 呼叫;AST cache 依 grammar 版本命名空間 |
| v0.9.84 | PowerShell 進階函式;Python stdlib 遮蔽防護;OpenCode 2 plugin 修復 |
| v0.9.85 | Julia/Fortran/Elixir/Scala 擷取修正;graph.html 跳脫 <;watch 鎖競態 |
| v0.9.86 | 18 個社群 PR;uninstall –purge 安全防護;緊湊單行 graph.json |
解析正確性:讓呼叫落在真正的目標上
這批修復的共同句型是「同名不再誤綁」:
- Python(v0.9.80/81):
self.x.m()與帶註記的區域變數(c: Client、含Optional/union/字串形式)解析到擁有該方法的類別,歧義時 fail closed;self/cls/super()可解析到另一個檔案裡的基底方法;巢狀類別身分加上外層限定(Outer.Inner不再與Outer2.Inner撞成一個節點);絕對 import(from werkzeug.wrappers import Request)不再被本地同名模組(wrappers.py)劫持;if TYPE_CHECKING:下的 import 標記為 type-only,不再形成不可能的 runtime 迴圈。 - TypeScript(v0.9.81):
this.field的型別可來自 class field 宣告(不只 constructor 注入);receiver 型別同名多檔時解析到呼叫者實際 import 的那個;public 呼叫不再綁到同名#private方法。 - C#(v0.9.81/83/84):外層 namespace 的型別可從巢狀 namespace 解析(innermost-wins);泛型與非泛型同名(
EffectvsEffect<T>)以 arity 區分 node id,不再自繼承迴圈;member chain(a.b.C())、element access(xs[i].M())與 constructor body 內的呼叫解析;同名 enum member 不再被裸呼叫綁走;外部型別(List<T>、System.Type)改為單一共用 placeholder——查詢回一個節點、共用檔案經它相連。 - 跨語言 own-class-chain(v0.9.83):Java/C#/Scala/C++ 的未限定呼叫綁到呼叫者自身的 class chain(自己 → 同檔基底 → 外圍類別),不再是檔案內最後一個同名方法;平手時 fail closed。
- Elixir / Julia / Rust / Scala(v0.9.85/86):qualified 與 alias 遠端呼叫、keyword-form 定義 body、Julia 的
where函式與參數型別、Fortran 具名 generic interface(dispatches_to邊)、Rust 檔內呼叫綁到擁有的impl、groupeduse(use a::{b, c::d})展開為每個名稱一條 import 邊。
確定性與輸出品質
- 更多可攜 node id(v0.9.80/83/86):manifest key、AST cache 的過時絕對路徑 id、
--no-cluster的 run-only 路徑、未解析 re-export 的 id(改以 repo-relative 路徑雜湊鑄造)都不再洩漏 checkout 路徑或 OS 使用者名;同名不同檔(x.pyvsx.html)不再塌縮。 - MCP 大加速(v0.9.80):traversal view 與 shortest-path 圖每個載入的圖只建一次(鍵於既有 graph cache)——
query_graph約 1.6 倍、shortest_path最高約 300 倍;兩個快取路徑圖的記憶體成本有 LRU 上限。 - AMBIGUOUS 邊降權(v0.9.81):低信心模糊邊在社群偵測前先降權(在副本上做、不動真圖),不再把獨立集群熔成一團;
GRAPHIFY_AMBIGUOUS_SCALE=1.0還原舊行為。 - AST cache 依 grammar 版本命名空間(v0.9.83):目錄加上
…-g<fingerprint>後綴,同版 graphify 升級 grammar 後不再吃到過時或 ABI 不相容的快取。 - graph.html 跳脫(v0.9.85):內嵌 JSON 中每個
<都被跳脫——節點標籤含未閉合<!--接<script時再也無法跳出資料區塊讓頁面變白。 - 緊湊單行 graph.json(v0.9.86):committed 的 graph.json 改為一行緊湊 JSON,重跑 build 產生
+1/-1diff 而不是大面積空白 churn;文件同時說明 PR 中大 diff 是預期。 - 查詢介面(v0.9.86):
explain對檔內同名多節點拒絕靜默擇一;lookup exit code 區分 0(有答案)/3(歧義)/4(找不到);輸出被 token budget 截斷時告訴你怎麼拿全文(含explain --all)。
平台與整合
- OpenCode 2 plugin(v0.9.84,#3554/#3732):plugin 改為輸出雙形——OpenCode 2 以 default export +
setup()載入、v1 的server()hook 保留;graphify install會刷新已安裝的 v1-only 副本,被升級過 v1 plugin 契約的使用者重新看得到圖工具。 - Windows(v0.9.80/83/85):console script 改用多核心抽取 pool(不再因非檔案
__main__.__file__退單核);測試套件在 Windows 通過(_atomic_replace對唯讀目的檔拒絕而非靜默覆寫);git hook 處理非 ASCII 檔名(core.quotePath=false+ C-quote 解碼)。 - Graphify Cloud 提示(v0.9.82):
graphify extract後在互動終端顯示一次性 Cloud 指引(每專案一次);GRAPHIFY_NO_TIPS或GRAPHIFY_NO_CTA關閉;CI、管線輸出與 AI 助理管線看不到它。 graph_stats(v0.9.80):回報圖的 build commit 與是否落後目前 HEAD。- skill runbook(v0.9.83):重用前次 build 寫入的掃描選項(排除與 gitignore 旗標),skill 驅動的 update 不再與 CLI rebuild 行為不一致。
- git 整合(v0.9.86):遵守 git 全域 ignore 檔(
core.excludesFile,git 忠實的優先序與~/XDG 展開)。
安全修復:uninstall –purge 的防呆(v0.9.86)
“
graphify uninstall --purgenow refuses to delete the project (or home, or a filesystem root) whenGRAPHIFY_OUTis empty or.”
當 GRAPHIFY_OUT 是空字串或 . 時,--purge 的刪除目標會解析成專案根目錄、家目錄甚至檔案系統根——現在直接拒絕,不再默默砍掉工作樹(#4329)。
隨堂測驗
升級到 v0.9.86 後重建 graph,committed 的 graph.json 會出現什麼樣的 diff?
💡 想先看個提示?
想想誰在 review 你的 PR——diff 噪音就是 review 成本。
GRAPHIFY_OUT 設成空字串時執行 graphify uninstall --purge,v0.9.86 的行為是?
💡 想先看個提示?
destructive 指令要檢查解析後的目標語義。
動手升級檢查清單
升級 v0.9.86:動手檢查清單
逐項勾選,確認你已完成升級必要的步驟(進度會保存在此瀏覽器)
延伸閱讀
- 官方 v0.9.86 release notes
- 官方 v0.9.84 release notes(OpenCode 2)
- 官方 v0.9.80 release notes(MCP 加速)
- 前一課:
v0974-to-v0979-determinism-and-self-binding——決定性與 intra-class 綁定 - 本主題 Changelog:完整的 v0.9.86 條目