Repository navigation
ci(ui-merge): delete objectui's nested workflows and Dependabot config; retire the action-ref scan and the CI page pin test with them - #26058
Merged
Conversation
…ed the CI page to `ci-cd-pipeline-doc.test.ts` held `content/docs/guide/ci-cd-pipeline.md` to objectui's own workflows under `ui/.github/workflows/`: the console budget, the workflow inventory, the ci.yml job table, the lint.yml step list, live-e2e, the half-state patrol, and command parity for every workflow section. GitHub runs none of those workflows since the cutover, and the next change deletes them, so the page describes CI that no longer exists and the test that held it to that CI retires with it. Rewriting or retiring the page goes to sub-issue 4. The markdown-test-inputs ledger drops its entry. `scripts-type-check` names another gate pin test in its by-name coverage list. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
…ui job Sections 4 and 5 of `check-pre-install-import-graph.test.ts` read objectui's `repo-gates.yml`, which GitHub never runs under the monorepo and which the next change deletes. objectstack#25902 ported its steps into the root `ci.yml`'s `lint-ui` job, so the wiring pins read that job by path: one step runs both legs, before the install; the root trigger filters no path and subscribes merge_group; the `ui` filter matches `ci.yml` and the gate; no other job or root workflow runs it; the step keeps the check name. The header count pin and the measurement-point pin read the job's comments. Section 3's floor gains the four repo-gates rows its comment scheduled for this change, now derived under `lint-ui`, and the self-walk case asserts the gate is in its own derived population. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
…orkflows `check:action-ref-convention` checks how `uses:` refs are spelled across `.github/workflows/`, against a table of declared exceptions. It was written for objectui's own workflows. objectstack#25902 ported it into the root `lint-ui` job, where it reads the root workflows. That ruling is B on objectstack#25712: the scan retires along with the nested workflows instead of being re-aimed. Two reasons: - On the root workflows, the convention it encodes is not the repository's. objectstack pins third-party actions by SHA (#25559). - Lint UI runs only on the `ui` path filter, so a workflow-only change would skip it anyway. A repository-wide action-ref convention needs a home that no path filter skips, and that goes to sub-issue 4. This change drops the step, its package alias, the script and its test. The Repo Gates comment block in `ci.yml` now names the retirement and no longer counts its gates. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
GitHub runs only the repository root's `.github/workflows/` and reads only the root `.github/dependabot.yml`. So since the cutover (#25825), the 26 workflows under `ui/.github/workflows/` and `ui/.github/dependabot.yml` have run nowhere. They are deleted here, each against its row of the #25697 workflow roster: the Type Check, Test, Build & E2E and Lint jobs were ported into the root `ci.yml` in PR A, Repo Gates by #25902, and the rest go to sub-issue 4 or a follow-up port. A port reads the deleted file from git history at the parent of this change. The earlier 2d PRs moved every test that read these files. `ui/.github/labeler.yml` stays until sub-issue 4 rules on it (F12 = B). `check-closing-keyword-parity` drops its exemption row for objectui's copy of the cross-repo closer, as that row's own comment scheduled. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
…oot register (pending a ruling) objectui's queue-guard register declares `.github/workflows/**` by the maintainer's ruling on objectui#12255, and `every declared surface exists in this tree` reads each row's directory under `ui/`. That directory is gone with the nested workflows. The guard that runs is the root one, and its register governs `ui/.github/workflows/**` at Tier H. So for that row, the existence case gives way to a case that asks the root predicate, by path, and that goes red again if the directory comes back. This is one of three options for a maintainer decision on objectstack#25712: drop the row, keep it as here, or retire this register for the root one in sub-issue 4. It is a separate commit so the ruling can replace it. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
os-zhuang
approved these changes
Oct 26, 2026
This was referenced Oct 26, 2026
This was referenced Oct 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Tesla · project thread
Part of #25712 (4b PR 2d-3c: delete objectui's nested workflows; Tier H).
Part of objectstack#25677.
Clause-②: no
Metadata-protocol: none
维护者速读(草稿)
ui/.github/workflows/下全部 26 个 objectui workflow 和ui/.github/dependabot.yml。GitHub 只运行根目录.github/workflows/、只读根目录dependabot.yml,这些文件自合仓(merge(ui): objectui becomes the ui/ workspace of this repository — subtree import at the frozen tip 9e1fe03286 plus the adaptation series (objectstack#25752) #25825)以来从未运行。每个文件对应 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 roster 的一行(见下表)。ui/.github/labeler.yml保留(F12 = B)。package.json别名,并从根ci.yml的lint-ui作业中去掉这一步。ci-cd-pipeline-doc.test.ts:它把 CI 文档页钉在这些已删除的 workflow 上。15 个 describe 列为 sub-issue 4 重写该页的清单(F14)。check-pre-install-import-graph的接线测试改为按路径读根ci.yml的lint-ui。根check-closing-keyword-parity去掉指向已删 workflow 的豁免行。Lint UI少跑一步 action-ref 扫描。标为 "kept, follow-up port" 的 workflow 由后续移植从本 PR 父提交的 git 历史中读取。回滚 = revert 本 PR。objectui#,ui/AGENTS.mdnests, 18 governance workflows merged or retired (parent #25677, 4b/6) #25712,2026-10-26 10:47Z,选项 (b)): objectui 队列守卫登记表中的.github/workflows/**行(objectui#12255「两仓加治理行」)保留,其存在性检查改为经根登记表判定(本分支最后一个提交)。事实与选项见下文。席位核对
(left for the dispatch seat)
Why
GitHub runs only the repository root's
.github/workflows/and reads only the root.github/dependabot.yml. Since the cutover (#25825), objectui's 26 workflows atui/.github/workflows/and itsui/.github/dependabot.ymlhave run nowhere. The earlier PRs of #25712 moved every test that read them:ci.yml;The Repo Gates steps run in the root
lint-uijob since #25902. This PR deletes the files and retires the two readers that had no root carrier: the action-ref scan (ruling B) and the CI page pin test (Q4).What changes
ui/.github/workflows/**(26 files) andui/.github/dependabot.yml. Each workflow is accounted for in the table below. A follow-up port reads the deleted file from git at this PR's parent. The root.github/dependabot.ymlalready covers the one rootpnpm-lock.yaml, which includesui/(npm,directory: "/"), and the root workflows (github-actions).ui/scripts/check-action-ref-convention.mjs, its test, thecheck:action-ref-conventionalias, and theAction Ref Conventionstep of the rootlint-uijob. It was written for objectui's workflows. On the root workflows, the convention it encodes is not this repository's (ci: pin credential-holding third-party actions by sha, and pass the Turbo cache credentials only to merge-queue and main runs #25559 pins third-party actions by SHA), and Lint UI runs only on theuifilter, so a workflow-only change would skip it. The Repo Gates comment block inci.ymlnow names the retirement and no longer counts its gates. A repository-wide convention goes to sub-issue 4 (F22).ui/scripts/__tests__/ci-cd-pipeline-doc.test.ts(Q4). It heldui/content/docs/guide/ci-cd-pipeline.mdto the deleted workflows. The page now describes CI that no longer exists. F14 (widened) rewrites or retires it in sub-issue 4, and the test's 15 describes are its checklist (below). The markdown-test-inputs ledger drops the test's entry.scripts-type-check's by-name coverage list namescheck-pre-install-import-graph.test.tsin its place.check-pre-install-import-graph.test.tssections 3–5 (33 → 37 cases). These sections read objectui'srepo-gates.yml; they now read the rootci.yml'slint-uijob by path, throughhelpers/root-ci.ts:merge_group.uifilter matches.github/workflows/ci.ymland the gate.Pre-Install Import Graph Checkname.repo-gatesrows its comment scheduled for this change:check-control-bytes,check-doc-component-types,check-doc-linksandcheck-skills-paths, now derived underlint-ui.scripts/check-closing-keyword-parity.mjsdrops itsNON_PARSERSrow forui/.github/workflows/cross-repo-issue-closer.yml, as that row's comment scheduled. The sweep fails on an exemption that matches nothing.check-governed-queue-guard.test.tscarries the recommended option (b) for the open question below, in its own commit.Deleted workflows, by roster row
Roster = the #25697 workflow audit (comment 6388182608). "kept, follow-up port" files are read from git at this PR's parent when ported.
board-snapshot.ymlboard-snapshot.ymlchangelog.ymlchangeset-guard.ymlchangeset-presence.ymlpr-automation.ymlCheck Changesetcheck-links.ymlcheck-links.yml(root trees only)ci.ymlci.ymltype-check-ui,test-ui,build-e2e-uicross-repo-issue-closer.ymlcross-repo-issue-closer.ymldependabot-auto-merge.ymldocs-deploy.ymlgoverned-surface-guard.ymlgoverned-surface-guard.yml→ sub-issue 4ui/.github/workflows/**at Tier Hhalf-state-patrol.ymlhalf-state-patrol.yml→ sub-issue 4half-state-patrol.ymlhook-selftests.ymllint.yml→ sub-issue 4lint.yml(notui/.claude/hooks)labeler.ymlpr-automation.ymlAuto Label→ sub-issue 4Auto Label;ui/.github/labeler.yml(the config) stays, F12 = Bline-citation-gate.ymllint.ymlLint UIci.ymllint-uilive-e2e.ymllockfile-dedupe.ymllockfile-integrity.ymlmerge-queue-head-patrol.ymlmerge-queue-triage.ymlnode-esm-load-gate.ymlperformance-budget.ymlBuild & E2E UI)published-dist-gate.ymlrepo-gates.ymlci.ymllint-ui(#25902), less the action-ref scan (ruling B)required-check-set-patrol.ymlrequired-set-patrol.yml→ sub-issue 4required-set-patrol.ymlshadcn-check.ymltest-shard-timings-refresh.ymlshard-timings-refresh.yml(core only)ui/.github/dependabot.yml.github/dependabot.yml(npmandgithub-actionsat/)Rows 5 (
changeset-release.yml) and 27 (spec-range-floors.yml) were deleted earlier.Ruled (b): the ui register's
.github/workflows/**row (objectui#12255)The maintainer ruled (b) on #25712 at 2026-10-26 10:47Z (comment 6414192040). The last commit carries it. Its code comment still reads "PENDING the maintainer's call"; the queue holds this branch, so that comment is corrected in the next #25712 PR.
What the row protects today.
GOVERNED_SURFACESinui/scripts/check-governed-queue-guard.mjsdeclares six rows. Itsworkflowsrow (prefix.github/workflows/) was added by the maintainer's ruling on objectui#12255 (「两仓加治理行」). In objectui,ui/.github/workflows/governed-surface-guard.ymlran this guard, and a pull request touching a workflow could not pass the merge queue without an approval fromGOVERNED_APPROVERS(os-zhuang, hotlong). In this repository the row protects nothing at runtime:check:governed-queue-guardis the self-test alone.ui/.github/workflows/**is carried by root files:scripts/pm/check-governed-merges.mjs(rowui-workflows, Tier H);.github/workflows/governed-surface-guard.yml, which enforces that register;.github/CODEOWNERS(/ui/.github/workflows/ @os-zhuang @hotlong);AGENTS.md,.claude/skills/pm-dispatch/SKILL.mdandscripts/pm/check-governed-prose.mjs.What happens when the nested workflows are deleted.
every declared surface exists in this treegoes red. This is the only red case in the deletion layout, measured with the whole suite.ui-workflowsrow needs no existing path: its self-test uses specimen strings. It keeps any re-createdui/.github/workflows/at Tier H.node scripts/pm/check-governed-merges.mjs --test ui/.github/workflows/ci.ymlanswers GOVERNED, tier H, rowui-workflows.Options.
(a) Drop the row from the ui register (6 → 5). This edits the register and the self-test assertions the ruling added:
the-register-declares-exactly-the-six-ruled-surfaces, the glob list, the reversed "governs its own workflow" pins and the test'sdeclares exactly the six ruled surfaces. In form it reverses objectui#12255, so it needs the maintainer's word. The root row is unchanged.(b) Keep the row; read it through the root register (recommended for this PR; on the branch). The existence case covers the other five rows. A new case asserts two things:
ui/.github/workflows/is absent. If it comes back, the case goes red and asks for the row to rejoin the existence check.ui/.github/workflows/ci.ymlGOVERNED at Tier H underui-workflows.No ruling is touched. The diff is one test file, +32/−3.
(c) Retire the ui queue guard and its register for the root one. That means the script, its test, the
check:governed-queue-guardandgovernedaliases, and the register. It is the cleanest end state, and it is roster row 11's question ("the register must decide whichui/**paths are governed"), so it belongs in sub-issue 4 rather than here.(d) Keep a placeholder under
ui/.github/workflows/(for example a README pointing at the root) so the row has a target. Not recommended: it keeps a directory whose only job is to satisfy a test.Why (b): it is the smallest change that keeps the record true, leaves the ruling and the root rule as they are, and hands the register question to (c) in sub-issue 4, where it belongs.
Unchanged here, on purpose
ui/.github/labeler.ymlstays (F12 = B, sub-issue 4).ui-workflows, the CODEOWNERS line, and the governed lists inAGENTS.md,pm-dispatch/SKILL.mdandcheck-governed-prose.mjs: governance, sub-issue 4 and 2h. They are named in the ruled section above.ui/scripts/dependabot-merge-gate.mjsstill namesRepo Gatesand describes the action-ref step in comments. That is objectui's Dependabot register, roster row 9 (sub-issue 4).Follow-up rows
F14 (widened, Q4).
ui/content/docs/guide/ci-cd-pipeline.mddescribes the deleted CI. Sub-issue 4 rewrites it for the root workflows or retires it. The retired test's 15 describes are the rewrite checklist, each a claim the page made that a rewrite must re-establish or drop:enforced console budget(row 22)advisory package size tiers(row 22)workflow inventory: every workflow has a section and every section a workflow (rows 1–28)lockfile merge driverci.yml job table(row 7), with its nestedwhat each job runslint.yml step list(row 16)contexts that can never be required (#4170)(rows 7, 17, 25)live-e2e backend pin (#7689)(row 17)Half-State Patrol wiring (#8043, objectui#11174)(row 12)the Playwright report claim (#8238)(row 17)live-e2e.yml — the run conclusion may not contradict the job (#8084)(row 17)the vi-mock and shadcn sections(rows 24, 26)the four sections measured as parity defects, with its nestedthe eager-closure half of the budget step(rows 22, 24)populations are pointed at, never counted in prosecommand parity, every workflow sectionThe page's Action Ref Convention section (and its pointer near the release-lane text) goes with ruling B. These comments cite the retired test and go stale with it; the rewrite should sweep them:
ui/scripts/check-lockfile-integrity.mjs;check-skill-eval-tokens.test.ts,check-skill-examples.test.ts,check-doc-example-types.test.ts,doc-version-claims.test.tsandci-setup-pnpm-wiring.test.ts;ui/e2e/live/ci/backend.envandui/e2e/live/saved-view-filter.spec.ts;ui/packages/auth/src/__tests__/reserved-auth-features.test.ts.F16 (open).
check:prompt-keysinlint-uireads the root.github/prompts/(2d-3a), but theuifilter has no.github/prompts/**glob, so a prompts-only change skips Lint UI.F19, F20 stand as listed on test(ui-merge): the ui tests stop reading objectui's nested workflows — Lint UI and Repo Gates readers pin the root lint-ui job, governance pins retire with their roster rows #26013: the
workflow-checks.tsparser has no caller, andcheck-cross-repo-closer-outcome.mjslost its subject.F21 (new). The pre-install import graph scan reads every root workflow, but the
uifilter names only.github/workflows/ci.yml. A change to another root workflow alone does not start Lint UI. Today onlyci.ymlcarries a ui pre-install step.F22 (new, ruling B). A repository-wide action-ref convention needs a home that no path filter skips. ci: pin credential-holding third-party actions by sha, and pass the Turbo cache credentials only to merge-queue and main runs #25559's SHA-pin practice is the reference.
Verification
Head
b8af88b8, onmain0d83ee8f. 37 files, +140 / −14224. Tier H by path (.github/workflows/**,ui/.github/workflows/**) and by size.Test runs are from
ui/, perui/AGENTS.md.scripts/__tests__suitecheck-governed-queue-guardevery declared surface exists in this tree, the ruled question above.check-pre-install-import-graph.test.ts,check-governed-queue-guard.test.ts,scripts-type-check.test.ts,markdown-test-inputs.test.tscheck-pre-install-import-graph33 → 37,check-governed-queue-guard9 → 10)pnpm exec eslint --max-warnings=0(touched files),markdown-test-inputs --audit,lint:coverage,check:entry-guard,check:pre-install-import-graph(both legs),check:test-path-roots,check:bash32-floornode scripts/check-closing-keyword-parity.mjsand--self-test(repository root)pnpm type-check:scriptspackages/components/src/renderers/action/resolve-icon.ts(265,69)TS2339, identical on unmodifiedmain; none in a touched fileGate sweep on
b8af88b8:node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 87 families for this diff. All 87 ran and exited 0,pnpm check:pm-dispatch-gatesincluded.--ranreconciliation: 87 derived, 87 run, 0 NOT-MEASURED, 0 UNRUN.Push-environment battery (
GITHUB_ACTIONS=true GITHUB_EVENT_NAME=push node scripts/pm/check-dispatch-gates.mjs) onb8af88b8: ✓ 2182 cases pass, 0 failed (fast tier 1917 in 446.9 s, slow tier 265 in 1168.9 s), exit 0. It also passed on39ca5878.🤖 Generated with Claude Code
https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS