Skip to content

feat(android): experimental direct Android engine over the engine protocol - #1234

Closed
okwasniewski wants to merge 5 commits into
oskar/engine-protocolfrom
oskar/android-engine
Closed

okwasniewski wants to merge 5 commits into
oskar/engine-protocolfrom
oskar/android-engine

Conversation

@okwasniewski

@okwasniewski okwasniewski commented Oct 18, 2026 •

Copy link
Copy Markdown
Member

Stacked on #1232. An Android engine that is an engine protocol server written in Java, running on the device: the proof that an engine can live outside the runner's process and language, and a measure of what driving the device directly buys over agent-device.

@e2e-dev/android (private, experimental)

A Java engine server (packages/android/server/java/) that runs on the device as an instrumentation. It listens on an abstract socket and drives the device in process through UiAutomation: the tree comes from accessibility nodes, and touches and keys are injected events. There is no adb process, no daemon hop, and no XML dump per call. The host half (src/transport.ts) installs the APK, starts the instrumentation, and forwards a port. The APK builds in seconds with javac, d8, aapt2, and apksigner, no Gradle.

Mobile benchmark, deterministic Android suite (apps/mobile-benchmark/e2e.android.config.ts, 42 tests, Pixel 7 API 36 emulator, one worker):

Suite agent-device direct Speedup
controls 130.9s 37.1s 3.5x
flows 47.7s 11.9s 4.0x
flows-lists 110.1s 72.8s 1.5x
login-form 28.7s 8.6s 3.3x
smoke 3.8s 1.4s 2.6x
total 321s 131s 2.4x

Engine calls on the same screens (packages/android/bench/bench.ts, nearest-rank p50, 5-20 samples per row, init one cold sample):

Operation agent-device direct Speedup
init (cold) 1593 ms 168 ms 9.5x
restart app 887 ms 156 ms 5.7x
observe 15.3 ms 2.0 ms 7.6x
tap 132 ms 30.4 ms 4.3x
fill (19 chars) 1028 ms 4.4 ms 231x
screenshot 1459 ms 65.7 ms 22x
swipe 402 ms 465 ms 0.9x
back, list up 320 ms 416 ms 0.8x
keyboard.type (10 chars) 67 ms 333 ms 0.2x

It wins wherever agent-device spends an adb process or a daemon hop per call. It loses where the app sets the pace:

  • swipe waits for the list to come to rest.
  • back is held up by the pop animation, which blocks accessibility queries for about 450 ms.
  • keyboard.type sends one key event per character, and React Native re-renders on each. agent-device commits the whole string through its IME.

fill sets text with ACTION_SET_TEXT; agent-device types it and reads it back.

Both engines pass all 42, twice in a row. The direct engine declares the same device surface as the mobile engine: press takes Enter, Space, or one character, the keys a soft keyboard has, and refuses modifiers and other named keys with the mobile engine's reasons.

Not there yet (in its README): one device per run, a device fixture with back() only, no video or state capture, no selector locators, no launchArguments or permissions (refused at config load).

Verified

Ran it locally: yes

  • Android: the mobile benchmark selection above on both engines (node node_modules/e2e/dist/cli/bin.js run --config e2e.android.config.ts, with BENCH_ENGINE=agent-device for the baseline) and node bench/bench.ts --rounds 20.
  • Review rounds: after the cubic pass, the Android suite still runs 40/42 in 134s, and no server process is left on the device after the run.
  • Reviewed together with feat(engine): engine protocol for out-of-process engines #1232: the fresh-context review and four cubic rounds covered both layers, and the Android findings (cancellation, masking, one session at a time, safe package names, device cleanup) are fixed here.

View guided diff Turn on auto-fix

…tocol

A Java engine server that runs on the device as an instrumentation and
drives it through UiAutomation, without agent-device: the tree from
accessibility nodes, touches and keys as injected events, one connection
at a time, cancellation honored, secure fields masked from a full scan.
The host half installs the APK, starts it, and forwards a port. The
mobile benchmark's e2e.android.config.ts runs the deterministic suite on
it.
@github-actions

github-actions Bot commented Oct 18, 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 515ms
🟢 aria hidden flow › picks the Pro plan by its visible text and confirms it 361ms
🟢 aria hidden flow › another plan shows the error and keeps the picker open 154ms
🟢 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.3s
🟢 async states › a wrong code is rejected after the toast has gone 4.8s
🟢 tests/canvas-only.e2e.ts · 2 passed 252ms
🟢 canvas only › taps square, circle, then diamond at their pixel coordinates 138ms
🟢 canvas only › a shape out of order paints the error and resets progress 114ms
🟢 tests/canvas-whiteboard.e2e.ts · 2 passed 367ms
🟢 canvas whiteboard › drags both shapes into their slots and saves 198ms
🟢 canvas whiteboard › bounces a shape off the wrong slot and refuses to save early 169ms
🟢 tests/cart-totals.e2e.ts · 2 passed 373ms
🟢 cart totals › increasing a quantity updates the line total but the order summary stays stale (planted bug) 226ms
🟢 cart totals › a quantity never drops below one 147ms
🟢 tests/checkout-review.e2e.ts · 1 passed 146ms
🟢 shows a raw greeting token and an undefined delivery date (planted bug), yet places the order 146ms
🟢 tests/context-menu-trap.e2e.ts · 2 passed 478ms
🟢 context menu trap › right-click opens nothing; the row menu renames the file 247ms
🟢 context menu trap › the decoy menu items refuse and keep the file 231ms
🟢 tests/control-inventory.e2e.ts · 8 passed 3.6s
🟢 control inventory › check sets the checkbox and the radio without flipping a set one 237ms
🟢 control inventory › check picks a radio the pick replaces with its summary 155ms
🟢 control inventory › a long press and a double click are told apart from a tap 997ms
🟢 control inventory › the file menu opens on right-click only and Rename renames the file 256ms
🟢 control inventory › setInputFiles attaches files named from the project root 151ms
🟢 control inventory › the details view is left through the browser history 206ms
🟢 control inventory › scrollIntoView brings the footnote into view 188ms
🟢 control inventory › every exercise done shows the success message 1.4s
🟢 tests/css-content-ui.e2e.ts · 2 passed 307ms
🟢 css content ui › the tile labelled Ship it advances and confirming ships 171ms
🟢 css content ui › a wrong tile shows the CSS-rendered error and keeps the picker 136ms
🟢 tests/date-picker.e2e.ts · 2 passed 612ms
🟢 date picker › navigates three months ahead and books the required date 362ms
🟢 date picker › confirming without the exact date shows the error 250ms
🟢 tests/debounced-search.e2e.ts · 2 passed 2.8s
🟢 debounced search › a decoy one character off is refused 1.4s
🟢 debounced search › picking the exact item adds it to the cart 1.4s
🟢 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 605ms
🟢 div soup › a wrong code is rejected 276ms
🟢 div soup › the right code grants access after the delete tile fixes a typo 329ms
🟢 tests/drag-and-drop.e2e.ts · 2 passed 600ms
🟢 drag and drop › an out-of-order item resets the dropzone 302ms
🟢 drag and drop › dropping Banana then Cherry passes 298ms
🟢 tests/filter-deep-link.e2e.ts · 2 passed 211ms
🟢 filter deep link › filtering writes the query to the URL 114ms
🟢 filter deep link › opening a shared link restores the filter 97ms
🟢 tests/gift-card-purchase.e2e.ts · 3 passed 521ms
🟢 gift card purchase › refuses to buy without an amount 136ms
🟢 gift card purchase › refuses a recipient without an at sign 199ms
🟢 gift card purchase › sends the gift card 186ms
🟢 tests/hover-menu.e2e.ts · 2 passed 409ms
🟢 hover menu › a decoy leaf is refused 177ms
🟢 hover menu › hovering Account, then Billing, reaches Redeem voucher 232ms
🟢 tests/iframe-form.e2e.ts · 2 passed 462ms
🟢 iframe form › a wrong code is refused by the host page 230ms
🟢 iframe form › the code read from one frame applies through the other 232ms
🟢 tests/image-only-ui.e2e.ts · 3 passed 398ms
🟢 image only ui › the icons have no names, so the bare svg locator is ambiguous 99ms
🟢 image only ui › a wrong icon shows the error image and keeps the icons 140ms
🟢 image only ui › tapping the star, then the heart, verifies the icons 159ms
🟢 tests/infinite-scroll.e2e.ts · 1 passed 2.9s
🟢 scrolls the feed until the Golden Ticket loads, then claims it 2.9s
🟢 tests/kanban-board.e2e.ts · 3 passed 598ms
🟢 kanban board › pointer drags move both cards into the goal layout 315ms
🟢 kanban board › a swipe along a path drags a card as well 132ms
🟢 kanban board › a plain tap moves nothing and the untouched board is rejected 151ms
🟢 tests/login-form.e2e.ts · 4 passed 663ms
🟢 login form › rejects a malformed email 146ms
🟢 login form › rejects a short password 156ms
🟢 login form › rejects an unknown account 180ms
🟢 login form › signs in and logs out 181ms
🟢 tests/lying-labels.e2e.ts · 4 passed 599ms
🟢 lying labels › the button whose accessible name says Pay now is the wrong one 135ms
🟢 lying labels › a text match for Pay now catches the decoy phrase too 97ms
🟢 lying labels › the field whose accessible name says Amount is the wrong one 191ms
🟢 lying labels › visible text drives the payment through 176ms
🟢 tests/native-dialogs.e2e.ts · 3 passed 400ms
🟢 native dialogs › answers the confirm, prompt, and alert chain 132ms
🟢 native dialogs › dismissing the confirm cancels the order 135ms
🟢 native dialogs › a wrong gift code is rejected 133ms
🟢 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 6.1s
🟢 onboarding wizard › back keeps what was typed and the brief comes back with it 320ms
🟢 onboarding wizard › the address step takes the brief through its bare-div dropdown 392ms
🟢 onboarding wizard › the profile step steers the calendar three decades back 1.6s
🟢 onboarding wizard › the preferences step flips the toggles the brief names and leaves the trap off 1.8s
🟢 onboarding wizard › the review step repeats the brief and finishes with the PIN 1.9s
🟢 tests/order-history.e2e.ts · 2 passed 1.4s
🟢 order history › overview and settings render their panels 200ms
🟢 order history › the orders tab never leaves its loading state (planted bug) 1.2s
🟢 tests/otp-auto-advance.e2e.ts · 3 passed 1.5s
🟢 otp auto-advance › focus advances with each digit and the full code verifies 530ms
🟢 otp auto-advance › backspace on an empty box clears and refocuses the previous one 150ms
🟢 otp auto-advance › a wrong code clears every box and starts over 788ms
🟢 tests/overlay-trap.e2e.ts · 1 passed 701ms
🟢 continues only after the banner and the overlay are gone 701ms
🟢 tests/playbook-cleanup.e2e.ts · 2 passed 499ms
🟢 playbook cleanup › deleting the draft removes it from an exact-name search 254ms
🟢 playbook cleanup › cancelling the dialog keeps the draft searchable 245ms
🟢 tests/price-sorting.e2e.ts · 3 passed 370ms
🟢 price sorting › opens in the featured order with sale prices struck through 101ms
🟢 price sorting › low to high sorts by the original price, not the paid one (planted bug) 130ms
🟢 price sorting › high to low is the same wrong order reversed (planted bug) 139ms
🟢 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.3s
🟢 buys a deal once the promo chrome is out of the way 1.3s
🟢 tests/rich-text-editor.e2e.ts · 2 passed 425ms
🟢 rich text editor › bolding exactly the required word passes the check 208ms
🟢 rich text editor › bold that spills into the previous word fails the check 217ms
🟢 tests/saved-addresses.e2e.ts · 3 passed 515ms
🟢 saved addresses › adds an address and clears the form 172ms
🟢 saved addresses › ignores an add with an empty field 161ms
🟢 saved addresses › delete shows its toast but keeps the address, on retry too (planted bug) 182ms
🟢 tests/shadow-dom-form.e2e.ts · 2 passed 517ms
🟢 shadow DOM form › rejects a wrong access code 251ms
🟢 shadow DOM form › grants access with the code from the hint inside the root 266ms
🟢 tests/smoke.e2e.ts · 1 passed 377ms
🟢 home lists the scenarios and opens one 377ms
🟢 tests/stale-dom.e2e.ts · 1 passed 2.1s
🟢 taps the moving target three times across rebuilds of the list 2.1s
🟢 tests/sticky-chrome.e2e.ts · 1 passed 171ms
🟢 accepts the terms once the button clears the sticky footer 171ms
🟢 tests/virtualized-table.e2e.ts · 1 passed 18.9s
🟢 scrolls the windowed table to the Golden Row and claims it 18.9s
🟢 tests/wishlist.e2e.ts · 2 passed 1.5s
🟢 wishlist › saving toggles the button and the tab badge 241ms
🟢 wishlist › the wishlist tab renders the empty state despite the badge count (planted bug) 1.3s

e2e 0.21.2 · 1m 6s · web · run artifacts

@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e web agent: 33 passed

34 agent steps · 26 replayed from cache · 18 model calls · 72.0k tokens (91% cached) · $0.0035

All 33 tests in 5 files
Test Agent Time
🟢 tests-agent/control-inventory.e2e.ts · 7 passed 7 steps 7.6s
🟢 control inventory › check sets the checkbox and the radio 1 step 610ms
🟢 control inventory › check picks a radio the pick replaces with its summary 1 step 274ms
🟢 control inventory › a long press and a double click are chosen over a plain tap 1 step 939ms
🟢 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.5s
🟢 control inventory › back returns from the details view to the inventory 1 step 311ms
🟢 control inventory › scroll_to brings the footnote into view 1 step 379ms
🟢 tests-agent/login-form.e2e.ts · 1 passed 1 step 351ms
🟢 act signs in with the benchmark account 1 step 351ms
🟢 tests-agent/planted-bugs.e2e.ts · 3 passed 4 steps · 7 calls 14.1s
🟢 cart totals: a judgment catches the stale order summary 2 steps · 3 calls 6.5s
🟢 checkout review: a judgment catches the broken copy 1 step · 1 call 1.8s
🟢 wishlist: a judgment catches the lost saved items 1 step · 3 calls 5.8s
🟢 tests-agent/scenarios.e2e.ts · 21 passed 21 steps · 11 calls 1m 49s
🟢 act completes shadow-dom-form 1 step · 2 calls 4.5s
🟢 act completes lying-labels 1 step · 3 calls 7.5s
🟢 act completes iframe-form 1 step · 3 calls 5.7s
🟢 act completes infinite-scroll 1 step 5.2s
🟢 act completes virtualized-table 1 step 51.6s
🟢 act completes overlay-trap 1 step 848ms
🟢 act completes sticky-chrome 1 step 862ms
🟢 act completes async-states 1 step · 3 calls 9.0s
🟢 act completes debounced-search 1 step 2.3s
🟢 act completes hover-menu 1 step 480ms
🟢 act completes drag-and-drop 1 step 436ms
🟢 act completes kanban-board 1 step 621ms
🟢 act completes context-menu-trap 1 step 2.6s
🟢 act completes stale-dom 1 step 450ms
🟢 act completes otp-auto-advance 1 step 700ms
🟢 act completes date-picker 1 step 796ms
🟢 act completes rich-text-editor 1 step 10.1s
🟢 act completes playbook-cleanup 1 step 578ms
🟢 act completes promo-storefront 1 step 2.3s
🟢 act completes gift-card-purchase 1 step 2.4s
🟢 act filters the list and the URL carries the filter 1 step 211ms
🟢 tests-agent/unique-cache.e2e.ts · 1 passed 1 step 277ms
🟢 act adds an address with a run-unique label 1 step 277ms

