Skip to content

Commit 32cd756

Browse files
committed
fix(spec): published copy says "this system" or drops the noun, not "this environment" (cloud#3002 ruling A)
Per-string reading of every non-test "this environment" hit in packages/spec/src: eleven change (a set made here is "authored in this system"; the system the reader is in is "this system" or the noun is dropped), four keep the word because it names a deployment or configuration scope (the seed loader's prod/dev/test tier, the ADR-0131 environment-wide uninstall scope, the environment artifact's consent record). Wording only: no code, kind, path, accept set or export moves. Claude-Session: https://claude.ai/code/session_01WnW7HvfnfHbLg1fpkHX3Mu Co-authored-by: Claude <noreply@anthropic.com>
1 parent 538f923 commit 32cd756

8 files changed

Lines changed: 28 additions & 11 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
'@objectstack/spec': patch
3+
'@objectstack/platform-objects': patch
4+
---
5+
6+
Clause-②: no
7+
8+
fix(spec): published copy that names the running system says "this system", or drops the noun, not "this environment"
9+
10+
- **What changed.** Inside the running system, user-facing copy names the system the reader is in as "this system", or drops the noun. A permission set made here, not shipped by a package, is "authored in this system".
11+
- The permission-set `packageId` refusal on the save, restore and publish doors now reads "a set written into no package is authored in this system, which an absent `packageId` states".
12+
- The permission set's `packageId` help text in Setup ends "Leave empty for a set authored in this system." The English Setup forms bundle of `@objectstack/platform-objects` is regenerated from it.
13+
- The `permission.managedBy` tombstone prescription, and the `permission-set-managed-by-retired` protocol-18 upgrade-guide entry, say "a set authored in this system carries neither".
14+
- The `AudienceConfig.posture` and `AuthConfig.audience` describes say "who may self-register", with no noun. Their TSDoc says "who may become a user of this system's apps", the sentence the Setup Authentication group already reads.
15+
- `AiModelsResponse.models` describes "Models this system offers". The `IMetadataService.listDiagnosed` TSDoc example reads "this system contains N items".
16+
- **Kept "environment", where the word names a deployment or configuration scope.** `SeedLoaderConfig.env` ("Only load datasets matching this environment", the `prod | dev | test` tier), the `package-uninstall-environment-wide` upgrade-guide entry (the ADR-0131 environment-wide scope, as against an organization), and the environment artifact's consent-record TSDoc.
17+
- **Unchanged.** Every error code, status, issue path, accepted value and export. Only the human-readable text moves.

‎packages/spec/src/api/protocol.zod.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3370,7 +3370,7 @@ export const AiModelsResponseSchema = lazySchema(() => z.object({
33703370
label: z.string().describe('Display label for the picker'),
33713371
default: z.boolean().describe('Whether this is the environment default'),
33723372
}),
3373-
])).describe('Models this environment offers'),
3373+
])).describe('Models this system offers'),
33743374
defaultModel: z.string().optional().describe('Default model id, when the service reports one'),
33753375
}));
33763376

‎packages/spec/src/contracts/metadata-service.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ export interface IMetadataService {
390390
* read a MISS and an OUTAGE arrive as the same `undefined`; on the plural
391391
* read they arrive as the same *array*, and an array carries a **count**.
392392
* A count is the strongest positive claim a read can make — a consumer that
393-
* renders `list(t).length` as "this environment contains N items" states,
393+
* renders `list(t).length` as "this system contains N items" states,
394394
* positively and numerically, something no read established. `list` cannot
395395
* be fixed in place (every caller would have to change at once, and most
396396
* are right to keep ignoring the verdict), so the verdict is offered

‎packages/spec/src/migrations/entries/semantic/18.permission-set-managed-by-retired.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const entry: SemanticMigration = {
1515
surface: 'permissions[].managedBy — the authored per-record provenance (package / platform / user) on a '
1616
+ 'permission set',
1717
replacement: 'Nothing: delete the key. A set\'s provenance is the package that ships it, decided from that '
18-
+ 'package\'s artifact and recorded as packageId; a set created in this environment carries neither. The '
18+
+ 'package\'s artifact and recorded as packageId; a set authored in this system carries neither. The '
1919
+ 'sys_permission_set.managed_by column the platform keeps is a different surface and is unchanged.',
2020
reason: 'The D2 conversion `permission-set-managed-by-removed` deletes `managedBy` from every permission set '
2121
+ 'in author sources, stored permission rows and built artifacts, and the delete is lossless: no seeder, '

‎packages/spec/src/security/permission-set-owner-binding.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ export function judgePermissionSetOwnerBinding(
124124
: `, or ${door === 'save' ? 'save the set' : 'save it'} into package '${declared}' `
125125
+ `(?package=${declared} on the REST door, packageId in process)`;
126126
const owner = bound === null
127-
? 'a set written into no package is authored in this environment, which an absent `packageId` states'
127+
? 'a set written into no package is authored in this system, which an absent `packageId` states'
128128
: 'the package a set is written into is its owner';
129129
const tail = `and ${owner} (ADR-0086 D3): a \`packageId\` that disagrees is refused, never silently overridden.`;
130130
const message = door === 'save'

‎packages/spec/src/security/permission.form.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export const permissionForm = defineForm({
4949
// (`judgePermissionSetOwnerBinding`).
5050
{ field: 'description', type: 'textarea', colSpan: 2, helpText: 'Human-readable description shown in Setup.' },
5151
{ field: 'isDefault', type: 'boolean', colSpan: 1, helpText: 'Gives this set to everyone who signs in, through the built-in everyone position. A set the app itself declares is granted at startup; a set from an installed package becomes a suggestion an admin confirms in Setup. A set with high-privilege permissions is never granted this way. Default false.' },
52-
{ field: 'packageId', type: 'text', colSpan: 2, helpText: 'The package that ships this set; a value naming any other package is refused. Leave empty for a set created in this environment.' },
52+
{ field: 'packageId', type: 'text', colSpan: 2, helpText: 'The package that ships this set; a value naming any other package is refused. Leave empty for a set authored in this system.' },
5353
],
5454
},
5555
{

‎packages/spec/src/security/permission.zod.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,7 @@ const PERMISSION_SET_MANAGED_BY_REMOVED =
677677
+ 'nothing ever read the authored key: no seeder, package upgrade or lock consulted it, so `package` never made '
678678
+ 'a set upgrade-owned and `platform` or `user` never shielded one from an upgrade. Delete the key; a set\'s '
679679
+ 'provenance is the package that ships it, decided from that package\'s artifact and recorded as `packageId`, '
680-
+ 'and a set created in this environment carries neither. '
680+
+ 'and a set authored in this system carries neither. '
681681
+ 'Run `os migrate meta --from 17` to list the mechanical edits for existing sources; `--write` applies the ones it can prove, and you apply the rest by hand.';
682682

683683
/**

‎packages/spec/src/system/auth-config.zod.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ export const EmailVerificationConfigSchema = lazySchema(() => z.object({
342342

343343
/**
344344
* Audience posture — the ONE declaration answering "who may become a user of
345-
* an app built on this environment" (#11739 / epic #11723).
345+
* an app built on this system" (#11739 / epic #11723).
346346
*
347347
* Before this existed, the answer was an emergent property of
348348
* `emailAndPassword.disableSignUp` + `emailVerification` + `ssoOnlyMode` +
@@ -398,7 +398,7 @@ const AUDIENCE_EMAIL_DOMAIN_SHAPE = /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[
398398
*/
399399
export const AudienceConfigSchema = lazySchema(() => z.object({
400400
/**
401-
* Who may become a user of this environment's apps:
401+
* Who may become a user of this system's apps:
402402
*
403403
* - `invite_only` (default): self-registration is CLOSED. A user comes into
404404
* existence only through an operator-side act — a pending invitation
@@ -414,7 +414,7 @@ export const AudienceConfigSchema = lazySchema(() => z.object({
414414
* console cannot turn it off.
415415
*/
416416
posture: z.enum(AUDIENCE_POSTURES).default('invite_only').describe(
417-
'Who may self-register into this environment: invite_only (default — operator acts only), ' +
417+
'Who may self-register: invite_only (default — operator acts only), ' +
418418
'email_domain (allowlisted email domains), or open (anyone). ' +
419419
'email_domain forces email verification on; open forces it on unless the deployment explicitly ' +
420420
'sets emailAndPassword.requireEmailVerification to false.',
@@ -578,7 +578,7 @@ export const AuthConfigSchema = lazySchema(() => z.object({
578578
emailAndPassword: EmailAndPasswordConfigSchema,
579579
emailVerification: EmailVerificationConfigSchema,
580580
/**
581-
* Audience posture (#11739) — who may become a user of this environment's
581+
* Audience posture (#11739) — who may become a user of this system's
582582
* apps. Undeclared ⇒ `invite_only` (the safe default; maintainer ruling
583583
* 2026-08-24 on epic #11723 — no legacy/undeclared limbo).
584584
*
@@ -598,7 +598,7 @@ export const AuthConfigSchema = lazySchema(() => z.object({
598598
* A `false` stored only through the settings console is still refused.
599599
*/
600600
audience: AudienceConfigSchema.optional().describe(
601-
'Audience posture: who may self-register into this environment ' +
601+
'Audience posture: who may self-register ' +
602602
'(invite_only — the default — | email_domain | open). See AudienceConfigSchema.',
603603
),
604604
advanced: AdvancedAuthConfigSchema,

0 commit comments

Comments
 (0)