CT 核心更新補齊
來源界線
本次比較 backend 7c41cbc50170b3003ba16ee099f1db4e78f61d1a 與已 fetch 的 master c15a12f9b01aa3e88e7b0cf65fe4735a48e03718(VERSION 5.19.0),檢閱至 2026 年 10 月 6 日(UTC)。這是已合併 Custom Tables 來源的文件,不代表 staging/production 部署、瀏覽器驗收或新增行為測試結果。前次 1a1fd292a0 與 41f8a03ce3 checkpoint 之後的增補涵蓋 CT #1965、#1952、#1923、#1962 與 #1950 的 CT 審核 manifest 修正,以及 #1996 的來源證據無關 proposal、#1994 僅限 CT 附件的子集、#1987 history/ACL 投影與 #2015 proposal 失敗分類;非 CT 模組與只有測試的變更排除。 另包含已合併座標 PR1 #1988。主管將 PR1 加上 #1987、#2015 設為 backend 5.20.0 發行目標;空間查詢篩選稍後隨 backend 5.21.0 提供(見下方)。此處不是 production rollout 證據。
離線 Playground 與 OpenAPI snapshot 仍各自標示來源版本。來源說明不會自動把新描述的請求變成可執行 catalog 項目。整合新版契約前,先確認使用環境的部署版本。
Proposal 失敗與 logical read 證據
#2015 區分過期 schema/source/authority 證據與非預期服務失敗。Governed proposal/selection 路徑對非預期內部失敗回 HTTP 500 ct.operation_failed、retry_same_key;Command/query timeout 與 effect-identity lock 使用 ct.operation_in_progress,key-content 衝突使用 ct.request_key_reuse,table constraint 維持 ct.constraint_violation。根本原因 log 只標示 class/module/line/step,不記錄私密 exception text。已提交後的 receipt 失敗仍為 ct.operation_outcome_unknown,須查詢收據。Table-source logical read 證據從整表欄位集合排除呼叫者隱藏欄位,不放寬真正 read/version/authority 檢查。Client recovery 請見凍結提案。
History 與 canonical column ACL
#1987 已由主管確認合併,來源 b1e5a13d0e209b41cca460fbe6ba0dc7c7b301a8。Display-keyed column ACL 輸入會正規化為目前 internal key;衝突別名會被拒絕。Live-read masking 解析別名,history/diff 依現行 denial 與 computed source dependency 投影。受欄位 allowlist/Agent ceiling 限制的 principal 不再看見已移除欄位;未受限 history 讀者仍可能看見。請見欄位可見性與歷程。此增補更新先前 #1994 source checkpoint,不更新離線 OpenAPI。主管確認 #1987 已於 5.19.0 發行;owner 回報整合後 reader/manager 隱私控制通過。實際出勤套件仍須 safety-net 驗收;員工 execute grants 維持空陣列。
附件來源與投遞權限
**#1994(僅 CT 子集)**收緊 create/update、bulk 與 prepared approval 附件寫入。同公司計費歸屬必要但不足:ID 需是同一 cell 已持有、本表上傳路徑或允許的 acting/table-owned room 檔案,或 acting user 能透過其他 CT 表讀取的檔案。跨表複製需 live row/可見欄位權限;pending upload 需來源表可讀及完整有界 no-holder probe。External client、public callback 與 system/無 actor 寫入不借用 user 讀取權。未知、跨租戶及未授權同公司 ID 共用不可存取診斷。自後端 5.22.0 起,Command 的附件複製 grant是唯一的例外:它會放行由該 Command 自己的 select 選出的複製,並以 grant 作者(而不是呼叫者)的權限來判斷。見附件來源權限。
send_channel_message 更窄:不可變快照的 blob 必須由本表自己的上傳路徑產生,或已屬於收件客戶聊天室。Cell 或跨表複製不授予 delivery 權限。既有 column/type、company、history/version 及外部 channel URL 檢查仍保留。見trigger actions。此增補不教非 CT blob、root、media 或 messaging 功能。
既有欄位 update preview
#1941 在 company、department、chatroom 新增 moderator-authorized、identity-bound POST …/columns/{column_id}/preview。Body 為 ColumnUpdate,以替換 schema 投影 caller-visible sample,不修改資料;之後 caller PATCH 保留的 body,沒有 preview ticket/hash 或凍結狀態。Preview 每 checked table 上限 200 live row、共用 2,000 ms,在 #1941 時是每 tenant/table 一個 concurrent preview;backend 5.21.0(#2052)改為每個資料表一個、每位使用者一個。無效 update preview 使用 HTTP 拒絕,不是 create-preview 的 valid: false;PATCH missing column 也改回 404。見欄位 reference。
審批證據與 Commands
-
#1896、#1906、#1921 — 原生終態事實。
require_approval.output_map可用terminal_fact綁定證據欄位。只有驗證通過的凍結 v2 Command 放行會與業務異動一起原子寫入。只有輸出用途的受保護載體不再要求呼叫者於 staging 前可讀;真正的映射輸入仍須可讀。收據、重播、事件及歷史仍遵守一般列/欄 ACL。JSON、載體型別及失敗契約請見終態來源證據。 -
#1923 — 終態載體與唯一性約束。 原生 Command prescan 只延後 enabled 且 matching 核准規則的 terminal-bound component,不建立暫時 unique claim;其他 forbidden null 仍須拒絕。每個延後的 record 必須有對應 held verdict,否則以
409 approval_decision_diverged回滾該 pass。放行時注入真正終態事實,並原子檢查完整 tuple。Unique 失敗時 Review 保持 approved、hold 為apply_failed,不提交業務/history/claim 效果,失敗收據不含值。Proposal staging 不是原生終態放行;下述 #1996 收窄先前對 write 的全面拒絕。窄範圍 staging 例外請見唯一 tuple與終態來源證據。 -
#1996 — 與來源證據無關的 proposal。 Terminal-carrier table 上只允許 write set 與受保護 carrier/output-map、approval field-map、condition、unique-key dependencies 無交集的既有列 update。Preparation 與 frozen-access/release 再驗證此邊界、protected old/new value 不變、target ID 與正數 expected version。對受保護 target 的 insert、delete、upsert、child/cascade 異動及 protected-field write 仍以
409 approval_provenance_unavailable拒絕。一般 authority、stale-state 與 prescan/held-verdict 檢查不變;proposal 不能捏造原生終態事實。詳細邊界見終態來源證據。 -
#1965 — 收據與事件投影。 Mapping/list 中巢狀 reserved
approval_provenancekey(含 null)使回傳收據僅剩狀態,manager 也一樣;只有頂層 null 不會如此。Definer authority 下,只有不含 provenance 的ct.command.succeededmetadata 能供具權限的原始 invoker 讀取,不含 cell、step 或 output。Execution owner/可見性及含 provenance 的 evidence 檢查仍適用,包括 replay;不改寫既有 legacy audit body。 -
#1892 — 有界相依閉包。 驗證與執行共用 256 張相依資料表上限。
compiled.table_ids、驗證 advisory 的table_ids、definition-authority 的table_access可承載完整閉包,不再截成 20 張。這不會提高直接 write target 或 approval-gated table 各 20 張的上限。過大閉包回傳query_limit_exceeded、phaseauthor、limit與actual;不得刪除相依項目來迴避驗證。 -
#1900 — Commands 尊重公式版本。 編譯、相依追蹤與求值均使用欄位
formula_version,包括 stored v2 值。明確採用工作日日曆時,核心可在commands_only表上以derived_recompute原子重算儲存結果/來源證據;不授權業務欄位寫入,也不發出業務 trigger。請見公式 v2。 -
#1852 — 審批映射與流程檢查。 原生表單輸入可用 column、fixed 或 omit 綁定;映射輸出仍驗證欄位型別。凍結放行仍重新驗證 schema/權限。對話同意不是原生 Review 核准;呼叫者傳入仿 Review 資料不會取得終態事實寫入權。
-
#1874 — 提案與委派。 受治理提案保留凍結計畫與收據;Command/審核者委派是即時權限相依,不是任意編輯資料列的授權。仍使用原生 prepare/approve/execute 生命週期及現行權限檢查。
-
#1962 — typed SELECT binds、祖先集合與日期算術。 SQL 綁定保留陣列/JSON 值及精確數值/日期項目;relation 的布林值與完整祖先陣列在重用時保留型別。成員運算比較完整 JSON 值,而非子集合;null 或非陣列的儲存集合不會成為可寫入的匹配。
$case保留相容陣列的項目型別與界限;$datediff可參與精確 decimal SQL 算術。不支援的 JSON 傳遞回傳安全的型別拒絕,不暴露 SQL 或參數;Command JSON 深度失敗則是已清理的 request-validation 回應。見 typed SELECT 值與 Command 錯誤契約。既有授權、relation 界限與精確 decimal 限制不變。 -
#1950 — 安全 callback 審核投影。 Review manifest 從第一個 compiled delivery action(或直接 callback)取得 method、目的地、header 名稱、已去識別化的 body shape 與參照 token。目的地移除 URL 的使用者資訊、query 與 fragment。這不擴大 callback 授權,也不揭露凍結的 header/body 值。見審核者看到什麼。#1950 其餘內容是測試對齊,不是另一項產品契約。
可攜設定與存取
- #1893 — 可攜 ACL 與 grant 參照。 IaC 在文件欄位宣告後、record seed 前綁定邏輯欄位 ACL key;匯出反向還原為 ref,包括 column write-ACL 與多 principal cell。Command grant 共用 table grant token:
$user:<username>、$dept:<name>、$room:<name>、$room:<department>/<name>、$smc:<platform>:<external_id>。原生讀取仍回傳 native ID;模糊/懸空匯出參照保留既有 raw-ID fallback。於目的公司重套匯出內容,重新解析目的身分,不要把來源公司 ID 當可攜 principal。 - #1884 — 指派與寫入 ACL。 寫入會檢查 incoming principal assignment 及欄位寫入限制;多 principal cell 不只是顯示清單。IaC user-list cell 用公司內的
$user:token;$dept:是 grant token,不是 principal cell kind。未知、僅外公司存在或型別不符的 record token,在 plan 以iac_principal_reference拒絕,不產生資源效果。 - #1873 — 維度、原生連結與 package readiness。 required native-link 與 same-dimension 規則加入 mutation/plan/apply 檢查。接受 JSON 形狀不代表可跨 scope 連結;須解析 package ref 及現行權限。請見同維度參照與 IaC。
- #1878 — 權限涵蓋。 client-access 與部門欄位權限使用現行有效限制。較廣 scope grant 不代表可讀被遮罩欄位。請見權限與 ACL。
僅變更 ACL 的 IaC 更新可使用 table moderator 權限,但不因此取得建表、改名、其他 metadata、宣告欄位或 system import 權限。請以真正 apply 的 actor 規劃完整 package。
Scope 套件與不可變輸入
#1952 在 #1907 revert 後重新提供 scope CT package lifecycle 與 A1–A6 immutable-input 基礎。它不同於一般 IaC plan/apply及 append-only 暫存世代。使用帶 scope ID 的根路徑 /private/module/custom_tables/company/{company_id},或同 module prefix 下的 /department/{department_id}、/chatroom/{chatroom_id}。這些 input/package 路由要求 JWT,不是一般 API key 驗證。
| 路由後綴 | 契約 |
|---|---|
POST /packages/plan | 提供 contract_version: 1、已取得的 manifest_artifact_id、semantic manifest_digest、mode install/upgrade/retire、expected_active_generation、request_idempotency_key |
POST /packages/plans/{plan_id}/apply | 綁定 expected_plan_digest 與 request key;202 代表已保留 run,不是安裝完成 |
GET /packages/runs/{run_id} | 讀取目前 package_status、run_version 與 verification identity |
POST /packages/runs/{run_id}/activate | 綁定 expected_run_version、expected_manifest_digest 與 request key;須為 ready_to_activate、目前 prerequisite 可用且 verification 通過 |
Install 與 upgrade 成功時都使用 verification outcome installed。Plan 在 24 小時後到期;inline step preview 最多 100 項,完整 step 保留於 steps_artifact_id。不提高既有 IaC 上限。
POST /core/input-artifacts 以 multipart metadata 加 file 取得輸入;/core/input-artifacts/from-source 只把目前可見、自己 turn 的 chat attachment 複製至目的 scope 的 manager audience,不改來源。不可用任意 URL 或一般 blob ID。以 /core/input-acquisitions/{acquisition_id} 讀取 acquisition status;artifact metadata 與 /bytes 是分開的讀取。iac_document 最多 5 MiB,其他 purpose 1 MiB,每次 byte-read chunk 64 KiB。這不是 id-less attachment blob 路由。
包括 same-key replay,都重新檢查目前 scope、resource 與 retained-input 權限;foreign、revoked、missing retained authority 共用 typed hidden/missing 404。拒絕 client-authored $ct_secret_version object;$ct_secret_slot 只可用於 mapped credential field 並具 exact-purpose accounting,不可放任意業務 JSON。A7 full-state snapshot/rebuild/restore 仍延後:取得 export index/template 不授予 trusted source-system 或 restore 權限。這個 source note 不代表部署可用、瀏覽器驗收或 real-model 對話品質,也不更新離線 catalog/OpenAPI pin。
計算值與文件明細
- #1865 — 公式 v2 與工作日。 明確選
formula_version: 2;省略仍是 legacy v1。computation_mode: "stored"僅適用 v2 及支援的同列相依。結果、來源變更及日曆證據走核心重算;v1 不會自動遷移。請見公式 v2。 - #1890 — computed metadata。 新增計算 metadata 使用可 instant-add 的 schema 路徑;不代表可提交生成/計算 cell 或跳過公式驗證。
- #1861 — 有序子集合。 主表/明細 bundle 用已儲存的 v2 Command、actor 範圍 idempotency 及預期版本進行原子寫入。陣列取代成員;省略集合 key 保留成員。parent/position 欄位由伺服器擁有;分組歷史/as-of 仍受現行 ACL 限制。請見子集合。
- #1882 — 過帳與有限資源。 過帳組合及有限資源保留檢查使用既有 Command/rule 交易。posted-state 規則、禁止編輯 grant、歷史及沖銷 Command 是控制組合,不是不可覆寫 seal;高權限管理者或 IaC 仍可改變政策/資料。請見動作政策。
CT 整合與發佈
- #1858 — events、inbox、outbox。 CT 發出伺服器擁有的型別化 event envelope。Command inbox 以
external_event_id綁定 inputs;不同 payload 為ct.inbox_payload_conflict。未知結果必須查詢/調解,不要盲目啟動新業務執行。delivery reconciliation 使用action_id、expected_attempts、outcome(applied、not_applied、unresolved)及非空reference。 - #1875 — 完成 callback。 Command 完成透過 durable outbox 傳送;callback 已排隊不等於接收端已套用。重試保留 execution/event 身分,未知投遞結果須調解。
- #1879 — CT 觸發 Worker 與排程。 CT trigger 可呼叫 EdgeWorker;排程執行及 CT event delivery 仍遵守配置的 Command/存取界線。trigger 不能繞過
commands_only或欄位 ACL;本頁只述 CT 整合,不含一般 Worker 管理。 - #1866 — 公開讀取。 matrix/timeline view 與每 token rate limit 保留即時 view/token projection。mint 時省略或 null
columns使用 view projection;columns: []代表無欄位,不是全部。schema 變更不會凍結舊的無限制 projection。請見公開讀取。 - #1867 — 原子 publish session。 publish task ticket 綁定擁有者及原生發佈檢查;ticket ID 不是權限 capability。請見原子 publish session。
- #1864 — 附件。 CT 附件生命週期延伸至 REST、IaC、CT Agent/MCP,仍保留 blob 擁有者、可見性與清理檢查。請見附件與 blob。
- #1877 — CT Analyst 讀取。 CT Analyst 工具清單包含 child-bundle 讀取;寫入仍使用已儲存 Command 的同意/執行路徑。
Backend 5.21.0(10 月 8 日)
Backend 172a7f80bdf4dbdffdc018eb08bfa42c62bb485c(tag v5.21.0,VERSION 為 5.21.0)依其已發行的程式碼樹撰寫文件,並與 5.20.1(4a6921b7e2b1b09f9c9cd5615210e3cc234fe364)比較。這是來源 pin,不代表 staging/production 已部署;離線 OpenAPI 快照、端點目錄與 Playground 仍維持各自較早的 pin。每項變更給整合方的「該怎麼做」寫在變更紀錄;以下清單列出每個呼叫端可見變更背後的 backend PR,以及講解它的頁面。
- #2101、#2110、#2112 — 其他公司的 id 回應與不存在相同。 其他公司的資料表、房間、link 目標、診斷與 trigger 目標 id 不再回
403(或回一個能分辨兩種情況的錯誤),而是與不存在的 id 相同;個別使用者授權路由則維持單一403。見其他公司的 id 回應與不存在相同。 - #2117 — 新增欄位、刪除欄位或清除單一資料表時遇到 Redis 中斷,回有型別的
503。 見併發與重試。 - #2091、#2111、#2113、#2117、#2118、#2121、#2048、#2058 — IaC。 大型欄位回填走有 ticket 的非同步 apply(
202);ticket 以有型別的ct.iac_apply_*狀態結束,不再卡住;原始資料表 id 與名稱一樣被授權;plan、state、export 與 apply 的起始階段受請求時間預算限制;Commands 可以寫入名為secret_ref的業務欄位。見 plan 與 apply。 - #2104、#2115、#2123、#2067、#2134 — 匯出、隱藏欄位與 unique 衝突。 CSV 與 XLSX 會中和以公式字元開頭的文字,匯出的大小與產生時間有上限,隱藏欄位的回應與不存在的欄位完全相同,unique 衝突錯誤也不再點出隱藏欄位。#2134 是 review 後續修正:unit selector 指向隱藏欄位的查詢和以前一樣被拒絕(#2123 曾在同一版內拿掉這項拒絕),而 IaC apply 若在自己的期限檢查寫入
ct.iac_apply_timeout之後才完成,會用完成結果取代那張 ticket。其餘部分讓 Agent 工具箱的查詢工具套用同樣的 unit selector 拒絕、移除一個沒用到的 IaC429schema model,並補上測試。見匯出檔案與欄位可見性。 - #2072 — 座標空間索引與距離查詢。 紀錄查詢可使用
within、within_any與sort[].distance_from。見座標查詢。 - #2105、#2116、#2135、#2052 — 欄位操作。 超過 500 筆 live 紀錄的 REST 欄位新增改為背景執行,並有狀態紀錄與有型別的錯誤;欄位寫入依 API worker 准入,滿載時回有型別的
429;更新預覽則依資料表與使用者各准入一個。見背景新增欄位與欄位參考。 - #2060、#2066 — Command 運算子與 upsert。
$time_of_day、$local_date、$date_add,以及針對unique_tuple規則的on_conflictupsert step(含 stored formula 鍵)與dry_run預覽。見本地時間與日期與以on_conflict做 upsert。 - #2083、#2120、#2109、#2055、#2056、#2033 — Commands:公開結果、子集合、法律保留、provenance、release 失敗與 SQL 組合。 在 flush 期間失敗的 release 現在會以終態結束。見作者選擇公開的結果與審批與法律保留。
- #2050 — 工作日行事曆。 唯讀 API key scope 與選用的例外 label。見唯讀 API key 存取。
- #2085、#2118、#2135 與 commit
9440dd930e(沒有 PR 編號)— ticket 與背景工作。 Bulk ticket 在 worker 消失時以有型別的狀態結束,GET /public/task只提供呼叫者有權輪詢的 ticket,匯入 extraction ticket 歸上傳者所有。見輪詢 ticket。 - 僅可靠性 — #2140、#2139、#2122、#2136、#2096、#2106。 Custom Tables 的資料庫工作改在 event loop 之外執行,full-GC 暫停與 worker 回收不再卡住請求,plan、reference guard 與時區集合的運算也更快。請求與回應的形狀都沒有改變。
- 僅測試與 harness — #2068、#2074、#2089、#2098、#2114、#2119、#2138。 不是呼叫端契約。
Backend 5.22.0(10 月 9 日)
Backend 36270f5a2b83fdd71b6641ad94cee707f8028292(即 tag v5.22.0 的程式碼樹;tag 所在的 commit ceee9a325d17d08a33e6c5bd94b9ecc3d1c84112 只把 VERSION 改為 5.22.0)依其已發行的程式碼樹撰寫文件,並與 5.21.0(172a7f80bdf4dbdffdc018eb08bfa42c62bb485c)比較。這是來源 pin,不代表 staging/production 已部署;離線 OpenAPI 快照、端點目錄與 Playground 仍維持各自較早的 pin。每項變更給整合方的「該怎麼做」寫在變更紀錄;以下清單列出每個呼叫端可見變更背後的 backend PR,以及講解它的頁面。這個範圍內共 23 個 commit,其中 9 個與 Custom Tables 有關;其餘 14 個是 Edge Workers、Sandbox 與基礎設施的 commit,本站不涵蓋。
- #2167 — 變更超過 300 個資源的 plan 改走 ticket 套用。 若 IaC apply 的 plan 建立、更新、刪除或搬移超過 300 個資源(
CUSTOM_TABLE_IAC_SYNC_CHANGE_LIMIT),會回202與 ticket,而不是在 request 內套用;noop、adopt、orphaned 與 record 行不計入。client 必須同時處理200與202。見變更量大的 Plan。 - #2151(ticket 部分)— 準時回傳的 apply 以
finished結束。 在 attempt 期限之前就回傳的結果,會取代搶先寫入的ct.iac_apply_timeout(不論是 worker 的 heartbeat、某次 status poll,還是重新投遞的工作寫的);超過期限才回傳的結果則維持 timeout。這取代了上面 #2134 為 5.21.0 描述的「遲到的結果取代 timeout」。見 Ticket 沒有結果就結束。 - #2166 — Command dry run、資料表 settings 與公開讀取。 definer 權限 Command 的
dry_run失敗時,對 execute-only 呼叫者的錯誤會像執行一樣被遮蔽;資料表settings中的座標索引狀態改由伺服器擁有(任何讀取都不回傳、IaC 會丟掉文件裡的副本、REST 建立會拒絕;在 5.21.0 上傳、文件帶有這個 key 的 package input 必須重新上傳),含座標欄位資料表的既有 IaC plan hash、Command 提案與暫存世代會在升級時失效一次;公開讀取的 query 最多接受 3 個sort鍵(第 4 個回400,不再是500)。見以dry_run預覽、座標索引與讀取。 - #2159 — 附件複製。 version 2 的寫入型 Command 可以帶
attachment_copiesgrant,讓原本無法自行複製的呼叫者(例如外部 client)也能跨資料表複製指定的附件;每次複製都會重新檢查 grant 的作者,部署也可以關閉這項功能。見附件複製。 - #2155 — 背景新增欄位不再因鎖衝突永久失敗。 死結會在 worker 內重跑;鎖等待逾時,或重跑後仍發生的死結,會把該次嘗試結束為
ct.column_add_interrupted,下一次 status poll 會接續;第三次以鎖衝突結束的嘗試才把工作結束為ct.column_add_failed。見背景新增欄位。 - #2151 — 隱藏名稱與有型別的 Command 錯誤。 被隱藏的欄位在另外三處的回應與不存在的欄位相同(以紀錄欄位排序的 saved view、MCP
records_aggregate的group_by、agent 計算篩選);對不含child_collectionstep 的 Command 呼叫/execute時,核准規則的來源資料表落在 tag 之外,改回422 command_tables_outside_tag,不再是500。見欄位可見性與 Commands。 - 僅可靠性 — #2158。 單一 API worker 收到大量已驗證請求時,請求不再互相卡住:request log 改在回應之後寫入,等候資料庫連線也有自己的限流器。請求與回應的形狀都沒有改變。
- 內部或僅測試 — #2153、#2149、#2164。 讀不到的時區資料庫不再讓 worker 啟動失敗、行程內工作登錄表會把關鍵字參數原樣傳遞,E2E 工具中的 worker 回收與 staging IaC 探測也做了調整。這些都不是呼叫端合約。
刻意不宣稱的功能
#1907 已被 #1948 revert;後續 #1952 僅重新提供此處描述的 scope package lifecycle 與 A1–A6 input 基礎。不得宣稱 A7 full-state snapshot/rebuild/restore。排除非 CT、root operations、Custom API tools、billing 及通用 agent platform;唯一有說明的 root 路由是座標索引回填,寫在座標查詢頁僅供 operator 參考的提示框中,因為它會補完呼叫端看得到的狀態。只有測試的合併(#1863、#1798、#1889、#1959)不是新增呼叫契約。
座標型別、幾何、formula/Command/rule 運算子,以及(自 5.21.0 起)stored 查詢篩選與距離排序都已提供;只有核准設計仍不等於已提供運算子,所以依賴某項功能前請先對照它的頁面。