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-zhuang os-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

vercel Bot commented Jul 20, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Error Error Jul 20, 2026 6:36am

Request Review

@github-actions github-actions Bot 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 free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:data size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant