Repository navigation
Epic: 11.0 major release — breaking-change batch + GA readiness #2364
Description
Activity
Version-cut mechanism in place → #2366. Found that the breaking service-ai removal (#2325,
feat!: open edition is MCP-only) was merged but unreleased with no changeset — the pending release would have leaked it as 10.4.0 (minor). #2366 adds the missing major changeset so the next release cuts 11.0.0 (the 73-package fixed group bumps together; all pending changes fold in). Low-key wording, no code change. This is the concrete trigger for 11.0; the A/B/C work items above can land into the same major.A3 started → #2369: removed the deprecated
http_request/http_call/webhookflow-node aliases (canonicalhttponly; ADR-0018 M3). spec 154 + service-automation 111 tests green, examples build clean. First mechanical breaking-cleanup landing into 11.0.A3 progress (alias removals, both verified): #2369 flow http aliases ✅, #2372 client-react useQuery aliases ✅.
Full A-scoping finding: most remaining A items cascade into examples/features → each needs its own PR:
- A1 PolicySchema ([P0][security] PolicySchema is 100% dead — enforce or remove #1882): NOT dead in practice — app-crm + app-showcase define/pass
policies:+stack.policiesfield; removal ⇒ migrate both examples. - A1 role.parent ([P0][security] Role parent dead — manager-rollup unimplemented #1886): removal guts RoleGraphService + role_and_subordinates recipient (ADR-0056 D6) → product decision (remove vs implement walk).
- A2 dead props: real dead set smaller than listed (currencyConfig/action.disabled/agent.access/skill.* are LIVE). Dead: field{vectorConfig,fileAttachmentConfig,dependencies,caseSensitive}, object{versioning,partitioning,softDelete,recordName,keyPrefix,tags,abstract,isSystem,active,enable.*,search,defaultDetailForm}, action type:'form', agent{tenantId,planning.strategy/allowReplan}, dataset.measures.certified.
- A3 IUIService: couples to CoreServiceName 'ui' + plugin-dev.
- A3 HttpDispatcher: 245 refs/7 adapters → staged.
- A3 IDataEngine + env vars: deprecation says v12 → not for 11.0.
- ADR-0041 trigger pkgs: already gone.
- A1 PolicySchema ([P0][security] PolicySchema is 100% dead — enforce or remove #1882): NOT dead in practice — app-crm + app-showcase define/pass
A-class session-2: 3 verified PRs landed — #2369 (flow http aliases), #2372 (client-react useQuery aliases), #2374 (IUIService). Decisions: role.parent→remove feature, IDataEngine+env→remove in 11.0. Remaining queue: PolicySchema #1882, role.parent #1886, A2 dead props, IDataEngine, env vars, HttpDispatcher — each a cascading PR; continuing.
A-class remaining queue — one issue each
Done (PRs): #2369 (flow http aliases), #2372 (client-react useQuery aliases), #2374 (IUIService contract).
Remaining — tracked issues (execution order: low→high risk):
- [11.0][A3] Remove deprecated IDataEngine interface (use IDataDriver) #2378 — IDataEngine → IDataDriver (271 typed refs; low)
- [11.0][A3] Remove legacy environment-variable aliases (OS_MULTI_TENANT, …) #2379 — legacy env-var aliases (OS_MULTI_TENANT …; low)
- [11.0][A2] Remove dead author-facing metadata properties (ADR-0049 enforce-or-remove) #2377 — A2 dead metadata properties (field/object/action/agent/dataset + ledger; low-med, may split)
- [P0][security] PolicySchema is 100% dead — enforce or remove #1882 — PolicySchema removal (+ migrate app-crm/app-showcase, drop stack.policies; med)
- [P0][security] Role parent dead — manager-rollup unimplemented #1886 — role.parent removal = remove role-hierarchy feature (plugin-sharing + tests + ADR-0056 D6; med-high)
- [11.0][A3] Remove deprecated HttpDispatcher class (staged; use createDispatcherPlugin) #2380 — HttpDispatcher class removal (245 refs / 7 adapters; high, staged)
Every PR also:
gen:api-surfacesnapshot regen + (if examples touched) example build verify + major changeset.#2379 done → PR #2383 (env aliases). Removed ObjectStack's own renames (OS_MULTI_TENANT, OBJECTSTACK_METADATA_WRITABLE, OS_AUTH_BASE_URL/AUTH_BASE_URL); kept ecosystem standards (DATABASE_URL, AUTH_SECRET, etc.) as silent. Local: cli 436 / objectql 718 / driver-sql 234 / plugin-auth 175 / mcp 53 / hono 40 / types 7 green, api-surface unchanged.
Adapter trim landed (#2391, merged): removed 6 non-Hono adapters + plugin-msw → Hono-only open edition; resolves #2380 (HttpDispatcher blast radius collapsed). Verified ../objectui has no real dependency on the removed packages (only a stale comment in one e2e spec). Docs-accuracy pass tracked in #2392 — to run after the remaining A-items. A-batch merged so far: #2369/#2372/#2374/#2379/#2378/#1882/#2391. Remaining: #1886 role.parent, #2377 A2 dead props (deferred), then #2392 docs.
Goal: define and ship the next major version (11.0) as a deliberate, batched breaking-change + GA-readiness release.
Why this epic exists
Fixed-group packages are at 10.3.0; the 43 pending changesets are all minor/patch (0 major), so today's release would be 10.4.0. Majors in this project are triggered by breaking changes (e.g. 10.0.0 = ADR-0057
sys_department→sys_business_unit). Nothing currently forces 11.0 — it is a choice to batch the breaking cleanups + close GA gaps. This epic is the cut list. Each breaking item should ship with an additive migration (spec sync /os migrate, per #2186).Status legend: ☐ todo · ◐ partial · ✅ done (verify & close)
A. Breaking batch — the "definition of 11.0" (core)
Each of these removes or changes an authored/public contract → belongs in a major. Pair each with a migration.
A1. Security "enforce-or-remove" (ADR-0049)
PolicySchemais 100% dead. Remove from spec (no runtime consumer;plugin-authhardcodes session/password). Breaking (apps authoring Policy lose a no-op). Deprecation note + migration. (Triaged: STILL-DEAD.)role.parentenforcement dead. Either implement manager-rollup hierarchy walk inplugin-sharingteam-graph.tsor removerole.parentand point hierarchy atsys_business_unit. Breaking if removed. (Triaged: authoring-live, enforcement-dead.)permission.allow{Transfer,Restore,Purge}. Interim is OK (fail-closed gate exists, ops don't). Decide for 11.0: implement the ops + enforce (additive, non-breaking) or formally keep[experimental]. (Triaged: PARTIAL — not a blocker.)A2. Dead spec-surface removal (liveness ledger — ADR-0049)
currencyConfig,vectorConfig,encryptionConfig,maskingRule,cached,dataQuality,fileAttachmentConfig(verify each), + naming-drift props (~39 dead of 73).apiEnabled(unenforced).action.disabled(CEL ignored),action.type:'form'/ shortcut /bulkEnabled;agent.access/permissions/visibility(chat route hardcodes);skill.triggerPhrases/skill.permissions;dataset.measures.certified.agent.autonomy,tool.inputSchema→ implement or mark deprecated-for-removal.A3. Deprecated alias / API removals (verified still present)
http_request/http_call/webhook→ canonicalhttp(packages/spec/src/automation/flow.zod.ts:33); alignFlowNodeActionenum with the live registry.plugin-trigger-record-change/plugin-trigger-schedule(new@objectstack/trigger-*already shipped).select/filters/sort/top/skip→fields/where/orderBy/limit/offset.HttpDispatcherclass (replaced bycreateDispatcherPlugin()),UIServiceSchema,IDataEngine(→IDataDriver), legacy env-var aliases.plugin-devstub still annotated "removed in v4.0.0" (we're at v10).B. GA functional gaps (triaged — mostly objectui/cloud)
name#1295 — lookup cell display field:pickRecordDisplayNamesupportspreferredFieldbutLookupCellRenderercall sites never pass the target'sdisplayNameField. OPEN — small fix (objectui).LayoutDispatcherportal routing + auth middleware end-to-end. ◐ verify, then close. Incl. [portal] record detail URL scheme + share-link 协议(GAP-7 of #1294) #1337 (detail URL / share-link), [portal] action 完成后导航策略(onComplete + portal 级默认)(GAP-8 of #1294) #1338 (onComplete nav).filefield has no upload UI; noattachment_listtype — attachments end-to-end blocked #1296 —filefield upload: file type +FileFieldwidget (drag-drop/camera/progress) shipped. ✅ verifyattachment_listneed, then close.C. Unfinished ADRs
(namespace,type,name)identity + physical-name derivation): prevents silent table-name collisions across co-installed packages. Identity change is itself breaking → good 11.0 fit.Deferred by design (not blockers): ADR-0039 Track B, ADR-0010 NL→Flow, ADR-0031 BPMN, ADR-0026 client-UI plugins.
D. Release mechanics & quality (healthy)
--auto(per past tag-race).xfailare deliberate watchdogs.Cut checklist (Definition of Done for 11.0)
filefield has no upload UI; noattachment_listtype — attachments end-to-end blocked #1296) closed.