You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ADR-0103 deferred the enum split ("revisitable later as a rename") because a new
`managedBy` value would fall through to the fully-editable `platform` default on
deployed Console clients. Both objections are now retired — the server-side write
guard / apiMethods reconciliation / /me/permissions clamp make that fallthrough
cosmetic (the write is rejected regardless of what the client renders), and
objectui#2712 closed the UI union — so v16 lands it additively.
- spec: new enum value `engine-owned` with the same all-locked default affordance
row as `system`; joins ENGINE_OWNED_BUCKETS (guard) + GUARDED_WRITE_BUCKETS
(clamp). Guard / reconcile / clamp MECHANISMS unchanged — engine-owned is an
explicit member of the set they already covered by resolved affordance.
- relabel 20 objects `system → engine-owned` (metadata store, jobs, approvals
runtime rows, sharing rows, automation runs, messaging delivery/receipt,
secrets, settings) — one-line, behaviour-identical each.
- 8 admin/user-writable objects keep `managedBy: 'system'` (RBAC link tables,
prefs, approval delegation, messaging config) — `system` now means
"engine-managed schema, writable via userActions".
- tests: engine-owned coverage in system-write-guard / fold-wildcard-superuser /
object affordance-matrix; ADR-0103 addendum; objects.mdx + regenerated ref.
Behaviour-, enforcement- and wire-identical: a self-documenting relabel, no data
migration, no code branches on the `'system'` literal. Retiring the overloaded
`system` (moving the 8 writable objects out) is a breaking rename deferred to v17.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
**Split the overloaded `managedBy: 'system'` bucket with an explicit `engine-owned` value (ADR-0103 addendum, #3343).** ADR-0103 deferred the enum split ("revisitable later as a rename") because a new `managedBy` value would fall through to the fully-editable `platform` default on deployed Console clients. Both reasons against it are now retired — the server-side write guard / `apiMethods` reconciliation / `/me/permissions` clamp make that fallthrough cosmetic (the write is rejected regardless of what the client renders), and objectui#2712 closed the UI union — so v16 lands it, **additively**.
14
+
15
+
-**New enum value `engine-owned`** with the same all-locked default affordance row as `system` (`create/import/edit/delete: false`, `exportCsv: true`). It joins `ENGINE_OWNED_BUCKETS` (the engine write guard) and `GUARDED_WRITE_BUCKETS` (the `/me/permissions` clamp); the guard, `reconcileManagedApiMethods`, and the clamp mechanisms are unchanged — `engine-owned` is an explicit member of the set they already covered by resolved affordance.
16
+
-**20 objects relabelled `system → engine-owned`** — the ones the engine owns end to end and that declared no write-opening `userActions` (the metadata store, jobs, approval runtime rows, sharing rows, `sys_automation_run`, the messaging delivery/receipt pipeline, `sys_secret`, settings). One-line, behaviour-identical per object.
17
+
-**8 admin/user-writable objects keep `managedBy: 'system'`** (the RBAC link tables, `sys_user_preference`, `sys_approval_delegation`, the messaging config grids) — `system` now reads as "engine-managed schema, writable via `userActions`".
18
+
19
+
Behaviour-, enforcement- and wire-identical: resolved affordances, the guard verdict, the 405 `apiMethods` reconciliation, and the permissions clamp are the same before and after — this is a self-documenting relabel, not a policy change. No data migration (`managedBy` is schema metadata) and no code branches on the `'system'` literal. Retiring the overloaded `system` entirely (moving the 8 writable objects to a dedicated bucket) is a breaking rename deferred to v17.
Copy file name to clipboardExpand all lines: content/docs/data-modeling/objects.mdx
+15-12Lines changed: 15 additions & 12 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -217,7 +217,7 @@ indexes: [
217
217
| Property | Type | Description |
218
218
| :--- | :--- | :--- |
219
219
|`isSystem`|`boolean`| System object, protected from deletion (default: `false`) |
220
-
|`managedBy`|`enum`| Lifecycle bucket that sets the default CRUD affordances and write policy — `'platform'` (default), `'config'`, `'system'`, `'append-only'`, `'better-auth'`. See [Lifecycle bucket](#lifecycle-bucket-managedby) below. |
220
+
|`managedBy`|`enum`| Lifecycle bucket that sets the default CRUD affordances and write policy — `'platform'` (default), `'config'`, `'system'`, `'engine-owned'`, `'append-only'`, `'better-auth'`. See [Lifecycle bucket](#lifecycle-bucket-managedby) below. |
221
221
|`userActions`|`object`| Per-object override of the CRUD affordances the `managedBy` default implies — `{ create?, edit?, delete?, import?, exportCsv? }`. This is what makes a `system`/`append-only` object admin/user-writable. See [Lifecycle bucket](#lifecycle-bucket-managedby). |
222
222
|`sharingModel`|`enum`| Org-Wide Default record visibility (ADR-0055/0056/0090). Canonical four only: `'private'`, `'public_read'`, `'public_read_write'`, `'controlled_by_parent'` (detail visibility derived from its master). The legacy aliases (`'read'`, `'read_write'`, `'full'`) were removed from the enum (ADR-0090 D4) — authoring rejects them. Unset on a custom object resolves to `'private'` (ADR-0090 D1) |
223
223
|`ownership`|`enum`| Record-ownership model: `'user'` (default — injects the reassignable `owner_id` lookup, engaging owner-scoped RLS, "My" views and owner reports), `'org'`, or `'none'` (no per-record owner — Dataverse-style catalog / junction tables, skips `owner_id`). Distinct from the package `own`/`extend` contribution kind. |
@@ -235,20 +235,23 @@ bare bucket string.
235
235
| :--- | :--- |
236
236
|`platform`|**Default.** User-owned business data — full New / Import / Edit / Delete. |
237
237
|`config`| Admin-authored configuration — New / Edit / Delete, no CSV import. |
238
-
|`system`| Platform-defined schema. **Engine-owned by default**: a platform service owns the row lifecycle, generic CRUD is hidden, and the object is exposed `['get', 'list']` only. |
238
+
|`system`| Platform-defined schema holding **admin/user-writable data** (RBAC link tables, preferences, messaging config). Locked by default; each object opens its writes via `userActions`. |
239
+
|`engine-owned`| Runtime rows a platform service owns end to end — generic CRUD hidden, exposed `['get', 'list']` only, **no user writes ever**. |
|`better-auth`| Identity tables owned by the better-auth driver — generic user-context CRUD is suppressed; mutations flow through the auth API (sign-in, invite, reset). |
241
242
242
-
**Engine-owned vs. admin-writable `system` objects (ADR-0103).** The `system`
243
-
bucket covers two kinds of object. Most are *engine-owned* — jobs,
|**icon**|`string`| optional | Icon name (Lucide/Material) for UI representation |
103
103
|**isSystem**|`boolean`| optional | Is system object (protected from deletion; defaults its org-wide sharing to public when no sharingModel is set — plugin-sharing) |
0 commit comments