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
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@objectstack/cli@14.7.0
Minor Changes
824a395: Tenancy mode as a first-class capability + a single owner for the user→membership
lifecycle (ADR-0093, Phases 1–3).
Tenancy service (@objectstack/types, @objectstack/plugin-auth). plugin-auth
registers a tenancy service — the single source of truth for tenancy mode
(mode, isolationActive, requested, degraded, defaultOrgId()). It derives isolationActive from the presence of the org-scoping service, so the
enterprise @objectstack/organizations package lights it up with no change.
SecurityPlugin's RLS-strip gate and /auth/config (features.multiOrgEnabled,
new features.degradedTenancy) now consume it instead of re-deriving the fact.
Fail-fast on degraded tenancy (@objectstack/cli, ADR-0093 D5). OS_MULTI_ORG_ENABLED=true without a working @objectstack/organizations now refuses to boot — a deployment that requested tenant isolation must not serve
traffic without it (tenant RLS would be silently stripped). Escape hatch: OS_ALLOW_DEGRADED_TENANCY=1 boots in an explicitly branded degraded state
(features.degradedTenancy). This may halt upgrades for deployments that were
silently degraded — intentionally; install the enterprise package or set the
escape hatch.
Membership reconciler (@objectstack/plugin-auth, ADR-0093 D1–D3, D6). A
single reconciler composed into better-auth's user.create.after hook owns the
"every new user gets a membership" invariant across all creation paths (signup,
admin create-user, import, SSO JIT). It yields to any existing membership (host
hooks win), honors a new membershipPolicy: 'auto' | 'invite-only' auth option
(default auto), and binds only to an unambiguous target org (single-org default;
multi-org binds nothing). A bounded, idempotent kernel:ready backfill covers
pre-existing member-less users in single-org/auto deployments
(OS_SKIP_MEMBERSHIP_BACKFILL=1 to opt out). The endpoint-level create-user bind
from fix(auth): bind admin-created users to the sole organization #2882 now delegates to this shared reconciler.
New env vars: OS_ALLOW_DEGRADED_TENANCY, OS_SKIP_MEMBERSHIP_BACKFILL. New docs:
Deployment → Tenancy Modes & Membership.
956208e: chore(console): refresh vendored @object-ui/console SPA to objectui@95835581
Bumps the pinned .objectui-sha from 2f3ab55a to 95835581 (11 commits) and rebuilds the prebuilt Console SPA shipped in @objectstack/console.
Notable upstream changes pulled in:
feat(console-ai): ChatDock — right-docked AI rail, now DEFAULT ON with the flag as a kill-switch (ADR-0057 P3 go-live), FAB launcher, /ai maximized dock + Studio right-dock reflow, bind-on-create conversations
feat(plugin-gantt): 对象列表视图:新增「导出」+ 改进「导入」的校验与数据完整性 #2460 interactive batches — row single-click locate / double-click detail, day-snap drag, layout with tray + filters, mobile QR code, lock hints
feat(plugin-gantt): summaryExtent 'self' + tooltip fallback formatting when no schema
9f03fdd: Console (objectui) refreshed to 2f3ab55adcbd. Frontend changes in this range:
Create plenty-cities-worry.md
objectui range: a44e7b6b28c6...2f3ab55adcbd
@objectstack/plugin-auth@14.7.0
Minor Changes
824a395: Tenancy mode as a first-class capability + a single owner for the user→membership
lifecycle (ADR-0093, Phases 1–3).
Tenancy service (@objectstack/types, @objectstack/plugin-auth). plugin-auth
registers a tenancy service — the single source of truth for tenancy mode
(mode, isolationActive, requested, degraded, defaultOrgId()). It derives isolationActive from the presence of the org-scoping service, so the
enterprise @objectstack/organizations package lights it up with no change.
SecurityPlugin's RLS-strip gate and /auth/config (features.multiOrgEnabled,
new features.degradedTenancy) now consume it instead of re-deriving the fact.
Fail-fast on degraded tenancy (@objectstack/cli, ADR-0093 D5). OS_MULTI_ORG_ENABLED=true without a working @objectstack/organizations now refuses to boot — a deployment that requested tenant isolation must not serve
traffic without it (tenant RLS would be silently stripped). Escape hatch: OS_ALLOW_DEGRADED_TENANCY=1 boots in an explicitly branded degraded state
(features.degradedTenancy). This may halt upgrades for deployments that were
silently degraded — intentionally; install the enterprise package or set the
escape hatch.
Membership reconciler (@objectstack/plugin-auth, ADR-0093 D1–D3, D6). A
single reconciler composed into better-auth's user.create.after hook owns the
"every new user gets a membership" invariant across all creation paths (signup,
admin create-user, import, SSO JIT). It yields to any existing membership (host
hooks win), honors a new membershipPolicy: 'auto' | 'invite-only' auth option
(default auto), and binds only to an unambiguous target org (single-org default;
multi-org binds nothing). A bounded, idempotent kernel:ready backfill covers
pre-existing member-less users in single-org/auto deployments
(OS_SKIP_MEMBERSHIP_BACKFILL=1 to opt out). The endpoint-level create-user bind
from fix(auth): bind admin-created users to the sole organization #2882 now delegates to this shared reconciler.
New env vars: OS_ALLOW_DEGRADED_TENANCY, OS_SKIP_MEMBERSHIP_BACKFILL. New docs:
Deployment → Tenancy Modes & Membership.
Patch Changes
da5e686: fix(auth): create-user membership bind is tenancy-mode-aware; export the ADR-0093 host API
Multi-org runtime verification (real @objectstack/organizations linked into a
live stack) caught a gap in the feat(auth): tenancy service + membership reconciler + degraded-tenancy fail-fast (ADR-0093 Phases 1–3) #2884 endpoint bind: it resolved its target org
via resolveDefaultOrgId (slug='default' first), so in a multi-org deployment —
where the bootstrap default org coexists with real tenant orgs — /admin/create-user
would have bound the new user into the default org, violating ADR-0093 D3
("the framework never guesses in multi mode"). The bind now consults the tenancy service (getTenancy on the endpoint deps): single mode → default org,
multi mode → no bind. Verified live: multi-org create-user and sign-up both leave
the new user member-less (invites / host hooks own membership there); single-org
behavior unchanged.
Also exports reconcile-membership and tenancy-service from the package index
as the public host API, and adds dogfood integration tests driving the REAL
better-auth pipeline: sign-up membership via the reconciler hook alone, backfill
bind + idempotency, invite-only refusal, and the yield-to-host-membership rule.
d6a72eb: Field metadata gains a widget override (FieldSchema.widget) — names a
registered form component (resolved as field:<widget>) to render a field with,
overriding the default widget derived from type and degrading back to it when
unregistered. The generic object form already honored this hint (objectui ObjectForm/form.tsx resolve widget || type); this promotes it to a
first-class, liveness-classified authoring property so any config object can ask
for a picker instead of a raw input.
sys_sharing_rule uses it so the Setup New Sharing Rule form is
pick-not-type instead of asking admins to hand-enter machine data:
object_name → object-ref (choose a registered object by name)
criteria_json → filter-condition (visual criteria builder scoped to the
chosen object's fields; dependsOn: object_name)
Also removes the queue recipient type: it is declared-but-unenforced (the
evaluator expands no users for it), so offering it authored a silently-inert rule
(ADR-0078). i18n bundles regenerated. Requires the matching objectui widgets; the
fields degrade to their type renderer where those aren't loaded.
f344ee1: Webhook form: pick, don't type. The sys_webhook create/edit form made admins
hand-type machine data in three fields; they're now proper controls (extends the sys_sharing_rule pass):
method — free text → select (GET/POST/PUT/PATCH/DELETE). Option
values are lowercased by Field.select; the auto-enqueuer now upper-cases the
resolved method before delivery, so legacy 'POST' rows and the new lowercase
values both normalise to a canonical HTTP method.
triggers — hand-typed comma-separated string → multi-select
(create/update/delete/undelete/api). Stored as an array; the
auto-enqueuer's parseRow now accepts array, JSON-encoded-array-string, and
the legacy comma-separated forms, so existing subscriptions keep firing.
object_name — free text → the object-ref object picker (same widget as sys_sharing_rule; degrades to a text input where the widget isn't loaded).
Backward compatible: no data migration required. Added tests covering the array
and JSON-string trigger shapes.
d6a72eb: Field metadata gains a widget override (FieldSchema.widget) — names a
registered form component (resolved as field:<widget>) to render a field with,
overriding the default widget derived from type and degrading back to it when
unregistered. The generic object form already honored this hint (objectui ObjectForm/form.tsx resolve widget || type); this promotes it to a
first-class, liveness-classified authoring property so any config object can ask
for a picker instead of a raw input.
sys_sharing_rule uses it so the Setup New Sharing Rule form is
pick-not-type instead of asking admins to hand-enter machine data:
object_name → object-ref (choose a registered object by name)
criteria_json → filter-condition (visual criteria builder scoped to the
chosen object's fields; dependsOn: object_name)
Also removes the queue recipient type: it is declared-but-unenforced (the
evaluator expands no users for it), so offering it authored a silently-inert rule
(ADR-0078). i18n bundles regenerated. Requires the matching objectui widgets; the
fields degrade to their type renderer where those aren't loaded.
@objectstack/types@14.7.0
Minor Changes
824a395: Tenancy mode as a first-class capability + a single owner for the user→membership
lifecycle (ADR-0093, Phases 1–3).
Tenancy service (@objectstack/types, @objectstack/plugin-auth). plugin-auth
registers a tenancy service — the single source of truth for tenancy mode
(mode, isolationActive, requested, degraded, defaultOrgId()). It derives isolationActive from the presence of the org-scoping service, so the
enterprise @objectstack/organizations package lights it up with no change.
SecurityPlugin's RLS-strip gate and /auth/config (features.multiOrgEnabled,
new features.degradedTenancy) now consume it instead of re-deriving the fact.
Fail-fast on degraded tenancy (@objectstack/cli, ADR-0093 D5). OS_MULTI_ORG_ENABLED=true without a working @objectstack/organizations now refuses to boot — a deployment that requested tenant isolation must not serve
traffic without it (tenant RLS would be silently stripped). Escape hatch: OS_ALLOW_DEGRADED_TENANCY=1 boots in an explicitly branded degraded state
(features.degradedTenancy). This may halt upgrades for deployments that were
silently degraded — intentionally; install the enterprise package or set the
escape hatch.
Membership reconciler (@objectstack/plugin-auth, ADR-0093 D1–D3, D6). A
single reconciler composed into better-auth's user.create.after hook owns the
"every new user gets a membership" invariant across all creation paths (signup,
admin create-user, import, SSO JIT). It yields to any existing membership (host
hooks win), honors a new membershipPolicy: 'auto' | 'invite-only' auth option
(default auto), and binds only to an unambiguous target org (single-org default;
multi-org binds nothing). A bounded, idempotent kernel:ready backfill covers
pre-existing member-less users in single-org/auto deployments
(OS_SKIP_MEMBERSHIP_BACKFILL=1 to opt out). The endpoint-level create-user bind
from fix(auth): bind admin-created users to the sole organization #2882 now delegates to this shared reconciler.
New env vars: OS_ALLOW_DEGRADED_TENANCY, OS_SKIP_MEMBERSHIP_BACKFILL. New docs:
Deployment → Tenancy Modes & Membership.
824a395: Tenancy mode as a first-class capability + a single owner for the user→membership
lifecycle (ADR-0093, Phases 1–3).
Tenancy service (@objectstack/types, @objectstack/plugin-auth). plugin-auth
registers a tenancy service — the single source of truth for tenancy mode
(mode, isolationActive, requested, degraded, defaultOrgId()). It derives isolationActive from the presence of the org-scoping service, so the
enterprise @objectstack/organizations package lights it up with no change.
SecurityPlugin's RLS-strip gate and /auth/config (features.multiOrgEnabled,
new features.degradedTenancy) now consume it instead of re-deriving the fact.
Fail-fast on degraded tenancy (@objectstack/cli, ADR-0093 D5). OS_MULTI_ORG_ENABLED=true without a working @objectstack/organizations now refuses to boot — a deployment that requested tenant isolation must not serve
traffic without it (tenant RLS would be silently stripped). Escape hatch: OS_ALLOW_DEGRADED_TENANCY=1 boots in an explicitly branded degraded state
(features.degradedTenancy). This may halt upgrades for deployments that were
silently degraded — intentionally; install the enterprise package or set the
escape hatch.
Membership reconciler (@objectstack/plugin-auth, ADR-0093 D1–D3, D6). A
single reconciler composed into better-auth's user.create.after hook owns the
"every new user gets a membership" invariant across all creation paths (signup,
admin create-user, import, SSO JIT). It yields to any existing membership (host
hooks win), honors a new membershipPolicy: 'auto' | 'invite-only' auth option
(default auto), and binds only to an unambiguous target org (single-org default;
multi-org binds nothing). A bounded, idempotent kernel:ready backfill covers
pre-existing member-less users in single-org/auto deployments
(OS_SKIP_MEMBERSHIP_BACKFILL=1 to opt out). The endpoint-level create-user bind
from fix(auth): bind admin-created users to the sole organization #2882 now delegates to this shared reconciler.
New env vars: OS_ALLOW_DEGRADED_TENANCY, OS_SKIP_MEMBERSHIP_BACKFILL. New docs:
Deployment → Tenancy Modes & Membership.
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@objectstack/cli@14.7.0
Minor Changes
824a395: Tenancy mode as a first-class capability + a single owner for the user→membership
lifecycle (ADR-0093, Phases 1–3).
Tenancy service (
@objectstack/types,@objectstack/plugin-auth). plugin-authregisters a
tenancyservice — the single source of truth for tenancy mode(
mode,isolationActive,requested,degraded,defaultOrgId()). It derivesisolationActivefrom the presence of theorg-scopingservice, so theenterprise
@objectstack/organizationspackage lights it up with no change.SecurityPlugin's RLS-strip gate and
/auth/config(features.multiOrgEnabled,new
features.degradedTenancy) now consume it instead of re-deriving the fact.Fail-fast on degraded tenancy (
@objectstack/cli, ADR-0093 D5).OS_MULTI_ORG_ENABLED=truewithout a working@objectstack/organizationsnowrefuses to boot — a deployment that requested tenant isolation must not serve
traffic without it (tenant RLS would be silently stripped). Escape hatch:
OS_ALLOW_DEGRADED_TENANCY=1boots in an explicitly branded degraded state(
features.degradedTenancy). This may halt upgrades for deployments that weresilently degraded — intentionally; install the enterprise package or set the
escape hatch.
Membership reconciler (
@objectstack/plugin-auth, ADR-0093 D1–D3, D6). Asingle reconciler composed into better-auth's
user.create.afterhook owns the"every new user gets a membership" invariant across all creation paths (signup,
admin create-user, import, SSO JIT). It yields to any existing membership (host
hooks win), honors a new
membershipPolicy: 'auto' | 'invite-only'auth option(default
auto), and binds only to an unambiguous target org (single-org default;multi-org binds nothing). A bounded, idempotent
kernel:readybackfill coverspre-existing member-less users in single-org/auto deployments
(
OS_SKIP_MEMBERSHIP_BACKFILL=1to opt out). The endpoint-level create-user bindfrom fix(auth): bind admin-created users to the sole organization #2882 now delegates to this shared reconciler.
New env vars:
OS_ALLOW_DEGRADED_TENANCY,OS_SKIP_MEMBERSHIP_BACKFILL. New docs:Deployment → Tenancy Modes & Membership.
Patch Changes
@objectstack/console@14.7.0
Minor Changes
f71339c: Console (objectui) refreshed to
6a741605b1e0. Frontend changes in this range:objectui range:
e7bebe929349...6a741605b1e035f6c61: Console (objectui) refreshed to
a44e7b6b28c6. Frontend changes in this range:objectui range:
6a741605b1e0...a44e7b6b28c6956208e: chore(console): refresh vendored
@object-ui/consoleSPA to objectui@95835581Bumps the pinned
.objectui-shafrom2f3ab55ato95835581(11 commits) and rebuilds the prebuilt Console SPA shipped in@objectstack/console.Notable upstream changes pulled in:
/aimaximized dock + Studio right-dock reflow, bind-on-create conversationsPatch Changes
9f03fdd: Console (objectui) refreshed to
2f3ab55adcbd. Frontend changes in this range:objectui range:
a44e7b6b28c6...2f3ab55adcbd@objectstack/plugin-auth@14.7.0
Minor Changes
824a395: Tenancy mode as a first-class capability + a single owner for the user→membership
lifecycle (ADR-0093, Phases 1–3).
Tenancy service (
@objectstack/types,@objectstack/plugin-auth). plugin-authregisters a
tenancyservice — the single source of truth for tenancy mode(
mode,isolationActive,requested,degraded,defaultOrgId()). It derivesisolationActivefrom the presence of theorg-scopingservice, so theenterprise
@objectstack/organizationspackage lights it up with no change.SecurityPlugin's RLS-strip gate and
/auth/config(features.multiOrgEnabled,new
features.degradedTenancy) now consume it instead of re-deriving the fact.Fail-fast on degraded tenancy (
@objectstack/cli, ADR-0093 D5).OS_MULTI_ORG_ENABLED=truewithout a working@objectstack/organizationsnowrefuses to boot — a deployment that requested tenant isolation must not serve
traffic without it (tenant RLS would be silently stripped). Escape hatch:
OS_ALLOW_DEGRADED_TENANCY=1boots in an explicitly branded degraded state(
features.degradedTenancy). This may halt upgrades for deployments that weresilently degraded — intentionally; install the enterprise package or set the
escape hatch.
Membership reconciler (
@objectstack/plugin-auth, ADR-0093 D1–D3, D6). Asingle reconciler composed into better-auth's
user.create.afterhook owns the"every new user gets a membership" invariant across all creation paths (signup,
admin create-user, import, SSO JIT). It yields to any existing membership (host
hooks win), honors a new
membershipPolicy: 'auto' | 'invite-only'auth option(default
auto), and binds only to an unambiguous target org (single-org default;multi-org binds nothing). A bounded, idempotent
kernel:readybackfill coverspre-existing member-less users in single-org/auto deployments
(
OS_SKIP_MEMBERSHIP_BACKFILL=1to opt out). The endpoint-level create-user bindfrom fix(auth): bind admin-created users to the sole organization #2882 now delegates to this shared reconciler.
New env vars:
OS_ALLOW_DEGRADED_TENANCY,OS_SKIP_MEMBERSHIP_BACKFILL. New docs:Deployment → Tenancy Modes & Membership.
Patch Changes
da5e686: fix(auth): create-user membership bind is tenancy-mode-aware; export the ADR-0093 host API
Multi-org runtime verification (real
@objectstack/organizationslinked into alive stack) caught a gap in the feat(auth): tenancy service + membership reconciler + degraded-tenancy fail-fast (ADR-0093 Phases 1–3) #2884 endpoint bind: it resolved its target org
via
resolveDefaultOrgId(slug='default' first), so in a multi-org deployment —where the bootstrap default org coexists with real tenant orgs —
/admin/create-userwould have bound the new user into the default org, violating ADR-0093 D3
("the framework never guesses in multi mode"). The bind now consults the
tenancyservice (getTenancyon the endpoint deps): single mode → default org,multi mode → no bind. Verified live: multi-org create-user and sign-up both leave
the new user member-less (invites / host hooks own membership there); single-org
behavior unchanged.
Also exports
reconcile-membershipandtenancy-servicefrom the package indexas the public host API, and adds dogfood integration tests driving the REAL
better-auth pipeline: sign-up membership via the reconciler hook alone, backfill
bind + idempotency, invite-only refusal, and the yield-to-host-membership rule.
Updated dependencies [d6a72eb]
Updated dependencies [824a395]
@objectstack/plugin-sharing@14.7.0
Minor Changes
d6a72eb: Field metadata gains a
widgetoverride (FieldSchema.widget) — names aregistered form component (resolved as
field:<widget>) to render a field with,overriding the default widget derived from
typeand degrading back to it whenunregistered. The generic object form already honored this hint (objectui
ObjectForm/form.tsxresolvewidget || type); this promotes it to afirst-class, liveness-classified authoring property so any config object can ask
for a picker instead of a raw input.
sys_sharing_ruleuses it so the Setup New Sharing Rule form ispick-not-type instead of asking admins to hand-enter machine data:
object_name→object-ref(choose a registered object by name)criteria_json→filter-condition(visual criteria builder scoped to thechosen object's fields;
dependsOn: object_name)recipient_id→recipient-picker(record picker whose target followsrecipient_type;dependsOn: recipient_type)Also removes the
queuerecipient type: it is declared-but-unenforced (theevaluator expands no users for it), so offering it authored a silently-inert rule
(ADR-0078). i18n bundles regenerated. Requires the matching objectui widgets; the
fields degrade to their
typerenderer where those aren't loaded.Patch Changes
@objectstack/plugin-webhooks@14.7.0
Minor Changes
f344ee1: Webhook form: pick, don't type. The
sys_webhookcreate/edit form made adminshand-type machine data in three fields; they're now proper controls (extends the
sys_sharing_rulepass):method— free text → select (GET/POST/PUT/PATCH/DELETE). Optionvalues are lowercased by
Field.select; the auto-enqueuer now upper-cases theresolved method before delivery, so legacy
'POST'rows and the new lowercasevalues both normalise to a canonical HTTP method.
triggers— hand-typed comma-separated string → multi-select(
create/update/delete/undelete/api). Stored as an array; theauto-enqueuer's
parseRownow accepts array, JSON-encoded-array-string, andthe legacy comma-separated forms, so existing subscriptions keep firing.
object_name— free text → theobject-refobject picker (same widget assys_sharing_rule; degrades to a text input where the widget isn't loaded).Backward compatible: no data migration required. Added tests covering the array
and JSON-string trigger shapes.
Patch Changes
@objectstack/spec@14.7.0
Minor Changes
d6a72eb: Field metadata gains a
widgetoverride (FieldSchema.widget) — names aregistered form component (resolved as
field:<widget>) to render a field with,overriding the default widget derived from
typeand degrading back to it whenunregistered. The generic object form already honored this hint (objectui
ObjectForm/form.tsxresolvewidget || type); this promotes it to afirst-class, liveness-classified authoring property so any config object can ask
for a picker instead of a raw input.
sys_sharing_ruleuses it so the Setup New Sharing Rule form ispick-not-type instead of asking admins to hand-enter machine data:
object_name→object-ref(choose a registered object by name)criteria_json→filter-condition(visual criteria builder scoped to thechosen object's fields;
dependsOn: object_name)recipient_id→recipient-picker(record picker whose target followsrecipient_type;dependsOn: recipient_type)Also removes the
queuerecipient type: it is declared-but-unenforced (theevaluator expands no users for it), so offering it authored a silently-inert rule
(ADR-0078). i18n bundles regenerated. Requires the matching objectui widgets; the
fields degrade to their
typerenderer where those aren't loaded.@objectstack/types@14.7.0
Minor Changes
824a395: Tenancy mode as a first-class capability + a single owner for the user→membership
lifecycle (ADR-0093, Phases 1–3).
Tenancy service (
@objectstack/types,@objectstack/plugin-auth). plugin-authregisters a
tenancyservice — the single source of truth for tenancy mode(
mode,isolationActive,requested,degraded,defaultOrgId()). It derivesisolationActivefrom the presence of theorg-scopingservice, so theenterprise
@objectstack/organizationspackage lights it up with no change.SecurityPlugin's RLS-strip gate and
/auth/config(features.multiOrgEnabled,new
features.degradedTenancy) now consume it instead of re-deriving the fact.Fail-fast on degraded tenancy (
@objectstack/cli, ADR-0093 D5).OS_MULTI_ORG_ENABLED=truewithout a working@objectstack/organizationsnowrefuses to boot — a deployment that requested tenant isolation must not serve
traffic without it (tenant RLS would be silently stripped). Escape hatch:
OS_ALLOW_DEGRADED_TENANCY=1boots in an explicitly branded degraded state(
features.degradedTenancy). This may halt upgrades for deployments that weresilently degraded — intentionally; install the enterprise package or set the
escape hatch.
Membership reconciler (
@objectstack/plugin-auth, ADR-0093 D1–D3, D6). Asingle reconciler composed into better-auth's
user.create.afterhook owns the"every new user gets a membership" invariant across all creation paths (signup,
admin create-user, import, SSO JIT). It yields to any existing membership (host
hooks win), honors a new
membershipPolicy: 'auto' | 'invite-only'auth option(default
auto), and binds only to an unambiguous target org (single-org default;multi-org binds nothing). A bounded, idempotent
kernel:readybackfill coverspre-existing member-less users in single-org/auto deployments
(
OS_SKIP_MEMBERSHIP_BACKFILL=1to opt out). The endpoint-level create-user bindfrom fix(auth): bind admin-created users to the sole organization #2882 now delegates to this shared reconciler.
New env vars:
OS_ALLOW_DEGRADED_TENANCY,OS_SKIP_MEMBERSHIP_BACKFILL. New docs:Deployment → Tenancy Modes & Membership.
Patch Changes
@objectstack/hono@14.7.0
Patch Changes
@objectstack/account@14.7.0
Patch Changes
@objectstack/setup@14.7.0
Patch Changes
@objectstack/studio@14.7.0
Patch Changes
@objectstack/client@14.7.0
Patch Changes
@objectstack/client-react@14.7.0
Patch Changes
@objectstack/cloud-connection@14.7.0
Patch Changes
@objectstack/connector-mcp@14.7.0
Patch Changes
@objectstack/connector-openapi@14.7.0
Patch Changes
@objectstack/connector-rest@14.7.0
Patch Changes
@objectstack/connector-slack@14.7.0
Patch Changes
@objectstack/core@14.7.0
Patch Changes
@objectstack/formula@14.7.0
Patch Changes
@objectstack/lint@14.7.0
Patch Changes
@objectstack/mcp@14.7.0
Patch Changes
@objectstack/metadata@14.7.0
Patch Changes
@objectstack/metadata-core@14.7.0
Patch Changes
@objectstack/metadata-fs@14.7.0
Patch Changes
@objectstack/metadata-protocol@14.7.0
Patch Changes
@objectstack/objectql@14.7.0
Patch Changes
@objectstack/observability@14.7.0
Patch Changes
@objectstack/platform-objects@14.7.0
Patch Changes
@objectstack/driver-memory@14.7.0
Patch Changes
@objectstack/driver-mongodb@14.7.0
Patch Changes
@objectstack/driver-sql@14.7.0
Patch Changes
@objectstack/driver-sqlite-wasm@14.7.0
Patch Changes
@objectstack/embedder-openai@14.7.0
Patch Changes
@objectstack/knowledge-memory@14.7.0
Patch Changes
@objectstack/knowledge-ragflow@14.7.0
Patch Changes
@objectstack/plugin-approvals@14.7.0
Patch Changes
@objectstack/plugin-audit@14.7.0
Patch Changes
@objectstack/plugin-dev@14.7.0
Patch Changes
@objectstack/plugin-email@14.7.0
Patch Changes
@objectstack/plugin-hono-server@14.7.0
Patch Changes
@objectstack/plugin-reports@14.7.0
Patch Changes
@objectstack/plugin-security@14.7.0
Patch Changes
824a395: Tenancy mode as a first-class capability + a single owner for the user→membership
lifecycle (ADR-0093, Phases 1–3).
Tenancy service (
@objectstack/types,@objectstack/plugin-auth). plugin-authregisters a
tenancyservice — the single source of truth for tenancy mode(
mode,isolationActive,requested,degraded,defaultOrgId()). It derivesisolationActivefrom the presence of theorg-scopingservice, so theenterprise
@objectstack/organizationspackage lights it up with no change.SecurityPlugin's RLS-strip gate and
/auth/config(features.multiOrgEnabled,new
features.degradedTenancy) now consume it instead of re-deriving the fact.Fail-fast on degraded tenancy (
@objectstack/cli, ADR-0093 D5).OS_MULTI_ORG_ENABLED=truewithout a working@objectstack/organizationsnowrefuses to boot — a deployment that requested tenant isolation must not serve
traffic without it (tenant RLS would be silently stripped). Escape hatch:
OS_ALLOW_DEGRADED_TENANCY=1boots in an explicitly branded degraded state(
features.degradedTenancy). This may halt upgrades for deployments that weresilently degraded — intentionally; install the enterprise package or set the
escape hatch.
Membership reconciler (
@objectstack/plugin-auth, ADR-0093 D1–D3, D6). Asingle reconciler composed into better-auth's
user.create.afterhook owns the"every new user gets a membership" invariant across all creation paths (signup,
admin create-user, import, SSO JIT). It yields to any existing membership (host
hooks win), honors a new
membershipPolicy: 'auto' | 'invite-only'auth option(default
auto), and binds only to an unambiguous target org (single-org default;multi-org binds nothing). A bounded, idempotent
kernel:readybackfill coverspre-existing member-less users in single-org/auto deployments
(
OS_SKIP_MEMBERSHIP_BACKFILL=1to opt out). The endpoint-level create-user bindfrom fix(auth): bind admin-created users to the sole organization #2882 now delegates to this shared reconciler.
New env vars:
OS_ALLOW_DEGRADED_TENANCY,OS_SKIP_MEMBERSHIP_BACKFILL. New docs:Deployment → Tenancy Modes & Membership.
Updated dependencies [d6a72eb]
@objectstack/rest@14.7.0
Patch Changes
@objectstack/runtime@14.7.0
Patch Changes
@objectstack/service-analytics@14.7.0
Patch Changes
@objectstack/service-automation@14.7.0
Patch Changes
@objectstack/service-cache@14.7.0
Patch Changes
@objectstack/service-cluster@14.7.0
Patch Changes
@objectstack/service-cluster-redis@14.7.0
Patch Changes
@objectstack/service-datasource@14.7.0
Patch Changes
@objectstack/service-i18n@14.7.0
Patch Changes
@objectstack/service-job@14.7.0
Patch Changes
@objectstack/service-knowledge@14.7.0
Patch Changes
@objectstack/service-messaging@14.7.0
Patch Changes
@objectstack/service-package@14.7.0
Patch Changes
@objectstack/service-queue@14.7.0
Patch Changes
@objectstack/service-realtime@14.7.0
Patch Changes
@objectstack/service-settings@14.7.0
Patch Changes
@objectstack/service-sms@14.7.0
Patch Changes
@objectstack/service-storage@14.7.0
Patch Changes
@objectstack/trigger-api@14.7.0
Patch Changes
@objectstack/trigger-record-change@14.7.0
Patch Changes
@objectstack/trigger-schedule@14.7.0
Patch Changes
@objectstack/verify@14.7.0
Patch Changes
create-objectstack@14.7.0
@objectstack/sdui-parser@14.7.0
objectstack-vscode@14.7.0
@objectstack/example-crm@4.0.85
Patch Changes
@objectstack/example-showcase@0.3.7
Patch Changes
@objectstack/example-todo@4.0.85
Patch Changes
@objectstack/example-embed-objectql@0.0.25
Patch Changes
@objectstack/dogfood@0.0.33
Patch Changes
@objectstack/downstream-contract@0.0.31
Patch Changes