Skip to content

feat(spec): explicit engine-owned managedBy bucket (ADR-0103 addendum, #3343) - #3352

Merged
os-zhuang merged 1 commit into
mainfrom
feat/managedby-engine-owned-bucket
Jul 20, 2026
Merged

feat(spec): explicit engine-owned managedBy bucket (ADR-0103 addendum, #3343)#3352
os-zhuang merged 1 commit into
mainfrom
feat/managedby-engine-owned-bucket

Conversation

@os-zhuang

@os-zhuangos-zhuang commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Item #2 of the managedBy taxonomy tracking issue #3343 — the enum split ADR-0103 explicitly deferred ("revisitable later as a rename"), landed for v16 as an additive, self-documenting relabel.

Why now (the ADR-0103 D1 objections, resolved)

ADR-0103 chose userActions over a new enum value for two reasons, both now retired:

  1. Silent fully-editable fallthrough on deployed clients — neutralised by the server-side enforcement ADR-0103 itself added (the engine write guard, apiMethods reconciliation, /me/permissions clamp). An unknown bucket resolving to the platform default on an old client is now cosmetic — the write is rejected regardless of what the client renders. (Re-verified: a generic /data create on an engine-owned object returns 405.)
  2. Open-ended UI type across three mirrors — closed by objectui#2712; the ManagedByBucket union is now a single closed type, so a missed reference is a compile error.

Full rationale in the ADR-0103 addendum (in this diff).

What changed (additive — system is retained)

  • New enum value engine-owned with the same all-locked default affordance row as system. Joins ENGINE_OWNED_BUCKETS (guard) + GUARDED_WRITE_BUCKETS (clamp). The guard / reconcileManagedApiMethods / clamp mechanisms are unchanged — engine-owned is an explicit member of the set they already covered by resolved affordance.
  • 20 objects relabelled system → engine-owned — the ones the engine owns end to end with no write-opening userActions (metadata store, jobs, approval runtime rows, sharing rows, sys_automation_run, messaging delivery/receipt, secrets, settings). One-line, behaviour-identical each.
  • 8 admin/user-writable objects keep managedBy: 'system' (RBAC link tables, sys_user_preference, sys_approval_delegation, messaging config grids) — system now reads as "engine-managed schema, writable via userActions".

Not a behaviour/enforcement change

Resolved affordances, the guard verdict, the 405 reconciliation, and the permissions clamp are identical before and after — a self-documenting relabel. No data migration (managedBy is schema metadata), and no code branches on the 'system' literal (all enforcement keys off resolveCrudAffordances / bucket-set membership — verified by grep).

Tests / gates

  • New engine-owned coverage: system-write-guard.test (guard fires on the explicit bucket), fold-wildcard-superuser.test (/me/permissions clamp), object.test (affordance matrix parity + enum accepts the value). All existing affordance/guard tests green (spec 107, plugin-security 12, hono 10, registry 73, identity 15).
  • tsc --noEmit clean; generated references regenerated (check:docs / check:api-surface / check:spec-changes / check:upgrade-guide / check:skill-refs / check:react-blocks all green).
  • ADR-0103 addendum + objects.mdx updated.

Companion / sequencing

Paired with objectui#2739 (the ManagedByBucket union + badge). The vendored console is re-pinned before v16 GA; during any sync window an old console renders an engine-owned object editable but the server still 405s the write. Retiring the overloaded system (moving the 8 writable objects to a dedicated bucket) is a breaking rename deferred to v17.

🤖 Generated with Claude Code

…dendum, #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 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>
@vercel

vercelBot commented Jul 20, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
specErrorErrorJul 20, 2026 6:36am

Request Review

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation protocol:data tests tooling size/m labels Jul 20, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 9 package(s): @objectstack/metadata-core, @objectstack/platform-objects, @objectstack/plugin-approvals, @objectstack/plugin-auth, @objectstack/plugin-hono-server, @objectstack/plugin-security, @objectstack/plugin-sharing, packages/services, @objectstack/spec.

112 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx(via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx(via @objectstack/spec)
  • content/docs/ai/skills.mdx(via @objectstack/spec)
  • content/docs/api/client-sdk.mdx(via @objectstack/spec)
  • content/docs/api/environment-routing.mdx(via @objectstack/spec)
  • content/docs/api/error-catalog.mdx(via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/api/index.mdx(via @objectstack/spec)
  • content/docs/automation/approvals.mdx(via @objectstack/plugin-approvals, packages/spec)
  • content/docs/automation/flows.mdx(via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx(via packages/spec)
  • content/docs/automation/hooks.mdx(via @objectstack/spec)
  • content/docs/automation/index.mdx(via @objectstack/spec)
  • content/docs/automation/webhooks.mdx(via packages/services, @objectstack/spec)
  • content/docs/automation/workflows.mdx(via @objectstack/spec)
  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/index.mdx(via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx(via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx(via @objectstack/metadata-core, packages/spec)
  • content/docs/concepts/north-star.mdx(via packages/spec)
  • content/docs/data-modeling/analytics.mdx(via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx(via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx(via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx(via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx(via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx(via @objectstack/spec)
  • content/docs/data-modeling/index.mdx(via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx(via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx(via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx(via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx(via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx(via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx(via @objectstack/spec)
  • content/docs/deployment/production-readiness.mdx(via @objectstack/plugin-auth)
  • content/docs/deployment/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx(via @objectstack/spec)
  • content/docs/getting-started/cli.mdx(via @objectstack/plugin-auth, @objectstack/plugin-security, @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/getting-started/validating-metadata.mdx(via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx(via @objectstack/plugin-hono-server, @objectstack/spec)
  • content/docs/kernel/cluster.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx(via packages/spec)
  • content/docs/kernel/index.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/audit-service.mdx(via packages/services)
  • content/docs/kernel/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx(via packages/services, packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/settings-service.mdx(via packages/services)
  • content/docs/kernel/runtime-services/sharing-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/kernel/services-checklist.mdx(via @objectstack/plugin-auth, @objectstack/spec)
  • content/docs/permissions/access-recipes.mdx(via packages/plugins/plugin-security)
  • content/docs/permissions/authentication.mdx(via @objectstack/plugin-auth, @objectstack/plugin-hono-server)
  • content/docs/permissions/authorization.mdx(via @objectstack/plugin-security, packages/plugins/plugin-sharing, @objectstack/spec)
  • content/docs/permissions/explain.mdx(via @objectstack/plugin-security)
  • content/docs/permissions/permission-sets.mdx(via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx(via packages/plugins/plugin-security, packages/plugins/plugin-sharing, @objectstack/spec)
  • content/docs/permissions/positions.mdx(via @objectstack/spec)
  • content/docs/permissions/rls.mdx(via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx(via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/permissions/sso.mdx(via @objectstack/plugin-auth)
  • content/docs/plugins/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/plugins/development.mdx(via @objectstack/spec)
  • content/docs/plugins/index.mdx(via @objectstack/plugin-auth, @objectstack/plugin-hono-server, @objectstack/plugin-security, @objectstack/spec)
  • content/docs/plugins/packages.mdx(via @objectstack/platform-objects, @objectstack/plugin-approvals, @objectstack/plugin-auth, @objectstack/plugin-hono-server, @objectstack/plugin-security, @objectstack/plugin-sharing, packages/services, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/protocol/diagram.mdx(via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx(via packages/services, @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx(via packages/plugins/plugin-sharing, packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx(via @objectstack/plugin-approvals, @objectstack/plugin-auth, @objectstack/plugin-hono-server, @objectstack/plugin-security, @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v12.mdx(via @objectstack/metadata-core, @objectstack/spec)
  • content/docs/releases/v13.mdx(via @objectstack/spec)
  • content/docs/releases/v16.mdx(via @objectstack/spec)
  • content/docs/releases/v9.mdx(via @objectstack/plugin-approvals, @objectstack/plugin-auth, @objectstack/spec)
  • content/docs/ui/actions.mdx(via @objectstack/spec)
  • content/docs/ui/audience-based-interfaces.mdx(via packages/plugins/plugin-security)
  • content/docs/ui/create-vs-edit-form.mdx(via @objectstack/spec)
  • content/docs/ui/dashboards.mdx(via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/ui/forms.mdx(via @objectstack/spec)
  • content/docs/ui/index.mdx(via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx(via @objectstack/spec)
  • content/docs/ui/setup-app.mdx(via @objectstack/platform-objects, @objectstack/spec)
  • content/docs/ui/translations.mdx(via @objectstack/spec)
  • content/docs/ui/views.mdx(via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:datasize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@os-zhuang