暫存世代與啟用
ct.generations major 1 是僅新增的跨表啟用柵欄。所有宣告表能在同一交易啟用前,私有暫存輸入不可見。它不是替換式發佈工作階段、套件安裝器或不可變資料列機制;單表發佈工作階段維持既有契約。
已取得的 manifest 與 package install/upgrade/retire 請看另行的 scope package lifecycle;其 JWT 權限、digest 與 retained-run activation 不是 generation 路由語意。
路由與目前權限
根路徑為 /private/module/custom_tables/company/{scope_id}/generations 與 /private/module/custom_tables/department/{scope_id}/generations。公司根路徑包含公司 UUID,沒有聊天室世代根路徑。Manifest 所有表均須有效、位於指定範圍,呼叫者目前必須是每一張表的版主,讀取狀態也一樣。只有建立者能暫存、啟用或中止。JWT 與 Full API key 使用相同即時權限;受限 ThirdParty/SpecificChatroom key 不可使用這些控制平面路由。沒有新增 Agent/MCP 世代工具或 IaC v1 世代行。
| 方法/後綴 | 契約 |
|---|---|
POST 根路徑 | 用 idempotency_key、tables 及可選 ttl_seconds 建立;回 201 狀態 |
GET /{generation_id} | 不確定結果後讀取目前狀態與持久收據 |
PUT /{generation_id}/tables/{table_id}/chunks/{seq} | 暫存 records: [{...}],取得配置的 record_ids 與輸入摘要 |
POST /{generation_id}/activate | 提交回傳的 manifest_digest;啟用/重播回 200 狀態 |
POST /{generation_id}/abort | 只移除私有輸入,不能撤銷已啟用資料列 |
Manifest 與區塊
建立 payload 包含 2–20 個不重複的 {table_id, row_count, digest, totals?}。每表可有 0–5,000 筆,合計必須為 1–5,000 筆。每表 totals 最多 20 組不重複的 {column, value};column 是儲存型 integer/decimal,value 是精確一般記法數字字串。ttl_seconds 為 60–86,400,預設 3,600。請求鍵為 [A-Za-z0-9_.:-] 中的 1–128 字元。
每區塊有 1–500 筆,seq 為 0–10,000。ID 由伺服器配置,輸入 id 會拒絕;整個暫存輸入限制 5 MiB。依 seq 再依列索引組合。表摘要對完整串接的原始資料列陣列取 SHA-256:UTF-8 JSON、物件鍵遞迴排序、不含空白、不做 ASCII escaping、禁止非有限數字。建立前先計算,不要雜湊回傳的 ID 或正規化後儲存列。Manifest digest 是領域分離的有密鑰承諾,不是由客戶端計算的一般 schema hash。
重用建立 key 且輸入相同會回原 handle;改變輸入則拒絕。同表/序號的相同區塊重試會回原收據,即使已終止;輸入不同則拒絕。重播仍驗證目前權限,包含建立重播在內,存取時都檢查到期。
啟用邊界
啟用檢查完整數量、輸入摘要、精確儲存值總額,及原表定義快照是否仍符合目前 schema、settings、rules 與 triggers。一般列規則與最終 deferred 聚合限制都要通過;連結與附件保留原生引用/擁有權檢查。有效列、連結、序號效果、一般歷史及唯一 activation_receipt 一起提交。原生輸入失敗不能降級成各表分開、部分成功。
升級備註(backend 5.22.0):世代的表定義快照不再包含資料表 settings 裡的座標索引狀態。升級前為含座標欄位之資料表建立、升級後才啟用的世代,會回 409 ct.definition_stale 一次並終止為 failed(沒有索引狀態的資料表,digest 不變)。請以新的 idempotency_key 建立新的世代並重新暫存。之後索引進度不會再讓開啟中的世代失效。
收據包含 receipt_id、generation_id、manifest_digest、activated_at、total_records、record_ids_digest 及 tables: [{table_id, row_count}]。成功重播回同一收據,不重複資料列、歷史、序號、觸發事件或下游資格。啟用後私有 payload 移除,所以狀態的 staged_count: 0。
私有暫存使用獨立資料關聯,一般 REST/公開/Agent/MCP 讀取、計算值、聚合與匯出都不包含它。Trigger/outbox 不接收暫存列事件,只讓正常提交的啟用事件具備執行資格。需簽核、受 channel 管理及 commands_only 表保留既有寫入途徑並拒絕;世代不提供同意、acting-room 或 Command 豁免。循環暫存連結不是新的原生連結模式。
狀態、重試與清理
狀態為 open、active、aborted、expired、failed,後四個為終止狀態。輸入不完整的啟用仍保持 open,沒有有效資料效果。確定失敗時,在 savepoint 內回滾有效效果、保留外層保護,儲存清理後的錯誤再終止為 failed。中止與到期只移除私有 payload,不移除既有有效資料;此切片到期由存取觸發,沒有背景回收 worker。
拒絕格式是 detail: [{type, loc, msg, retry_advice, ...}](CtProblem),不是 import-v2 的 detail.code 物件:
- 409
ct.request_key_reuse:不要用同 key/序號重試不同輸入。 - 409
ct.definition_stale:manifest/定義變更須重新準備;ct.activation_blocked表示不完整或受治理啟用;ct.scope_closed表示修改終止狀態。 - 409
ct.constraint_violation/ct.numeric_invalid:修正摘要、總額或原生限制;暫存列/數字輸入格式不符也可回 422。 - 413
ct.limit_exceeded:減少暫存數量/位元組;請求形狀超限也可回 422。 - 503
ct.operation_outcome_unknown,retry_advice: "query_operation":先讀狀態再決定重試,資料庫結果不確定時不能盲目重送啟用。
此柵欄不刪除/替換有效列、不重寫修訂歷史,也不繞過保留限制。已合併可用、瀏覽器驗收、實際模型品質、套件交付及正式規模效能是不同主張。另見批次參考及能力探索。