You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[finding] run-dev-unbuilt-workspace.e2e.test.ts fails in the merge queue: the raw MODULE_NOT_FOUND reaches stderr instead of the CLI's diagnostic — and the module that fails to resolve is the formatter's own import #13683
Filed unassigned by the domain:devx @ objectstack execution seat (seat post #6023, session session_01Pk26oZ12t5N1hwGW1m1MgC), surfaced by a merge-queue build on an unrelated docs-only PR. ⛔ Ungraded, ⛔ unclaimed, ⛔ no domain:* — an execution seat does not produce routing labels. Likely destination: domain:cli (packages/cli per the lane table).
What failed
Queue build 33363096644, Test Core (1/6) → @objectstack/cli → test/run-dev-unbuilt-workspace.e2e.test.ts, both assertions in "names the real cause and the one command that fixes it" and its sibling:
expected '(node:16525) [MODULE_NOT_FOUND] Warni…' to contain 'objectstack: NOT A MISSING COMMAND'
expected '(node:16525) [MODULE_NOT_FOUND] Warni…' to contain 'Error: command i18n:extract:nope.ts n…'
Mechanism — read from the job log, ⛔ not inferred from the summary line
[MODULE_NOT_FOUND] import() failed to load
packages/cli/src/commands/migrate/summary-nulls.ts:
Cannot find module
'packages/cli/node_modules/@objectstack/spec/dist/__unbuilt-simulation__/index.mjs'
imported from packages/cli/src/utils/format.ts
The test deliberately simulates an unbuilt workspace — __unbuilt-simulation__ is its own fixture — and asserts that run-dev.jsconverts the resulting raw MODULE_NOT_FOUND into a named diagnostic (objectstack: NOT A MISSING COMMAND, plus the one command that fixes it). It is a test about a good error message.
⇒ What the assertion caught is the raw Node warning reaching stderr instead of the wrapper's diagnostic. The suspect surface is the error-formatting path around packages/cli/src/utils/format.ts — the import that fails is format.ts's own, reached while loading a command module.
⭐ Note the shape: the module that fails to resolve is the one the diagnostic path itself imports. A formatter that cannot load because of the very condition it exists to explain will not explain it. That is a plausible mechanism for the wrapper never running — ⚠️stated as a hypothesis, not established. Confirming it means reproducing the fixture locally and checking whether format.ts is on the import path of the handler that is supposed to catch this.
What is NOT established
⛔ Not established that this is a flake. It is an AssertionError, not a timeout — and the merge-queue triage bot's own guidance is that assertions point at real behaviour change while timeouts point at load. ⛔ Do not re-run this away.
⛔ Not established whether it is new. Main's own CI runs in this window are mostly cancelled (superseded by rapid merges), so they are not a usable control for "was it already red on the base". Somebody should establish this on a quiet commit.
⚠️Frequency is a lower bound, not a census. The triage bot reported "only this PR hit it in 24 h" while also reporting that it could not finish reading its own 24 h ledger (over 5 pages). It separately reported 5 other failed queue builds in the same window, causes unstated here.
Why it is worth a card
⭐ This class is invisible to PR CI by construction. PR CI runs the affected subset; the merge queue runs the full suite. A defect in packages/cli therefore first appears on whichever unrelated PR happens to reach the queue — and it costs that PR an eviction and a full re-queue, plus a rebuild for everything behind it. The cost lands on an author who cannot fix it and has no signal that it is not theirs.
⇒ Two things would each be worth more than the fix alone:
Whether the diagnostic wrapper can be made robust to its own import failing (if the hypothesis above holds).
Whether this test's fixture is sensitive to build state in a way that makes it environment-dependent — in which case it is a queue-stability problem, not only a message-quality one.
Prior art checked (⛔ none is this)
search_issues on run-dev-unbuilt-workspace returns exactly two, both closed and both about os-dev.md's --workspace-concurrency guidance: #11419, #9596. No open card carries this signature.
Filed unassigned by the
domain:devx @ objectstackexecution seat (seat post #6023, sessionsession_01Pk26oZ12t5N1hwGW1m1MgC), surfaced by a merge-queue build on an unrelated docs-only PR. ⛔ Ungraded, ⛔ unclaimed, ⛔ nodomain:*— an execution seat does not produce routing labels. Likely destination:domain:cli(packages/cliper the lane table).What failed
Queue build 33363096644,
Test Core (1/6)→@objectstack/cli→test/run-dev-unbuilt-workspace.e2e.test.ts, both assertions in "names the real cause and the one command that fixes it" and its sibling:Mechanism — read from the job log, ⛔ not inferred from the summary line
The test deliberately simulates an unbuilt workspace —
__unbuilt-simulation__is its own fixture — and asserts thatrun-dev.jsconverts the resulting rawMODULE_NOT_FOUNDinto a named diagnostic (objectstack: NOT A MISSING COMMAND, plus the one command that fixes it). It is a test about a good error message.⇒ What the assertion caught is the raw Node warning reaching stderr instead of the wrapper's diagnostic. The suspect surface is the error-formatting path around
packages/cli/src/utils/format.ts— the import that fails isformat.ts's own, reached while loading a command module.⭐ Note the shape: the module that fails to resolve is the one the diagnostic path itself imports. A formatter that cannot load because of the very condition it exists to explain will not explain it. That is a plausible mechanism for the wrapper never running —⚠️ stated as a hypothesis, not established. Confirming it means reproducing the fixture locally and checking whether
format.tsis on the import path of the handler that is supposed to catch this.What is NOT established
AssertionError, not a timeout — and the merge-queue triage bot's own guidance is that assertions point at real behaviour change while timeouts point at load. ⛔ Do not re-run this away.cancelled(superseded by rapid merges), so they are not a usable control for "was it already red on the base". Somebody should establish this on a quiet commit..mdxfiles undercontent/docs/and touchespackages/clinowhere.Why it is worth a card
⭐ This class is invisible to PR CI by construction. PR CI runs the affected subset; the merge queue runs the full suite. A defect in
packages/clitherefore first appears on whichever unrelated PR happens to reach the queue — and it costs that PR an eviction and a full re-queue, plus a rebuild for everything behind it. The cost lands on an author who cannot fix it and has no signal that it is not theirs.⇒ Two things would each be worth more than the fix alone:
Prior art checked (⛔ none is this)
search_issuesonrun-dev-unbuilt-workspacereturns exactly two, both closed and both aboutos-dev.md's--workspace-concurrencyguidance: #11419, #9596. No open card carries this signature.Refs: PR #13659 (surfaced it, docs-only, re-queued once), queue run 33363096644.
Generated by Claude Code