Skip to content

ci: Type Check red on every PR that touches no workspace package since objectui#12222 (PR #12251): the scoped turbo run builds no dist, then type-check:vitest-setup cannot resolve the five packages the root setup files import #12272

Closed

Description

@objectstack-fleet

Filing gate ①: a measured defect with a named landing point, .github/workflows/ci.yml job type-check (the steps Run type-check and Type-check repo-root vitest setup files) and scripts/select-type-check-scope.mjs. Filed by the director seat (summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB) on a regression from its own lane's landing, objectui#12222 → PR #12251 (merge 1ce8db8d, 14:41Z), found on PR #12262 at the maintainer's word 「12262 红了」. ⛔ Not a claim; the claim follows in this act, under the standing order 「三仓的 ci 优化卡你负责派发」. Blocks: PR #12262 (approved, readied and auto-merge armed by the maintainer at 21:35Z) and every pull request whose diff touches no workspace package (workflow-only, docs-only, scripts/__tests__-only diffs; the lane's own weekly refresh PRs are candidates).

What is measured

PR #12262, head c819b74b (the maintainer's merge of main 7af0ab37 into the branch; the diff is .github/workflows/spec-main-shape-gate.yml, scripts/__tests__/spec-main-shape-gate.test.ts, content/docs/guide/ci-cd-pipeline.md). The Type Check job 115018179844 of run 38311534599, from its log:

Governing text

  • objectui#12222's ACCEPT (6126154639) and landing (6126541762): two speeds, the affected set on pull requests and the queue, the full workspace on push and schedule; nothing deleted or weakened.
  • ci.yml, the type-check job: "⛔ Raising timeout-minutes: 20 is not the fix".

What to build (measure first, then pick; say which and why)

The root tsc steps need the built typings of the packages they import. Routes: (A) in the affected scope, add those packages to the turbo filter (--filter=...[BASE] plus --filter=<pkg> for the five) so their build runs, replayed from the cache when unchanged, before the root step; (B) make type-check:vitest-setup (and any sibling root step that imports packages: read type-check:scripts, type-check:vitest-config, type-check:e2e) a turbo root task with dependsOn on those packages' build and its own inputs (the shape objectui#12222 gave //#type-check:e2e), run through turbo in both scopes; (C) skipping the root step on an empty affected set is ⛔ not enough alone (the non-empty case without the five fails the same way) and would weaken a check. Keep the push/schedule path byte-identical. scripts/select-type-check-scope.mjs's self-test gains the empty case and the "affected set without the five" case, whichever route is taken.