e2e 0.21.2 · 2m 12s · 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 21 files

Heads up: you’ve reached your flex budget. Increase your flex budget or wait for usage to reset.

View guided diff | Turn on auto-fix | Re-trigger cubic

Comment thread packages/android/src/transport.ts Resolved
Comment thread packages/android/src/transport.ts Resolved
@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e android agent: 20 passed

24 agent steps · 15 replayed from cache · 36 model calls · 191.2k tokens (84% cached) · $0.0126

All 20 tests in 1 file
Test Agent Time
🟢 tests-agent/scenarios.e2e.ts · 20 passed 24 steps · 36 calls 6m 55s
🟢 act completes Login Form 1 step 25.0s
🟢 act completes Infinite Scroll List 1 step 21.8s
🟢 act completes Modal Flow 1 step 9.9s
🟢 act completes Bottom Tabs 1 step 8.0s
🟢 act completes Text Input Variations 1 step 7.5s
🟢 act completes Broken Accessibility 2 steps · 5 calls 35.2s
🟢 act completes Vision Only 2 steps · 1 call 12.1s
🟢 act completes Gestures 1 step · 7 calls 41.6s
🟢 act completes Async States 1 step · 12 calls 1m 7s
🟢 act completes Debounced Search 1 step 6.9s
🟢 act completes Huge Virtualized List 1 step 1m 0s
🟢 act completes Flattened Registration Form 2 steps · 1 call 10.6s
🟢 act completes Flattened Login 2 steps · 6 calls 37.1s
🟢 act completes Sticky Chrome Target 1 step 8.3s
🟢 act completes WebView Accessibility 1 step · 4 calls 17.1s
🟢 act completes Permission Prompt 1 step 6.4s
🟢 act completes Product Catalog 1 step 9.6s
🟢 act completes Error Recovery 1 step 8.8s
🟢 act completes Choice Controls 1 step 10.8s
🟢 act completes Sequential Onboarding 1 step 11.5s

