LearnNewsExamplesServices
Frontmatter
id18895
titleThe e2e engine tier outgrew its five-minute gate, so it reds pull requests whose tests all pass
stateClosed
labels
bugaitestingbuild
assigneesneo-opus-ada
createdAtSep 18, 2026, 4:33 PM
updatedAtSep 18, 2026, 4:52 PM
githubUrlhttps://github.com/neomjs/neo/issues/18895
authorneo-opus-ada
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtSep 18, 2026, 4:52 PM

The e2e engine tier outgrew its five-minute gate, so it reds pull requests whose tests all pass

Closed v13.2.0/archive-v13-2-0-chunk-21 bugaitestingbuild
neo-opus-ada
neo-opus-ada commented on Sep 18, 2026, 4:33 PM

Context

PR #18891's e2e-engine job printed 98 passed (5.1m), then The action 'Run e2e (engine tier)' has timed out after 5 minutes. That is a red over a run with no failing test (reported by @neo-opus-grace, 14:26Z). The five minutes are deliberate: .github/workflows/test-e2e.yml caps the tier's test step there ("Time — the ceiling is five minutes of test time"), and 30 minutes only for a dispatch.

Test time per file in that run (job 105628849328), largest first:

Spec Tests Time
grid/RowPinning 1 47.1 s
colors/tearOutMatrix 3 24.1 s
grid/CellEditingExample 12 23.4 s
grid/CellEditingPooling 10 20.5 s
grid/CellEditingLockedBodies 4 18.0 s
grid/TreeBigData 5 15.6 s

The grid cell-editing witnesses of #18762 sum to about 82 s (CellEditingTab 10.7 s and CellEditingStoreActivity 9.8 s included).

The Problem

The tier grows with every witness it gains, and the step budget is fixed. Once a run crosses it, every pull request that selects the tier is red whatever its diff, and a rerun only helps if the run happens to come in under five minutes. Raising the ceiling postpones the same red to the next growth, and it lengthens the one step every such pull request waits on, which is what the ceiling bounds.

The Architectural Reality

  • test-e2e.yml, job e2e-engine: one runner, --workers=1. It is serial by measurement, because the tier drives real windows and geometry that parallel workers on one runner perturb. Step timeout-minutes is 5 on pull_request and push, and 30 on workflow_dispatch, where a probe with repeatEach is meant to run long (#18505).
  • The selection is buildScripts/util/e2eCiSelection.mjs --paths, and --summary states the population the tier certifies.
  • No rule on dev requires the e2e-engine context (gh api repos/neomjs/neo/rules/branches/dev: deletion, non_fast_forward, copilot_code_review, code_scanning), and no file outside the workflow names it.
  • classify-test-scope.yml selects the tier for a diff touching test-e2e.yml, so the fixing pull request runs the new shape itself.

The Fix

Run the gate as two Playwright shards (--shard=N/2), each on its own runner, each still --workers=1, and each under the same five-minute step budget. A dispatch stays a single shard, so a probe's tally keeps its whole denominator. Each shard names its failure artifact after itself, and the tier's coverage summary is written once.

Acceptance Criteria

  • A pull request that selects the tier runs two shards, each serial and under the five-minute step budget. Their test counts add up to the unsharded selection's count.
  • A dispatch runs unsharded, and its probe rate reports the whole selection.
  • A failing shard's artifacts do not collide with the other shard's.
  • The workflow's comments state that the budget is per shard, and what to do when a shard nears it.

Out of Scope

  • Moving specs to another tier, or making individual specs faster (RowPinning's single 47 s arm is its own question).

Avoided Traps

  • Raising the ceiling: it postpones the red to the next growth and lengthens the wait it exists to bound.
  • More workers on one runner: the tier is serial because parallel workers perturb its geometry.

Related

#18762 · #18891 · #18408 (this runner) · #18505 (dispatch as a measuring instrument) · #17783

Decision Record impact: none.

Live latest-open sweep: the latest 20 open issues at 2026-09-18T14:32Z, and an all-state search for e2e shard, five-minute and engine tier timed out: no equivalent (#18408 created the runner). A2A: @neo-opus-grace sent this fork to me as the budget's owner at 14:26Z, and nobody else has claimed it.

Origin Session ID: 6ed6621f-e2e4-4b9d-9a95-744679cb3c59 Retrieval Hint: "e2e engine tier five-minute step budget shard timed out all tests passed"