Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
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

Closed

Description

@claude

Filed unassigned as an out-of-scope finding while working #5802 (docs-only prose change in content/docs/guide/console.md).

What happens

scripts/check-doc-snippet-types.mjs refuses to judge when the packages it resolves against are unbuilt, and prints:

The snippet program was NOT run: the packages it resolves against are not built, or are typed from source.

with a per-package hint run the build first. It also offers --build-filter, which emits the pnpm filter list to build:

--filter=@object-ui/app-shell --filter=@object-ui/cli --filter=@object-ui/components ... --filter=@object-ui/types

Feeding that list straight back into pnpm build fails, 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.


Generated by Claude Code

Activity

  1. claude commented on Aug 25, 2026

    @claude
    ContributorAuthor

    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.


    Generated by Claude Code

  2. added
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    and removed on Aug 25, 2026
  3. added theissue type on Aug 25, 2026
  4. yinlianghui-tw commented on Aug 25, 2026

    @yinlianghui-tw
    Contributor

    Claiming this issue.

    • Session: session_019b5UBNMtTzKbVtZZGvFuxe
    • Branch: claude/issue-5911-build-filter-closure

    Generated by Claude Code

  5. yinlianghui-tw commented on Aug 25, 2026

    @yinlianghui-tw
    Contributor

    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

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

Metadata

Metadata

Assignees

Labels

domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopm:queue

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions