Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .changeset/28826-tenancy-posture-open-runtime-wording.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@objectstack/spec': patch
---

docs(spec): the tenancy-posture docblocks name `@objectstack/organizations` as open code and the licence as the commercial entitlement

Clause-②: no
Metadata-protocol: none

The file header and the docblocks in `packages/spec/src/security/tenancy-posture.ts` still called the `@objectstack/organizations` runtime "enterprise", although it ships from this repository under Apache-2.0 since ADR-0132 D1. They now name the package without that adjective, and say "commercial entitlement" where they mean the licence gate that the commercial package of the same name adds by subclassing the open one (ADR-0132 D2, D3). What stays true is unchanged: a walled posture (`group` or `isolated`) still needs that runtime mounted to activate (ADR-0093 D5). Comment-only: no schema, type or runtime behaviour changes.
27 changes: 17 additions & 10 deletions packages/spec/src/security/tenancy-posture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,13 @@
*
* The wall's IMPLEMENTATION is open — the Layer 0 compiler, `accessible_org_ids`
* resolution and the D5 write stamping all ship in open packages — but ENABLING
* a multi-organization posture (`group` or `isolated`) requires the enterprise
* `@objectstack/organizations` runtime (ADR-0105 D12). The two are separate
* questions and must not be conflated: open code does not mean free activation.
* a multi-organization posture (`group` or `isolated`) requires the
* `@objectstack/organizations` runtime to be mounted (ADR-0105 D12, ADR-0093 D5).
* That runtime is open code too: it ships from this repository under Apache-2.0
* (ADR-0132 D1). What stays commercial is the entitlement — the licence gate the
* commercial package of the same name adds by subclassing the open one (ADR-0132
* D2, D3). The two are separate questions and must not be conflated: open code
* does not mean free activation.
*
* Cloud ADR-0016's 铁律 (强制免费、治理收费) is satisfied by the first half alone —
* it guarantees that a deployment RUNNING a multi-org shape is safe, which the
Expand Down Expand Up @@ -67,8 +71,8 @@ export function postureEnforcesWall(posture: TenancyPosture): boolean {
* `packages/drivers/driver-sql`). An explicit value is never overwritten; where
* `@objectstack/plugin-security` installs the wall on the write, it holds that
* value to the Layer 0 verdict, storing it where the wall admits it and
* refusing the write where it does not. The enterprise
* `@objectstack/organizations` runtime fills an absent value too, in its write
* refusing the write where it does not. The `@objectstack/organizations`
* runtime (open code, ADR-0132 D1) fills an absent value too, in its write
* middleware, but it is not the only stamper.
*
* What does need that runtime is ACTIVATING a walled posture (ADR-0105 D12):
Expand Down Expand Up @@ -96,9 +100,11 @@ export function postureUsesUnionScope(posture: TenancyPosture): boolean {
*
* Presence-of-package answers "may this deployment run multi-org at all"; it
* cannot answer "which shapes of it" — that is a packaging decision, and the
* commercial runtime owns it. Declaring the set here lets the enterprise package
* gate `group` and `isolated` independently (different tiers, a license flag, a
* trial) without the open core hard-coding anyone's price list.
* commercial runtime owns it. Declaring the set here lets the commercial package
* of the same name gate `group` and `isolated` independently under its
* commercial entitlement (different tiers, a licence flag, a trial) without the
* open core hard-coding anyone's price list. The open package entitles both
* walled postures by construction (ADR-0132 D4).
*
* Omitting `supportedPostures` entitles every walled posture, which is what
* every runtime predating this seam did.
Expand All @@ -111,8 +117,9 @@ export function postureUsesUnionScope(posture: TenancyPosture): boolean {
* declaration leaves behaviour byte-identical to a runtime predating the key.
*
* They exist because the alternative seams are dead. Host self-declaration of
* the boundary is a paywall bypass (only a mounted enterprise runtime may
* declare anything here, which is what keeps the org-create gate intact), and
* the boundary is a paywall bypass (only a mounted `org-scoping` runtime may
* declare anything here, and on a commercial host that is the licence-gated
* one, which is what keeps the org-create gate intact), and
* carrying `tenancy` through `objectExtensions` silently drops it in the merge
* (objectstack#12680). Nor can the per-object authoring channel
* (`tenancy: { enabled: false }`) express either fact: that declaration travels
Expand Down
Loading