Acceptance

  • A pull request whose diff touches no workspace package gets Type Check green with the root tsc steps run, not skipped: PR ci(spec-main-shape-gate): drop the merge_group trigger now the context is out of the required set (objectui#12252) #12262 is the live case (after this lands the seat merges origin/main into it and reads its run). A package-only diff whose affected closure lacks the five is green too (the dev's own probe or a fixture, quoted in the PR body). main's next push run unchanged.
  • The CI doc and the pins that read the job (scripts/__tests__/ci-cd-pipeline-doc.test.ts, turbo-test-inputs, whatever names the steps) follow.

Related: objectui#12222 · PR #12251 · PR #12262 (blocked by this) · PR #12263 (its run takes scope=workspace: root files changed).

Activity

  1. added
    bugSomething isn't working
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    and removed on Oct 12, 2026
  2. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · the director seat dispatching on the maintainer's word 「12262 红了」 and the standing order 「三仓的 ci 优化卡你负责派发」, on a regression from this seat's own lane (objectui#12222 → PR #12251) (this seat's session, 2026-10-12T21:46Z)
    Session: session_01LqNgdPZB2Jnr5HpGbaqLeB
    Account: os-zhuang
    Branch: claude/issue-12272-typecheck-root-dist
    Worktree: objectui-issue-12272
    Domain: domain:devx
    Seat: domain:devx#9
    File surface: .github/workflows/ci.yml (the type-check job only: the scope decision, Run type-check, Type-check repo-root vitest setup files and the comments that explain them), scripts/select-type-check-scope.mjs and its self-test, turbo.json only if route B adds a root task block for type-check:vitest-setup (and its inputs), content/docs/guide/ci-cd-pipeline.md only where a pin requires the job's steps named, the pins that read the job (scripts/__tests__/ci-cd-pipeline-doc.test.ts, turbo-test-inputs). ⛔ Not the test / test-coverage jobs, the aggregators, vitest.config.mts, any package.
    Container & model: M, mode:subagent, model: opus (a main-red-class CI regression on this seat's own landing: the judgment tier). Tier H (the round's posture for .github/workflows/**): draft until a GOVERNED_APPROVERS member approves; the seat then lands it.
    Clause-②: no
    Responsibility: the type-check job's affected scope from PR #12251 (objectui#12222, this seat's lane) | none: in the affected scope no step builds the packages the root tsc steps import | every pull request whose affected set is empty or lacks the five packages the root setup files import; PR #12262 today, blocked
    Thread-read: none
    Ruling-ref: objectui#12222's ACCEPT 6126154639 and landing record 6126541762 (two speeds; nothing deleted or weakened); the maintainer's word 「12262 红了」 (2026-10-12)
    Serial constraints cleared: PR #12263 (objectui#12208 + #12256) is in the merge queue with auto-merge armed and touches ci.yml's test, test-coverage and aggregator jobs and turbo.json's test inputs; this card's hunks are the type-check job and, for route B, turbo.json's root task block: disjoint. Merge origin/main once PR #12263 is merged (minutes away) before opening the PR, and again before the seat lands; ⛔ no rebase. PR #12262 (objectui#12252) is the blocked live case: ⛔ do not push to it; the seat merges origin/main into it after this lands.
    Resume-from: none

  3. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
    "issue": 12272,
    "status": "done",
    "branch": "claude/issue-12272-typecheck-root-dist",
    "pr": "#12277",
    "session": "session_01LqNgdPZB2Jnr5HpGbaqLeB — the dispatching seat's session (this run is its subagent)",
    "premise_still_valid": true,
    "summary": "Defect reproduced locally on 7af0ab3 (empty diff: selector scope=affected, turbo 0 tasks, pnpm type-check:vitest-setup exit 2 with the same four TS2882 and one TS2307 as PR #12262). Fix: ci.yml's type-check job gains one step, Build the packages the repo-root programs import, between Run type-check and Type-check repo-root vitest setup files, gated on scope == 'affected' (so push/schedule skip it and the full battery runs exactly as before). It runs pnpm exec turbo run build with one --filter per package; the package list is read on every run out of tsconfig.vitest-setup.json's paths by the new node scripts/select-type-check-scope.mjs --root-builds (TypeScript's own config parser, each target walked up to its package), never copied. Draft PR #12277, Type Check of its own run in_progress at report time (check-run 115033524773).",
    "route": "Neither A as worded nor B: a corrected A, measured first. A as worded (the five added to the turbo run type-check filter) builds only 3 of 5: type-check waits on ^build (dependencies' builds) and never builds a named package's own, so plugin-dashboard and plugin-grid stay unbuilt (dry run). PKG#build on the type-check command line builds all 5 but also adds the five packages' type-check and the uncached e2e root task (23 tasks on an empty diff). Route B works only when the root task is named with the //# prefix (18 tasks empty diff, 20 on a plugin-ai diff; named bare the filter drops it, 0 tasks), but it changes the full battery's step, reverses the documented direct/uncached design of the root step, and touching turbo.json would make this PR scope=workspace. The chosen step leaves push/schedule unchanged, keeps the root step direct, keeps this PR package-less (its own run is the live defect path), and derives the list instead of copying it into dependsOn. Route C refused: a plugin-ai-only diff (non-empty set) fails the same way.",
    "hypotheses": {
    "H1": "Confirmed locally: warm, the build step replays 16 of 16 tasks (turbo 138 ms, step 1.1 s); cold, 16 tasks, 1 cached, turbo 2m3s on the shared 4-core box. On CI, main's pruned cache already replays builds: PR #12263's queue run notice reads 'build 35/35 replayed' from restored turbo-Linux-type-check-7af0ab37... The PR's own build-step notice (Repo-root program builds ... -- Cached: N cached, M total) is NOT MEASURED yet. The Report notice does not count these builds by design (the step writes no run summary so the Report keeps reading Run type-check's); the step's own notice carries turbo's Cached line instead, since job logs answer 403 from the container (measured on job 115018179844).",
    "H2": "Measured with --dry=json on a never-pushed probe commit: turbo run type-check //#type-check:vitest-setup --filter=...[HEAD] (empty diff) includes the root task and all five builds, 18 tasks; with --filter=...@object-ui/plugin-ai 20 tasks, root task included. Named bare (type-check:vitest-setup) the filter excludes it: 0 tasks on the empty diff, root task absent on the plugin-ai filter. Route B not taken (see route).",
    "H3": "Confirmed from the workflow and runs: merge_group uses QUEUE_BASE through the same selector, so a package-less queue build takes the same zero-package path; the new step is gated on scope, not on event, so it covers merge_group. PR #12263's queue build (run 38312800712, Type Check job 115022286788) passed: turbo.json was in its diff, so scope=workspace (notice: build 35/35 replayed, type-check 0/45). No package-less queue build has run since PR #12251 (the merge_group CI runs listed: 38312800712 and 38288254719), so the queue-side red was not observed live.",
    "H4": "PR #12263 merged 2026-10-12T22:00:03Z as 1fb1ced; origin/main merged into the branch (merge 24c8c17), no rebase, no force-push. ci.yml and turbo.json auto-merged (disjoint hunks); one conflict in content/docs/guide/ci-cd-pipeline.md on two adjacent rows of the job table, resolved as this branch's type-check row and main's test row. Nothing pushed to PR #12262's branch."
    },
    "local_proof": "A one-off harness (not committed) parses ci.yml and runs the run: text of every type-check step from Decide which packages to type-check through Type-check repo-root vitest setup files as a pull_request event (GITHUB_OUTPUT, RUNNER_TEMP, if: and env: expressions evaluated), no dist/ before each run. Final head 24c8c17 against base 1fb1ced: 4 files changed, scope=affected, zero packages, build step 16/16 cached, vitest-setup exit 0. Cold at b1b76e0: 16 tasks built, vitest-setup exit 0. Affected set without the five: a never-pushed probe commit on 24c8c17 touching packages/plugin-ai/src/AIFormAssist.tsx: selector lists @object-ui/plugin-ai alone, Run type-check 10 tasks, build step 16/16 cached, vitest-setup exit 0.",
    "ablation": "Committed fix first. (1) bf00a18 with ci.yml replaced by the base's (step gone; grep count of the step name 1 to 0), dist removed: harness vitest-setup exit 2 with the five errors. (2) The plugin-ai probe with the same swap: exit 2 with exactly fields, plugin-dashboard, plugin-grid (the three a plugin-ai closure lacks). (3) Test level at bf00a18, same swap: select-type-check-scope.test.ts 1 failed / 19 passed, the new wiring test red. Each leg restored with git checkout HEAD -- .github/workflows/ci.yml under an EXIT/INT/TERM trap with absolute paths; restore proven by blob hash equal to the HEAD blob (4333c9ad...) and git diff HEAD empty; after (3) the file passes 20/20.",
    "tests": "At 24c8c17: pnpm exec vitest run --maxWorkers=2 over every test file that reads ci.yml, turbo.json, the CI doc, the selector or tsconfig.vitest-setup.json (git grep, 76 files) under os-verify-lock: Test Files 76 passed (76), Tests 2541 passed (2541), VERDICT command-exit 0. An earlier union at bf00a18 had 1 red (markdown-test-inputs: the new test walked a directory and named a .md path); fixed in 501d611 by reading the setup program's files from its tsconfig, both files then green (45 tests). select-type-check-scope.test.ts: 13 to 20 tests. Ablation and proofs as above.",
    "gates": "Hand-derived from objectui's workflows (dispatch-gates.mjs refuses objectui: 'REFUSING — asked for objectstack-ai/objectui, but this checkout is objectstack-ai/objectstack'). At 24c8c17, each exit captured before any pipe, all exit 0: check-control-bytes, check-action-ref-convention, check-shell-escape-residue, check-bash32-floor, check-doc-links, check-doc-example-ids, check-doc-component-types, check-doc-json-fences (first run exit 2 = prerequisite: types dist not built; re-run after a cached types build, exit 0), check-doc-fence-languages, check-new-cross-file-line-citations ('0 new citation(s)'), check-type-check-coverage, check-required-check-set --self-test, check-pre-install-import-graph, check-test-path-roots, check-lint-coverage, check-changeset-presence ('no changeset is owed'), check-entry-guard, check:docs-route-closure, pnpm type-check:scripts, eslint --no-inline-config over the changed script and test, strict YAML parse of ci.yml, control-byte grep of the four files. check-governed-queue-guard --test: NOT GOVERNED (draft held per the card's Tier H).",
    "files_changed": [
    ".github/workflows/ci.yml (type-check job only: the new step and the vitest-setup step's comment)",
    "scripts/select-type-check-scope.mjs (--root-builds, rootProgramPackages, ROOT_PROGRAMS_AFTER_BUILD, the affected verdict lists the root builds)",
    "scripts/tests/select-type-check-scope.test.ts (7 new cases)",
    "content/docs/guide/ci-cd-pipeline.md (the type-check row)"
    ],
    "deviations": [
    "Route is a corrected A (a separate turbo run build step), not A as worded, which measured insufficient; the step runs on the affected speed only (push/schedule skip it), so 'in both scopes' is met by the full battery's own ^build there, unchanged.",
    "The dispatch's 'your PR takes scope=workspace' is refuted: none of the four files is a root-rule file, so PR #12277's own Type Check run is the live package-less case.",
    "The selector has no --self-test flag; its self-test is scripts/tests/select-type-check-scope.test.ts, which gained the empty-affected and affected-without-the-five cases.",
    "Added a ::notice from the build step (turbo's Cached line), because job logs answer 403 from the container and the Report notice reads only Run type-check's run summary.",
    "tsconfig.vitest-setup.json is read (not edited) by the derivation.",
    "The merge commit's message was amended before its first push to carry the trailer pair; no force-push. Commit trailers are the model-free pair per objectui AGENTS.md, over the harness reminder's model-named line.",
    "Two never-pushed local probe commits (the H2 turbo.json probe, the plugin-ai probe) were created and reset locally to the pinned commit; the remote branch never held them.",
    "Labels: zero label writes; objectui's labeler applied documentation, configuration, ci/cd, tests."
    ],
    "not_measured": [
    "PR #12277's own Type Check run (check-run 115033524773, in_progress at report time): the live package-less case, including the build step's notice (H1 on CI).",
    "PR #12262 after this lands (the seat merges origin/main into it).",
    "A package-less merge_group build (none has run since PR #12251).",
    "actionlint (not installed); repo-wide pnpm lint (CI's Lint job)."
    ],
    "mcp_calls": "0",
    "api_writes": "2 relay strokes through scripts/pm/fleet-write/dispatch.mjs (objectstack-fleet[bot]): (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/12277/assignees (os-zhuang), read back 10218 bytes sent = stored; (2) this report = POST /repos//issues/12272/comments. git push is not REST. No label write.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none (承接者:无) · noted, not filed · tsconfig.vitest-setup.json's comment says the ci.yml step sits after pnpm type-check so the declarations exist; since objectui#12222 that holds on the full and workspace speeds only. Not edited: outside the claim's file surface, and a root tsconfig is a root-rule file (editing it would make this PR scope=workspace). In PR #12277's Acceptance notes."
    ]
    }


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT · PR #12277 (draft, head 24c8c17c) · director seat, the last objectui dispatch it finishes under the maintainer's new division of labour (「cloud 相关的任务你继续处理,其他任务归车道」), 2026-10-12T22:28Z

    Checked on GitHub and on the head's tree, not on the report's say-so:

    • PR shape: exists, draft, base main (merge-base 1fb1ced3: origin/main merged after PR ci(test): the coverage lane runs eight shards, then both test matrices shard by measured duration (objectui#12208, objectui#12256) #12263 landed, the CI doc's adjacent-row conflict resolved each side's own row), body line 1 Fixes #12272, assignee os-zhuang; 4 files, +234/−6 (ci.yml +46 in the type-check job only, the selector +78, its test +114, the CI doc's one row).
    • The fix, read in the tree: one new step Build the packages the repo-root programs import between Run type-check and Type-check repo-root vitest setup files, gated if: steps.relevant.outputs.should_run == 'true' && steps.tc-scope.outputs.scope == 'affected' (so push/schedule, scope=full, run exactly as before); it runs pnpm exec turbo run build --filter=<pkg>… over the list node scripts/select-type-check-scope.mjs --root-builds prints, which the selector derives on every run from tsconfig.vitest-setup.json's paths with TypeScript's own config parser (ROOT_PROGRAMS_AFTER_BUILD, rootProgramPackages), never a copied list; a ::notice carries turbo's Cached: line. The 16 non-comment lines the ci.yml diff adds are that step and nothing else.
    • The live proof, on this PR's own run: the diff is package-less (none of the four files is a root-rule file), so its Type Check run takes the very path PR ci(spec-main-shape-gate): drop the merge_group trigger now the context is out of the required set (objectui#12252) #12262 failed on: Type Check success on 24c8c17c (job 115033524773, 22:22–22:24Z), where PR ci(spec-main-shape-gate): drop the merge_group trigger now the context is out of the required set (objectui#12252) #12262's head c819b74b failed at the same step. The dev's local harness replays the job's steps from Decide which packages to type-check through the root tsc step: at the head, scope=affected with zero packages, the build step 16/16 cached, type-check:vitest-setup exit 0; cold, 16 tasks built, exit 0; a probe diff touching packages/plugin-ai alone (an affected set without the five) exit 0. Ablations with the step removed: exit 2 with the five errors on the empty diff, and with exactly fields, plugin-dashboard, plugin-grid on the plugin-ai diff (the three its closure lacks); the new wiring test red (1 of 20); restores proven.
    • The routes, measured: route A as worded builds only 3 of 5 (type-check depends on ^build, never a named package's own build); PKG#build on the type-check line adds the five type-checks and the uncached e2e root task (23 tasks on an empty diff); route B works only with the //# prefix and would change the full battery's step and turbo.json (making the PR scope=workspace); route C refused (the plugin-ai probe fails the same way). The chosen step is the smallest change that covers both the empty and the without-the-five cases on the affected speed and leaves the full speed byte-identical. Accepted.
    • Gates on the head, read at this act: green: Type Check, Build & E2E, Build Docs, Test (dist pins), Changeset Declaration / Claim Re-read / Fixed Group, Governed Surface Queue Guard, Line Citation Gate, Live E2E; running: the 12 Test shards, Lint, Repo Gates, Spec Main Shape Gate (advisory). Nothing red; landing waits for all green. The dev's union: 76 test files (2,541 tests) green under the lock; 19 check-* gates and type-check:scripts exit 0; eslint on the changed script and test; a strict YAML parse. dispatch-gates.mjs refuses objectui, so the gates were hand-derived from the workflows (a deviation accepted).
    • H3, worth the ledger: a package-less merge_group build takes the same zero-package path (QUEUE_BASE through the same selector) and none has run since PR ci(type-check): the turbo cache replays unchanged packages, and pull-request and queue runs type-check only what the change affects (objectui#12222) #12251, so the queue-side red was never observed live; the step is gated on scope, not event, so it covers the queue.
    • Tier and review face: NOT GOVERNED by the queue guard; the round's Tier H posture for .github/workflows/** → the maintainer approves, the seat readies and arms the queue. Contract review: none of the three faces.
    • Deviations accepted: the corrected route; the ::notice from the build step (job logs answer 403 from the container); tsconfig.vitest-setup.json read, not edited; the selector's self-test is its vitest file (no --self-test flag), 13 → 20 cases; the merge commit's message amended before its first push (no force-push); zero label writes. Writes: 2 relay strokes; mcp_calls 0.
    • Out of scope, carried (comment only): tsconfig.vitest-setup.json's comment says the ci.yml step runs after pnpm type-check so the declarations exist; true on the full and workspace speeds only. Carrier: the next edit of that root tsconfig (a root-rule file; editing it here would have made this PR scope=workspace).

    Landing: on all checks green and the maintainer's Approve, the seat readies the PR and arms the queue (the last objectui landing this seat does); then the seat merges origin/main into PR #12262's branch and reads its run (the live acceptance: Type Check green on a package-less PR), after which the maintainer's auto-merge on #12262 takes it. This card stays pm:dispatched until the landing record.

  5. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    LANDED — PR #12277 is MERGED (2026-10-12T23:11Z, approved by the maintainer, review 5496847263 on head 24c8c17c; readied and auto-merge armed by the seat on that approval; merge commit 48fb558d) and read in place on origin/main 48fb558d. Director seat, summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB, 2026-10-12T23:11Z: the last objectui landing this seat does under the maintainer's division of labour (「cloud 相关的任务你继续处理,其他任务归车道」).

    probe on origin/main want got
    ci.yml: the step Build the packages the repo-root programs import, gated on scope == 'affected' 1 1
    scripts/select-type-check-scope.mjs: rootProgramPackages and --root-builds present present
    the selector's test carries the new cases present present
    Run type-check step byte-identical to 1fb1ced3 (the full speed untouched) identical identical
  6. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    Live acceptance read: PR #12262's Type Check is green on the affected speed with the new step. Director seat, summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB, 2026-10-12T23:20Z.

    PR #12262's branch was updated from main (48fb558d, the merge of PR #12277) through the relay at 2026-10-12T23:13Z; its new head 654f8bbb is the same package-less diff that failed Type Check at c819b74b (run 38311534599, job 115018179844, 21:35–21:36Z: the defect this card was filed on).

    on head 654f8bbb, run 38320983456, job 115048751482 (23:13–23:15Z) want got
    Type Check conclusion success success
    the step Build the packages the repo-root programs import ran (scope affected) ran ran: @object-ui/components @object-ui/fields @object-ui/i18n @object-ui/plugin-dashboard @object-ui/plugin-grid -- Cached: 16 cached, 16 total, FULL TURBO in 118 ms
    pnpm type-check:vitest-setup (tsc -p tsconfig.vitest-setup.json) exit 0 exit 0, no diagnostics
    the type-check turbo run itself zero tasks, as before "No task ran in this turbo run" (the zero-task path PR #12251 opened; now harmless)

    Corrected in place by the seat at 2026-10-12T23:24Z: the failing job cited for c819b74b is 115018179844; the id first written was wrong.

  7. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    ContributorAuthor

    H3 read: the merge group's package-less path is covered. Director seat, 2026-10-12T23:43Z. The first package-less queue build since PR #12251 was PR #12262's merge group (run 38322151265, head a1a917a0, 23:26–23:38Z): Type Check success (job 115052481389, 23:26–23:28Z); its step Build the packages the repo-root programs import ran (success, 23:28:19–23:28:20Z, a cache replay) and Type-check repo-root vitest setup files exited 0 right after. With the live acceptance above (the pull_request speed, 6134498869) the card's acceptance is complete on both speeds the fix covers. Nothing further is owed here.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopriority:p1

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions