docs(wiki): /wiki-capture — 修正過時決策 + 新增 API-as-Wall ADR

- decisions-summary.md:新增「KBDB 鐵律 + API-as-Wall」「安裝契約」;
  修正過時兩條(「共用 D1 掛載」改 API;「萬物皆 Block v3」標已淘汰/違規殘留已刪)
- 新增 ADR docs/2-architecture/decisions/0001-api-as-wall.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-14 21:25:46 +08:00
parent c82d75f742
commit 3a1faf19f4
2 changed files with 64 additions and 8 deletions
+23 -8
View File
@@ -10,15 +10,30 @@
**原因**:graph 能力較龐大、非基本儲存功能、leo 產權、較複雜 → 不留 arcrun。基本盤(block CRUDD1 三表)= `arcrun/kbdb`,不在本目錄。
**詳細**`docs/HANDOFF-kbdb-plugin.md`;來源 InkStoneCo 頂層 `matrix-rearrange` Phase 2 (R2)。
## 獨立 repo 名 + 邊界乾淨度 — 2026-06-14
**結論**獨立 repo = 新 repo `uncle6me-web/kbdb-graph-plugin`(leo 拍板,沿用目錄名)。grep 證實插件與基本盤 action 層零耦合,耦合只在 DB 層(讀 blocks/entry_values + triplets VIEW
**原因**乾淨的 AGE-on-Postgres,插件抽出無程式碼牽連;唯一要設計的是 DB 掛載介面
**詳細**`docs/3-specs/kbdb-graph-extraction/design.md`(灰色地帶結論 + 掛載介面)
## 🔒 KBDB 鐵律 + 插件 API-as-Wall 形態 — 2026-06-14(最高原則)
**結論**插件【絕不碰表、零 SQL、零 migration】,讀寫全走基本盤 arcrun/kbdb HTTP API。新資料類型=建 template+填 slot,永不建表(連插件自建獨立 D1 都不行)。任何人不准動表(CREATE/ALTER/DROP)。embedding/語意搜尋屬基本盤 optional embed 模組,非插件職責
**原因** AGE-on-Postgres 更嚴——AGE 能讀 Postgres 表,KBDB 插件連表都不許碰。真正的 API-as-Wall。鐵律已 hook 化(`.claude/hooks/pre-{write,bash}-guard-no-table.sh`,違反 exit 2
**詳細**`InkStoneCo/docs/3-specs/matrix-rearrange/DECISION-kbdb-v3-baseplane.md` + ADR `docs/2-architecture/decisions/0001-api-as-wall.md`
## 萬物皆 BlockKBDB v3— 2026-02-28
**結論**一張 Block 表 + type 欄位,禁 CREATE/ALTER TABLE,新資料類型用 templateAPI-as-Wall
**原因**零 migration 擴充;所有讀寫經 API 不繞過直打 D1
**詳細**`CLAUDE.md` 下半(v3 全規範,含基本盤,待裁剪只留 graph 插件相關)
## 獨立 repo 名 — 2026-06-14
**結論**獨立 repo = **public `uncle6me-web/kbdb-graph-plugin`**(leo 拍板,沿用目錄名)。無 .github/workflows(不開 Actions
**原因**插件與基本盤 action 層零耦合,抽出乾淨
**詳細**`docs/3-specs/kbdb-graph-extraction/design.md`
## 掛載介面 = 基本盤 API(非共用 D1)— 2026-06-14(推翻原判斷)
**結論**:插件掛載 = HTTP API`KBDB_BASE_URL`),**不共用 D1、不直接 SQL、不建 VIEW**。圖在插件層記憶體從 records 組裝。
**原因**:⚠️ 原版「AGE-on-Postgres 共用 D1 + DB 掛載介面」是**讀違規現狀(插件直接 SQL 讀 blocks/entry_values)推出來的錯判斷**——那些直接 SQL 是違規歷史產物,不是設計依據。鐵律 > 現狀。
**詳細**design.md「掛載介面 = 基本盤 API」節 + mistakes.md「讀違規現狀推翻鐵律」。
## 安裝契約:KBDB_BASE_URL 安裝時 AI 填 — 2026-06-14
**結論**`KBDB_BASE_URL` 不寫死 toml、不叫人填。安裝時 AI 查 CF subdomain 拼 `https://arcrun-kbdb.<subdomain>.workers.dev``wrangler secret put` + `wrangler deploy`。本地整合測試用 `.dev.vars`(非 .env)。
**原因**:因部署而異(每個 self-hosted 用戶 subdomain 不同),但確定性可算(能 deploy 就能查 subdomain,同套 CF 憑證)。
**詳細**`scripts/install.sh`;參考 arcrun `docs/3-specs/arcrun/sdk-and-website/self-hosted-init.md`
## ~~萬物皆 BlockKBDB v3~~ — 2026-02-28(已淘汰,2026-06-14 修正)
**結論**:⚠️ 本目錄那套帶獨立 `blocks` 表 + 0001/0005 CREATE TABLE 的「v3」是**長歪的違規殘留,已刪**。基本盤真身 = `arcrun/kbdb` 3 表(`entries/templates/entry_values``entry_type='block'` 表達 block,不需獨立 blocks 表)。
**原因**:「萬物皆 Block」獨立 blocks 表違反「不建表」鐵律。基本盤規範歸 arcrun/kbdb,本 repo CLAUDE.md 已裁剪。
**詳細**DECISION-kbdb-v3-baseplane.md 一節「原提問的前提是錯的」。
## 避免再被 GitHub flag(上游鐵律)— 沿用
**結論**:禁跨 repo 自動同步 Actions;部署繞開 GitHubwrangler / scp);新 repo 預設不開 Actions。
@@ -0,0 +1,41 @@
# ADR 0001KBDB 鐵律 — 插件 API-as-Wall(零碰表 / 零 SQL / 零 migration
- 狀態:已採納(Accepted
- 日期:2026-06-14
- 決策者:leo(總管)
- 提出:KBDB-graph 子 repo CC
## 背景
KBDB-graph 插件(triplet 採集 + graph 查詢)原本直接以 SQL 讀寫基本盤的 `blocks`/`entry_values` 表(28×/31× SQL 引用),並帶獨立 `blocks` 表 + 0001/0005 `CREATE TABLE` migrations。子 repo 的 design.md 一度把這個「現狀」當成 **AGE-on-Postgres 訊號**,跑去問「要不要共用同一個 D1、直接 SQL 掛在基本盤表上」。
這是**讀違規現狀去推翻鐵律**——那些直接 SQL 是違反 API-as-Wall 的歷史產物,不是設計依據。
## 決策
KBDB 生態最高原則(leo 拍板):
1. **任何人不准動表** — 禁 `CREATE/ALTER/DROP TABLE`。那 3 表(`entries`/`templates`/`entry_values`)只有基本盤維護者能改。
2. **插件不准直接接觸表** — 禁 `SELECT/INSERT/UPDATE/DELETE/JOIN`、禁 `.prepare(...sql...)`、禁綁 D1/Vectorize/AI。
3. **讀寫全走基本盤 API/CLI/MCP** — 插件與 AI/人同一條路(薄殼原則)。唯一通道 = `src/lib/kbdb-client.ts`,指向 `KBDB_BASE_URL`
4. **新資料類型 = 建 template + 填 slot,永不建表** — triplet=`template='triplet'`、entity=`template='entity'`。連「插件自建獨立 D1triplet_clusters 等)」都不行——那仍是建表。
5. **零 migration、零 SQL** — 插件目錄無 `migrations/`。SQL 只存在於基本盤 worker 內部。
> 比 AGE-on-Postgres 更嚴:AGE 插件能直接讀 Postgres 表;KBDB 插件連表都不許碰,必須透過基本盤 API。真正的 API-as-Wall。
## 後果
- 圖不靠 DB VIEW,靠插件層從 triplet records 在**記憶體**組鄰接表跑演算法。
- embedding / 語意搜尋屬基本盤 optional embed 模組(D1 only 之外的加購層),**非插件職責**;插件 entity 正規化降級 exact match、search 降級 keyword。
- 基本盤缺口(無 `PUT/DELETE /records/:id`、無 vectorize)標 `[→arcrun]`,**不得**為此自建表或直連 D1。
- 鐵律寫成 hook 強制(`.claude/hooks/pre-write-guard-no-table.sh``pre-bash-guard-no-table.sh`,違反 exit 2)。誠實限制:hook 擋語法層明顯 SQL,藏在 helper 裡的繞道擋不了 → 文檔 + hook 兩者都不可省。
## 關鍵教訓
**讀現狀 ≠ 設計依據。** 違規代碼會自我合理化。現狀與鐵律衝突時,改現狀,不是改鐵律。
## 相關
- 頂層決策全文:`InkStoneCo/docs/3-specs/matrix-rearrange/DECISION-kbdb-v3-baseplane.md`
- 改寫範圍:`docs/3-specs/kbdb-graph-extraction/design.md``tasks.md`R-EXT-4
- 教訓:`.claude/wiki/mistakes.md`「讀違規現狀推翻鐵律」