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
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
check-doc-snippet-types --build-filter omits the dependency closure, so the build it prescribes fails #5911
Feeding that list straight back into pnpm buildfails, because the list names only the packages the docs resolve against, not their dependency closure:
packages/react build: src/index.ts(50,8): error TS2307: Cannot find module '@object-ui/i18n' or its corresponding type declarations.
ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL @object-ui/react@17.6.0 build: `tsc`
@object-ui/i18n is a workspace package that @object-ui/react depends on, but no doc snippet imports it, so it never enters the --build-filter output.
Workaround
Append pnpm's dependency-closure suffix to each filter — --filter=@object-ui/app-shell... etc. — after which the build succeeds and the gate returns a real verdict.
Why it is worth fixing
The gate is careful to distinguish "not run" (a precondition) from "failed" (a verdict), which is exactly right. But the remedy it hands you does not work as printed, so the natural next step after reading the message lands on a red build that looks like a defect in the changed branch rather than an incomplete filter list. Emitting the ... suffix (or otherwise expanding to the dependency closure) would close the loop.
Observation-class: no user-visible behaviour is wrong, and the gate's verdicts are correct once the closure is built.
Concentrated triage batch: finding → pm:queue + domain:devx, Bug, S — the tool's own prescription fails: --build-filter emits only the packages the docs resolve against, not their dependency closure, so the printed pnpm build command dies on the first workspace dep (@object-ui/i18n, measured). Fix: emit closure-including filters (pnpm's --filter pkg... dependency ellipsis) or compute the closure explicitly; acceptance = the printed command succeeds verbatim on a clean tree.
{
"issue": 5911,
"status": "done",
"branch": "claude/issue-5911-build-filter-closure",
"pr": "https://github.com/objectstack-ai/objectui/pull/6289",
"premise_still_valid": true,
"summary": "The closure gap is real and reproduced, but two things in the issue text are stale and the report corrects both. (1) The named example is gone: @object-ui/i18n is emitted directly today, so the missing packages are now @object-ui/collaboration, @object-ui/react-runtime, @object-ui/sdui-parser, @object-ui/providers, @object-ui/permissions, @object-ui/mobile. (2) More load-bearing: the gate's PRINTED remedy uses turbo, and turbo was never broken -- this repo's build task declares dependsOn ['^build'], so it supplied the closure all along; measured with turbo run build --dry-run=json, the bare list and the closure list select the IDENTICAL 33 tasks (only-in-NEW [], only-in-OLD []). The defect is live on the pnpm spelling, which wears the same --filter= flag and selects exactly what it matches. So the fix appends pnpm/turbo's '...' dependency-closure suffix to each emitted filter: a strict no-op for CI and for the printed command, and a fix for every other spelling. The emission moved into an exported buildFilterArgs so the SUFFIX is pinned by tests rather than the LIST, which is supposed to move as coverage grows. content/docs/guide/ci-cd-pipeline.md updated to say what the suffix is for.",
"tests": "REPRODUCTION, from a fresh worktree measured at dists=0 tsbuildinfo=0. Gate emitted 21 bare --filter= words; a workspace-dep walk showed 6 packages the set depends on were absent. OLD list on the pnpm path: `pnpm $(bare) --workspace-concurrency=2 run build` -> EXIT=1, 'packages/components build: src/renderers/basic/div.tsx:10:32 - error TS2307: Cannot find module @object-ui/sdui-parser' and 'ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL @object-ui/components@17.6.0 build' -- same shape as filed, package names moved. Same OLD list through turbo (`pnpm build $(bare) --concurrency=2`) instead SUCCEEDED, 'Tasks: 32 successful, 32 total' -- that is the measurement that corrects the issue. AFTER the fix, reset again to dists=0 tsbuildinfo=0 (removed only the dirs the runs had built, count re-measured at 0): NEW list, same pnpm command -> EXIT=0, `grep -c 'TS2307\\|ERR_PNPM'` = 0. Selection: pnpm bare=21 packages, pnpm closure=33. GATE REAL VERDICT after the new-list build (not the precondition message): exit 0, 'Semantic phase: 267 of 267 block(s) judged, 0 failed.' / 'Every covered documentation snippet compiles against the built types.' NEW TESTS collected by name under --reporter=verbose: 'emits the dependency-closure suffix on every filter, so the build it prescribes is complete', 'keeps the emission sorted and shell-safe -- the workflow word-splits it unquoted', 'names every package it is given, so the closure suffix never replaces a name'; 'Test Files 1 passed (1)' / 'Tests 44 passed (44)'. ABLATION, run from the COMMITTED state so restoring is a checkout: stripped the '...' from the emission; mutation confirmed ON DISK before the run -- closure marker grep 1 -> 0, injected bare form 1, git diff --stat one line changed -- then 'Tests 3 failed | 41 passed (44)' with exactly the three new tests red. NO REBUILD LEG APPLIES and this is stated rather than skipped: the suite imports the gate as '../check-doc-snippet-types.mjs', a relative path to plain JS source, so no package exports and no dist/ sit between the mutation and the run. Restore leg confirmed: git status --short clean, marker back to 1, emission carrying '...'. GATES, all on final commit 3e9c50a63, every exit code captured by redirect before any pipe: `pnpm exec vitest run scripts/__tests__` -> 'Test Files 77 passed (77)' / 'Tests 2210 passed (2210)'; `pnpm type-check:scripts` exit 0 (positive control: echoed its script line 'tsc -p tsconfig.scripts.json'); `pnpm lint:root` UNNARROWED exit 0, verdict line '✖ 28 problems (0 errors, 28 warnings)' -- 0 errors, warnings pre-existing; `pnpm check:control-bytes` -> '✅ check-control-bytes: OK (scanned 5178 tracked text file(s); skipped 85 binary).' plus a self grep -naP over the diff with no hits; `pnpm check:doc-snippets` -> 'Every covered documentation snippet compiles against the built types.'; `pnpm check:doc-types` -> '✅ Every documented component type is registered.'; `pnpm check:doc-fences` -> '✅ check:doc-fences — every TypeScript block in 223 document(s) is fenced ts/tsx/typescript'; `pnpm docs:check-links` -> 'Links are valid across 15 scan roots.'; `pnpm check:skills-paths` -> '✅ check-skills-paths: OK (93/94 stated path(s) resolve across 18 guide file(s); 1 baselined).'. CHANGESET: read the presence gate's own verdict on this diff rather than assuming -- `GITHUB_BASE_REF=main node scripts/check-changeset-presence.mjs` exit 0, '✅ No source of a released package changed in this range, so no changeset is owed.' (3 files changed, 0 of them published source). No label applied; skip-changeset does not exist in this repo. CONSUMER SWEEP: grep -rn build-filter reaches 4 files; the workflow consumes through turbo (identical task set, measured), the 3 test assertions near the old format pin a STUBBED gate's stdout for objectui#6221's shell tests and not the real emission (still green unchanged), and the two prose sites were updated.",
"open_questions": [],
"out_of_scope_findings": []
}
Activity
claude commentedon Aug 25, 2026
Concentrated triage batch:
finding→pm:queue+domain:devx, Bug, S — the tool's own prescription fails:--build-filteremits only the packages the docs resolve against, not their dependency closure, so the printedpnpm buildcommand dies on the first workspace dep (@object-ui/i18n, measured). Fix: emit closure-including filters (pnpm's--filter pkg...dependency ellipsis) or compute the closure explicitly; acceptance = the printed command succeeds verbatim on a clean tree.Generated by Claude Code
yinlianghui-tw commentedon Aug 25, 2026
Claiming this issue.
session_019b5UBNMtTzKbVtZZGvFuxeclaude/issue-5911-build-filter-closureGenerated by Claude Code
yinlianghui-tw commentedon Aug 25, 2026
os-dev-report
{ "issue": 5911, "status": "done", "branch": "claude/issue-5911-build-filter-closure", "pr": "https://github.com/objectstack-ai/objectui/pull/6289", "premise_still_valid": true, "summary": "The closure gap is real and reproduced, but two things in the issue text are stale and the report corrects both. (1) The named example is gone: @object-ui/i18n is emitted directly today, so the missing packages are now @object-ui/collaboration, @object-ui/react-runtime, @object-ui/sdui-parser, @object-ui/providers, @object-ui/permissions, @object-ui/mobile. (2) More load-bearing: the gate's PRINTED remedy uses turbo, and turbo was never broken -- this repo's build task declares dependsOn ['^build'], so it supplied the closure all along; measured with turbo run build --dry-run=json, the bare list and the closure list select the IDENTICAL 33 tasks (only-in-NEW [], only-in-OLD []). The defect is live on the pnpm spelling, which wears the same --filter= flag and selects exactly what it matches. So the fix appends pnpm/turbo's '...' dependency-closure suffix to each emitted filter: a strict no-op for CI and for the printed command, and a fix for every other spelling. The emission moved into an exported buildFilterArgs so the SUFFIX is pinned by tests rather than the LIST, which is supposed to move as coverage grows. content/docs/guide/ci-cd-pipeline.md updated to say what the suffix is for.", "tests": "REPRODUCTION, from a fresh worktree measured at dists=0 tsbuildinfo=0. Gate emitted 21 bare --filter= words; a workspace-dep walk showed 6 packages the set depends on were absent. OLD list on the pnpm path: `pnpm $(bare) --workspace-concurrency=2 run build` -> EXIT=1, 'packages/components build: src/renderers/basic/div.tsx:10:32 - error TS2307: Cannot find module @object-ui/sdui-parser' and 'ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL @object-ui/components@17.6.0 build' -- same shape as filed, package names moved. Same OLD list through turbo (`pnpm build $(bare) --concurrency=2`) instead SUCCEEDED, 'Tasks: 32 successful, 32 total' -- that is the measurement that corrects the issue. AFTER the fix, reset again to dists=0 tsbuildinfo=0 (removed only the dirs the runs had built, count re-measured at 0): NEW list, same pnpm command -> EXIT=0, `grep -c 'TS2307\\|ERR_PNPM'` = 0. Selection: pnpm bare=21 packages, pnpm closure=33. GATE REAL VERDICT after the new-list build (not the precondition message): exit 0, 'Semantic phase: 267 of 267 block(s) judged, 0 failed.' / 'Every covered documentation snippet compiles against the built types.' NEW TESTS collected by name under --reporter=verbose: 'emits the dependency-closure suffix on every filter, so the build it prescribes is complete', 'keeps the emission sorted and shell-safe -- the workflow word-splits it unquoted', 'names every package it is given, so the closure suffix never replaces a name'; 'Test Files 1 passed (1)' / 'Tests 44 passed (44)'. ABLATION, run from the COMMITTED state so restoring is a checkout: stripped the '...' from the emission; mutation confirmed ON DISK before the run -- closure marker grep 1 -> 0, injected bare form 1, git diff --stat one line changed -- then 'Tests 3 failed | 41 passed (44)' with exactly the three new tests red. NO REBUILD LEG APPLIES and this is stated rather than skipped: the suite imports the gate as '../check-doc-snippet-types.mjs', a relative path to plain JS source, so no package exports and no dist/ sit between the mutation and the run. Restore leg confirmed: git status --short clean, marker back to 1, emission carrying '...'. GATES, all on final commit 3e9c50a63, every exit code captured by redirect before any pipe: `pnpm exec vitest run scripts/__tests__` -> 'Test Files 77 passed (77)' / 'Tests 2210 passed (2210)'; `pnpm type-check:scripts` exit 0 (positive control: echoed its script line 'tsc -p tsconfig.scripts.json'); `pnpm lint:root` UNNARROWED exit 0, verdict line '✖ 28 problems (0 errors, 28 warnings)' -- 0 errors, warnings pre-existing; `pnpm check:control-bytes` -> '✅ check-control-bytes: OK (scanned 5178 tracked text file(s); skipped 85 binary).' plus a self grep -naP over the diff with no hits; `pnpm check:doc-snippets` -> 'Every covered documentation snippet compiles against the built types.'; `pnpm check:doc-types` -> '✅ Every documented component type is registered.'; `pnpm check:doc-fences` -> '✅ check:doc-fences — every TypeScript block in 223 document(s) is fenced ts/tsx/typescript'; `pnpm docs:check-links` -> 'Links are valid across 15 scan roots.'; `pnpm check:skills-paths` -> '✅ check-skills-paths: OK (93/94 stated path(s) resolve across 18 guide file(s); 1 baselined).'. CHANGESET: read the presence gate's own verdict on this diff rather than assuming -- `GITHUB_BASE_REF=main node scripts/check-changeset-presence.mjs` exit 0, '✅ No source of a released package changed in this range, so no changeset is owed.' (3 files changed, 0 of them published source). No label applied; skip-changeset does not exist in this repo. CONSUMER SWEEP: grep -rn build-filter reaches 4 files; the workflow consumes through turbo (identical task set, measured), the 3 test assertions near the old format pin a STUBBED gate's stdout for objectui#6221's shell tests and not the real emission (still green unchanged), and the two prose sites were updated.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code