Repository navigation
Commit 39ca587
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)
<!-- 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-3b: the ui tests that read a nested workflow
whose root carrier is on `main`).
Part of objectstack#25677.
Clause-②: no
Metadata-protocol: none
## 维护者速读(草稿)
- **改了什么:**
- 23 个 ui 测试文件原来读取 `ui/.github/workflows/` 下的 objectui workflow,现在不再读。
- 读 `lint.yml` 的 5 个文件和读 `repo-gates.yml` 的 4 个文件,改为按路径读根目录 `ci.yml` 的
`lint-ui` 作业(#25902 已把 Repo Gates 移入该作业)。`markdown-test-inputs` 改为读根目录
`filter` 作业的 `ui` 过滤器和 `test-ui` 的 `if:`。
- 其余 13 个文件里断言治理 workflow 接线的用例退役。每个退役用例都在原处写明 #25697 roster
的行号,由该行负责以后迁移。读脚本、fixture、配置或 `package.json` 的用例全部保留。
- `check-governed-queue-guard.mjs` 自带的 `--self-test` 里也有读 workflow
的接线断言,同样退役。
- **为什么改:** GitHub 只运行仓库根目录的 `.github/workflows/`,嵌套的那些 workflow
永远不会运行,对它们做断言等于什么都没检查。2d-3c 要删除 `ui/.github/workflows/**`,这些测试必须先不再读它们。
- **风险与代价(含回滚):** 不动任何 workflow,也不动受管面。被退役的接线断言要等 sub-issue 4 把对应
workflow 迁到根目录时再按路径补回。回滚 = 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, so a pin on one of them asserts
nothing GitHub does. 2d-3c deletes that directory. Before it can, every
test that reads it has to stop. This PR handles the readers whose root
carrier is already on `main`:
- 2d-3a (#25957, merged): the pre-install import graph and the
prompt-keys gate;
- 2d-3b (this PR, Tier S): 23 test files and one gate's self-test. It
folds the planned 2d-3b1 and 2d-3b2, since #25902 (the root carrier of
`repo-gates.yml`) merged first and the combined diff stays under 3000
lines;
- 2d-3c (Tier H, after this PR): deletes `ui/.github/workflows/**` and
`ui/.github/dependabot.yml`, and retires the action-ref scan.
## What changes
- **The Lint UI readers retarget to the root `lint-ui` job, by path**
(roster row 16, ported in PR A):
- `bash32-floor-wiring` and `entry-guard-wiring` read the job's steps
through `helpers/root-ci.ts` and pin the one step that runs both legs of
the alias.
- `check-test-path-roots` and `check-vi-mock-override-shape` pin the
job's `pnpm --dir ui run` step.
- The vi.mock sibling case now asserts that the gate is not among the
steps any workflow runs before an install, read through the pre-install
scan.
- The skip-switch case now asserts that the `ui` filter matches the
files the gate reads.
- `lint-workflow` changes three things:
- The ratchet-prose surface is the `lint-ui` job: its text for the
rule-name check, its comments for the count check.
- The trigger claims read the root `on:` block. It must still subscribe
`pull_request` and filter no paths, and the job's `if:` must not read
the event name.
- The ignore-list claim becomes "the `ui` filter still matches a ui
`.ts`/`.tsx` source, and the job excludes no path".
- **The Repo Gates readers retarget to the same job** (objectui's
`repo-gates.yml`, carried by #25902's "objectui's Repo Gates" block):
- `check-control-bytes` and `check-docs-route-eager-closure`: the alias
is a package script, the root Lint UI job runs it, the root trigger
gates pull requests (and, for the eager closure, the queue) with no
paths filter, and the `ui` filter matches the files the gate reads.
- `check-doc-snippet-emitted-census`: the census leg runs after
`ui-gate-build` and before the gate, in the root job. A new case pins
that the alias the job runs is this script.
- `check-doc-fence-languages`: one step runs both legs; no other
`ci.yml` job and no other root workflow runs the guard; nothing before
it in the job installs; the job's header comments state no count.
- **The governance-workflow pins retire with their roster rows.** Each
retired case is named, by its title, in a comment where it stood, with
its row and the port that brings it back. The verdict, fixture, config
and `package.json` cases in the same files are unchanged.
- **`ui/scripts/check-governed-queue-guard.mjs`.** Its `--self-test`
asserted ten facts about `governed-surface-guard.yml`, and its test
file's collection failure hid them. They retire against row 11. The
required-context register pin stays. The self-test now passes 183 cases.
- **`markdown-test-inputs.test.ts`** ran the "Decide whether this change
needs a full run" step out of objectui's `ci.yml`. The root `test-ui`
(row 7) was ported without that step, so the step-driven legs retire,
named in the header.
- Two root pins replace them. The `filter` job's `ui` globs match the
documents the objectui#8857, #9096 and #9142 shapes changed, and
`test-ui`'s `if:` reads that filter.
- The affected-test selector picks the readers.
`select-affected-tests.test.ts` pins that already.
- **`ui/scripts/markdown-test-inputs.mjs`.** `--audit` is clean. The
ledger changes in five places:
- Dropped: `check-changeset-presence`'s workflow walker, and
`check-links-workflow`'s entry, which no longer reads markdown.
- `check-control-bytes` and `check-docs-route-eager-closure` gain
`reads: []` entries. Their new markdown literals probe the `ui` filter's
globs and open no document, so they are recorded as `notRead`.
- `check-doc-fence-languages` records its probe as `notRead` and drops
its `walker`, since its only walk was of the nested workflows directory.
### Disposition table
Roster = the #25697 workflow audit (comment 6388182608).
| # | Test file | Cases before → after | Retired | Retargeted | Carried
by now |
|---|---|---|---|---|---|
| 1 | `bash32-floor-wiring` | 9 → 9 | (none) | the `lint.yml` step →
`lint-ui`'s `check:bash32-floor` step, both legs | root `ci.yml`
`lint-ui` (row 16) |
| 2 | `entry-guard-wiring` | 7 → 7 | (none) | same, `check:entry-guard`
| row 16 |
| 3 | `check-test-path-roots` | 23 → 23 | (none) | `lint-ui` runs
`check:test-path-roots` | row 16 |
| 4 | `check-vi-mock-override-shape` | 28 → 28 | (none) | `lint-ui` step
after the install; pre-install scan; `ui` filter | row 16, plus the root
`filter` job |
| 5 | `lint-workflow` | 5 → 5 | `lint.yml`'s header prose, with
`lint.yml` | workflow surface → `lint-ui` job; trigger claims → root
`on:` plus the `ui` filter | rows 7 and 16 |
| 6 | `check-control-bytes` | 38 → 38 | (none) | `repo-gates.yml` →
`lint-ui`; trigger and paths claims → root `on:` plus the `ui` filter |
`lint-ui`'s Repo Gates block (#25902) |
| 7 | `check-docs-route-eager-closure` | 22 → 22 | (none) | same |
#25902 |
| 8 | `check-doc-snippet-emitted-census` | 39 → 40 | (none) | census
order → `lint-ui` (`ui-gate-build` < census < gate); **new:** the alias
runs this script | #25902 |
| 9 | `check-doc-fence-languages` | 33 → 33 | (none) | one step, one
home, needs-no-install, no-count header → `lint-ui`; paths → root `on:`
plus the `ui` filter | #25902 |
| 10 | `check-changeset-overwrite` | 21 → 17 | 4 `changeset-guard.yml`
pins | (none) | **row 3** (→ sub-issue 4) |
| 11 | `check-changeset-no-major` | 26 → 24 | 2 `changeset-guard.yml`
pins | (none) | **row 3**; the repo-state cases run in Test UI |
| 12 | `check-changeset-claims` | 111 → 99 | 3 reachability, 6 delivery,
3 comment-count pins | (none) | **row 4** (one read **row 22**) |
| 13 | `check-changeset-presence` | 53 → 46 | 7 reachability pins |
(none) | **rows 4 and 3**; root counterpart is `pr-automation.yml`
`Check Changeset` |
| 14 | `render-changeset-claims-comment` | 28 → 27 | the
marker-spelled-once pin | (none) | **row 4** |
| 15 | `check-eager-closure-budget` | 154 → 148 | 4 workflow contract
pins, the workflow's must-hit control, the `merge_group` absence pin;
the workflow leaves both prose populations | (none) | **row 22**, "kept,
follow-up port" into `Build & E2E UI` |
| 16 | `render-budget-comment` | 36 → 23 | the 13-case
`performance-budget.yml contract` | (none) | **row 22** |
| 17 | `check-governed-queue-guard` (+ the `.mjs` self-test) | 16 → 9 |
8 workflow pins (one only partly), plus 10 self-test assertions | (none)
| **row 11**: root `governed-surface-guard.yml`, whose register governs
`ui/.github/workflows/**` |
| 18 | `check-merge-queue-head` | 40 → 32 | 11 workflow pins (two only
partly) | (none) | **row 20**; root counterpart is
`merge-queue-triage.yml` |
| 19 | `check-new-cross-file-line-citations` | 37 → 33 | 4 workflow pins
| (none) | **row 15** |
| 20 | `shadcn-check-report` | 28 → 23 | 6 workflow pins (one only
partly) | (none) | **row 26**, "kept, follow-up port" |
| 21 | `check-links-workflow` | 9 → 4 | 5 workflow pins and the workflow
surface of the count pin | (none) | **row 6**; the root
`check-links.yml` sweeps the root's trees, not `ui/` |
| 22 | `check-required-check-set` | 27 → 22 | 5 patrol pins;
`dependabot-auto-merge.yml` leaves `REPAIRED` | (none) | **rows 25 and
9**; root counterpart is `required-set-patrol.yml` |
| 23 | `markdown-test-inputs` | 25 → 17 | 4 + 5 decision-step cases, the
#9142 FIRES case, the real-step half of its depth-1 case | **new:** the
`ui` filter matches the three shapes' documents; `test-ui` reads the
filter | **row 7** (`test-ui`), plus the affected-test selector |
When a test file shows "(one only partly)", the case kept its
non-workflow half under a new title.
Untouched here, and listed for 2d-3c (the PM files its decision card):
- `check-governed-queue-guard`'s `every declared surface exists in this
tree` goes red once `ui/.github/workflows/` is gone. The register's
`.github/workflows/**` row was a maintainer ruling (objectui#12255), so
this PR does not decide it.
- `ui/.github/labeler.yml` stays, pending sub-issue 4 (F12 = B).
### Follow-up rows (not folded here)
- **F18.** After this PR the `markdown-test-inputs` ledger has no root
CI consumer. Its audit runs in Test UI, and the root `test-ui` job
decides from the `ui` filter and the selector, never from the ledger.
Sub-issue 4 decides whether the ledger stays as an audit or retires.
- **F19.** `ui/scripts/__tests__/workflow-checks.ts`'s parser
(`readWorkflows`, `triggerBlock`, `producedCheckNames`) has no caller
after this PR. Its `repoRoot` export still has two,
`check-lockfile-integrity` and `check-lockfile-dedupe`. It can be
trimmed with 2d-3c or sub-issue 4.
- **F20.** `ui/scripts/check-cross-repo-closer-outcome.mjs` takes
objectui's `ui/.github/workflows/cross-repo-issue-closer.yml` as its
subject, and only objectui's `lint.yml` ran it. Nothing runs it now, and
after 2d-3c its subject is gone. It goes with the
cross-repo-issue-closer roster row in sub-issue 4.
## Verification
Head `249928d5`, on `main` `3518664c`. 25 files, +606 / −1544.
Test runs are from `ui/`, per `ui/AGENTS.md`.
| Run | Result |
|---|---|
| The 23 modified test files, after the rebase onto `3518664c` | 23
files, 766 tests passed |
| Whole `scripts/__tests__` suite (at `45026511`, before the rebase;
`main` brought one `ui/scripts` change since,
`check-i18n-dead-keys.mjs`, which no touched file reads) | 183 files
passed, 2 skipped; 5323 tests passed, 2 skipped |
| Whole suite in the 2d-3c layout (`ui/.github/workflows/` and
`ui/.github/dependabot.yml` moved aside) | 4 files red, exactly the set
2d-3c owns: `check-action-ref-convention` (12 cases; 2d-3c retires it),
`check-governed-queue-guard` (1 case, the open question above),
`check-pre-install-import-graph` (sections 4 and 5; collection),
`ci-cd-pipeline-doc` (2d-3c deletes it; collection). No hidden reader is
left. |
| `node scripts/check-governed-queue-guard.mjs --self-test` | 183 cases
pass |
| `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` (all 25 touched files),
`markdown-test-inputs --audit` | both exit 0; the audit reads "115
candidate test files, all adjudicated" |
Gate sweep: `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derives 18 families for this diff, unchanged
after the rebase. All 18 ran and exited 0. `--ran` reconciliation: 18
derived, 18 run, 0 NOT-MEASURED, 0 UNRUN.
Push-environment battery (`GITHUB_ACTIONS=true GITHUB_EVENT_NAME=push
node scripts/pm/check-dispatch-gates.mjs`): ✓ 2182 cases pass, 0 failed
(fast tier 1917 in 442.3 s, slow tier 265 in 1234.8 s), exit 0. The
rebase brought no `scripts/pm/` change.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01A6SEitNngAMugGbuJHWsDS
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 39a78b1 commit 39ca587
25 files changed
Lines changed: 606 additions & 1544 deletions
File tree
- ui/scripts
- __tests__
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
| 13 | + | |
12 | 14 | | |
13 | 15 | | |
14 | 16 | | |
| |||
36 | 38 | | |
37 | 39 | | |
38 | 40 | | |
39 | | - | |
40 | | - | |
41 | | - | |
42 | | - | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
43 | 47 | | |
44 | 48 | | |
45 | 49 | | |
| |||
50 | 54 | | |
51 | 55 | | |
52 | 56 | | |
53 | | - | |
54 | | - | |
55 | | - | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
56 | 64 | | |
57 | 65 | | |
58 | 66 | | |
59 | 67 | | |
60 | 68 | | |
61 | 69 | | |
62 | 70 | | |
63 | | - | |
| 71 | + | |
64 | 72 | | |
65 | 73 | | |
66 | 74 | | |
67 | 75 | | |
68 | | - | |
| 76 | + | |
69 | 77 | | |
70 | 78 | | |
71 | | - | |
72 | | - | |
| 79 | + | |
| 80 | + | |
73 | 81 | | |
74 | 82 | | |
75 | 83 | | |
| |||
82 | 90 | | |
83 | 91 | | |
84 | 92 | | |
85 | | - | |
| 93 | + | |
86 | 94 | | |
87 | 95 | | |
88 | 96 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
38 | | - | |
39 | | - | |
40 | | - | |
41 | | - | |
42 | | - | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
43 | 46 | | |
44 | 47 | | |
45 | 48 | | |
| |||
61 | 64 | | |
62 | 65 | | |
63 | 66 | | |
64 | | - | |
65 | | - | |
66 | | - | |
67 | | - | |
68 | | - | |
69 | | - | |
70 | | - | |
71 | | - | |
72 | | - | |
73 | | - | |
74 | | - | |
75 | | - | |
76 | | - | |
77 | | - | |
78 | | - | |
79 | | - | |
80 | | - | |
81 | | - | |
82 | 67 | | |
83 | 68 | | |
84 | 69 | | |
| |||
200 | 185 | | |
201 | 186 | | |
202 | 187 | | |
203 | | - | |
204 | | - | |
205 | | - | |
206 | | - | |
207 | | - | |
208 | | - | |
209 | | - | |
210 | | - | |
211 | | - | |
212 | | - | |
213 | | - | |
214 | | - | |
215 | | - | |
216 | | - | |
217 | | - | |
218 | | - | |
219 | | - | |
220 | | - | |
221 | | - | |
222 | | - | |
223 | | - | |
224 | | - | |
225 | | - | |
226 | | - | |
227 | | - | |
228 | | - | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
229 | 193 | | |
230 | | - | |
231 | | - | |
232 | | - | |
233 | | - | |
234 | | - | |
235 | | - | |
236 | | - | |
237 | | - | |
238 | | - | |
239 | | - | |
240 | | - | |
241 | | - | |
242 | | - | |
243 | | - | |
244 | | - | |
245 | | - | |
246 | | - | |
247 | | - | |
248 | | - | |
249 | | - | |
250 | | - | |
251 | | - | |
252 | | - | |
253 | | - | |
254 | | - | |
255 | | - | |
256 | | - | |
257 | | - | |
258 | | - | |
259 | | - | |
260 | | - | |
261 | | - | |
262 | | - | |
263 | | - | |
264 | | - | |
265 | | - | |
266 | | - | |
267 | | - | |
268 | | - | |
269 | | - | |
270 | | - | |
271 | | - | |
272 | | - | |
273 | | - | |
274 | | - | |
275 | | - | |
276 | | - | |
277 | | - | |
278 | | - | |
279 | | - | |
280 | | - | |
281 | | - | |
282 | | - | |
283 | | - | |
284 | | - | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
285 | 209 | | |
286 | 210 | | |
287 | 211 | | |
| |||
953 | 877 | | |
954 | 878 | | |
955 | 879 | | |
956 | | - | |
957 | | - | |
958 | | - | |
959 | | - | |
960 | | - | |
961 | | - | |
962 | | - | |
963 | | - | |
964 | | - | |
965 | | - | |
966 | | - | |
967 | | - | |
968 | | - | |
969 | | - | |
970 | | - | |
971 | | - | |
972 | | - | |
973 | | - | |
974 | | - | |
975 | | - | |
976 | | - | |
977 | | - | |
978 | | - | |
979 | | - | |
980 | | - | |
981 | | - | |
982 | | - | |
983 | | - | |
984 | | - | |
| 880 | + | |
| 881 | + | |
| 882 | + | |
| 883 | + | |
| 884 | + | |
| 885 | + | |
| 886 | + | |
| 887 | + | |
| 888 | + | |
| 889 | + | |
985 | 890 | | |
986 | 891 | | |
987 | 892 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
51 | | - | |
52 | | - | |
53 | | - | |
54 | | - | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
55 | 57 | | |
56 | 58 | | |
57 | 59 | | |
58 | | - | |
59 | 60 | | |
60 | 61 | | |
61 | 62 | | |
| |||
410 | 411 | | |
411 | 412 | | |
412 | 413 | | |
413 | | - | |
414 | | - | |
415 | | - | |
416 | | - | |
417 | | - | |
418 | | - | |
419 | | - | |
420 | | - | |
421 | | - | |
422 | | - | |
423 | | - | |
424 | | - | |
425 | | - | |
426 | | - | |
427 | | - | |
428 | | - | |
429 | | - | |
430 | | - | |
431 | | - | |
432 | | - | |
433 | | - | |
434 | | - | |
435 | | - | |
436 | | - | |
437 | | - | |
438 | | - | |
439 | | - | |
440 | | - | |
441 | | - | |
442 | | - | |
443 | | - | |
444 | | - | |
445 | | - | |
446 | | - | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
0 commit comments