Skip to content

Forward conversion never opens on unreleased main: spec still labelled 17.4.0 while main refuses 17.5.0 retirements, so artifacts built by the published 17.4.0 CLI are refused #20390

Description

@hotlong

Ruled: 5865890672 · letter A · 2026-09-28T08:02Z

Source

This surfaced on objectstack-ai/hotcrm#1964 (floor 1 of the cloud framework re-cut, objectstack-ai/cloud#2332 / PR objectstack-ai/cloud#2423) and is tracked under epic objectstack-ai/cloud#2440.

Maintainer ruling in the epic session, 2026-09-28 (verbatim): 「平台修转换 + HotCRM 先删 scale(推荐)」. The platform fixes the forward conversion. hotcrm only removes what no release can convert.

What breaks

objectstack main (measured at 862b6ce8) already refuses keys that the retirement ledger marks "removed in @objectstack/spec 17.5.0". But packages/spec on main still carries the version label 17.4.0, and 17.5.x is not published (npm latest = 17.4.0).

applyArtifactForwardConversions (packages/metadata-core/src/artifact-forward-conversion.ts ~301, resolveInstalledSpecVersion) therefore reads runtime 17.4.0 == the artifact's authored floor ^17.4.0 and returns authored-current. The retired conversions are then not replayed, and MetadataPlugin._parseAndRegisterArtifact (packages/metadata/src/plugin.ts ~894) refuses the artifact.

Consequence: any artifact built by the published @objectstack/cli 17.4.0 that contains a dashboard chart cannot boot on a runtime that runs unreleased main. At 17.4.0, chartConfig.type is required, and main refuses it. Such a runtime is the EE composed boot through OS_COMPOSED_ARTIFACT_URL, as cloud does when it pins a framework SHA. No source spelling of chartConfig is legal on both versions short of deleting the block.

Measured (hotcrm#1964 dev report, 2026-09-28)

Probe: the same ObjectStackDefinitionSchema.parse(applyArtifactForwardConversions(...)) from objectstack 862b6ce dist, run on hotcrm main's artifact:

runtime label verdict conversions applied issues left
17.4.0 (actual label on main) authored-current none 63: 16 chartConfig.type, 9 xAxis, 9 yAxis, 23 objects..scale, 6 pages..assignedProfiles
forced 17.5.0 converted-forward dashboard-widget-chart-config-structure-removed ×34, page-assigned-profiles-removed ×6, page-component-filter-record-to-rule-array ×4 only the 23 currency scale issues (no conversion exists; hotcrm is removing them)

Direct EE boot of the same artifact on main: exit 1. With all three key families stripped: serves (HTTP 200).

Direction (for triage and the owning lane)

Make the conversion window open for artifacts authored at the last published release whenever the runtime already enforces a later retirement. The dev named two shapes; picking one is the owning lane's design call:

  • Option a. main carries a prerelease label (e.g. 17.5.0-next) as soon as it contains a 17.5 retirement.
  • Option b. The window compares the artifact's authored version against the retirement's own version instead of the package label.

Acceptance

  1. An artifact built by the published 17.4.0 CLI with dashboard charts and page assignedProfiles boots on main, and the conversion notices are logged.
  2. Newly authored sources that use the retired keys are still refused loudly.
  3. A regression test pins the "unreleased main, artifact at last release" case.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:specpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions