Repository navigation
ci: gate merges through the merge queue with one required check per workflow - #931
Conversation
🟢 e2e web: 91 passedAll 91 tests in 41 files
e2e 0.18.0 · 1m 59s · web · run artifacts |
There was a problem hiding this comment.
All reported issues were addressed across 7 files
Heads up: you’re close to your included review allowance. Set a flex budget so reviews don’t pause.
Turn on auto-fix | Re-trigger cubic
🟢 e2e web agent: 33 passed34 agent steps · 26 replayed from cache · 21 model calls · 83.9k tokens (90% cached) · $0.0043 All 33 tests in 5 files
e2e 0.18.0 · 2m 56s · web · run artifacts |
🟢 e2e ios agent: 21 passed, 1 skipped25 agent steps · 136 model calls · 853.7k tokens (82% cached) · $0.0561 All 22 tests in 1 file
e2e 0.18.0 · 12m 17s · ios-simulator · run artifacts |
🟢 e2e android: 1 flaky, 53 passed, 1 skipped
|
| Test | Time | |
|---|---|---|
| tests/device.e2e.ts · 1 flaky, 3 passed | 43.1s | |
| 🟢 | permission prompt › allowing the system dialog enables the microphone | 7.3s |
| 🟢 | permission prompt › a denied prompt recovers once the permission is granted outside | 12.7s |
| sequential onboarding echoes the exact values (1 failed attempt first) | 15.7s | |
| 🟢 | onboarding rejects a malformed email before advancing | 7.4s |
| ⏭️ | tests/controls.e2e.ts · 24 passed, 1 skipped | 3m 31s |
| 🟢 | control inventory › a label query resolves a labeled text field | 34.4s |
| 🟢 | control inventory › a labeled field answers name, display value, value reads, fill, and clear | 15.9s |
| 🟢 | control inventory › a placeholder query and attribute reads find the field | 11.0s |
| 🟢 | control inventory › a secure field takes a fill and denies value reads | 9.2s |
| 🟢 | control inventory › press sends a character and Enter through the soft keyboard | 9.1s |
| 🟢 | control inventory › a field autofocuses on mount and focus() moves the focus | 13.0s |
| 🟢 | control inventory › toBeFocused follows the focus | 10.7s |
| 🟢 | control inventory › a switch checks, unchecks, and reports its state | 10.3s |
| 🟢 | control inventory › checkbox and radio roles answer getByRole, and a checkbox toggles by tap | 7.5s |
| 🟢 | control inventory › checkbox and radio roles check, uncheck, and report their state | 12.8s |
| 🟢 | control inventory › a tab role answers getByRole | 4.0s |
| 🟢 | control inventory › a radio group reports the checked option | 9.8s |
| 🟢 | control inventory › buttons report disabled, enabled, and a state that arrives later | 9.8s |
| 🟢 | control inventory › a display: none element is absent rather than hidden, its visible twin attached | 6.5s |
| 🟢 | control inventory › a header answers its accessible name | 4.2s |
| 🟢 | control inventory › a tab row answers count, all, texts, filters, positions, and switching | 5.6s |
| 🟢 | control inventory › a list answers counts, list-form text, reads, and boxes in order | 5.4s |
| ⏭️ | control inventory › a row contains its texts (skipped: React Native flattens a plain View out of the accessibility tree on both platforms: XCTest and the Android helper report a View with a testID as a leaf beside its children, so filter({ has }) and a query scoped to it match nothing; only Sc…) | |
| 🟢 | control inventory › a long press lands as one | 7.3s |
| 🟢 | control inventory › a double tap lands inside the 300 ms window | 7.9s |
| 🟢 | control inventory › an ambiguous locator fails at once | 5.3s |
| 🟢 | control inventory › screenshot, restart, and clearState reopen the app on its home list | 10.6s |
| 🟢 | refusals › verbs a device never declares are refused before the engine | 3ms |
| 🟢 | refusals › keys the soft keyboard cannot send are refused by the engine | 95ms |
| 🟢 | refusals › a missing locator fails as not found once its timeout passes | 1.1s |
| 🟢 | tests/device-fixture.e2e.ts · 8 passed | 1m 9s |
| 🟢 | device fixture › setOrientation rotates the window the app measures | 4.8s |
| 🟢 | device fixture › home leaves the app, openApp brings it back where it was | 6.2s |
| 🟢 | device fixture › foregroundApp sees the home screen after home() | 4.2s |
| 🟢 | device fixture › closeApp then openApp relaunches on the home list | 7.5s |
| 🟢 | device fixture › foregroundApp after closeApp reports the closed session as APP_NOT_OPEN | 4.8s |
| 🟢 | device fixture › device.back pops the scenario | 5.6s |
| 🟢 | device fixture › setNetwork and setAirplaneMode change what the app sees | 16.2s |
| 🟢 | device fixture › setLocation and clearLocation change what the app reads | 19.7s |
| 🟢 | tests/flows-lists.e2e.ts · 7 passed | 2m 23s |
| 🟢 | infinite scroll reaches the target item | 25.3s |
| 🟢 | product catalog adds exactly two of the right variant | 9.6s |
| 🟢 | gestures: long-press, then swipe left | 7.8s |
| 🟢 | gestures: double-tap completes the flow | 9.9s |
| 🟢 | sticky chrome: accept below the fold, then continue | 12.9s |
| 🟢 | async states: load, pull to refresh, claim through the toast | 11.8s |
| 🟢 | huge virtualized list reaches row 512 | 1m 6s |
| 🟢 | tests/flows.e2e.ts · 7 passed | 1m 2s |
| 🟢 | text inputs unlock the submit button | 8.9s |
| 🟢 | filled text inputs report their values | 7.0s |
| 🟢 | modal flow confirms through the native alert | 9.8s |
| 🟢 | bottom tabs act inside the last tab | 8.0s |
| 🟢 | error recovery retries, then confirms the delete | 9.1s |
| 🟢 | choice controls place the exact order | 9.1s |
| 🟢 | debounced search selects the target once results arrive | 10.1s |
| 🟢 | tests/login-form.e2e.ts · 3 passed | 31.8s |
| 🟢 | login form › rejects a malformed email | 9.6s |
| 🟢 | login form › rejects an unknown account | 8.8s |
| 🟢 | login form › signs in and logs out | 13.4s |
| 🟢 | tests/smoke.e2e.ts · 1 passed | 6.7s |
| 🟢 | home lists the scenarios and opens one | 6.7s |
e2e 0.18.0 · 9m 47s · android-emulator · run artifacts
🟢 e2e android agent: 20 passed24 agent steps · 113 model calls · 607.4k tokens (85% cached) · $0.0363 All 20 tests in 1 file
e2e 0.18.0 · 9m 46s · android-emulator · run artifacts |
🟢 e2e ios: 52 passed, 1 skippedAll 53 tests in 7 files
e2e 0.18.0 · 6m 45s · ios-simulator · run artifacts |
|
[claude-opus-5-5] responding on behalf of okwasniewski Needs a human:
|
e97af99 to
905f9c1
Compare
The
Mainruleset enables a merge queue but requires no status checks, and no workflow listens tomerge_group. So the queue merges right away and auto-merge waits on nothing: #929 merged whilespecandmobilewere still running.spec,benchmark,mobile,docsends in a<workflow> gatejob. It fails when any job it needs failed or was cancelled and passes over a skipped one. These four are the only checks the ruleset will require.merge_group, so the queue runs every suite on the queued tree before it merges.mobile:changesplans the suites as a matrix. A fork or Dependabot PR leaves outagenticat the job level. Before, those jobs built the Expo app and booted 2 simulators, then skipped only the run step and reported green.mobileon push to main runs no suite (the queue already tested the same tree). It only rebuilds the Expo app on a cache miss (lookup-only), because main's cache scope is the one PRs and queue entries restore from. The per-platform build commands moved into.github/actions/expo-appso both paths share them.docsdrops its workflow-levelpaths:(a required gate would sit pending forever) for adocsentry in.github/filters.yml. It no longer runs on push to main.benchmarkweb agentskips Dependabot PRs, as mobile already did.specandbenchmarkstill run on push to main (cheap, they warm main's caches, and they keep a health signal).Trust change: the queue runs a queued PR's code with repo secrets, fork or not. Enqueueing is now the trust decision (written into AGENTS.md security invariants).
Rejected review finding: the agent-device runner cache will no longer be saved on main. Measured on #917, a cache miss costs nothing visible (suite 9:46 on a miss vs 10:53 on a hit), so it isn't worth warming.
After merge
Update the
Mainruleset (doing it before this lands would block every open PR):required_status_checks:spec gate,benchmark gate,mobile gate,docs gate(GitHub Actions integration)check_response_timeout_minutesfrom 60 to 120 (mobile jobs time out at 60, plus the macOS queue)Verified
Ran it locally: no - CI-only.
actionlintis clean (Blacksmith labels and one existing SC2016 ignored) andpnpm checkpasses. Thepull_requestpath is verified by this PR's own runs. Themerge_grouppath can only be exercised after the ruleset update.