e2e 0.21.2 · 6m 56s · android-emulator · run artifacts

@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e android: 55 passed, 1 skipped

All 56 tests in 7 files
Test Time
⏭️ tests/controls.e2e.ts · 24 passed, 1 skipped 2m 47s
🟢 control inventory › a label query resolves a labeled text field 19.8s
🟢 control inventory › a labeled field answers name, display value, value reads, fill, and clear 11.9s
🟢 control inventory › a placeholder query and attribute reads find the field 4.6s
🟢 control inventory › a secure field takes a fill and denies value reads 6.3s
🟢 control inventory › press sends a character and Enter through the soft keyboard 7.6s
🟢 control inventory › a field autofocuses on mount and focus() moves the focus 10.1s
🟢 control inventory › toBeFocused follows the focus 9.3s
🟢 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 6.6s
🟢 control inventory › checkbox and radio roles check, uncheck, and report their state 11.8s
🟢 control inventory › a tab role answers getByRole 3.7s
🟢 control inventory › a radio group reports the checked option 8.3s
🟢 control inventory › buttons report disabled, enabled, and a state that arrives later 7.7s
🟢 control inventory › a display: none element is absent rather than hidden, its visible twin attached 6.0s
🟢 control inventory › a header answers its accessible name 3.5s
🟢 control inventory › a tab row answers count, all, texts, filters, positions, and switching 5.0s
🟢 control inventory › a list answers counts, list-form text, reads, and boxes in order 5.0s
⏭️ 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 6.7s
🟢 control inventory › a double tap lands inside the 300 ms window 7.5s
🟢 control inventory › an ambiguous locator fails at once 4.7s
🟢 control inventory › screenshot, restart, and clearState reopen the app on its home list 9.1s
🟢 refusals › verbs a device never declares are refused before the engine 2ms
🟢 refusals › keys the soft keyboard cannot send are refused by the engine 64ms
🟢 refusals › a missing locator fails as not found once its timeout passes 1.1s
🟢 tests/device-fixture.e2e.ts · 9 passed 1m 8s
🟢 device fixture › setOrientation rotates the window the app measures 4.7s
🟢 device fixture › home leaves the app, openApp brings it back where it was 5.2s
🟢 device fixture › foregroundApp sees the home screen after home() 4.3s
🟢 device fixture › closeApp then openApp relaunches on the home list 5.9s
🟢 device fixture › closeApp leaves the next commands on the same device 5.8s
🟢 device fixture › foregroundApp after closeApp reports the closed session as APP_NOT_OPEN 3.7s
🟢 device fixture › device.back pops the scenario 4.4s
🟢 device fixture › setNetwork and setAirplaneMode change what the app sees 15.7s
🟢 device fixture › setLocation and clearLocation change what the app reads 18.7s
🟢 tests/device.e2e.ts · 4 passed 34.2s
🟢 permission prompt › allowing the system dialog enables the microphone 6.3s
🟢 permission prompt › a denied prompt recovers once the permission is granted outside 11.7s
🟢 sequential onboarding echoes the exact values 9.6s
🟢 onboarding rejects a malformed email before advancing 6.5s
🟢 tests/flows-lists.e2e.ts · 7 passed 1m 55s
🟢 infinite scroll reaches the target item 15.9s
🟢 product catalog adds exactly two of the right variant 9.4s
🟢 gestures: long-press, then swipe left 7.9s
🟢 gestures: double-tap completes the flow 9.1s
🟢 sticky chrome: accept below the fold, then continue 10.6s
🟢 async states: load, pull to refresh, claim through the toast 11.2s
🟢 huge virtualized list reaches row 512 50.8s
🟢 tests/flows.e2e.ts · 7 passed 49.7s
🟢 text inputs unlock the submit button 6.2s
🟢 filled text inputs report their values 5.2s
🟢 modal flow confirms through the native alert 8.1s
🟢 bottom tabs act inside the last tab 6.1s
🟢 error recovery retries, then confirms the delete 7.9s
🟢 choice controls place the exact order 8.0s
🟢 debounced search selects the target once results arrive 8.1s
🟢 tests/login-form.e2e.ts · 3 passed 28.8s
🟢 login form › rejects a malformed email 8.3s
🟢 login form › rejects an unknown account 8.4s
🟢 login form › signs in and logs out 12.2s
🟢 tests/smoke.e2e.ts · 1 passed 4.9s
🟢 home lists the scenarios and opens one 4.9s

