Repository navigation
Commit d55acb7
ci(live-e2e): derive the Live E2E UI ceiling from its first population (40 → 45) and pin it; the saved-view-filter header names the workspace backend (#30869)
<!-- claude-projects-attribution: {"github_login":"marchtian"} -->
_Requested by **田騏** · [project
thread](https://claude.ai/code/project/chan_01VmuUhXU9SSUzqJYyXSmYSi?thread=cmsg_01VmuUhXU9SSUzqJYyXSmYSiNjyvCdXYygFqntMNR7S2dW)_
Fixes #27228
Ruling-ref: 6464191239
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:必需检查 `Live E2E UI` 的超时上限从 40 分钟改为 45 分钟,用 3,395 次真实运行(main 的
push、定时运行,加上合并队列)重新推导,并在测试里钉住;另把 `saved-view-filter.spec.ts`
头注释里已退役的后端版本钉改成现在真正用的工作区后端。
- 为什么改:旧的 40 分钟只来自一次本地冷启动估算,且没有测试钉住,会悄悄漂移;太松时一个卡死的后端会占住合并队列 40
分钟。注释则在误导下一个读者用错后端。
- 风险与回滚:风险低。实测最慢一次成功运行是合并队列里的 822 秒(13.7 分钟,慢机器),按规则要 ≥3 倍,40 分钟只有 2.92
倍,所以取 45;代价是真卡死时多占队列 5 分钟。回滚就是把 `ci.yml` 和测试里的 45 改回 40。
- 先看:`.github/workflows/ci.yml`(`live-e2e-ui` 上方的推导注释与
`timeout-minutes`)→
`ui/scripts/__tests__/turbo-cache-save-bound.test.ts`(`CEILINGS`
与新的对照用例)→ `ui/e2e/live/saved-view-filter.spec.ts`(只改注释)。
- 两分钟验证:`pnpm --dir ui exec vitest run
scripts/__tests__/turbo-cache-save-bound.test.ts`,预期 46 个用例全绿,其中含
`live-e2e-ui keeps its derived ceiling of 45 minutes`。
- 需要你做的:本 PR 改 `.github/workflows/ci.yml`(Tier H),需要你一次授权的 APPROVED
评审;之后由席位落地。
## What changes
1. **`Live E2E UI` ceiling, 40 → 45, from its first population.** The
rule is the one above `lint-ui` (#25869 row F13): the smallest round
number that is both at least 3x the slowest successful run and at least
that run + 15 min.
- Population: every completed `CI` run with event `push` or `schedule`
on `main`, or `merge_group`, created between #27212's merge
(2026-10-28T11:47:32Z) and 2026-11-06T05:50:51Z. That is 3,395 runs
(1,177 push, 53 schedule, 2,165 merge_group). The queue runs count
because this is a required context and a queue entry whose run is
cancelled is ejected; the sibling ceilings were derived over every CI
run too. Every run carries the job: 3,205 success, 181 skipped, 7
failure (316 to 529 s), 2 cancelled (91 s, 0 s). None reached a ceiling.
- Duration is `completed_at` minus `started_at`, cross-checked against
the last step's end. Six queue jobs on 2026-11-01 carry a late platform
stamp: four read about 4,000 s and two read below zero, while their
steps span 387 to 513 s. Each of the 40 slowest reported jobs, and those
six, is read to its last step's end instead.
- Successful jobs: n=3205, min 68 s, median 407 s, p95 563 s, p99 589 s,
max **822 s** (13.7 min, job 125022934909 in run 41364879269: a queue
run on a slow runner, with a 615 s closure build and 94 s of specs). So
max(41.1, 28.7) => **45**. The next slowest, to the last step, are 772,
738, 731, 702 and 699 s (reported 775, 740, 733, 704 and 701 s), all
queue runs. Push and schedule alone top out at 624 s and would give 35.
- `pull_request` runs are not in the population: they were not read in
full, which the sibling rule ("every successful job") asks for. A sample
of 93 successful ones on the same slow days (2026-11-01 to 2026-11-03)
tops out at 675 s, under the deciding 822 s, so 45 holds either way. The
next re-derivation should read them in full.
- The slow tail is the cold case. Those jobs spend 406 to 615 s in the
closure-build step, above the 384 s cold closure build in the local run
that set the old 40, so the measured max replaces that estimate as the
slowest successful run.
- The derivation comment in `ci.yml` now carries these numbers and the
queries.
2. **The pin.** `turbo-cache-save-bound.test.ts` adds `live-e2e-ui: 45`
to `CEILINGS`, beside the four sibling ceilings, so `it.each(CEILINGS)`
holds it. It adds a control: a copy of the workflow with the ceiling at
40, or with no ceiling at all, reads as moved for exactly that job, and
the real workflow reads as moved for none. The job saves no cache, so it
is not added to `CACHE_JOBS`.
3. **`saved-view-filter.spec.ts` header, comment only.** It named
`OBJECTSTACK_VERSION` in `backend.env` as the backend. It now names the
workspace backend: `ui/e2e/live/ci/start-backend.sh`, which boots this
tree's built `@objectstack/cli` on `LIVE_BACKEND_APP`
(`examples/app-showcase`). It says the 400/200 readings were first
measured against the published release the lane pinned at the time. No
assertion, timeout or retry moves.
No other job's ceiling changes.
## Tests
- `pnpm --dir ui exec vitest run --maxWorkers=2
scripts/__tests__/turbo-cache-save-bound.test.ts`: 46/46 passed (at
`640fd99ad0`).
- The full derived gate list is in Verification.
## Acceptance notes
- `ui/e2e/live/ci/backend.env` sets one variable,
`LIVE_BACKEND_APP=examples/app-showcase`. It names `OBJECTSTACK_VERSION`
only in a comment that says the pin retired and why. Nothing in it reads
as a live pin, and it is left unchanged.
- The job's `BUDGET:` note now also gives the specs step's reading in
the 40 slowest jobs of this population (43 to 94 s, median 70 s). That
is still under its 2-minute budget.
- Method caveat for the next re-derivation: `completed_at` minus
`started_at` can carry a late platform stamp. Six queue jobs on
2026-11-01 read about 4,000 s or below zero; the four long ones (runs
41286803335, 41286803828, 41286905470, 41286940359) span 472, 387, 508
and 513 s to their last step. The 40-minute timeout never fired on them.
Read the slow tail to the last step's end.
## Verification
All local readings are at head `640fd99ad0`: the first-round commit
`359c392f7b`, one merge of `origin/main` `ae82d057e1` (`c21e59e84c`),
and the merge-queue re-derivation on top. There was no rebase.
- `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack`: 62 commands for the 3 changed paths, the
same list as round 1.
- All 62 exited 0 on this head. The workspace build from round 1 was in
place (`pnpm build --concurrency=2`, 118/118 tasks); in round 1, four
gates first exited 3 and the ui suite exited 1 until that build existed.
The ui suite: Test Files 170 passed, 2 skipped (172); Tests 4981 passed,
2 skipped.
- `--ran` reconciliation: `62 derived, 62 run, 0 NOT-MEASURED, 0 UNRUN`,
a derived zero (all 62 recorded an exit code).
- No changeset: nothing here publishes (the workflow, a test under the
private `ui/` root, and a comment in an e2e spec), so the PR carries
`skip-changeset`.
- Dogfood: not run. The title has no `!` and `Clause-②: no` carries no
`(narrowing)` arm.
- CI families: see the PR's check-runs.
<details><summary>Each derived command and its exit code at
640fd99</summary>
```text
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-dts-emitted.mjs --self-test :: 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/ci-failure.mjs --self-test :: exit 0
pnpm --dir ui exec vitest run scripts/ :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:aggregator-roster :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:declared-population-live :: 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:engine-double-contract :: 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:pm-close-cards :: exit 0
pnpm check:pm-dispatch-gates :: 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-issue-transfer :: exit 0
pnpm check:pm-post-stamped :: exit 0
pnpm check:pm-record-recognisers :: exit 0
pnpm check:pnpm-acquisition :: exit 0
pnpm check:pnpm-filter-targets :: exit 0
pnpm check:published-files :: exit 0
pnpm check:query-options-erasure :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:registry-log-declared :: exit 0
pnpm check:required-contexts :: exit 0
pnpm check:rest-log-spy-declared :: exit 0
pnpm check:shard-attestation :: 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:tier-file-adoption :: exit 0
pnpm check:type-check-coverage :: exit 0
pnpm check:type-check-debt :: exit 0
pnpm check:undeclared-dep-imports :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm check:where-matcher :: exit 0
pnpm check:workflow-status-functions :: exit 0
pnpm check:workflow-step-name-quoting :: exit 0
```
</details>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- signed: domain:devx#2 · marchtian ·
session_017ihL2ebbZkr2QAEG1x7UC8 -->
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 9038187 commit d55acb7
3 files changed
Lines changed: 82 additions & 24 deletions
File tree
- .github/workflows
- ui
- e2e/live
- scripts/__tests__
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4650 | 4650 | | |
4651 | 4651 | | |
4652 | 4652 | | |
4653 | | - | |
4654 | | - | |
4655 | | - | |
4656 | | - | |
4657 | | - | |
| 4653 | + | |
| 4654 | + | |
| 4655 | + | |
| 4656 | + | |
| 4657 | + | |
| 4658 | + | |
4658 | 4659 | | |
4659 | | - | |
4660 | | - | |
4661 | | - | |
4662 | | - | |
4663 | | - | |
| 4660 | + | |
| 4661 | + | |
| 4662 | + | |
| 4663 | + | |
| 4664 | + | |
| 4665 | + | |
| 4666 | + | |
| 4667 | + | |
| 4668 | + | |
| 4669 | + | |
| 4670 | + | |
| 4671 | + | |
| 4672 | + | |
| 4673 | + | |
| 4674 | + | |
| 4675 | + | |
| 4676 | + | |
| 4677 | + | |
| 4678 | + | |
| 4679 | + | |
| 4680 | + | |
| 4681 | + | |
| 4682 | + | |
| 4683 | + | |
| 4684 | + | |
| 4685 | + | |
| 4686 | + | |
| 4687 | + | |
| 4688 | + | |
| 4689 | + | |
| 4690 | + | |
| 4691 | + | |
| 4692 | + | |
| 4693 | + | |
| 4694 | + | |
| 4695 | + | |
| 4696 | + | |
| 4697 | + | |
4664 | 4698 | | |
4665 | 4699 | | |
4666 | 4700 | | |
4667 | 4701 | | |
4668 | 4702 | | |
4669 | | - | |
| 4703 | + | |
4670 | 4704 | | |
4671 | 4705 | | |
4672 | 4706 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| |||
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
38 | | - | |
39 | | - | |
| 38 | + | |
| 39 | + | |
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| |||
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
72 | 76 | | |
73 | 77 | | |
74 | 78 | | |
75 | 79 | | |
76 | 80 | | |
77 | 81 | | |
| 82 | + | |
78 | 83 | | |
79 | 84 | | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
80 | 92 | | |
81 | 93 | | |
82 | 94 | | |
| |||
196 | 208 | | |
197 | 209 | | |
198 | 210 | | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
199 | 223 | | |
200 | 224 | | |
201 | 225 | | |
| |||
0 commit comments