diff --git a/.changeset/28826-tenancy-posture-open-runtime-wording.md b/.changeset/28826-tenancy-posture-open-runtime-wording.md new file mode 100644 index 00000000000..6d2eaf39ee1 --- /dev/null +++ b/.changeset/28826-tenancy-posture-open-runtime-wording.md @@ -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. diff --git a/packages/spec/src/security/tenancy-posture.ts b/packages/spec/src/security/tenancy-posture.ts index 0379dd50517..1badc640884 100644 --- a/packages/spec/src/security/tenancy-posture.ts +++ b/packages/spec/src/security/tenancy-posture.ts @@ -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 @@ -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): @@ -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. @@ -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