e2e 0.21.2 · 7m 48s · android-emulator · run artifacts

@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

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

⚠️ 1 flaky test passed on a retry

⚠️ device fixture › the clipboard reads back what was written
tests/fixtures.ts:81

ENGINE_FAILURE (beforeEach) at step 3 of 3: locator.tap getByLabel("Control Inventory. "), after 8.8s

perform tap failed: XCTest recorded a failure while executing tap; the action may not have been performed. Hint: The iOS runner session was invalidated. Re-observe with a fresh snapshot before retrying; if the accessibility tree is unavailable, use screenshot plus coordinate commands instead of retrying the tap blindly.

  • Screen: dev.e2e.benchmark / Benchmark Examples

Evidence: screenshot, log

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

e2e 0.21.2 · 6m 53s · ios-simulator · run artifacts

@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e ios agent: 21 passed, 1 skipped

25 agent steps · 10 replayed from cache · 70 model calls · 441.8k tokens (79% cached) · $0.0342

All 22 tests in 1 file
Test Agent Time
⏭️ tests-agent/scenarios.e2e.ts · 21 passed, 1 skipped 25 steps · 70 calls 13m 17s
🟢 act completes Login Form 1 step · 7 calls 1m 25s
🟢 act completes Infinite Scroll List 1 step 40.0s
🟢 act completes Modal Flow 1 step 13.4s
🟢 act completes Bottom Tabs 1 step 8.9s
🟢 act completes Text Input Variations 1 step 19.5s
🟢 act completes Broken Accessibility 2 steps · 6 calls 47.2s
🟢 act completes Vision Only 2 steps · 6 calls 42.9s
🟢 act completes Gestures 1 step · 9 calls 1m 11s
🟢 act completes Async States 1 step · 11 calls 1m 10s
🟢 act completes Debounced Search 1 step · 3 calls 24.1s
🟢 act completes Flattened Registration Form 2 steps · 1 call 36.1s
🟢 act completes Flattened Login 2 steps · 13 calls 1m 51s
🟢 act completes Sticky Chrome Target 1 step 18.6s
🟢 act completes WebView Accessibility 1 step 14.9s
🟢 act completes Permission Prompt 1 step 12.8s
🟢 act completes Photo Picker 1 step · 2 calls 32.3s
🟢 act completes Product Catalog 1 step 12.2s
🟢 act completes Error Recovery 1 step · 1 call 28.0s
🟢 act completes Choice Controls 1 step · 5 calls 49.0s
🟢 act completes Stripe PaymentSheet 1 step · 6 calls 47.4s
🟢 act completes Apple Pay 1 step 12.5s
⏭️ 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.21.2 · 13m 17s · ios-simulator · run artifacts

…the SDK debug key

The server masks fields found before and after a capture, refuses an id
without a method, and waits for a vanished session's work however long it
takes. The build checks against the platform API and signs with the SDK's
debug keystore, replacing a server signed with another key. Device cleanup
gets its own budget and runs when startup fails.

@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 4 files (changes from recent commits).

Heads up: you’ve reached your flex budget. Increase your flex budget or wait for usage to reset.

View guided diff | Turn on auto-fix | Re-trigger cubic

…engine

Modifiers and named keys beyond Enter and Space are refused with the
mobile engine's reasons, and scrollIntoView is no longer declared, so the
mobile benchmark's selection passes whole on the direct engine.

@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 4 files (changes from recent commits).

Heads up: you’ve reached your flex budget. Increase your flex budget or wait for usage to reset.

View guided diff | Turn on auto-fix | Re-trigger cubic

Comment thread packages/android/README.md Resolved
@okwasniewski

Copy link
Copy Markdown
Member Author

Closing: experiment done, it validated the engine protocol (#1232) with no protocol changes needed. Branch kept for reference.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant