Symptom
The check-i18n-bundles gate reports a stale-dist prerequisite failure as a content verdict — check-i18n-bundles: 1 bundle problem(s) / extract failed … — instead of naming the unmet prerequisite the way its sibling check-i18n-coverage does. In the QA run, packages/spec/dist predated commit 06be54ec (#7285, which added authorisesIrreversibleAction), so platform-objects' extract threw "The requested module '@objectstack/spec/system' does not provide an export named 'authorisesIrreversibleAction'". The coverage gate handled the same cause well — it refused to judge the ratchet ("Nothing was compared… the baseline was left exactly as committed", the designed #6033/#5862 honesty) — but the bundles gate graded it as content.
Root cause
Located, and verified still present on origin/main as of this filing. In scripts/check-i18n-bundles.mjs, the only prerequisite classifier is looksLikeMissingCliCommand() (scripts/cli-build-prerequisite.mjs), which matches oclif's Error: command … not found — an unbuilt/half-built CLI — only. A stale dependency dist that makes extraction throw a module-export mismatch does not match that signature, so the prerequisite branch (reportPrerequisiteNotMet) never fires. Execution falls to the in-loop failure path: collectDriftedBundles(stdout) finds no drift lines (the extract blew up before producing any), so it lands in the else branch that does broken.push(${pkg}: extract failed — …), and the final verdict prints check-i18n-bundles: ${broken.length + drifted.length} bundle problem(s). That is a content verdict for a prerequisite failure — the same "bundle/extract" wording (#5217 comment header) that misdirects the reader to the i18n configs.
Fix shape. The bundles gate should recognize the stale-dist / module-export-mismatch prerequisite and name it the way its sibling coverage gate does — a hard failure that states it checked nothing — rather than counting it as a bundle problem.
Stale-premise note. The packages/spec/dist staleness in the run was a checkout artifact, not the bug. The bug is the mislabel, and the mislabel path (else → broken.push('extract failed') → "N bundle problem(s)") is present on origin/main. #5217 (closed) added the prerequisite classifier for the unbuilt-CLI case; it does not cover this stale-dependency-dist / missing-export case.
Reproduction
With packages/spec/dist older than a commit that adds a new @objectstack/spec/system export, run node scripts/check-i18n-bundles.mjs. It prints 1 bundle problem(s) / extract failed …, while node scripts/check-i18n-coverage.mjs on the same tree refuses to judge ("Nothing was compared…").
Source
Extracted from the QA run #7640 (framework 92f26f7, console 09987b680).
Symptom
The
check-i18n-bundlesgate reports a stale-distprerequisite failure as a content verdict —check-i18n-bundles: 1 bundle problem(s)/extract failed …— instead of naming the unmet prerequisite the way its siblingcheck-i18n-coveragedoes. In the QA run,packages/spec/distpredated commit06be54ec(#7285, which addedauthorisesIrreversibleAction), soplatform-objects' extract threw "The requested module '@objectstack/spec/system' does not provide an export named 'authorisesIrreversibleAction'". The coverage gate handled the same cause well — it refused to judge the ratchet ("Nothing was compared… the baseline was left exactly as committed", the designed #6033/#5862 honesty) — but the bundles gate graded it as content.Root cause
Located, and verified still present on
origin/mainas of this filing. Inscripts/check-i18n-bundles.mjs, the only prerequisite classifier islooksLikeMissingCliCommand()(scripts/cli-build-prerequisite.mjs), which matches oclif'sError: command … not found— an unbuilt/half-built CLI — only. A stale dependency dist that makes extraction throw a module-export mismatch does not match that signature, so the prerequisite branch (reportPrerequisiteNotMet) never fires. Execution falls to the in-loop failure path:collectDriftedBundles(stdout)finds no drift lines (the extract blew up before producing any), so it lands in theelsebranch that doesbroken.push(${pkg}: extract failed — …), and the final verdict printscheck-i18n-bundles: ${broken.length + drifted.length} bundle problem(s). That is a content verdict for a prerequisite failure — the same "bundle/extract" wording (#5217 comment header) that misdirects the reader to the i18n configs.Fix shape. The bundles gate should recognize the stale-dist / module-export-mismatch prerequisite and name it the way its sibling coverage gate does — a hard failure that states it checked nothing — rather than counting it as a bundle problem.
Stale-premise note. The
packages/spec/diststaleness in the run was a checkout artifact, not the bug. The bug is the mislabel, and the mislabel path (else→broken.push('extract failed')→"N bundle problem(s)") is present onorigin/main. #5217 (closed) added the prerequisite classifier for the unbuilt-CLI case; it does not cover this stale-dependency-dist / missing-export case.Reproduction
With
packages/spec/distolder than a commit that adds a new@objectstack/spec/systemexport, runnode scripts/check-i18n-bundles.mjs. It prints1 bundle problem(s)/extract failed …, whilenode scripts/check-i18n-coverage.mjson the same tree refuses to judge ("Nothing was compared…").Source
Extracted from the QA run #7640 (framework 92f26f7, console 09987b680).