period_fence
period_fence 是目前有效、可調整的 CT 規則,不是永久封存。每表最多三個 fence。規則檢查已儲存 date 或 datetime 欄位是否落在期間資料列內;when 必須省略或為空。沒有日期的影像不受限制。
Link 與 range 模式
{
"type": "period_fence",
"date_column": "Posting date",
"period": { "table_id": "22222222-2222-4222-8222-222222222222", "start_column": "Start", "end_column": "End" },
"open": [{ "column": "Open", "op": "eq", "value": true }],
"require_period": true
}此 REST 範例使用 range 模式。期間表必須是同公司/scope 規則允許的目標。界線使用已儲存 date 欄位,起日包含、迄日不包含(start <= day < end);null 迄日表示無上限。start_column 與 end_column 必須成對提供且不能相同。
Link 模式改用 fenced table 上 cardinality-one 的 period.link_column,連到的資料列就是期間。Link 模式的界線可省略;若提供,仍須成對。伺服器回傳推導出的 mode 與期間 table_id,GET→PUT round-trip 可保留它們。
Range 模式最多接受兩組 period.match,將期間表的 link 欄位對應到 fenced table 的 link 欄位;兩側必須連到同一目標表。REST 可用 "$same" 指同顯示名稱的欄位,IaC 則必須寫明 column ref。Link 模式不接受 match。
open 包含 1–5 個 AND predicate,作用於期間表已儲存的 scalar 欄位:eq、neq、in、is_null、is_not_null。in 要求非空清單。每個涵蓋日期的期間都必須符合所有 predicate;其中一列關閉就足以拒絕寫入。評估分區內的無效界線會拒絕,不會默默略過期間。
檢查影像與拒絕回應
| 操作 | 檢查影像 |
|---|---|
| Create | Post-image |
| Update 或 revert | Pre-image 與 post-image 都檢查 |
| Delete | Pre-image |
| Restore | 還原後的 post-image |
require_period 預設 true。期間不存在/已刪除或沒有涵蓋區間時為 no_period;設 false 可允許未涵蓋日期,但不能放行已關閉的涵蓋期間。純 schema 變更與 reorder 不是有日期的資料列寫入。執行時鎖定並讀取目前期間列;排隊工作與 approval release 不能沿用過期的開啟狀態快照。
{
"detail": {
"error": "ct.scope_closed",
"message": "no period covers this date; define a period before posting",
"reason": "no_period",
"rule_id": "rule_12345678",
"rule_name": "Posting period",
"table_id": "33333333-3333-4333-8333-333333333333",
"change_type": "create",
"image": "post",
"date": "2026-10-02"
}
}REST 單筆寫入使用 409;reason 為 closed、no_period、date_outside_period、period_invalid 或 dependency_invalid。回應指出拒絕的 fence 與資料列影像,不包含期間資料列 ID。Bulk/import 可能把 code 放在資料列錯誤文字內,IaC 放在線錯誤內。Command execution 的 ct.scope_closed 與 ct.scope_override_reason_required 可直接回傳 calendar-error envelope;其他拒絕則可能使用 program-error envelope。遭拒的寫入不會生效。
變更期間與稽核
原本關閉的期間資料列只能在獲授權的 Command 內變更。除非透過 approval release,真人的 REST execution 必須附上非空 reason(1–500 字元);否則為 422 ct.scope_override_reason_required。Agent 與 MCP 變更關閉期間時必須走 approval,不能代填真人理由。Command 不會自動繞過交易資料列的 fence;要變更有日期的資料列,須先重新開啟相關期間。
期間開啟狀態/界線變更與 Command override 都有稽核紀錄。Chatroom、department、company scope 提供 GET …/tables/{table_id}/period-events,回傳 {table_id, events, total};接受可選 record_id、limit(1..1000,預設 100)與 offset(預設 0),並套用目前資料列/欄位讀取可見性。Event 包含 actor、before/after 狀態、Command/execution/approval 參照與 reason;隱藏欄位會遮蔽。見期間事件。
刪除/改型別相依欄位或將被參照的期間來源丟入垃圾桶,會以 409 ct.scope_dependency_in_use 拒絕。若確實要改 schema,先移除相依 fence。管理者仍能更改規則;此功能不提供不可覆寫的 immutable-record primitive。
IaC
使用 rule line。Link 模式以 column ref 指定 period.link_column;range 模式以 period.table 指定期間表的 table ref,不是 REST 的 period.table_id。Date/bounds/open/match 欄位使用各自表格的 column ref。無效形狀或無法解析的 ref 在 planning 時拒絕;apply 仍會再次執行規則檢查。