Files
kbdb-graph-plugin/contracts
Leo 98b221b435 docs(sdd): 立 ingest-contract SDD + 搬入 ingest-candidate 契約 (T3.1+T3.8)
對應 issue #1(頂層 mira-dissolve T3)。

- contracts/ingest-candidate.json:ingest→graph 邊界契約(自頂層搬入)
- contracts/README.md:標明候選(輸入)≠已存(triplet)
- docs/3-specs/ingest-contract/design.md + tasks.md:
  - ensureTemplate 改 slot-diff 補丁(取代 early-return,免遷移腳本)
  - 補 KbdbClient.updateRecord(base PATCH /records/:id)
  - ingest 流程:驗證(422)→idempotency(uri+hash)→先 append 後 deprecate
  - triplet template 增 source_uri+content_hash slot 承載 idempotency
  - 跨 repo 協調點(3.6 圖工具併 KBDB MCP)明列需 arcrun 配合

總管已認可四個設計決定(issue #1 comment)。鐵律:零建表/零 SQL/零 migration。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 18:07:12 +08:00
..

contracts/ — graph 插件邊界契約

本目錄放 graph 插件對外的 JSON Schema 契約。兩份契約是不同方向的東西,別混

兩份契約的分工

檔案 是什麼 方向 誰產 / 誰收
ingest-candidate.json 輸入候選envelope ingest 插件 graph 插件 ingest 萃取後送進來,graph 收下處理
triplet.json 已存三元組graph 內部存的單筆 S-P-O graph 內部 / 對查詢面 graph 寫進基本盤 records 後的形態

核心區別ingest-candidate 是「還沒進庫的一批原始萃取」,triplet 是「已經正規化、存好、可查的單筆」。

  • ingest 只送原始 (subject, predicate, object) + confidence禁送 graph 領域欄位(id / clusters / bridge_score / created_at / triplet 上的 *_entity_type)。送了 → graph 以 422 拒收(additionalProperties: false)。
  • 正規化、clusters、bridge_score、embed、status/superseded_by 取代邏輯——全是 graph 領域ingest 一無所知(純餵食器)。

ingest-candidate envelope 重點

  • 一個 envelope = 一個來源檔(canonical MD)一次萃取的產物
  • source.uri(穩定識別)+ source.content_hash(快照鍵)共同決定 idempotency
    • 同 uri + 同 hash → no-op{skipped:true})。
    • 同 uri + 新 hash → deprecate-then-append(舊 active 翻 status=deprecated + superseded_byappend 新批 active)。
  • nodes[](選填)帶 gloss / entity_type —— 節點屬性,不是邊屬性,故獨立於 triplets[]。graph 用 gloss 去 embed(每節點一句,非裸詞)。

完整 schema 與欄位說明見 ingest-candidate.jsondescription / $comment。 本 repo 對此契約的實作(端點、取代邏輯、測試)見 docs/3-specs/ingest-contract/