Skip to content

ci(ui-merge): the pre-install import graph reads the repository root's workflows; objectui's prompt files move to the root .github/prompts/ - #25957

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-6qe56u
Oct 26, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-6qe56u

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Tesla · project thread

Part of #25712 (4b PR 2d-3a: the pre-install import graph reads the root workflows, and the prompt files move to the root .github/prompts/).
Part of objectstack#25677.

Clause-②: no
Metadata-protocol: none

维护者速读(草稿)

  • 改了什么:
    • check-pre-install-import-graph 的总体改为从仓库根目录的 .github/workflows/ 推导。它只收根 workflow 里在 install 之前运行 objectui gate 的步骤,写法有三种:pnpm --dir ui run <alias>(经 ui/package.json 解析)、node ui/scripts/<x>、pnpm --dir ui exec node scripts/<x>。
    • ui/.github/prompts/ 下的 3 个 prompt 文件原样移到根目录 .github/prompts/。check:prompt-keys 改为在仓库根读取 prompt,在 objectui 根推导 registry。
    • 两个 gate 的测试随之改读根目录,markdown-test-inputs ledger 删掉 3 个已移走的路径。
  • 为什么改: 这个 gate 原来读嵌套的 ui/.github/workflows/,那里有 10 个永远不会运行的步骤还在引用已删除的 scripts/objectstack-pin.mjs,所以它在 main 上一直是红的(Queue-flake anchor: scripts/__tests__/check-pre-install-import-graph.test.ts #25863,24 小时内有 11 个 PR 因此被踢出合并队列)。本 PR 合入后,这一行变绿。prompt 文件移到根目录,VS Code 才能读到。
  • 风险与代价(含回滚): 不动任何 workflow,也不动受管面(.github/prompts/ 不在受管清单里,也没有 CODEOWNERS 规则)。在 2d-3c 给 ui 过滤器加上 .github/prompts/** 之前,只改 prompt 的 PR 不会触发 Lint UI 和 Test UI(见 F16)。回滚 = revert 本 PR。
  • 席位意见:(留空)
  • 你要做的: 无。Tier S,由席位落地。

席位核对

(left for the dispatch seat)

Why

GitHub runs only the repository root's .github/workflows/. Since the cutover (#25825), objectui's own workflows sit at ui/.github/workflows/ and run nowhere. check-pre-install-import-graph derived its population from that directory. Ten of the steps there still run the deleted scripts/objectstack-pin.mjs, so the gate, and Test UI with it, has been red on main with unresolved: scripts/objectstack-pin.mjs (#25863).

This is the first of three PRs that finish 2d (the dispatcher's split of 2026-10-26):

  • 2d-3a (this PR, Tier S): the two gate retargets and the prompts move;
  • 2d-3b (Tier S): the other 25 test files that read a nested workflow;
  • 2d-3c (Tier H): deletes ui/.github/workflows/** and ui/.github/dependabot.yml, and changes the Lint UI steps.

What changes

  • ui/scripts/check-pre-install-import-graph.mjs.
    • The workflows are read from workflowRoot(), the parent of the objectui root. Only the root workflow steps that run an objectui gate before their job's first install count, in three spellings:
      • pnpm --dir ui run <alias>. The alias is resolved through ui/package.json's scripts, and every node scripts/<x> in its body is a row. This is the spelling the root ci.yml prescribes for objectui's commands.
      • node ui/scripts/<x>.
      • pnpm --dir ui exec node scripts/<x>.
    • A bare node scripts/<x> in a root workflow is objectstack's own script, resolved against the repository root, and stays out of the population.
    • The install boundary, the import-graph walk and the findings are unchanged.
    • The self-test gains four cases (the three spellings and the root's own script), for 20 in all. --list names the alias each row came through.
  • check-pre-install-import-graph.test.ts.
    • The derivation fixtures use the root spelling (node ui/scripts/<x>). One new case covers the alias spelling and the exclusion of the root's own scripts.
    • The real-tree floor lists the four root rows: type-check-ui → check-type-check-coverage, and lint-ui → check-lint-coverage, check-entry-guard, check-bash32-floor.
    • The gate is not in its own derived population until the root Lint UI job runs it, so the self-membership case now walks the gate's graph by name. 2d-3c adds that step, as ci(ui-merge): run objectui's Repo Gates in the root Lint UI job (18 of 19; the pre-install import graph waits for ui/.github to retire) #25902's comment in the root ci.yml schedules.
    • The header pointer check resolves .github/workflows against the repository root.
  • Prompts. ui/.github/prompts/{component,engine,ui-library}.prompt.md move to .github/prompts/ unchanged. VS Code reads prompt files from the workspace root.
  • ui/scripts/check-prompt-component-keys.mjs.
    • promptsRoot() (the repository root) is where .github/prompts/ is read.
    • The registry is still derived under the objectui root. analyze() takes the prompts root as an option. A fixture tree passes one directory for both roots, so the fixture cases are unchanged.
    • The CLI defaults to the repository root, and it has a --prompts-root flag.
  • check-prompt-component-keys.test.ts.
    • The live-tree cases read the root prompts.
    • Two cases are new: no prompt file is left under the objectui root, and the bare command, as CI runs it, scans the root prompts and passes.
  • ui/scripts/markdown-test-inputs.mjs. The three prompt paths leave the two entries that declared them (ci-cd-pipeline-doc, dollar-dialect-alias-census), because they are no longer in the objectui tree. --audit: 114 candidates, all adjudicated, 81 entries, all present.

Disposition table

# Subject Retired Kept / retargeted Carried by now
1 check-pre-install-import-graph population the read of ui/.github/workflows/ retargeted: root .github/workflows/, ui gates only root ci.yml (type-check-ui, lint-ui)
2 floor row changeset-guard.yml : no-major yes (none) roster row 3 (→ sub-issue 4)
3 floor row changeset-presence.yml : changeset-presence yes (none) roster row 4 (→ sub-issue 4)
4 floor row ci.yml : changeset-check yes (none) roster row 7, Changeset Fixed Group Check (→ sub-issue 4)
5 floor rows ci.yml : type-check and lint.yml : lint (entry guard) (none) retargeted: type-check-ui and lint-ui, plus lint-ui's other two pre-install gates roster rows 7 and 16 (ported in PR A)
6 the four repo-gates.yml : repo-gates floor rows from the floor for now they rejoin under lint-ui in 2d-3c #25880's port (#25902) of roster row 24
7 "is in its own population" the membership assertion, until 2d-3c retargeted: walks its own graph by name (no package, nothing unresolved) 2d-3c adds the gate's root Lint UI step
8 .github/prompts/*.prompt.md (3 files) (none) moved to the root root .github/prompts/
9 check-prompt-component-keys prompt surface the read of ui/.github/prompts/ retargeted: promptsRoot() root .github/prompts/

Untouched here: the pre-install test's wiring and header-count sections still read objectui's repo-gates.yml, the gate's home until 2d-3c gives it a root step. ui/.github/labeler.yml stays, pending sub-issue 4 (F12 = B).

Follow-up rows (not folded here)

  • F16. The root filter job's ui globs (ui/**, the lockfile, the workspace file, turbo.json, ci.yml) do not match .github/prompts/**. So a PR that only changes a prompt runs neither Lint UI (where check:prompt-keys runs once ci(ui-merge): run objectui's Repo Gates in the root Lint UI job (18 of 19; the pre-install import graph waits for ui/.github to retire) #25902 lands) nor Test UI. Proposed for 2d-3c: add .github/prompts/** to the ui filter in root ci.yml (Tier H).

  • F17. The moved prompts cite paths relative to the objectui root, and objectui's script names. Read from the repository root, some of these are wrong:

    • packages/components/src/renderers/action/, packages/fields/src/widgets/types.ts and apps/console need a ui/ prefix;
    • pnpm check:prompt-keys needs pnpm --dir ui run check:prompt-keys.
    • The packages/spec/... paths in engine.prompt.md already resolve from the root.

    This PR moves the files unchanged. The content edit belongs with 2h (the instruction-file rewrite) or sub-issue 4.

Verification

This head is main d65cbb61 (with #25940) plus two commits. Test runs are from ui/, per ui/AGENTS.md.

Run Result
Gate, real tree: node scripts/check-pre-install-import-graph.mjs ✅ 4 pre-install steps in 2 jobs run 4 gates; 6 modules walked
Same derivation over #25902's root ci.yml (6f2cb2ab) 18 rows in 2 jobs (type-check-ui 1, lint-ui 17), 23 modules, 0 findings
Gate power: a typescript import added to scripts/check-lint-coverage.mjs ❌ scripts/check-lint-coverage.mjs reaches the package typescript (reverted)
node scripts/check-pre-install-import-graph.mjs --self-test 20 cases pass
node scripts/check-prompt-component-keys.mjs OK: 3 prompt files, 32 taught keys, 452 authorable
The 2 modified test files plus markdown-test-inputs, dollar-dialect-alias-census, markdown-fence-scan 5 files, 163 tests passed at this head
Whole scripts/__tests__ suite, at this head 182 files passed, 2 skipped; 5,369 tests passed, 2 skipped, 0 failed. check-pre-install-import-graph, the base red, is green.
The 2 modified test files with ui/.github/workflows/ and ui/.github/dependabot.yml moved aside (the 2d-3c layout) check-prompt-component-keys: 47 passed. check-pre-install-import-graph: red on ENOENT ui/.github/workflows/repo-gates.yml, its sections 4 and 5, which 2d-3c retargets with the gate's root Lint UI step (see "Untouched here").
pnpm type-check:scripts the one error is packages/components/src/renderers/action/resolve-icon.ts(265,69) TS2339, identical on unmodified main; none in a touched file
pnpm exec eslint --max-warnings=0 (touched files), lint:coverage, check:test-path-roots, check:entry-guard, markdown-test-inputs --audit all exit 0

Derived gates (node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack): 29 families from this PR's 11 paths (the tool counts each moved file as two). All 29 exit 0, and --ran reconciles 29 run, 0 NOT-MEASURED, 0 UNRUN. The slowest were check:query-options-erasure (340 s), check-comment-mask-corpus (233 s) and check:engine-double-contract (73 s).

Push-environment battery (GITHUB_ACTIONS=true GITHUB_EVENT_NAME=push node scripts/pm/check-dispatch-gates.mjs, both tiers), at this head: ✓ dispatch-gates self-test: 2182 cases pass. (fast 1917 cases in 402.5 s, slow 265 in 1144.5 s), exit 0, 0 failed.

CI at this head: 58 check runs, 45 passed, 13 skipped, 0 failed.

🤖 Generated with Claude Code

https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS

…m the repository root's workflows

GitHub runs only the root .github/workflows/. The gate read objectui's
nested ui/.github/workflows/, which runs nowhere since the monorepo merge,
and went red on ten dead steps that still name the deleted
scripts/objectstack-pin.mjs.

The population is now the root workflow steps, ahead of their job's install,
that run an objectui gate: `pnpm --dir ui run <alias>` resolved through
ui/package.json, `node ui/scripts/<x>`, or `pnpm --dir ui exec node
scripts/<x>`. A bare `node scripts/<x>` in a root workflow is the root's own
script and stays out. The self-test gains the four spelling cases.

The test's floor lists the root rows: type-check-ui's coverage check and
lint-ui's three gates. The rest of objectui#6148's table ran in workflows
nothing runs. Each one is named with the roster row of the #25697 audit
that carries it, or with the port that brings it back. The gate is not in
its own derived population until the root Lint UI job runs it, so the test
walks its graph by name. The header's pointer resolves against the root.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
…mpts/, and check:prompt-keys reads them there

VS Code reads prompt files from the workspace root's .github/prompts/, and
objectui's nested .github/ is being retired. The three *.prompt.md files
move unchanged.

check-prompt-component-keys derives its registry under the objectui root
and now reads the prompts under a separate root. promptsRoot() is the
repository root. analyze() takes it as an option, and a fixture tree
passes one directory for both roots, so the fixture cases are unchanged.
The CLI defaults to the repository root and has a --prompts-root flag.
The live-tree cases read the root prompts. Two new cases cover the move:
no prompt file is left under the objectui root, and the bare command,
as CI runs it, passes.

The markdown-test-inputs ledger drops the three prompt paths from the two
entries that declared them; they are no longer under the objectui tree.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 26, 2026
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tests labels Oct 26, 2026
@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 26, 2026 06:11
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 26, 2026
Merged via the queue into main with commit 0c37228 Oct 26, 2026
66 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-6qe56u branch October 26, 2026 06:51
os-tesla pushed a commit that referenced this pull request Oct 26, 2026
…derives 30 to 40

#25957 retargeted check:pre-install-import-graph at the root workflows,
and it is green on the merged tree, so the step held back for 2d-3 runs
now. The F13 rule re-derived with the gates' ~174 s added (558 + 174 =
732 s) gives 40; turbo-cache-save-bound.test.ts pins the new value.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015MoCPtpv6AtTo899tF8Ktq
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants