Repository navigation
Commit 833e4a8
ci(test-ui): add the
<!-- claude-projects-attribution: {"github_login":"os-steve"} -->
_Requested by **Steve** · [project
thread](https://claude.ai/code/project/chan_01FdL1XeUyvVNxLreh3F4Qi9?thread=cmsg_01FdL1XeUyvVNxLreh3F4Qi9C2Dy8KN4fv23aea1JR1i9T)_
Fixes #26460
Clause-②: no
Metadata-protocol: none
**Tier H** (`.github/workflows/ci.yml`, `AGENTS.md`; `.claude/**` rides
along). Draft until an approval from GOVERNED_APPROVERS (os-zhuang,
hotlong). The ruleset half — adding `Test UI` to the `main` ruleset's
required status checks — is the maintainer's, done in the same sitting
as the merge (#9325's two halves; precedent `Lint UI` / `Build & E2E UI`
via #25857 and `Type Check UI` via #25878).
## 维护者速读
- 改了什么:在 ci.yml 加一个汇总任务 `Test UI`(job id `test-ui-gate`),覆盖 16 个 `Test
UI (k/16)` 分片,任一分片不是 success 就红;分片因 ui
过滤被跳过时为绿。注册表、汇总名册和两处写着必过名单的说明文字同步从 8 个变 9 个。
- 为什么改:裁决 6435318516(字母 A,分阶段)。Test UI 分片都不是必过,队列照样合入 Test UI 红的
PR(#26419 → #26421)。ui 车道的第一阶段读数已完成:最近 50 次跑了 Test UI 的队列构建 flake
0/50(6436579765)。
- 风险与回滚:只新增一个约 10 秒的任务,不改分片、超时、过滤。合入后在 ruleset 里加上 `Test UI` 才生效;回滚就是从
ruleset 删掉这一项再 revert 本 PR。若 Test UI 出现 flake,会把队列条目弹出。
- 先看:`.github/workflows/ci.yml` 新增的 `test-ui-gate` 任务(判定的 case
分支);`scripts/check-required-contexts.mjs` 新增的注册行;`AGENTS.md` 第 525–528
行的名单。
- 两分钟验证:`node scripts/check-required-contexts.mjs && node
scripts/check-aggregator-roster.mjs`,应看到 `ci.yml:test-ui-gate → 'Test
UI'` 和 `5 aggregator(s)`;本 PR 的 checks 里应有一个名为 `Test UI` 的绿色检查。
- 需要你做的:批准本 PR,合入时在 Settings → Rulesets → `main` 的必过检查里加上 `Test UI`。
## What changes
- `.github/workflows/ci.yml`: a new job `test-ui-gate`, `name: Test UI`,
`needs: [test-ui, filter]`, `if: always()`, placed right after
`test-ui`. It copies `test-gate`'s shape: the `name:` literal and `if:
always()` are both load-bearing, and it declares its roster
(`OS_AGGREGATOR_MEMBERS: test-ui`, `OS_AGGREGATOR_NON_MEMBERS: filter`).
Its one step reads the matrix rollup `needs['test-ui'].result`:
- `success` → green;
- `skipped` → green only when `filter` concluded `success` and said the
diff reaches no ui path (`ui_tree` or `ui` is `'false'`, the shards' own
`if:`), the #4928 guard. That is how a PR or queue build that touches no
ui path reads, the same way `Lint UI` and `Build & E2E UI` read
`skipped` today;
- anything else (`failure`, `cancelled`, an unexplained `skipped`, a
lifecycle value such as `abandoned`) → red, with an `::error` naming the
rollup.
No other job changes: no shard, timeout or filter edit, and no Test Core
line (#25870 edits that section in parallel; the hunks do not overlap).
- `scripts/check-required-contexts.mjs`: one `REQUIRED_CONTEXTS` row
(`ci.yml`, `test-ui-gate`, `Test UI`, `authorized` naming ruling
6435318516 and the reading 6436579765). Both `statesTheSet` surfaces'
`mustName` gain `Test UI`. Self-test: battery (3) renames the bare `Test
UI` name and expects red; battery (9) collides the `Test UI (k/16)`
shard name with the bare gate name and expects red, plus the coexistence
control.
- `scripts/check-aggregator-roster.mjs`: `REQUIRED_AGGREGATORS` gains
`ci.yml/test-ui-gate/Test UI`, the floor that keeps the new aggregate
from losing its roster declaration. Self-test batteries (2) and (3) gain
the dropped-member and phantom-`needs:` controls for it.
- `AGENTS.md` (merge-queue rule) and
`.claude/skills/pm-dispatch/references/platform-readings.md`: the
required-set list grows from eight to nine. `check:required-contexts`
reds until both name the registry exactly (`statesTheSet`); the count
words are hand-followed.
## Why
Ruling A (staged) on #26460, comment 6435318516. The ui step it orders
first is done: the flake reading on the newest 50 queue builds that ran
Test UI is 0/50, and every Test UI red in the last 24 hours has a named
cause that is fixed on `main` (comment 6436579765).
## Acceptance notes
- **Rollup, not per-shard credentials.** `test-gate` counts shard
attestations because one rollup word cannot carry several shards'
verdicts. The Test UI shards publish no attestation, and adding one is a
change to `test-ui` (pinned by the ui lane's `ui/scripts/__tests__`), so
this job reads the rollup and fails closed on every value except
`success` and a filter-explained `skipped`. The rollup's known blind
spot, a matrix where some legs are skipped and the rest succeed, cannot
occur here: all 16 legs share one job-level `if:` and a static matrix,
and the ui lane pins the width at 16
(`select-affected-tests-wiring.test.ts`).
- **`cancelled` is red.** That is also what a shard killed by its own
`timeout-minutes` reads, which must not pass. On a superseded push it
paints the old sha red, which no required check reads.
- objectui's per-shard reader `ui/scripts/check-test-shard-results.mjs`
(the ported `Test` aggregate, row 7 of #25697's roster, "dropped until
cutover") hardcodes the `Test (shard N/M)` spelling, so it cannot read
`Test UI (k/16)` without a ui-lane change. Not used here; noted for the
ui lane.
## Verification
All on head `853ddedb4`.
<details><summary>The two touched gates and their self-tests</summary>
```
node scripts/check-required-contexts.mjs → exit 0 · 9 pinned, ci.yml:test-ui-gate → 'Test UI'
node scripts/check-required-contexts.mjs --self-test → exit 0 · 179 assertions
node scripts/check-aggregator-roster.mjs → exit 0 · 5 aggregator(s); all 5 required-context aggregate(s) declared
node scripts/check-aggregator-roster.mjs --self-test → exit 0 · 63 assertions
```
</details>
<details><summary>dispatch-gates derived family</summary>
`node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
--ran` → exit 0: **80 derived, 80 run, 0 NOT-MEASURED** (a derived
zero). Five families first read exit 3 (PREREQUISITE NOT MET: no built
`packages/*` dist) and were re-run green after `turbo run build
--filter='./packages/**'`: `check:doc-formula-expressions`,
`check:dts-closure`, `check:dual-build-cjs-loads`,
`check:lean-entry-closure`, `check:sourcemap-no-sources-content`.
`check:pm-dispatch-gates`: 1935 fast-tier cases pass.
Also run, outside the derivation because the ui lane's pins read
`ci.yml` as text: `pnpm --dir ui exec vitest run scripts/__tests__` →
exit 0, Test Files 178 passed, 2 skipped (180); Tests 5097 passed.
```
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/check-declaration-mirrors.mjs :: exit 0
node scripts/check-declaration-mirrors.mjs --self-test :: exit 0
node scripts/check-dts-emitted.mjs --self-test :: exit 0
node scripts/check-platform-checklist-watchdog.mjs :: exit 0
node scripts/check-platform-checklist-watchdog.mjs --self-test :: exit 0
node scripts/check-release-section-coverage.mjs :: exit 0
node scripts/check-release-section-coverage.mjs --strict :: exit 0
node scripts/check-self-test-wired.mjs :: exit 0
node scripts/check-self-test-wired.mjs --self-test :: exit 0
node scripts/check-self-test-workflow-commands.mjs :: exit 0
node scripts/check-self-test-workflow-commands.mjs --self-test :: exit 0
node scripts/check-step-collectors.mjs :: exit 0
node scripts/check-step-collectors.mjs --self-test :: exit 0
node scripts/check-whole-set-label-write.mjs :: exit 0
node scripts/check-whole-set-label-write.mjs --self-test :: exit 0
node scripts/ci/assert-turbo-remote-cache.mjs --self-test :: exit 0
node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0
node scripts/ci/prune-turbo-cache.mjs --self-test :: exit 0
node scripts/ci/scheduled-full-run.mjs --self-test :: exit 0
node scripts/docs-audit/check-drift-comment.mjs :: exit 0
node scripts/pm/bare-root-worklist.mjs --self-test :: exit 0
node scripts/pm/board-snapshot.mjs --self-test :: exit 0
node scripts/pm/check-governed-queue-guard.mjs --self-test :: exit 0
node scripts/pm/check-harness-current.mjs --self-test :: exit 0
node scripts/pm/ci-failure.mjs --self-test :: exit 0
node scripts/render-release-coverage-anchor.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:aggregator-roster :: exit 0
pnpm check:bash32-floor :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:cli-command-ids :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:declared-population-live :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:docs-audit-scope :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:dts-closure :: exit 0
pnpm check:dual-build-cjs-loads :: exit 0
pnpm check:entry-guard :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:lean-entry-closure :: exit 0
pnpm check:node-version :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:parse-guard :: exit 0
pnpm check:platform-checklist :: exit 0
pnpm check:pm-close-cards :: exit 0
pnpm check:pm-expected-skips :: exit 0
pnpm check:pm-fleet-write-dispatch :: exit 0
pnpm check:pm-fleet-write-execute :: exit 0
pnpm check:pm-fleet-write-validate :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-governed-prose :: exit 0
pnpm check:pm-half-states :: exit 0
pnpm check:pm-issue-transfer :: exit 0
pnpm check:pm-post-stamped :: exit 0
pnpm check:pm-record-recognisers :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:pm-skill-ratchet :: exit 0
pnpm check:pnpm-acquisition :: exit 0
pnpm check:pnpm-filter-targets :: exit 0
pnpm check:pnpm-flag-spellings :: exit 0
pnpm check:ratchet-remedy-authority :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:required-contexts :: exit 0
pnpm check:scripts-symbol-anchors :: exit 0
pnpm check:shard-attestation :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:sourcemap-no-sources-content :: exit 0
pnpm check:stall-guard-budget :: exit 0
pnpm check:stall-guard-headroom :: exit 0
pnpm check:type-check-coverage :: exit 0
pnpm check:type-check-debt :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm check:workflow-status-functions :: exit 0
pnpm check:workflow-step-name-quoting :: exit 0
pnpm check:pm-dispatch-gates :: exit 0
```
</details>
## Human Minimum
- [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic.
(No schema touched.)
- [x] 2. Every name I added uses the casing for its kind.
- [ ] 3. No formatter ran; `pnpm lint` is CI's repo-wide run, not run
locally.
- [x] 4. One issue, one branch off an up-to-date `main`, one pull
request.
- [x] 5. Nothing publishes (CI workflow, repo scripts and instruction
prose): `skip-changeset`; both declaration lines are above.
- [x] 6. `packages/spec` not touched.
- [x] 7. No hand edits to `content/docs/references/`,
`packages/*/CHANGELOG.md` or `content/docs/releases/`.
- [x] 8. Title, body and comments are in English (the 维护者速读 block is the
maintainer's Chinese summary).
- [ ] The *Before Submitting* list in CONTRIBUTING.md is done. (Local
runs are the derived gate subset above; the full farm is CI's.)
---
_Generated by [Claude
Code](https://claude.ai/code/session_01ADHkmNhqdySz5JeM3ARKGW)_
Co-authored-by: Claude <noreply@anthropic.com>Test UI aggregate job and register it as a required context (#26569)1 parent 500bc9d commit 833e4a8
5 files changed
Lines changed: 119 additions & 14 deletions
File tree
- .claude/skills/pm-dispatch/references
- .github/workflows
- scripts
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
387 | 387 | | |
388 | 388 | | |
389 | 389 | | |
390 | | - | |
| 390 | + | |
391 | 391 | | |
392 | | - | |
| 392 | + | |
393 | 393 | | |
394 | 394 | | |
395 | 395 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3722 | 3722 | | |
3723 | 3723 | | |
3724 | 3724 | | |
| 3725 | + | |
| 3726 | + | |
| 3727 | + | |
| 3728 | + | |
| 3729 | + | |
| 3730 | + | |
| 3731 | + | |
| 3732 | + | |
| 3733 | + | |
| 3734 | + | |
| 3735 | + | |
| 3736 | + | |
| 3737 | + | |
| 3738 | + | |
| 3739 | + | |
| 3740 | + | |
| 3741 | + | |
| 3742 | + | |
| 3743 | + | |
| 3744 | + | |
| 3745 | + | |
| 3746 | + | |
| 3747 | + | |
| 3748 | + | |
| 3749 | + | |
| 3750 | + | |
| 3751 | + | |
| 3752 | + | |
| 3753 | + | |
| 3754 | + | |
| 3755 | + | |
| 3756 | + | |
| 3757 | + | |
| 3758 | + | |
| 3759 | + | |
| 3760 | + | |
| 3761 | + | |
| 3762 | + | |
| 3763 | + | |
| 3764 | + | |
| 3765 | + | |
| 3766 | + | |
| 3767 | + | |
| 3768 | + | |
| 3769 | + | |
| 3770 | + | |
| 3771 | + | |
| 3772 | + | |
| 3773 | + | |
| 3774 | + | |
| 3775 | + | |
| 3776 | + | |
| 3777 | + | |
| 3778 | + | |
| 3779 | + | |
| 3780 | + | |
| 3781 | + | |
| 3782 | + | |
| 3783 | + | |
| 3784 | + | |
| 3785 | + | |
| 3786 | + | |
| 3787 | + | |
| 3788 | + | |
| 3789 | + | |
| 3790 | + | |
| 3791 | + | |
| 3792 | + | |
3725 | 3793 | | |
3726 | 3794 | | |
3727 | 3795 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
520 | 520 | | |
521 | 521 | | |
522 | 522 | | |
523 | | - | |
524 | | - | |
525 | | - | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
526 | 526 | | |
527 | | - | |
| 527 | + | |
528 | 528 | | |
529 | 529 | | |
530 | 530 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
| 17 | + | |
| 18 | + | |
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
| |||
68 | 69 | | |
69 | 70 | | |
70 | 71 | | |
71 | | - | |
| 72 | + | |
72 | 73 | | |
73 | 74 | | |
74 | 75 | | |
| |||
110 | 111 | | |
111 | 112 | | |
112 | 113 | | |
| 114 | + | |
| 115 | + | |
113 | 116 | | |
114 | 117 | | |
115 | 118 | | |
| |||
507 | 510 | | |
508 | 511 | | |
509 | 512 | | |
| 513 | + | |
510 | 514 | | |
511 | 515 | | |
512 | 516 | | |
| |||
536 | 540 | | |
537 | 541 | | |
538 | 542 | | |
| 543 | + | |
539 | 544 | | |
540 | 545 | | |
541 | 546 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
471 | 471 | | |
472 | 472 | | |
473 | 473 | | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
474 | 483 | | |
475 | 484 | | |
476 | 485 | | |
| |||
585 | 594 | | |
586 | 595 | | |
587 | 596 | | |
588 | | - | |
589 | | - | |
590 | | - | |
591 | | - | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
592 | 601 | | |
593 | 602 | | |
594 | 603 | | |
| |||
600 | 609 | | |
601 | 610 | | |
602 | 611 | | |
| 612 | + | |
603 | 613 | | |
604 | 614 | | |
605 | 615 | | |
| |||
631 | 641 | | |
632 | 642 | | |
633 | 643 | | |
| 644 | + | |
634 | 645 | | |
635 | 646 | | |
636 | 647 | | |
| |||
652 | 663 | | |
653 | 664 | | |
654 | 665 | | |
655 | | - | |
| 666 | + | |
656 | 667 | | |
657 | 668 | | |
658 | 669 | | |
| |||
1936 | 1947 | | |
1937 | 1948 | | |
1938 | 1949 | | |
| 1950 | + | |
| 1951 | + | |
| 1952 | + | |
| 1953 | + | |
| 1954 | + | |
| 1955 | + | |
| 1956 | + | |
1939 | 1957 | | |
1940 | 1958 | | |
1941 | 1959 | | |
| |||
2087 | 2105 | | |
2088 | 2106 | | |
2089 | 2107 | | |
| 2108 | + | |
| 2109 | + | |
| 2110 | + | |
| 2111 | + | |
| 2112 | + | |
| 2113 | + | |
| 2114 | + | |
| 2115 | + | |
| 2116 | + | |
| 2117 | + | |
| 2118 | + | |
| 2119 | + | |
| 2120 | + | |
| 2121 | + | |
2090 | 2122 | | |
2091 | 2123 | | |
2092 | 2124 | | |
| |||
0 commit comments