Repository navigation
test(ui-merge): the ui gate-wiring pins read the root ci.yml that runs them; pins on jobs it did not port retire - #25879
Conversation
…s them; pins on jobs it did not port retire GitHub runs only the repository root's .github/workflows/. objectui's ci.yml under ui/.github/ runs nowhere, yet 28 ui/scripts/__tests__ files read it. - New scripts/__tests__/helpers/root-ci.ts reads the root ci.yml by path (workspaceRoot()), slices a job, reads the filter job's ui: globs, and spells objectui's commands as `pnpm --dir ui run <alias>`. - 17 files retarget their wiring pins to the root type-check-ui, test-ui and build-e2e-ui jobs. The path-filter pins now assert that the root triggers carry no path filter and that the ui: filter globs cover each gate's surface. - 11 files retire pins on objectui jobs the root did not port: the coverage lane, Build Docs, the shard aggregate, the timings upload, the affected-test and type-check-scope selectors, objectui's turbo-cache rule and its cache-save bound. Each retirement comment names the workflow roster row that carries it. Four of these files had nothing else to pin and are deleted, and markdown-test-inputs.mjs drops the two ledger rows whose literals went with them. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
…st-ui job through helpers/root-ci Claude-Session: https://claude.ai/code/session_015oJuSyTy7Y3cm91KJMEW2m Co-Authored-By: Claude <noreply@anthropic.com>
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 40261620902 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Requested by Tesla · project thread
Part of #25712 (4b PR 2d-1: the
ui/scripts/__tests__files that readui/.github/workflows/ci.ymlread the root ci.yml instead, or retire).Part of objectstack#25677.
Clause-②: no
Metadata-protocol: none
维护者速读(草稿)
ui/scripts/__tests__里有 28 个测试文件读的是嵌套的ui/.github/workflows/ci.yml,而这个文件在 monorepo 里根本不会运行(GitHub 只运行仓库根目录的.github/workflows/)。本 PR 新增一个小 helper,按路径读根目录的ci.yml。17 个文件改为断言根ci.yml里真正运行的type-check-ui/test-ui/build-e2e-ui任务;另外 11 个文件里,凡是断言对象是根目录没有移植的 objectui 任务(coverage、Build Docs、shard 汇总、timings 上传、两个选择器、turbo 缓存规则)的用例,都退役,并在原处写明由 tooling(ui-wiring): objectstack-side inert wiring for theui/workspace — workspace globs, root turbo tasks, path-filtered ui test/typecheck/lint/E2E jobs, spec change compiles the Console; pin gates retire at cutover (parent #25677, 3/6) #25697 workflow 清单的哪一行承接。其中 4 个文件没有别的内容,整文件删除。ui/.github/。删之前这 28 个文件必须先不依赖它,否则删除时会红 28 个文件。改完以后,无论ui/.github/在不在,这 28 个文件都是绿的。type-check-ui的 Turbo 缓存保存没有 objectui#6577 的上限(把那组 pin 指向根任务,6 条里 5 条红)。按 PM 的裁定不在本 PR 里改根 workflow,只列为 follow-up。回滚 = revert 本 PR。席位核对
(left for the dispatch seat)
Why
GitHub runs only the repository root's
.github/workflows/. Since the cutover (#25825), objectui's ownci.ymlsits atui/.github/workflows/ci.ymland runs nowhere. Its four jobs that matter were ported into the rootci.ymlby #25697:Type Checkbecametype-check-ui,Testbecametest-ui,Build & E2Ebecamebuild-e2e-ui, andlint.yml'sLintbecamelint-ui.The 2d census (local,
maine167956eplus 2c, withui/.github/deleted; per-file table below) found that deletingui/.github/reds 81ui/scripts/__tests__files. Thirty of them readui/.github/workflows/ci.yml. Two of those thirty,markdown-test-inputs.test.tsandselect-affected-tests-wiring.test.ts, belong to #25851 and are not touched here. This PR is the other 28. The 51 files that scan the workflow directory or read other single workflows are 2d-2 and 2d-3.The rule for each pin, per the dispatcher's ruling: retarget it to the root workflow by path, or, when the root did not port its subject, retire it and name the roster row (#25697, comment 6388182608) or the root job that now carries the subject. Nothing is skipped, and nothing is folded into a root workflow here; work worth folding is listed as follow-up rows.
What changes
ui/scripts/__tests__/helpers/root-ci.ts. It reads<workspaceRoot()>/.github/workflows/ci.ymland never a copy underui/. It provides:jobBlock(ci, key), which throws on a missing job, so a renamed job is a red pin and never an empty block;triggerBlockandwithoutComments;uiFilterGlobs, thefilterjob'sui:paths filter, which throws on an empty list;globMatchesandrepoPath;uiRun(alias), which returnspnpm --dir ui run <alias>, the root's spelling of objectui's commands.pnpm install --frozen-lockfile", "before or after turbo'stype-checktask", "fetch-depth: 0above the step". The three path-filter pins asserted that objectui'spushpaths-ignoredid not hide a surface. They now assert two things: the root triggers carry no path filter at all, and thefilterjob'sui:globs cover each surface the gate judges, which is what the job'sif:reads.coverage-shard-reporter-readability,coverage-shard-width,docs-build-triggerandturbo-cache-save-bound. The pure-module cases in the other seven stay, for examplecheck-test-shard-results's budget sizing, which reads only constants.ui/scripts/markdown-test-inputs.mjsdrops two ledger rows:docs-build-trigger.test.ts(deleted) andcheck-action-forward-parity.test.ts, whose only markdown literal (content/docs/guide/ci-cd-pipeline.md, an argument to the old matcher self-check) went with the retargeted pin.markdown-test-inputs.test.tsitself is not touched. Without these two removals it reportsstale-test.Disposition table (28 files)
ui/.github/workflows/ci.ymlcheck-action-forward-paritypushpaths-ignoretype-check-ui; no trigger path filter;ui:globs cover everySURFACESfilecheck-doc-example-shared-readertype-check-uicheck-handler-key-read-sitestype-check-uicheck-i18n-call-site-keystype-check-uicheck-i18n-designer-table-paritypaths-ignoretype-check-ui;ui:globs cover the designer table and the gatecheck-i18n-en-driftfetch-depth: 0;paths-ignoretype-check-ui(fetch-depth: 0);ui:globs cover the 10 packs, the ledger and the designer tablecheck-lucide-icon-record-namespnpm <alias>anywhererun: pnpm --dir ui run <alias>check-object-metadata-write-doorstype-check-uicheck-package-self-importtype-checktype-check-uicheck-phantom-dependenciestype-checktype-check-uicheck-unreferenced-sourcestype-checktype-check-uicheck-published-tsconfig-tooling-excludepublished-dist-gate.ymltype-check-ui;published-dist-gate.ymlis roster row 23 (kept, follow-up port)check-pending-changeset-literalsDecide whether this change needs a full runexclude pathspecstest-uireads theuioutput;ui:globs coverscripts/andpackages/test sourcesscripts-type-checktype-checkjob, step after installtype-check-uivitest-config-type-checkpnpm type-checktype-check-ui, beforepnpm exec turbo run type-checkvitest-setup-type-checkpnpm type-checktype-check-ui, afterpnpm exec turbo run type-checkensure-chromium-readyci.ymlandlive-e2e.ymluse the script, no--with-depslive-e2ehalf retiredbuild-e2e-ui;live-e2e.ymlis roster row 17 (kept, follow-up port)check-doc-expression-carriagenode scripts/check-doc-expression-carriage.mjsindocsBuild Docs (@object-ui/site)(kept, follow-up port); the page-row pin stayscheck-test-shard-resultstest-aggregatewiring; theTest (shard N/M)nameTest (the shard aggregate)(dropped until cutover; port with objectstack's shard attestation)shard-headroomtest-aggregateandcoverage-reporttest-file-timingstestjob name, timing reporter, upload; refresh--shardstest-shard-timings-refresh.yml(→ sub-issue 4; "restore Test UI's timings reporter and upload");test-ui's comment records the waitselect-affected-testsSelect the tests this change affectswiringTest (shard n/16):test-uiruns the whole suite and does not wire the selectorselect-type-check-scopetc-scopestep,TURBO_FORCE, root-programs buildType Check:type-check-uiuses turbo...[base]and its own root-programs build stepreport-turbo-cachetype-checkprune and save; every workflow's turbo cache* UIjobs carry objectstack's cache steps (job key,build-corefallback, push-only save, no prune or report); follow-up F2coverage-shard-reporter-readability(deleted, 4 cases)test-coveragereporter flagscoverage-shard-width(deleted, 5 cases)test-coverageandcoverage-reportwidthdocs-build-trigger(deleted, 17 cases)docsjob'sdocs-changesdecision stepBuild Docs(kept, follow-up port)turbo-cache-save-bound(deleted, 6 cases)type-check's split, bounded cache savetype-check-uicarries the save but not the bound; measured below; follow-up F1Follow-up rows (fold-worthy, not done here)
* UIjobs' Turbo cache saves the objectui#6577 / #7048 way: split restore and save,timeout-minutes,continue-on-error, thecache-hitguard, and a ceiling that leaves the verdict room. Then restoreturbo-cache-save-bound's pins againsttype-check-ui.type-check-uijob by a scratch copy, fail 5 of 6. Only "save after the last command" holds. The other five fail because the job keeps a combinedactions/cache(the pnpm store), its save has no bound,continue-on-errororcache-hitguard, and its ceiling is 40 minutes. Fixing it is a rootci.ymledit (Tier H), and the dispatcher ruled no folds into root workflows in these PRs.report-turbo-cache.mjs(prune before save, restored-key notice), or retire the script.check-test-shard-results.mjsandshard-headroom.mjs.coverage-nightly.yml, then restore the reporter and width pins.Build Docs (@object-ui/site): port, then restoredocs-build-trigger's derived closure and the carriage-census wiring pin.test-uiwith the refresh workflow, then restoretest-file-timings's ci pins.select-affected-tests.mjsintotest-uionce itsgit diffpaths are cwd-relative, or retire it, and the same forselect-type-check-scope.mjs.live-e2e.yml(row 17) andpublished-dist-gate.yml(row 23) ports bring their workflow halves back.Verification
Run from
ui/perui/AGENTS.md, at this head (mainc475b45bplus this commit):markdown-test-inputs.test.ts, withui/.github/presentui/.github/moved aside (the 2d-3 layout)markdown-test-inputs.test.tsfails at collection onENOENT ui/.github/workflows/ci.yml; that file is #25851's.scripts/__tests__suite,--shard=1/4through4/4, underscripts/pm/os-verify-lock.shpnpm type-check:scriptspackages/components/src/renderers/action/resolve-icon.ts(265,69)TS2339, identical on unmodifiedmainhere; none in a touched filepnpm exec eslint(touched files),pnpm lint:root,lint:coverage,check:test-path-roots,check:ui-root-lookups,check:lint-rule-coverage,check:entry-guard,check:vi-mock-override-shape; rootpnpm check:test-source-aliasOf the 26 suite failures, one is the owned row from 2c (
check-pre-install-import-graph,unresolved: scripts/objectstack-pin.mjs; it clears in 2d-3 with the nested workflows). The other 25 aredate-only-zone-pins-10183×23 andunit-registry-absence-collision×2. They fail identically on a cleanmaincheckout here ("ran no case at all" on this unbuilt box), so they are not this diff's.Derived gates (
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackfrom this diff): 18 families, all exit 0 at this head.--ranreconciles 18 run, 0 NOT-MEASURED, 0 UNRUN. The slowest werecheck:query-options-erasure(308 s),check:type-check-debt(287 s) andcheck-comment-mask-corpus(208 s).The 2d census: what deleting
ui/.github/reds (81 files; 30 readci.yml)Local,
maine167956eplus 2c, whole suite in two shards withui/.github/deleted. 83 files fail. Two of them (date-only-zone-pins-10183,unit-registry-absence-collision) fail identically on cleanmainon that box. The other 81 readui/.github/.ui/.github/workflows/ci.yml(30 files): rows 1–28 above, plus hourly full run: red on main (Lint & Type Check) #25851'smarkdown-test-inputsandselect-affected-tests-wiring.check-doc-component-types,check-doc-example-ids,check-doc-example-types,check-doc-json-fences,check-doc-snippet-types,check-hand-rolled-comment-mask,check-i18n-dead-keys,check-lint-rule-coverage,check-lockfile-dedupe,check-lockfile-integrity,check-pre-install-import-graph,check-prompt-component-keys,check-published-dist-tooling,check-readme-exports,check-shell-escape-residue,check-skill-eval-tokens,check-skill-examples,check-skills-paths,check-vi-mock-inherit,check-vi-mock-specifiers,ci-setup-pnpm-wiring,dependabot-merge-gate,docs-links-workflow,merge-queue-reporting,workflow-cache-save-bound,doc-version-claims,labeler-package-coverage(.github/labeler.yml).repo-gates.yml:check-action-ref-convention,check-control-bytes,check-doc-fence-languages,check-doc-snippet-emitted-census,check-docs-route-eager-closure;lint.yml:bash32-floor-wiring,check-test-path-roots,check-vi-mock-override-shape,entry-guard-wiring,lint-workflow;changeset-presence.yml:check-changeset-claims,check-changeset-presence,render-changeset-claims-comment;changeset-guard.yml:check-changeset-no-major,check-changeset-overwrite;performance-budget.yml:check-eager-closure-budget,ci-cd-pipeline-doc,render-budget-comment;check-governed-queue-guard(governed-surface-guard.yml),check-links-workflow(check-links.yml),check-merge-queue-head(merge-queue-head-patrol.yml),check-new-cross-file-line-citations(line-citation-gate.yml),check-required-check-set(dependabot-auto-merge.yml,required-check-set-patrol.yml),shadcn-check-report(shadcn-check.yml).🤖 Generated with Claude Code
https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS