AI dependency lockfile / local-first / deterministic

程式能編譯。
API 仍會漂移。

Evidrift 把 Coding Agent 寫程式時依賴的 TypeScript 與 OpenAPI assumption 鎖進 repository,並在下一次 merge 前交給 CI 重新驗算。

Evidrift:Code compiles. APIs drift.
檢查什麼

一項 assumption。每次重新計算。

Receipt 是 repository file,不是可信任 verdict。Evidrift 每次都會重新載入 source,計算 deterministic contract,不信任儲存的 matchedverified flag。

typescript.symbol

TypeScript API drift

記錄真實 call site 選到的 overload、parameter、normalized signature、installed version、resolved declaration path 與 hash。

json.pointer

OpenAPI contract drift

透過 RFC 6901 JSON Pointer,記錄 repository-local OpenAPI JSON 或 JSON Schema 中的一個 canonical value。

sha256

Receipt tampering

把每張 Receipt 當成 hostile input,重新計算 content ID 與 evidence hash,偵測手動修改與偽造。

No signup. No API key. No cloud.

10 秒把它弄壞。

npx --yes evidrift@latest demo
實際 Evidrift CLI demo:TypeScript contract 先通過,dependency signature 改變後產生 deterministic FAIL

GIF 來自真實本機 CLI transcript。不執行 package code,不使用 cloud service 或 LLM verdict。

FAIL contract_mismatch sha256:...
Claim: parseConfig accepts an optional options parameter used by the demo.
Expected signature: parseConfig(input:string,options?:ParseOptions):ParseResult
Current signature: parseConfig(input:string,options:ParseOptions):ParseResult
Affected code location: app/src/index.ts:3
Receipt ID: sha256:...
Action: Review the dependency change, then intentionally record new evidence.
不是另一個 AI reviewer

不能 deterministic,就不阻擋 CI。

Evidrift 會做

  • 記錄某個 code location 為何依賴一項 static contract;
  • 透過 CLI、MCP 或 GitHub Actions 重新驗證同一份 evidence;
  • 在 deterministic contract mismatch 或 evidence-integrity failure 時失敗;
  • source 改變但 selected contract 仍相同時只提出 warning。

Evidrift 不會做

  • 證明 runtime correctness 或 free-text semantic truth;
  • 抓取 arbitrary URL 或解析 remote OpenAPI reference;
  • 執行 package code 或 Receipt 提供的 command;
  • 把 LLM judge 當成 CI gate。
下一步

從真實失敗開始。

先跑 demo,再決定是否把 Evidrift 加進 repository。翻譯的是說明文字;CLI command、Receipt schema、error code、API name 與 machine-readable output 維持英文。