Skip to content

feat: write a failure page per failed test with each step's actions, polls, cache decision, and app log - #823

Closed
okwasniewski wants to merge 4 commits into
oskar/drop-playwright-tracefrom
oskar/failure-pages
Closed

okwasniewski wants to merge 4 commits into
oskar/drop-playwright-tracefrom
oskar/failure-pages

Conversation

@okwasniewski

@okwasniewski okwasniewski commented Oct 4, 2026 •

Copy link
Copy Markdown
Member

Stacked on #822. When a test fails, a coding agent (or a person) should read one file and know what happened. Today that file is opt-in (--reporter markdown), deterministic steps record nothing (events: []), the cache's decision never leaves report.json, and console errors and failed requests exist only inside the trace zip the parent PR removes.

Every run now writes a page per failed or flaky test under .e2e/failures/, and each step on it says what it did.

flowchart LR
  E[web engine: console, pageerror, requestfailed, 4xx/5xx] -- appLog --> R[StepRecorder: redact, file under the step]
  L[LocatorEngine: node acted on] --> R
  P[expect / waitFor: sample history] --> R
  C[step cache: stop point, write outcome, entry] --> R
  R --> J[report.json events]
  J --> F[runner writes failures/*.md]
  F --> T["terminal: ❯ details failures/x.md"]
Loading
  • Engine hook: EngineAttemptContext.appLog({ source, level, text }). The session adapter checks each entry, holds it until a step recorder takes it, and files it under the step that started last, redacted then clipped (200 per attempt). The web engine reports console errors and warnings, uncaught exceptions, failed requests, and 4xx/5xx responses (packages/web/src/app-log.ts).
  • Deterministic steps: an engine event per action names the node from the resolve's own cache, no engine call (tap button "Add" (appeared after 1200ms, went stale 1x)); a point action names its point (tap at (120, 48)). expect and waitFor record a poll event with the readings in order: one value the whole time is a wrong expectation, changing values are a race.
  • Cache: step.cache.entry (the file), detail (at action 2 of 3, tap button "Apply": ..., or the recorded end state that never showed), and the report-only write (saved, kept, unconfirmed, evicted, no-change). New entries store their key's context, so a rekeyed REPLAY_STALE names what changed: since the app's identity (app.identity, else its URL) or environment changed. Existing entries are not rewritten to gain it.
  • Also recorded: the hook a step ran in (step.phase), loop-guard and wind-down notes on the agent's turns, and the message of a failed agent action.
  • Output: the runner writes the pages before run-finished (named <file>-<title slug>-<16 hex of the result id>.md) and names them in the event and FinishedRun.failurePages. The markdown reporter keeps only summary.md, linked to them. A page that cannot be written is a stderr line, like junit.xml.

Verified

Ran it locally: yes

  • testbed, a scratch config with a scripted model (no provider key) and four failing tests: agentic, agent step then a wrong expectation, a missing locator, and a page that logs errors. e2e run:
 FAIL  |web| tests-audit/audit.e2e.ts > app: the page breaks while the test runs
LOCATOR_NOT_FOUND: locator did not become visible: getByRole("heading", name: "Todos")
 ❯ at http://127.0.0.1:4388/nope
 ❯ app 2 errors, 2 warnings logged
 ❯ details .e2e-audit/failures/audit-app-the-page-breaks-while-the-796fac5f.md
...
   Failures  .e2e-audit/failures/ (4 pages: steps, cache, app log, screen)

The page's steps:

1. ✓ `app.open` `/todos` (37ms in beforeEach) — `tests-audit/audit.e2e.ts:4`
2. ✓ `browser.evaluate` (3ms) — `tests-audit/audit.e2e.ts:24`
   - ✗ console error: `failed to load todos: TypeError: items is undefined`
3. ✓ `app.open` `/nope` (5ms) — `tests-audit/audit.e2e.ts:30`
   - ✗ uncaught error: `RangeError: render loop exceeded at eval (...)`
   - ⚠ network warning: `GET /api/missing 404 Not Found`
   - ⚠ network warning: `GET /nope 404 Not Found`
4. ✗ `locator.waitFor` `getByRole("heading", name: "Todos") → visible` (1.0s) — **LOCATOR_NOT_FOUND**
   - waitFor gave up after 11 reads in 1.0s: absent x11

and for the agent step that passed before a wrong expectation:

2. ✓ `agent.act` "Add a todo named Milk." (420ms, 2 model calls)
   - cache: no replay: nothing recorded for this step yet; recording saved (`.e2e/cache/1227d5a6….json`)
   - type "Milk" into textbox "New todo" (18ms)
   - press "Enter" on the focused field (4ms)
5. ✗ `expect.toHaveText` `getByRole("status", name: "Remaining")` (1.6s) — **ASSERTION_FAILED**
   - expect gave up after 16 reads in 1.6s: text "0 remaining" (1 match) x16
  • Second run of the same suite: cache: replayed all 2 recorded actions, no model call; recording kept. Changing the app port and running with --strict-cache: REPLAY_STALE ... since the app's identity (app.identity, else its URL) or environment changed after it was recorded.
  • web-benchmark agentic suite, CI=1 --strict-cache with committed recordings and no key: 26 replayed. The 7 failures are steps that call the model by design, and the failure pages said so (no replay: a retry never replays, at action 2 of 3, tool type (run-time value)).

Review in cubic

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e web: 91 passed

All 91 tests in 41 files
Test Time
🟢 tests/aria-hidden-flow.e2e.ts · 2 passed 622ms
🟢 aria hidden flow › picks the Pro plan by its visible text and confirms it 440ms
🟢 aria hidden flow › another plan shows the error and keeps the picker open 182ms
🟢 tests/async-states.e2e.ts · 2 passed 7.1s
🟢 async states › reads the code off the transient toast and verifies it once the button enables 2.2s
🟢 async states › a wrong code is rejected after the toast has gone 4.8s
🟢 tests/canvas-only.e2e.ts · 2 passed 300ms
🟢 canvas only › taps square, circle, then diamond at their pixel coordinates 151ms
🟢 canvas only › a shape out of order paints the error and resets progress 149ms
🟢 tests/canvas-whiteboard.e2e.ts · 2 passed 400ms
🟢 canvas whiteboard › drags both shapes into their slots and saves 234ms
🟢 canvas whiteboard › bounces a shape off the wrong slot and refuses to save early 166ms
🟢 tests/cart-totals.e2e.ts · 2 passed 381ms
🟢 cart totals › increasing a quantity updates the line total but the order summary stays stale (planted bug) 207ms
🟢 cart totals › a quantity never drops below one 174ms
🟢 tests/checkout-review.e2e.ts · 1 passed 231ms
🟢 shows a raw greeting token and an undefined delivery date (planted bug), yet places the order 231ms
🟢 tests/context-menu-trap.e2e.ts · 2 passed 537ms
🟢 context menu trap › right-click opens nothing; the row menu renames the file 292ms
🟢 context menu trap › the decoy menu items refuse and keep the file 245ms
🟢 tests/control-inventory.e2e.ts · 8 passed 3.5s
🟢 control inventory › check sets the checkbox and the radio without flipping a set one 250ms
🟢 control inventory › check picks a radio the pick replaces with its summary 174ms
🟢 control inventory › a long press and a double click are told apart from a tap 971ms
🟢 control inventory › the file menu opens on right-click only and Rename renames the file 218ms
🟢 control inventory › setInputFiles attaches files named from the project root 143ms
🟢 control inventory › the details view is left through the browser history 195ms
🟢 control inventory › scrollIntoView brings the footnote into view 247ms
🟢 control inventory › every exercise done shows the success message 1.3s
🟢 tests/css-content-ui.e2e.ts · 2 passed 437ms
🟢 css content ui › the tile labelled Ship it advances and confirming ships 244ms
🟢 css content ui › a wrong tile shows the CSS-rendered error and keeps the picker 193ms
🟢 tests/date-picker.e2e.ts · 2 passed 671ms
🟢 date picker › navigates three months ahead and books the required date 406ms
🟢 date picker › confirming without the exact date shows the error 265ms
🟢 tests/debounced-search.e2e.ts · 2 passed 2.9s
🟢 debounced search › a decoy one character off is refused 1.5s
🟢 debounced search › picking the exact item adds it to the cart 1.5s
🟢 tests/deferred-dialog.e2e.ts · 1 passed 1.1s
🟢 one submit opens one confirm, even when double-clicked 1.1s
🟢 tests/div-soup.e2e.ts · 2 passed 630ms
🟢 div soup › a wrong code is rejected 299ms
🟢 div soup › the right code grants access after the delete tile fixes a typo 331ms
🟢 tests/drag-and-drop.e2e.ts · 2 passed 680ms
🟢 drag and drop › an out-of-order item resets the dropzone 351ms
🟢 drag and drop › dropping Banana then Cherry passes 329ms
🟢 tests/filter-deep-link.e2e.ts · 2 passed 241ms
🟢 filter deep link › filtering writes the query to the URL 137ms
🟢 filter deep link › opening a shared link restores the filter 104ms
🟢 tests/gift-card-purchase.e2e.ts · 3 passed 476ms
🟢 gift card purchase › refuses to buy without an amount 142ms
🟢 gift card purchase › refuses a recipient without an at sign 164ms
🟢 gift card purchase › sends the gift card 170ms
🟢 tests/hover-menu.e2e.ts · 2 passed 410ms
🟢 hover menu › a decoy leaf is refused 177ms
🟢 hover menu › hovering Account, then Billing, reaches Redeem voucher 233ms
🟢 tests/iframe-form.e2e.ts · 2 passed 464ms
🟢 iframe form › a wrong code is refused by the host page 234ms
🟢 iframe form › the code read from one frame applies through the other 230ms
🟢 tests/image-only-ui.e2e.ts · 3 passed 395ms
🟢 image only ui › the icons have no names, so the bare svg locator is ambiguous 101ms
🟢 image only ui › a wrong icon shows the error image and keeps the icons 130ms
🟢 image only ui › tapping the star, then the heart, verifies the icons 164ms
🟢 tests/infinite-scroll.e2e.ts · 1 passed 3.9s
🟢 scrolls the feed until the Golden Ticket loads, then claims it 3.9s
🟢 tests/kanban-board.e2e.ts · 3 passed 733ms
🟢 kanban board › pointer drags move both cards into the goal layout 366ms
🟢 kanban board › a swipe along a path drags a card as well 152ms
🟢 kanban board › a plain tap moves nothing and the untouched board is rejected 215ms
🟢 tests/login-form.e2e.ts · 4 passed 736ms
🟢 login form › rejects a malformed email 164ms
🟢 login form › rejects a short password 167ms
🟢 login form › rejects an unknown account 184ms
🟢 login form › signs in and logs out 221ms
🟢 tests/lying-labels.e2e.ts · 4 passed 642ms
🟢 lying labels › the button whose accessible name says Pay now is the wrong one 140ms
🟢 lying labels › a text match for Pay now catches the decoy phrase too 106ms
🟢 lying labels › the field whose accessible name says Amount is the wrong one 193ms
🟢 lying labels › visible text drives the payment through 203ms
🟢 tests/native-dialogs.e2e.ts · 3 passed 430ms
🟢 native dialogs › answers the confirm, prompt, and alert chain 146ms
🟢 native dialogs › dismissing the confirm cancels the order 139ms
🟢 native dialogs › a wrong gift code is rejected 145ms
🟢 tests/newsletter-signup.e2e.ts · 1 passed 2.2s
🟢 subscribe renders no feedback and logs a TypeError (planted bug) 2.2s
🟢 tests/onboarding-wizard.e2e.ts · 5 passed 4.1s
🟢 onboarding wizard › back keeps what was typed and the brief comes back with it 217ms
🟢 onboarding wizard › the address step takes the brief through its bare-div dropdown 300ms
🟢 onboarding wizard › the profile step steers the calendar three decades back 1.0s
🟢 onboarding wizard › the preferences step flips the toggles the brief names and leaves the trap off 1.2s
🟢 onboarding wizard › the review step repeats the brief and finishes with the PIN 1.3s
🟢 tests/order-history.e2e.ts · 2 passed 1.4s
🟢 order history › overview and settings render their panels 163ms
🟢 order history › the orders tab never leaves its loading state (planted bug) 1.2s
🟢 tests/otp-auto-advance.e2e.ts · 3 passed 1.4s
🟢 otp auto-advance › focus advances with each digit and the full code verifies 460ms
🟢 otp auto-advance › backspace on an empty box clears and refocuses the previous one 141ms
🟢 otp auto-advance › a wrong code clears every box and starts over 772ms
🟢 tests/overlay-trap.e2e.ts · 1 passed 687ms
🟢 continues only after the banner and the overlay are gone 687ms
🟢 tests/playbook-cleanup.e2e.ts · 2 passed 430ms
🟢 playbook cleanup › deleting the draft removes it from an exact-name search 213ms
🟢 playbook cleanup › cancelling the dialog keeps the draft searchable 217ms
🟢 tests/price-sorting.e2e.ts · 3 passed 376ms
🟢 price sorting › opens in the featured order with sale prices struck through 109ms
🟢 price sorting › low to high sorts by the original price, not the paid one (planted bug) 137ms
🟢 price sorting › high to low is the same wrong order reversed (planted bug) 130ms
🟢 tests/product-reviews.e2e.ts · 1 passed 1.1s
🟢 the running-shoe page lists coffee-grinder reviews (planted bug) 1.1s
🟢 tests/promo-storefront.e2e.ts · 1 passed 1.4s
🟢 buys a deal once the promo chrome is out of the way 1.4s
🟢 tests/rich-text-editor.e2e.ts · 2 passed 431ms
🟢 rich text editor › bolding exactly the required word passes the check 214ms
🟢 rich text editor › bold that spills into the previous word fails the check 217ms
🟢 tests/saved-addresses.e2e.ts · 3 passed 545ms
🟢 saved addresses › adds an address and clears the form 188ms
🟢 saved addresses › ignores an add with an empty field 174ms
🟢 saved addresses › delete shows its toast but keeps the address, on retry too (planted bug) 183ms
🟢 tests/shadow-dom-form.e2e.ts · 2 passed 546ms
🟢 shadow DOM form › rejects a wrong access code 281ms
🟢 shadow DOM form › grants access with the code from the hint inside the root 265ms
🟢 tests/smoke.e2e.ts · 1 passed 392ms
🟢 home lists the scenarios and opens one 392ms
🟢 tests/stale-dom.e2e.ts · 1 passed 2.2s
🟢 taps the moving target three times across rebuilds of the list 2.2s
🟢 tests/sticky-chrome.e2e.ts · 1 passed 165ms
🟢 accepts the terms once the button clears the sticky footer 165ms
🟢 tests/virtualized-table.e2e.ts · 1 passed 1m 5s
🟢 scrolls the windowed table to the Golden Row and claims it 1m 5s
🟢 tests/wishlist.e2e.ts · 2 passed 1.5s
🟢 wishlist › saving toggles the button and the tab badge 245ms
🟢 wishlist › the wishlist tab renders the empty state despite the badge count (planted bug) 1.3s

e2e 0.17.0 · 1m 52s · web · run artifacts

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e web agent: 33 passed

34 agent steps · 26 replayed from cache · 20 model calls · 76.2k tokens (92% cached) · $0.0035

All 33 tests in 5 files
Test Agent Time
🟢 tests-agent/control-inventory.e2e.ts · 7 passed 7 steps 7.5s
🟢 control inventory › check sets the checkbox and the radio 1 step 605ms
🟢 control inventory › check picks a radio the pick replaces with its summary 1 step 373ms
🟢 control inventory › a long press and a double click are chosen over a plain tap 1 step 890ms
🟢 control inventory › a right-click opens the file menu and Rename renames the file 1 step 2.6s
🟢 control inventory › upload attaches the named project files 1 step 2.4s
🟢 control inventory › back returns from the details view to the inventory 1 step 287ms
🟢 control inventory › scroll_to brings the footnote into view 1 step 374ms
🟢 tests-agent/login-form.e2e.ts · 1 passed 1 step 358ms
🟢 act signs in with the benchmark account 1 step 358ms
🟢 tests-agent/planted-bugs.e2e.ts · 3 passed 4 steps · 8 calls 13.3s
🟢 cart totals: a judgment catches the stale order summary 2 steps · 4 calls 7.7s
🟢 checkout review: a judgment catches the broken copy 1 step · 1 call 1.6s
🟢 wishlist: a judgment catches the lost saved items 1 step · 3 calls 4.0s
🟢 tests-agent/scenarios.e2e.ts · 21 passed 21 steps · 12 calls 2m 32s
🟢 act completes shadow-dom-form 1 step · 3 calls 4.3s
🟢 act completes lying-labels 1 step · 3 calls 4.7s
🟢 act completes iframe-form 1 step · 3 calls 4.2s
🟢 act completes infinite-scroll 1 step 5.4s
🟢 act completes virtualized-table 1 step 1m 44s
🟢 act completes overlay-trap 1 step 845ms
🟢 act completes sticky-chrome 1 step 845ms
🟢 act completes async-states 1 step · 3 calls 6.6s
🟢 act completes debounced-search 1 step 2.3s
🟢 act completes hover-menu 1 step 476ms
🟢 act completes drag-and-drop 1 step 432ms
🟢 act completes kanban-board 1 step 638ms
🟢 act completes context-menu-trap 1 step 2.6s
🟢 act completes stale-dom 1 step 467ms
🟢 act completes otp-auto-advance 1 step 690ms
🟢 act completes date-picker 1 step 785ms
🟢 act completes rich-text-editor 1 step 7.8s
🟢 act completes playbook-cleanup 1 step 560ms
🟢 act completes promo-storefront 1 step 2.3s
🟢 act completes gift-card-purchase 1 step 2.3s
🟢 act filters the list and the URL carries the filter 1 step 198ms
🟢 tests-agent/unique-cache.e2e.ts · 1 passed 1 step 254ms
🟢 act adds an address with a run-unique label 1 step 254ms

e2e 0.17.0 · 2m 54s · web · run artifacts

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 99 files

Heads up: you’re close to your included review allowance. Set a flex budget so reviews don’t pause.

Re-trigger cubic

Comment thread packages/e2e/src/expect/samples.ts Outdated
Comment thread packages/e2e/src/report/outcome.ts Outdated
Comment thread packages/e2e/src/report/failure-text.ts Outdated
Comment thread docs/coding-agents.mdx
Comment thread packages/e2e/src/report/failure-pages.ts Outdated
Comment thread packages/e2e/src/report/failure-text.ts Outdated
Comment thread packages/e2e/src/agent/tool-loop.ts Outdated
Comment thread packages/e2e/src/engine/index.ts
Comment thread packages/web/tests/integration/app-log.test.ts
Comment thread docs/reference/cli.mdx
@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e ios: 1 flaky, 51 passed, 1 skipped

⚠️ 1 flaky test passed on a retry

⚠️ control inventory › toBeFocused follows the focus
tests/controls.e2e.ts:101

ASSERTION_FAILED at step 5 of 5: expect.toBeFocused getByRole("textbox", name: "Autofocus field"), after 5.3s

  • Expected: focused
  • Observed: default states (1 match)
  • Failed the same way on 2 attempts: ASSERTION_FAILED at step 5. The retry that passed is the exception.
  • Screen: dev.e2e.benchmark / Control Inventory

Evidence: screenshot, log

All 53 tests in 7 files
Test Time
⚠️ tests/controls.e2e.ts · 1 flaky, 22 passed, 1 skipped 3m 37s
🟢 control inventory › a label query resolves a labeled text field 10.0s
🟢 control inventory › a labeled field answers name, display value, value reads, fill, and clear 18.3s
🟢 control inventory › a placeholder query and attribute reads find the field 6.1s
🟢 control inventory › a secure field takes a fill and denies value reads 9.5s
🟢 control inventory › press sends a character and Enter through the soft keyboard 9.0s
🟢 control inventory › a field autofocuses on mount and focus() moves the focus 11.8s
⚠️ control inventory › toBeFocused follows the focus (2 failed attempts first) 13.5s
🟢 control inventory › a switch checks, unchecks, and reports its state 14.5s
🟢 control inventory › checkbox and radio roles answer getByRole, and a checkbox toggles by tap 9.8s
🟢 control inventory › checkbox and radio roles check, uncheck, and report their state 16.9s
🟢 control inventory › a radio group reports the checked option 15.3s
🟢 control inventory › buttons report disabled, enabled, and a state that arrives later 9.0s
🟢 control inventory › a display: none element is absent rather than hidden, its visible twin attached 8.6s
🟢 control inventory › a header answers its accessible name 5.2s
🟢 control inventory › a tab row answers count, all, texts, filters, positions, and switching 8.1s
🟢 control inventory › a list answers counts, list-form text, reads, and boxes in order 8.5s
⏭️ 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 9.6s
🟢 control inventory › pointer verbs land at the point asked for 11.9s
🟢 control inventory › an ambiguous locator fails at once 6.9s
🟢 control inventory › screenshot, restart, and clearState reopen the app on its home list 13.0s
🟢 refusals › verbs a device never declares are refused before the engine 3ms
🟢 refusals › keys the soft keyboard cannot send are refused by the engine 636ms
🟢 refusals › a missing locator fails as not found once its timeout passes 1.3s
🟢 tests/device-fixture.e2e.ts · 9 passed 1m 20s
🟢 device fixture › setAppearance flips the color scheme the app reads 11.8s
🟢 device fixture › setOrientation rotates the window the app measures 7.3s
🟢 device fixture › the clipboard reads back what was written 5.7s
🟢 device fixture › home leaves the app, openApp brings it back where it was 7.6s
🟢 device fixture › closeApp then openApp relaunches on the home list 8.0s
🟢 device fixture › foregroundApp after closeApp reports the closed session as APP_NOT_OPEN 5.3s
🟢 device fixture › device.back pops the scenario 5.8s
🟢 device fixture › setLocation and clearLocation change what the app reads 13.3s
🟢 device fixture › enrollBiometrics and setBiometrics answer a biometric prompt 14.6s
🟢 tests/device.e2e.ts · 2 passed 1m 7s
🟢 sequential onboarding echoes the exact values 51.3s
🟢 onboarding rejects a malformed email before advancing 15.4s
🟢 tests/flows-lists.e2e.ts · 7 passed 3m 53s
🟢 infinite scroll reaches the target item 30.3s
🟢 product catalog adds exactly two of the right variant 11.1s
🟢 gestures: long-press, then swipe left 9.9s
🟢 sticky chrome: accept below the fold, then continue 11.9s
🟢 async states: load, pull to refresh, claim through the toast 13.7s
🟢 huge virtualized list reaches row 512 2m 20s
🟢 web view coupon form applies the code shown on the page 15.8s
🟢 tests/flows.e2e.ts · 7 passed 1m 20s
🟢 text inputs unlock the submit button 19.2s
🟢 filled text inputs report their values 10.6s
🟢 modal flow confirms through the native alert 10.7s
🟢 bottom tabs act inside the last tab 8.4s
🟢 error recovery retries, then confirms the delete 10.8s
🟢 choice controls place the exact order 9.1s
🟢 debounced search selects the target once results arrive 11.4s
🟢 tests/login-form.e2e.ts · 3 passed 49.2s
🟢 login form › rejects a malformed email 13.1s
🟢 login form › rejects an unknown account 13.8s
🟢 login form › signs in and logs out 22.3s
🟢 tests/smoke.e2e.ts · 1 passed 11.8s
🟢 home lists the scenarios and opens one 11.8s

e2e 0.17.0 · 6m 37s · ios-simulator · run artifacts

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e android: 54 passed, 1 skipped

All 55 tests in 7 files
Test Time
⏭️ tests/controls.e2e.ts · 24 passed, 1 skipped 3m 6s
🟢 control inventory › a label query resolves a labeled text field 25.9s
🟢 control inventory › a labeled field answers name, display value, value reads, fill, and clear 14.7s
🟢 control inventory › a placeholder query and attribute reads find the field 7.1s
🟢 control inventory › a secure field takes a fill and denies value reads 7.6s
🟢 control inventory › press sends a character and Enter through the soft keyboard 8.3s
🟢 control inventory › a field autofocuses on mount and focus() moves the focus 13.0s
🟢 control inventory › toBeFocused follows the focus 9.1s
🟢 control inventory › a switch checks, unchecks, and reports its state 10.2s
🟢 control inventory › checkbox and radio roles answer getByRole, and a checkbox toggles by tap 7.3s
🟢 control inventory › checkbox and radio roles check, uncheck, and report their state 11.6s
🟢 control inventory › a tab role answers getByRole 3.7s
🟢 control inventory › a radio group reports the checked option 8.8s
🟢 control inventory › buttons report disabled, enabled, and a state that arrives later 7.6s
🟢 control inventory › a display: none element is absent rather than hidden, its visible twin attached 6.3s
🟢 control inventory › a header answers its accessible name 3.9s
🟢 control inventory › a tab row answers count, all, texts, filters, positions, and switching 5.4s
🟢 control inventory › a list answers counts, list-form text, reads, and boxes in order 5.1s
⏭️ 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.0s
🟢 control inventory › a double tap lands inside the 300 ms window 7.4s
🟢 control inventory › an ambiguous locator fails at once 4.7s
🟢 control inventory › screenshot, restart, and clearState reopen the app on its home list 8.5s
🟢 refusals › verbs a device never declares are refused before the engine 12ms
🟢 refusals › keys the soft keyboard cannot send are refused by the engine 1.2s
🟢 refusals › a missing locator fails as not found once its timeout passes 1.1s
🟢 tests/device-fixture.e2e.ts · 8 passed 1m 6s
🟢 device fixture › setOrientation rotates the window the app measures 5.0s
🟢 device fixture › home leaves the app, openApp brings it back where it was 6.6s
🟢 device fixture › foregroundApp sees the home screen after home() 4.1s
🟢 device fixture › closeApp then openApp relaunches on the home list 6.8s
🟢 device fixture › foregroundApp after closeApp reports the closed session as APP_NOT_OPEN 4.3s
🟢 device fixture › device.back pops the scenario 4.9s
🟢 device fixture › setNetwork and setAirplaneMode change what the app sees 16.1s
🟢 device fixture › setLocation and clearLocation change what the app reads 18.6s
🟢 tests/device.e2e.ts · 4 passed 38.0s
🟢 permission prompt › allowing the system dialog enables the microphone 6.9s
🟢 permission prompt › a denied prompt recovers once the permission is granted outside 13.3s
🟢 sequential onboarding echoes the exact values 10.7s
🟢 onboarding rejects a malformed email before advancing 7.0s
🟢 tests/flows-lists.e2e.ts · 7 passed 2m 12s
🟢 infinite scroll reaches the target item 18.0s
🟢 product catalog adds exactly two of the right variant 10.4s
🟢 gestures: long-press, then swipe left 7.9s
🟢 gestures: double-tap completes the flow 9.6s
🟢 sticky chrome: accept below the fold, then continue 11.6s
🟢 async states: load, pull to refresh, claim through the toast 11.6s
🟢 huge virtualized list reaches row 512 1m 3s
🟢 tests/flows.e2e.ts · 7 passed 52.1s
🟢 text inputs unlock the submit button 6.2s
🟢 filled text inputs report their values 5.5s
🟢 modal flow confirms through the native alert 8.5s
🟢 bottom tabs act inside the last tab 6.5s
🟢 error recovery retries, then confirms the delete 8.2s
🟢 choice controls place the exact order 8.6s
🟢 debounced search selects the target once results arrive 8.6s
🟢 tests/login-form.e2e.ts · 3 passed 30.0s
🟢 login form › rejects a malformed email 8.8s
🟢 login form › rejects an unknown account 8.5s
🟢 login form › signs in and logs out 12.7s
🟢 tests/smoke.e2e.ts · 1 passed 5.8s
🟢 home lists the scenarios and opens one 5.8s

e2e 0.17.0 · 8m 30s · android-emulator · run artifacts

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e android agent: 20 passed

24 agent steps · 112 model calls · 603.2k tokens (85% cached) · $0.0361

All 20 tests in 1 file
Test Agent Time
🟢 tests-agent/scenarios.e2e.ts · 20 passed 24 steps · 112 calls 9m 27s
🟢 act completes Login Form 1 step · 4 calls 30.1s
🟢 act completes Infinite Scroll List 1 step · 3 calls 27.1s
🟢 act completes Modal Flow 1 step · 4 calls 15.9s
🟢 act completes Bottom Tabs 1 step · 3 calls 7.9s
🟢 act completes Text Input Variations 1 step · 3 calls 15.9s
🟢 act completes Broken Accessibility 2 steps · 6 calls 27.9s
🟢 act completes Vision Only 2 steps · 6 calls 32.6s
🟢 act completes Gestures 1 step · 7 calls 33.2s
🟢 act completes Async States 1 step · 10 calls 39.5s
🟢 act completes Debounced Search 1 step · 4 calls 11.0s
🟢 act completes Huge Virtualized List 1 step · 3 calls 1m 14s
🟢 act completes Flattened Registration Form 2 steps · 12 calls 1m 3s
🟢 act completes Flattened Login 2 steps · 6 calls 37.4s
🟢 act completes Sticky Chrome Target 1 step · 4 calls 14.4s
🟢 act completes WebView Accessibility 1 step · 5 calls 15.7s
🟢 act completes Permission Prompt 1 step · 3 calls 8.1s
🟢 act completes Product Catalog 1 step · 5 calls 13.9s
🟢 act completes Error Recovery 1 step · 6 calls 13.4s
🟢 act completes Choice Controls 1 step · 6 calls 23.5s
🟢 act completes Sequential Onboarding 1 step · 12 calls 1m 2s

e2e 0.17.0 · 9m 27s · android-emulator · run artifacts

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e ios agent: 21 passed, 1 skipped

25 agent steps · 139 model calls · 873.1k tokens (81% cached) · $0.0614

All 22 tests in 1 file
Test Agent Time
⏭️ tests-agent/scenarios.e2e.ts · 21 passed, 1 skipped 25 steps · 139 calls 13m 35s
🟢 act completes Login Form 1 step · 9 calls 1m 11s
🟢 act completes Infinite Scroll List 1 step · 3 calls 50.1s
🟢 act completes Modal Flow 1 step · 4 calls 14.9s
🟢 act completes Bottom Tabs 1 step · 3 calls 13.5s
🟢 act completes Text Input Variations 1 step · 5 calls 29.4s
🟢 act completes Broken Accessibility 2 steps · 7 calls 37.6s
🟢 act completes Vision Only 2 steps · 6 calls 30.8s
🟢 act completes Gestures 1 step · 9 calls 45.6s
🟢 act completes Async States 1 step · 9 calls 44.5s
🟢 act completes Debounced Search 1 step · 5 calls 20.5s
🟢 act completes Flattened Registration Form 2 steps · 14 calls 1m 36s
🟢 act completes Flattened Login 2 steps · 14 calls 1m 32s
🟢 act completes Sticky Chrome Target 1 step · 8 calls 44.2s
🟢 act completes WebView Accessibility 1 step · 5 calls 37.8s
🟢 act completes Permission Prompt 1 step · 3 calls 21.0s
🟢 act completes Photo Picker 1 step · 4 calls 19.8s
🟢 act completes Product Catalog 1 step · 5 calls 16.8s
🟢 act completes Error Recovery 1 step · 6 calls 19.5s
🟢 act completes Choice Controls 1 step · 8 calls 42.2s
🟢 act completes Stripe PaymentSheet 1 step · 7 calls 42.9s
🟢 act completes Apple Pay 1 step · 5 calls 25.1s
⏭️ act completes Apple Pay Billing Address (skipped: the CI simulator's Apple Pay sheet skips the billing-address step, so the scenario cannot be completed there)

e2e 0.17.0 · 13m 35s · ios-simulator · run artifacts

@okwasniewski
okwasniewski force-pushed the oskar/drop-playwright-trace branch from 5e10e1f to 0be324d Compare October 4, 2026 07:50
@okwasniewski

Copy link
Copy Markdown
Member Author

[claude-opus-5-5] responding on behalf of okwasniewski

Same status as #822: everything is green except web agent. main's committed web recordings went stale with the 0.12.0 engine bump, and re-recording takes a model key (details on #822). iOS agentic passed on its rerun: the "Gestures" double-tap is a live-model flake, and this PR doesn't touch the mobile engine. Left unlabeled until the recordings are re-recorded.

…polls, cache decision, and app log

Every run writes .e2e/failures/<test>.md and the terminal names it. Steps
record the node an action hit, assertion and waitFor readings, the cache's
decision and write outcome, and what the app logged (new engine appLog hook,
implemented by the web engine). REPLAY_STALE for a rekeyed recording names
the key parts that changed.
…nd share one node describer

A failure page that cannot be written is a stderr line, as junit.xml and
summary.md are. cache.write moves to the report's step cache, since it is
decided after act() returns. Kept entries are no longer rewritten only to
gain keyedBy, so committed caches stay clean. Node and clip helpers reuse
targetLabel and bound.
…ps in their video segment, and record point actions
@okwasniewski

Copy link
Copy Markdown
Member Author

[claude-opus-5-5] responding on behalf of okwasniewski

Superseded by #869: one PR, trace keeps its modes and now writes e2e trace pages under .e2e/traces/.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant