Skip to content

Four more @objectstack/* packages still reach the Console bundle from objectui's lockfile — the same publish-ordering trap #8134 closes for spec #9659

Description

@os-steve

Filed unassigned as an out-of-scope finding from the #8134 implementation round (the OBJECTSTACK_SPEC_DIST injection). #8134 asked its dev to enumerate every @objectstack/* package that reaches the console's vendor bundle and report which are resolved from objectui's lockfile rather than from this workspace. This is that list. ⛔ Nothing here is addressed by that PR, by design — it injected spec only.

The shape, restated once

scripts/build-console.sh builds the console at the pinned objectui SHA with pnpm install --frozen-lockfile. Every @objectstack/* package objectui declares therefore resolves to the last published tarball, never to this workspace. For any such package, a change made here is invisible in the shipped console until three ordered cross-repo steps complete: publish, objectui lockfile refresh, console pin bump. The framework-side card closes green the whole time.

Injection is the escape hatch, and it is now used twice: OBJECTSTACK_CLIENT_DIST (pre-existing) and OBJECTSTACK_SPEC_DIST (#8134).

Measured inventory

Measured in the real build tree (.cache/objectui-82a94170c405) at pin 82a94170c405, framework origin/main @ 40162f1e2:

packageinstalledobjectui workspace packages declaring itinjected from this tree?
@objectstack/spec17.0.030#8134
@objectstack/client17.0.02✅ pre-existing
@objectstack/formula17.0.02exposed
@objectstack/lint17.0.01exposed
@objectstack/core17.0.00 (transitive)exposed
@objectstack/sdui-parser17.0.00 (transitive)exposed

All six are installed from npm into the build tree's pnpm store. So 4 of 6 remain on the publish-ordering trap after #8134.

@objectstack/lint is confirmed to actually reach the console bundle, not merely to be installed: the vite build resolves it and emits browser-externalization warnings naming its dist/index.js by path, on every console build.

Why this is a finding and not a bug

⚠️ No user-visible break is measured for any of the four. The exposure is real but latent, and the severity is not uniform:

  • spec was the acute one precisely because it is the authorable surface the Studio designer validates against — a stale copy turns a freshly declared key into an "unrecognized key" banner. That property does not transfer automatically to the other four.
  • core and sdui-parser are transitive with zero direct import sites in objectui, so their bundled surface is whatever client/spec/lint drag in.
  • formula (2 declarers) and lint (1) are directly declared and the more plausible next instance.

The right next step is a judgement about which of the four can carry an authoring-visible surface at all, not a reflexive fourfold injection — each injection adds a hook that must exist on the objectui side (spec's needed objectui#4854, a subpath-aware resolver, because a plain prefix alias cannot serve an exports map).

Suggested scoping, not a recommendation

  1. Decide per package whether its console-visible surface can go stale in a way an author or admin would notice. Only those need injection.
  2. If more than one does, the third injection is the point to stop copying the block and factor build-console.sh's guard/export/assert triple into a loop over a declared list — two is a coincidence, three is a pattern.
  3. scripts/assert-console-spec-injection.mjs (added by #7804's GlobalFilterSchema.object is unreachable in the Studio designer, and no console pin bump can fix it — the console vendors the PUBLISHED @objectstack/spec, which the key postdates #8134) derives its probes from the two package trees on disk and is not spec-specific in principle; it could generalize.

Refs: #8134 (the spec injection and the measurement that produced this list), objectstack-ai/objectui#4854 (the hook the spec injection needed).

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions