From f4415dc86ceaed1fbf9c4ebfa5d07d7084e6227f Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 9 Sep 2026 16:49:30 +0000 Subject: [PATCH 1/2] fix(spec): register sys_package_version in CLOUD_PROVIDED_OBJECT_NAMES The curated cloud list carried sys_package and sys_package_installation but not the release-snapshot table between them, so the shipped sys_metadata.package_version_id lookup target was classed as a platform-prefixed name nothing registers. Add the one entry, pin it by name beside sys_license, and add the patch changeset. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01MkQhmuuJAVDjmeWNixwDDH --- .../spec-cloud-provided-package-version.md | 24 +++++++++++++++++++ .../constants/platform-object-names.test.ts | 17 +++++++++++++ .../system/constants/platform-object-names.ts | 1 + 3 files changed, 42 insertions(+) create mode 100644 .changeset/spec-cloud-provided-package-version.md diff --git a/.changeset/spec-cloud-provided-package-version.md b/.changeset/spec-cloud-provided-package-version.md new file mode 100644 index 0000000000..e1d847d7cc --- /dev/null +++ b/.changeset/spec-cloud-provided-package-version.md @@ -0,0 +1,24 @@ +--- +"@objectstack/spec": patch +--- + +`sys_package_version` is now registered in `CLOUD_PROVIDED_OBJECT_NAMES` +(`@objectstack/spec/system`), so `isPlatformProvidedObjectName('sys_package_version')` +returns `true` and a reference to it resolves instead of being flagged as a +platform-prefixed name nothing registers (#16745). + +The list already carried `sys_package` and `sys_package_installation` — the head +and tail of the three-table package family that `cloud/package.zod.ts` declares — +but not the release-snapshot table between them, whose row schema this repository +ships as `cloud/package-version.zod.ts`. Platform metadata that ships with the +product references the name: `sys_metadata.package_version_id` in +`@objectstack/metadata-core` is a `Field.lookup('sys_package_version', …)`. Against +the list's own stated purpose ("Listed here so a cloud-targeted stack is not told +its references are fictional") that shipped lookup target was being judged +fictional, and the same misclassification reached any dataset `object`, action +parameter `reference`, dashboard `optionsFrom.object` or navigation +`requiresObject` naming it. + +One entry is added; no other member moves. The cloud-side half of the contract — +that `@objectstack/service-tenant` registers the table — is owned by the cloud +repository per the list's header and is not asserted from here. diff --git a/packages/spec/src/system/constants/platform-object-names.test.ts b/packages/spec/src/system/constants/platform-object-names.test.ts index c846699f44..b2a4cde719 100644 --- a/packages/spec/src/system/constants/platform-object-names.test.ts +++ b/packages/spec/src/system/constants/platform-object-names.test.ts @@ -167,4 +167,21 @@ describe('platform-object predicates', () => { expect(isPlatformProvidedObjectName('sys_license')).toBe(true); expect(CLOUD_PROVIDED_OBJECT_NAMES).toContain('sys_license'); }); + + it('resolves the middle table of the cloud package family', () => { + // `sys_package` and `sys_package_installation` were registered; the + // release-snapshot table between them was not, although this repo declares + // its row schema (`cloud/package-version.zod.ts`) and ships a platform + // object that looks it up (`sys_metadata.package_version_id` in + // `@objectstack/metadata-core`). While it was absent the object-reference + // ladder classed that shipped lookup target as a platform-prefixed name + // nothing registers. Pinned by name, beside `sys_license`, for the same + // reason. The other half of the contract — that the cloud runtime really + // registers the table — is owned by the cloud repository, per the list's + // header, and is not asserted here. + for (const name of ['sys_package', 'sys_package_version', 'sys_package_installation']) { + expect(isPlatformProvidedObjectName(name), name).toBe(true); + expect(CLOUD_PROVIDED_OBJECT_NAMES, name).toContain(name); + } + }); }); diff --git a/packages/spec/src/system/constants/platform-object-names.ts b/packages/spec/src/system/constants/platform-object-names.ts index 6aff77525b..f691ad7939 100644 --- a/packages/spec/src/system/constants/platform-object-names.ts +++ b/packages/spec/src/system/constants/platform-object-names.ts @@ -153,6 +153,7 @@ export const CLOUD_PROVIDED_OBJECT_NAMES: readonly string[] = [ 'sys_license', 'sys_package', 'sys_package_installation', + 'sys_package_version', ]; /** From 8d6f1d9f8f3fb2f59a5b541efc7bdf5e070924c6 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 9 Sep 2026 18:54:30 +0000 Subject: [PATCH 2/2] fix(spec): grade the CLOUD_PROVIDED_OBJECT_NAMES widening at minor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The clause-② declaration for this PR is `yes`: `CLOUD_PROVIDED_OBJECT_NAMES` is a closed accept set and this diff adds a member to it. A PR that declares clause ② must grade at least one package whose published source it moves at `minor` or above (`check-changeset-no-major.mjs`, level axis), and a purely additive widening of a published public surface takes at least `minor` by the `Check Changeset` "WHICH LEVEL" rule. `major` is refused by the same script's launch-window guard, so `minor` is the only legal grade. The changeset prose no longer frames the addition as restoring something the published header already promised — that reading was withdrawn: the header states why the list exists, not that this name is a member of it. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01MkQhmuuJAVDjmeWNixwDDH --- .../spec-cloud-provided-package-version.md | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/.changeset/spec-cloud-provided-package-version.md b/.changeset/spec-cloud-provided-package-version.md index e1d847d7cc..1ee95fcc3f 100644 --- a/.changeset/spec-cloud-provided-package-version.md +++ b/.changeset/spec-cloud-provided-package-version.md @@ -1,24 +1,28 @@ --- -"@objectstack/spec": patch +"@objectstack/spec": minor --- -`sys_package_version` is now registered in `CLOUD_PROVIDED_OBJECT_NAMES` -(`@objectstack/spec/system`), so `isPlatformProvidedObjectName('sys_package_version')` -returns `true` and a reference to it resolves instead of being flagged as a -platform-prefixed name nothing registers (#16745). +`CLOUD_PROVIDED_OBJECT_NAMES` (`@objectstack/spec/system`) gains a member: +`sys_package_version`. `isPlatformProvidedObjectName('sys_package_version')` now +returns `true`, so a reference to that name resolves instead of being flagged as +a platform-prefixed name nothing registers (#16745). -The list already carried `sys_package` and `sys_package_installation` — the head -and tail of the three-table package family that `cloud/package.zod.ts` declares — -but not the release-snapshot table between them, whose row schema this repository -ships as `cloud/package-version.zod.ts`. Platform metadata that ships with the -product references the name: `sys_metadata.package_version_id` in -`@objectstack/metadata-core` is a `Field.lookup('sys_package_version', …)`. Against -the list's own stated purpose ("Listed here so a cloud-targeted stack is not told -its references are fictional") that shipped lookup target was being judged -fictional, and the same misclassification reached any dataset `object`, action -parameter `reference`, dashboard `optionsFrom.object` or navigation -`requiresObject` naming it. +This widens an accept set. The name was previously refused, the list is a closed +set, and nothing in the published header enumerated this member — so the ladder +now accepts a value it used to warn on, and the widening reaches every surface +that consults the predicate: a dataset `object`, an action parameter +`reference`, a dashboard `optionsFrom.object` and a navigation `requiresObject` +naming `sys_package_version` all stop being diagnosed. -One entry is added; no other member moves. The cloud-side half of the contract — -that `@objectstack/service-tenant` registers the table — is owned by the cloud -repository per the list's header and is not asserted from here. +Why this name and not another: the list already carried `sys_package` and +`sys_package_installation` — the head and tail of the three-table package family +that `cloud/package.zod.ts` declares — but not the release-snapshot table +between them, whose row schema this repository ships as +`cloud/package-version.zod.ts`. Platform metadata that ships with the product +references it: `sys_metadata.package_version_id` in `@objectstack/metadata-core` +is a `Field.lookup('sys_package_version', …)`. + +One entry is added; no other member moves and nothing is removed or narrowed. +The cloud-side half of the contract — that `@objectstack/service-tenant` +registers the table — is owned by the cloud repository per the list's header and +is not asserted from here.