feat(kbdb): bulk 寫入端點(缺口1)+owner_id 寫入必填——D28 keystone
- POST /entries/bulk、/records/bulk:任意N筆約3 subrequest(批量冪等查+db.batch()+hydrate),解 Too many subrequests - 部分失敗不整批炸(逐筆驗證剔除+batch錯退化逐句隔離);page_name 冪等 - embedManyOnWrite 批次嵌(單次AI.run+upsert+UPDATE IN) - owner_id 缺→400(validateEntryInput,擋在HTTP路由層;內部無主路徑recipe-stat/value entries不受傷) - Phase 13 tasks;tsc 0、vitest 18/18
This commit is contained in:
@@ -204,6 +204,30 @@
|
||||
寫一筆帶 `metadata.embed:true` 的 entry → `?mode=semantic` 搜回;未開時 `?mode=semantic` 回 keyword+capability_hint。
|
||||
本次只到 **tsc exit 0(kbdb/cypher/cli/mcp 全綠)+ toml 注入 dry-run 驗證**,不假裝端到端綠(mindset §7)。
|
||||
|
||||
## Phase 13:base bulk 寫入端點 + owner_id 寫入必填(Arcrun#8,機械化 bulk ingest / bulk deprecate 的 keystone)—— 本次做
|
||||
|
||||
> 來源:總管交辦(Arcrun#7 附帶缺口)。總庫機械化 bulk ingest + 舊語料 bulk deprecate 共同卡在
|
||||
> base 寫入「每筆一個 subrequest 串行」→ 大筆記(journals `2026_07_01.md` 11 三元組+10 node)撞 CF
|
||||
> 「Too many subrequests by single Worker invocation」回 500。另 base 寫入沒強制 owner_id → 漏傳寫成
|
||||
> owner=None,被 mira owner 過濾濾掉(實測 graph 插件回填 16 筆 gloss owner=None 查不到)。
|
||||
> 判定:屬 base 既有寫入能力的**補完**(同三表、同 CRUD、只是批次化省 subrequest),非新架構、不新增表/binding
|
||||
> (rule 06「修改不重建」);owner 強制對齊既有租戶隔離模型(proxy 選項①)+ D27/D28「設計成 AI 錯不了」。故 in-scope。
|
||||
|
||||
- [x] 13.1 **base bulk 寫入端點(缺口1 keystone)**:`POST /entries/bulk`(entries route)+ `POST /records/bulk`
|
||||
(records route)。收整個 envelope(`{entries:[...]}` / `{records:[...]}` 或裸陣列)。**少 subrequest 寫法**:
|
||||
用 D1 `db.batch([...stmts])` 一次 call 跑多語句 → N 筆 ≈ 常數 subrequest(entries:1 次 page_name 冪等查詢 +
|
||||
1 次 batch + 1 次 hydrate;records:1 次 template 查 + 1 次攤平 batch)。`bulkCreateEntries`/`bulkCreateRecords`
|
||||
在 actions;冪等沿用既有 page_name(帶 page_name 且已存在→就地 update,否則 insert);回傳逐筆結果
|
||||
(created/updated/failed 計數 + 失敗明細)、部分失敗不整批炸(逐筆驗證剔壞的 + batch 拋錯退化逐句/逐 record 隔離);
|
||||
embed-on-write 批次化(`embedManyOnWrite`:單次 AI.run+upsert,不在迴圈逐筆撞 subrequest)。kbdb tsc exit 0 + vitest 綠。
|
||||
- [x] 13.2 **owner_id 寫入必填(機制強制,D27/D28)**:`validateEntryInput` 通用驗證器(POST /entries 單筆 +
|
||||
POST /entries/bulk 逐筆共用),缺 owner_id → 400/該筆 failed(明確錯誤 `owner_id required: 每筆寫入必須指定租戶…`);
|
||||
POST /records + POST /records/bulk 同理必填。**機制邊界=HTTP 寫入路由**(不在 createEntry() 本身——它被
|
||||
record slot value entry〔owner 由 record 帶〕與 recipe-stat〔全域統計、天生無主〕內部呼叫;所有外部寫入都經路由 → 路由層擋 = 擋死外部漏欄)。
|
||||
**breaking change,會打到的 caller 見回報**(總管協調)。kbdb tsc exit 0 + vitest(route 400 測試)綠。
|
||||
- [x] 13.3 **測試**:`tests/bulk-write.test.ts`——bulk 多筆一次成功 + 部分失敗(缺 owner 不炸整批)+ 冪等(同 page_name 重入 update 不重複);
|
||||
bulk records(template 組裝 + owner 隔離);route 層 owner_id 缺→400。13 測試綠(+ 既有 embed-backfill 5 = 18 全綠)。
|
||||
|
||||
## 驗收
|
||||
|
||||
- [ ] V1 純 D1(無 Vectorize/AI)能 CRUD entries/templates/records + LIKE search
|
||||
|
||||
Reference in New Issue
Block a user