Skip to content

Commit aa2f8e3

Browse files
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)
<!-- claude-projects-attribution: {"github_login":"os-tesla"} --> _Requested by **Tesla** · [project thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6JaoAqVfFyhsxKuFcEP9YTBj25)_ 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`,这些文件自合仓(#25825)以来从未运行。每个文件对应 #25697 roster 的一行(见下表)。`ui/.github/labeler.yml` 保留(F12 = B)。 - 按 PM 裁定 B,退役 objectui 的 action-ref 约定扫描:删除脚本、测试、`package.json` 别名,并从根 `ci.yml` 的 `lint-ui` 作业中去掉这一步。 - 按 Q4 删除 `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 的豁免行。 - **为什么改:** 嵌套 workflow 在 monorepo 中永不运行;读它们的测试已由 2d-1、2d-2、2d-3a、2d-3b 全部迁走,本 PR 收尾删除。 - **风险与代价(含回滚):** 不新增任何 CI 步骤;唯一的 CI 行为变化是 `Lint UI` 少跑一步 action-ref 扫描。标为 "kept, follow-up port" 的 workflow 由后续移植从本 PR 父提交的 git 历史中读取。回滚 = revert 本 PR。 - **已裁定(#25712,2026-10-26 10:47Z,选项 (b)):** objectui 队列守卫登记表中的 `.github/workflows/**` 行(objectui#12255「两仓加治理行」)保留,其存在性检查改为经根登记表判定(本分支最后一个提交)。事实与选项见下文。 - **你要做的:** 作为 Tier H 审批本 PR。 ## 席位核对 (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 at `ui/.github/workflows/` and its `ui/.github/dependabot.yml` have run nowhere. The earlier PRs of #25712 moved every test that read them: - 2c (#25861) and 2d-1 (#25879): the readers of objectui's `ci.yml`; - 2d-2a (#25904) and 2d-2b (#25940): the single-workflow readers; - 2d-3a (#25957): the pre-install import graph scan and the prompt-keys gate; - 2d-3b (#26013): the Lint UI, Repo Gates and governance-workflow readers. The Repo Gates steps run in the root `lint-ui` job 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 - **Deleted: `ui/.github/workflows/**` (26 files) and `ui/.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.yml` already covers the one root `pnpm-lock.yaml`, which includes `ui/` (npm, `directory: "/"`), and the root workflows (`github-actions`). - **Retired: the action-ref convention scan (ruling B).** Deleted: `ui/scripts/check-action-ref-convention.mjs`, its test, the `check:action-ref-convention` alias, and the `Action Ref Convention` step of the root `lint-ui` job. It was written for objectui's workflows. On the root workflows, the convention it encodes is not this repository's (#25559 pins third-party actions by SHA), and Lint UI runs only on the `ui` filter, so a workflow-only change would skip it. The Repo Gates comment block in `ci.yml` now names the retirement and no longer counts its gates. A repository-wide convention goes to sub-issue 4 (**F22**). - **Retired: `ui/scripts/__tests__/ci-cd-pipeline-doc.test.ts` (Q4).** It held `ui/content/docs/guide/ci-cd-pipeline.md` to 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 names `check-pre-install-import-graph.test.ts` in its place. - **Retargeted: `check-pre-install-import-graph.test.ts` sections 3–5** (33 → 37 cases). These sections read objectui's `repo-gates.yml`; they now read the root `ci.yml`'s `lint-ui` job by path, through `helpers/root-ci.ts`: - One step runs both legs, self-test first, before the install. - The root trigger filters no path and subscribes `merge_group`. - The `ui` filter matches `.github/workflows/ci.yml` and the gate. - No other job or root workflow runs the gate. - The step keeps the `Pre-Install Import Graph 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: `check-control-bytes`, `check-doc-component-types`, `check-doc-links` and `check-skills-paths`, now derived under `lint-ui`. - The self-walk case asserts that the gate is in its own derived population. - No pre-install step is added: #25902 carries it. - **`scripts/check-closing-keyword-parity.mjs`** drops its `NON_PARSERS` row for `ui/.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.ts`** carries 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. | Deleted file | Roster row | Disposition (roster) | Carried by now | |---|---|---|---| | `board-snapshot.yml` | 1 | → sub-issue 4 | root `board-snapshot.yml` | | `changelog.yml` | 2 | → sub-issue 4 | (none) | | `changeset-guard.yml` | 3 | → sub-issue 4 | (none); its pins retired in 2d-3b | | `changeset-presence.yml` | 4 | → sub-issue 4 | root `pr-automation.yml` `Check Changeset` | | `check-links.yml` | 6 | → sub-issue 4 | root `check-links.yml` (root trees only) | | `ci.yml` | 7 | Type Check, Test, Build & E2E **ported in PR A**; the rest → sub-issue 4 or kept, follow-up port | root `ci.yml` `type-check-ui`, `test-ui`, `build-e2e-ui` | | `cross-repo-issue-closer.yml` | 8 | → sub-issue 4 | root `cross-repo-issue-closer.yml` | | `dependabot-auto-merge.yml` | 9 | → sub-issue 4 | (none) | | `docs-deploy.yml` | 10 | → sub-issue 4 | (none; objectui's site is a separate Vercel project) | | `governed-surface-guard.yml` | 11 | covered by root `governed-surface-guard.yml` → sub-issue 4 | root guard; its register governs `ui/.github/workflows/**` at Tier H | | `half-state-patrol.yml` | 12 | covered by root `half-state-patrol.yml` → sub-issue 4 | root `half-state-patrol.yml` | | `hook-selftests.yml` | 13 | covered by root `lint.yml` → sub-issue 4 | root `lint.yml` (not `ui/.claude/hooks`) | | `labeler.yml` | 14 | covered by root `pr-automation.yml` `Auto Label` → sub-issue 4 | root `Auto Label`; `ui/.github/labeler.yml` (the config) stays, F12 = B | | `line-citation-gate.yml` | 15 | → sub-issue 4 | (none) | | `lint.yml` | 16 | **ported in PR A** → `Lint UI` | root `ci.yml` `lint-ui` | | `live-e2e.yml` | 17 | kept, follow-up port | (none until ported) | | `lockfile-dedupe.yml` | 18 | kept, follow-up port | (none until ported) | | `lockfile-integrity.yml` | 19 | kept, follow-up port | (none until ported) | | `merge-queue-head-patrol.yml` | 20 | → sub-issue 4 | root `merge-queue-triage.yml` | | `node-esm-load-gate.yml` | 21 | kept, follow-up port | (none until ported) | | `performance-budget.yml` | 22 | kept, follow-up port (fold into `Build & E2E UI`) | (none until ported) | | `published-dist-gate.yml` | 23 | kept, follow-up port | (none until ported) | | `repo-gates.yml` | 24 | → sub-issue 4 | root `ci.yml` `lint-ui` (#25902), less the action-ref scan (ruling B) | | `required-check-set-patrol.yml` | 25 | covered by root `required-set-patrol.yml` → sub-issue 4 | root `required-set-patrol.yml` | | `shadcn-check.yml` | 26 | kept, follow-up port | (none until ported) | | `test-shard-timings-refresh.yml` | 28 | → sub-issue 4 | root `shard-timings-refresh.yml` (core only) | | `ui/.github/dependabot.yml` | (not a workflow) | | root `.github/dependabot.yml` (`npm` and `github-actions` at `/`) | 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_SURFACES` in `ui/scripts/check-governed-queue-guard.mjs` declares six rows. Its `workflows` row (prefix `.github/workflows/`) was added by the maintainer's ruling on objectui#12255 (「两仓加治理行」). In objectui, `ui/.github/workflows/governed-surface-guard.yml` ran this guard, and a pull request touching a workflow could not pass the merge queue without an approval from `GOVERNED_APPROVERS` (os-zhuang, hotlong). In this repository the row protects nothing at runtime: - No root workflow runs the ui guard. Its only runner was that nested workflow, and `check:governed-queue-guard` is the self-test alone. - The protection of `ui/.github/workflows/**` is carried by root files: - the register in `scripts/pm/check-governed-merges.mjs` (row `ui-workflows`, Tier H); - `.github/workflows/governed-surface-guard.yml`, which enforces that register; - `.github/CODEOWNERS` (`/ui/.github/workflows/ @os-zhuang @hotlong`); - the governed lists in `AGENTS.md`, `.claude/skills/pm-dispatch/SKILL.md` and `scripts/pm/check-governed-prose.mjs`. **What happens when the nested workflows are deleted.** - The ui row names a directory that no longer exists. Its test `every declared surface exists in this tree` goes red. This is the only red case in the deletion layout, measured with the whole suite. - The root `ui-workflows` row needs no existing path: its self-test uses specimen strings. It keeps any re-created `ui/.github/workflows/` at Tier H. `node scripts/pm/check-governed-merges.mjs --test ui/.github/workflows/ci.yml` answers GOVERNED, tier H, row `ui-workflows`. - The CODEOWNERS line points at a missing path. That is harmless, and it is left as is. **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's `declares 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. - The root predicate, run by path, judges `ui/.github/workflows/ci.yml` GOVERNED at Tier H under `ui-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-guard` and `governed` aliases, and the register. It is the cleanest end state, and it is roster row 11's question ("the register must decide which `ui/**` 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.yml` stays (F12 = B, sub-issue 4). - The root register row `ui-workflows`, the CODEOWNERS line, and the governed lists in `AGENTS.md`, `pm-dispatch/SKILL.md` and `check-governed-prose.mjs`: governance, sub-issue 4 and 2h. They are named in the ruled section above. - `ui/scripts/dependabot-merge-gate.mjs` still names `Repo Gates` and 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.md` describes 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: 1. `enforced console budget` (row 22) 2. `advisory package size tiers` (row 22) 3. `workflow inventory`: every workflow has a section and every section a workflow (rows 1–28) 4. `lockfile merge driver` 5. `ci.yml job table` (row 7), with its nested `what each job runs` 6. `lint.yml step list` (row 16) 7. `contexts that can never be required (#4170)` (rows 7, 17, 25) 8. `live-e2e backend pin (#7689)` (row 17) 9. `Half-State Patrol wiring (#8043, objectui#11174)` (row 12) 10. `the Playwright report claim (#8238)` (row 17) 11. `live-e2e.yml — the run conclusion may not contradict the job (#8084)` (row 17) 12. `the vi-mock and shadcn sections` (rows 24, 26) 13. `the four sections measured as parity defects`, with its nested `the eager-closure half of the budget step` (rows 22, 24) 14. `populations are pointed at, never counted in prose` 15. `command parity, every workflow section` The 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: - the page itself; - `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.ts` and `ci-setup-pnpm-wiring.test.ts`; - `ui/e2e/live/ci/backend.env` and `ui/e2e/live/saved-view-filter.spec.ts`; - `ui/packages/auth/src/__tests__/reserved-auth-features.test.ts`. - **F16 (open).** `check:prompt-keys` in `lint-ui` reads the root `.github/prompts/` (2d-3a), but the `ui` filter has no `.github/prompts/**` glob, so a prompts-only change skips Lint UI. - **F19, F20** stand as listed on #26013: the `workflow-checks.ts` parser has no caller, and `check-cross-repo-closer-outcome.mjs` lost its subject. - **F21 (new).** The pre-install import graph scan reads every root workflow, but the `ui` filter names only `.github/workflows/ci.yml`. A change to another root workflow alone does not start Lint UI. Today only `ci.yml` carries a ui pre-install step. - **F22 (new, ruling B).** A repository-wide action-ref convention needs a home that no path filter skips. #25559's SHA-pin practice is the reference. ## Verification Head `b8af88b8`, on `main` `0d83ee8f`. 37 files, +140 / −14224. Tier H by path (`.github/workflows/**`, `ui/.github/workflows/**`) and by size. Test runs are from `ui/`, per `ui/AGENTS.md`. | Run | Result | |---|---| | Whole `scripts/__tests__` suite | 180 files passed, 2 skipped; 5216 tests passed, 2 skipped. Without the last commit, exactly one case is red: `check-governed-queue-guard` `every 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.ts` | 4 files, 79 tests passed (`check-pre-install-import-graph` 33 → 37, `check-governed-queue-guard` 9 → 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-floor` | all exit 0; the audit reads "114 candidate test files, all adjudicated" | | `node scripts/check-closing-keyword-parity.mjs` and `--self-test` (repository root) | both exit 0; the sweep reads "all registered" | | `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 | Gate sweep on `b8af88b8`: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derives 87 families for this diff. All 87 ran and exited 0, `pnpm check:pm-dispatch-gates` included. `--ran` reconciliation: 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`) on `b8af88b8`: ✓ 2182 cases pass, 0 failed (fast tier 1917 in 446.9 s, slow tier 265 in 1168.9 s), exit 0. It also passed on `39ca5878`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent be78977 commit aa2f8e3

37 files changed

Lines changed: 140 additions & 14224 deletions

‎.github/workflows/ci.yml‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3791,9 +3791,10 @@ jobs:
37913791
pnpm --dir ui run check:bash32-floor
37923792
37933793
# ── objectui's Repo Gates (objectstack#25880) ────────────────────────
3794-
# The nineteen gates of `ui/.github/workflows/repo-gates.yml`, which
3795-
# GitHub stopped running when the tree moved under `ui/` (it reads only
3796-
# this repository's `.github/workflows/`). They judge what objectui ships
3794+
# The gates of objectui's `repo-gates.yml`, which GitHub stopped running
3795+
# when the tree moved under `ui/` (it reads only this repository's
3796+
# `.github/workflows/`), and which objectstack#25712 deleted with the
3797+
# rest of `ui/.github/workflows/`. They judge what objectui ships
37973798
# — `ui/content/docs/**`, `ui/skills/**`, the package READMEs and the
37983799
# documented component types — so the change most likely to trip them is
37993800
# a docs-only or skills-only PR, which the `filter` job's `ui` globs
@@ -3808,15 +3809,14 @@ jobs:
38083809
# `.objectstack-pin` restore / build / save (the merged tree builds
38093810
# `@objectstack/*` from the workspace, see the header above
38103811
# `type-check-ui`) and the turbo-cache report / prune bookkeeping (this
3811-
# job's own restore and save serve the build below).
3812+
# job's own restore and save serve the build below). Retired since: the
3813+
# Action Ref Convention scan, which judged objectui's own workflows and
3814+
# went with them (objectstack#25712); a repository-wide action-ref
3815+
# convention needs a home that no `ui` path filter skips (sub-issue 4).
38123816
- name: Control Byte Scan — Scan tracked text files for raw control bytes
38133817
if: ${{ !cancelled() }}
38143818
run: pnpm --dir ui run check:control-bytes
38153819

3816-
- name: Action Ref Convention — Check action reference spelling against the declared convention
3817-
if: ${{ !cancelled() }}
3818-
run: pnpm --dir ui run check:action-ref-convention
3819-
38203820
# Self-test first: a scan whose recogniser is broken reports a clean
38213821
# tree. It derives its population from this repository's workflows, so
38223822
# it walks this job's install-free steps, itself included.

‎scripts/check-closing-keyword-parity.mjs‎

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -210,14 +210,9 @@ const NON_PARSERS = [
210210
file: SELF,
211211
why: 'this gate -- it carries the keyword set as its own MUTATION ANCHORS (X4) and as the specimen the sweep self-test plants',
212212
},
213-
// The three below arrived with the objectui import under ui/. The closer copy
214-
// IS a parser in its own repository, but GitHub runs workflows only from the
215-
// root .github/workflows, so here it never executes; the governance fold that
216-
// deletes ui/.github removes the first row and, with the harness, the third.
217-
{
218-
file: 'ui/.github/workflows/cross-repo-issue-closer.yml',
219-
why: 'the imported objectui copy of the closer -- inert in this repository (GitHub runs only the root .github/workflows), so it closes nothing here; it goes when ui/.github is folded into the root',
220-
},
213+
// The two below arrived with the objectui import under ui/. A third, objectui's
214+
// copy of the closer workflow, left with ui/.github/workflows (objectstack#25712);
215+
// the harness row goes with the closer's roster row in sub-issue 4.
221216
{
222217
file: 'ui/AGENTS.md',
223218
why: 'the imported objectui agent guide -- it quotes the keyword alternation in prose, warning that the closer ignores negation; it parses nothing',

‎ui/.github/dependabot.yml‎

Lines changed: 0 additions & 68 deletions
This file was deleted.

0 commit comments

Comments
 (0)