Skip to content

fix(decision): decide through experimental_decide and reject unsupported models at config load - #916

Merged
okwasniewski merged 3 commits into
mainfrom
oskar/decision-release-fixes
Oct 6, 2026
Merged

okwasniewski merged 3 commits into
mainfrom
oskar/decision-release-fixes

Conversation

@okwasniewski

@okwasniewski okwasniewski commented Oct 6, 2026 •

Copy link
Copy Markdown
Member

Fixes for @e2e-dev/decision before its first publish in #825, from the pre-release stress test.

  • Calls experimental_decide now. experimental_evaluate is deprecated in ai 7.0.128, and typeSafeAi.decisionModel() (@ai-sdk/typesafe-ai 3.0.13) failed typecheck with TS2741 doEvaluate missing. model is typed Exclude<Experimental_DecisionModel, string> from ai, so decision models and the deprecated evaluation models both typecheck and run.
  • Peer ai goes from ^7.0.0 to ^7.0.128, the first release that exports experimental_decide (checked against the 7.0.127 and 7.0.128 tarballs). On main the floor was wrong anyway: experimental_evaluate first shipped in 7.0.103. pnpm only warns on an unmet peer, so the package reads experimental_decide off the ai namespace, and an older ai gets INVALID_CONFIG: decisionExecutor() needs ai 7.0.128 or later instead of a module link error.
  • Drops the @ai-sdk/provider@4.0.21 pin, which installed next to the 4.0.22 that ai brings. Types come from the ai peer.
  • decisionExecutor() checks the model at config load and throws ConfigurationError('INVALID_CONFIG') naming the fix, the way web() and easSimulators() do. Main threw a raw TypeError (packages/decision/src/executor.ts:29).
  • MODEL_UNAVAILABLE names the env var the provider reads (Set TYPESAFE_AI_API_KEY to the decision model API key.). The name comes out of the SDK's LoadAPIKeyError text and nothing else in that text is kept.
  • README, docs page, docs example, and skill now use decisionModel(). errors.mdx lists decisionExecutor() under INVALID_CONFIG. The existing unreleased changeset is amended, not added to.

Verified

Ran it locally: yes. Packed e2e, @e2e-dev/web, @e2e-dev/decision into a scratch project (/tmp/rc-decision), ai@7.0.128 (floor and npm latest are the same version today), testbed /todos app, mock choice model. No real model key on this box.

main (7aafa00 tarball) this branch
model: openrouter('inception/mercury-2.5') TypeError: Cannot read properties of undefined (reading 'includes') INVALID_CONFIG: decisionExecutor({ model }) got the language model openrouter/inception/mercury-2.5; pass an AI SDK decision model, e.g. decisionExecutor({ model: typeSafeAi.decisionModel('jev-latest') })
model: 'openai/gpt-5' TypeError: ... (reading 'includes') INVALID_CONFIG: decisionExecutor({ model }) got the string "openai/gpt-5"; ...
no model TypeError: ... (reading 'supportedQuestionTypes') INVALID_CONFIG: decisionExecutor({ model }) got undefined; ...
tsc on decisionExecutor({ model: typeSafeAi.decisionModel('jev-latest') }) TS2741: Property 'doEvaluate' is missing passes, evaluationModel() too
typeSafeAi.decisionModel() run with no key MODEL_UNAVAILABLE: Set the evaluation model API key. (from source, not run) MODEL_UNAVAILABLE: Set TYPESAFE_AI_API_KEY to the decision model API key.
ai@7.0.127 peer ^7.0.0 accepts 7.0.100-7.0.102, whose import fails with a link error (stress test, ai@7.0.100) npm install fails with ERESOLVE on peer ai@"^7.0.128"; forced with --legacy-peer-deps: INVALID_CONFIG: decisionExecutor() needs ai 7.0.128 or later; update the ai package

Real CLI, both model kinds, checks a todo and asserts on /todos:

 ✓ decision executor checks a todo and asserts > agent.act "mark the Pay the invoice todo done" 337ms · 3 model calls
 ✓ decision executor checks a todo and asserts > agent.assert "a todo is marked done" 129ms · 1 model call
      Tests  1 passed (1)
         AI  4 tokens · 4 model calls · mock/heuristic-1        (doDecide)
         AI  4 tokens · 4 model calls · mock/heuristic-legacy   (doEvaluate)

Unsupported model, as a user sees it (exit 2):

 ERROR  configuration error INVALID_CONFIG (config)
decisionExecutor({ model }) got the language model openrouter/x; pass an AI SDK decision model, e.g. decisionExecutor({ model: typeSafeAi.decisionModel('jev-latest') })

New tests: unit tests for each rejected shape and the key message, a test with experimental_decide mocked away, and type tests in tests/types/options.ts for decisionModel(), evaluationModel(), and both literal shapes.

Review in cubic

… at config load

- peer ai ^7.0.128: first release with experimental_decide (7.0.127 lacks it)
- accept decision models and deprecated evaluation models; types from ai
- drop the @ai-sdk/provider pin that duplicated ai's copy
- unsupported model is INVALID_CONFIG naming the fix, not a TypeError
- missing API key names the env var the provider reads
- docs, README, skill use decisionModel()
Read experimental_decide off the ai namespace so an older ai loads the
package and decisionExecutor() throws INVALID_CONFIG naming 7.0.128,
instead of a module link error. An uncalled provider factory as model
no longer prints its source.

@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 22 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/decision/README.md
@github-actions

github-actions Bot commented Oct 6, 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 392ms
🟢 aria hidden flow › picks the Pro plan by its visible text and confirms it 273ms
🟢 aria hidden flow › another plan shows the error and keeps the picker open 119ms
🟢 tests/async-states.e2e.ts · 2 passed 7.0s
🟢 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 230ms
🟢 canvas only › taps square, circle, then diamond at their pixel coordinates 119ms
🟢 canvas only › a shape out of order paints the error and resets progress 111ms
🟢 tests/canvas-whiteboard.e2e.ts · 2 passed 354ms
🟢 canvas whiteboard › drags both shapes into their slots and saves 183ms
🟢 canvas whiteboard › bounces a shape off the wrong slot and refuses to save early 171ms
🟢 tests/cart-totals.e2e.ts · 2 passed 297ms
🟢 cart totals › increasing a quantity updates the line total but the order summary stays stale (planted bug) 158ms
🟢 cart totals › a quantity never drops below one 139ms
🟢 tests/checkout-review.e2e.ts · 1 passed 140ms
🟢 shows a raw greeting token and an undefined delivery date (planted bug), yet places the order 140ms
🟢 tests/context-menu-trap.e2e.ts · 2 passed 495ms
🟢 context menu trap › right-click opens nothing; the row menu renames the file 270ms
🟢 context menu trap › the decoy menu items refuse and keep the file 225ms
🟢 tests/control-inventory.e2e.ts · 8 passed 3.2s
🟢 control inventory › check sets the checkbox and the radio without flipping a set one 212ms
🟢 control inventory › check picks a radio the pick replaces with its summary 141ms
🟢 control inventory › a long press and a double click are told apart from a tap 961ms
🟢 control inventory › the file menu opens on right-click only and Rename renames the file 200ms
🟢 control inventory › setInputFiles attaches files named from the project root 119ms
🟢 control inventory › the details view is left through the browser history 161ms
🟢 control inventory › scrollIntoView brings the footnote into view 238ms
🟢 control inventory › every exercise done shows the success message 1.2s
🟢 tests/css-content-ui.e2e.ts · 2 passed 318ms
🟢 css content ui › the tile labelled Ship it advances and confirming ships 170ms
🟢 css content ui › a wrong tile shows the CSS-rendered error and keeps the picker 148ms
🟢 tests/date-picker.e2e.ts · 2 passed 509ms
🟢 date picker › navigates three months ahead and books the required date 291ms
🟢 date picker › confirming without the exact date shows the error 218ms
🟢 tests/debounced-search.e2e.ts · 2 passed 2.7s
🟢 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.0s
🟢 one submit opens one confirm, even when double-clicked 1.0s
🟢 tests/div-soup.e2e.ts · 2 passed 605ms
🟢 div soup › a wrong code is rejected 271ms
🟢 div soup › the right code grants access after the delete tile fixes a typo 334ms
🟢 tests/drag-and-drop.e2e.ts · 2 passed 613ms
🟢 drag and drop › an out-of-order item resets the dropzone 315ms
🟢 drag and drop › dropping Banana then Cherry passes 298ms
🟢 tests/filter-deep-link.e2e.ts · 2 passed 225ms
🟢 filter deep link › filtering writes the query to the URL 123ms
🟢 filter deep link › opening a shared link restores the filter 102ms
🟢 tests/gift-card-purchase.e2e.ts · 3 passed 490ms
🟢 gift card purchase › refuses to buy without an amount 140ms
🟢 gift card purchase › refuses a recipient without an at sign 182ms
🟢 gift card purchase › sends the gift card 168ms
🟢 tests/hover-menu.e2e.ts · 2 passed 412ms
🟢 hover menu › a decoy leaf is refused 181ms
🟢 hover menu › hovering Account, then Billing, reaches Redeem voucher 231ms
🟢 tests/iframe-form.e2e.ts · 2 passed 534ms
🟢 iframe form › a wrong code is refused by the host page 219ms
🟢 iframe form › the code read from one frame applies through the other 315ms
🟢 tests/image-only-ui.e2e.ts · 3 passed 479ms
🟢 image only ui › the icons have no names, so the bare svg locator is ambiguous 155ms
🟢 image only ui › a wrong icon shows the error image and keeps the icons 142ms
🟢 image only ui › tapping the star, then the heart, verifies the icons 182ms
🟢 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 747ms
🟢 kanban board › pointer drags move both cards into the goal layout 364ms
🟢 kanban board › a swipe along a path drags a card as well 165ms
🟢 kanban board › a plain tap moves nothing and the untouched board is rejected 218ms
🟢 tests/login-form.e2e.ts · 4 passed 831ms
🟢 login form › rejects a malformed email 213ms
🟢 login form › rejects a short password 185ms
🟢 login form › rejects an unknown account 183ms
🟢 login form › signs in and logs out 250ms
🟢 tests/lying-labels.e2e.ts · 4 passed 658ms
🟢 lying labels › the button whose accessible name says Pay now is the wrong one 176ms
🟢 lying labels › a text match for Pay now catches the decoy phrase too 109ms
🟢 lying labels › the field whose accessible name says Amount is the wrong one 189ms
🟢 lying labels › visible text drives the payment through 184ms
🟢 tests/native-dialogs.e2e.ts · 3 passed 397ms
🟢 native dialogs › answers the confirm, prompt, and alert chain 131ms
🟢 native dialogs › dismissing the confirm cancels the order 132ms
🟢 native dialogs › a wrong gift code is rejected 134ms
🟢 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 231ms
🟢 onboarding wizard › the address step takes the brief through its bare-div dropdown 297ms
🟢 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 167ms
🟢 order history › the orders tab never leaves its loading state (planted bug) 1.2s
🟢 tests/otp-auto-advance.e2e.ts · 3 passed 1.3s
🟢 otp auto-advance › focus advances with each digit and the full code verifies 451ms
🟢 otp auto-advance › backspace on an empty box clears and refocuses the previous one 123ms
🟢 otp auto-advance › a wrong code clears every box and starts over 751ms
🟢 tests/overlay-trap.e2e.ts · 1 passed 704ms
🟢 continues only after the banner and the overlay are gone 704ms
🟢 tests/playbook-cleanup.e2e.ts · 2 passed 404ms
🟢 playbook cleanup › deleting the draft removes it from an exact-name search 207ms
🟢 playbook cleanup › cancelling the dialog keeps the draft searchable 197ms
🟢 tests/price-sorting.e2e.ts · 3 passed 318ms
🟢 price sorting › opens in the featured order with sale prices struck through 92ms
🟢 price sorting › low to high sorts by the original price, not the paid one (planted bug) 110ms
🟢 price sorting › high to low is the same wrong order reversed (planted bug) 116ms
🟢 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 413ms
🟢 rich text editor › bolding exactly the required word passes the check 212ms
🟢 rich text editor › bold that spills into the previous word fails the check 201ms
🟢 tests/saved-addresses.e2e.ts · 3 passed 466ms
🟢 saved addresses › adds an address and clears the form 156ms
🟢 saved addresses › ignores an add with an empty field 145ms
🟢 saved addresses › delete shows its toast but keeps the address, on retry too (planted bug) 165ms
🟢 tests/shadow-dom-form.e2e.ts · 2 passed 464ms
🟢 shadow DOM form › rejects a wrong access code 230ms
🟢 shadow DOM form › grants access with the code from the hint inside the root 234ms
🟢 tests/smoke.e2e.ts · 1 passed 378ms
🟢 home lists the scenarios and opens one 378ms
🟢 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 167ms
🟢 accepts the terms once the button clears the sticky footer 167ms
🟢 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 215ms
🟢 wishlist › the wishlist tab renders the empty state despite the badge count (planted bug) 1.3s

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

@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e web agent: 33 passed

33 agent steps · 26 replayed from cache · 18 model calls · 71.0k tokens (93% cached) · $0.0031

All 33 tests in 5 files
Test Agent Time
🟢 tests-agent/control-inventory.e2e.ts · 7 passed 7 steps 7.2s
🟢 control inventory › check sets the checkbox and the radio 1 step 538ms
🟢 control inventory › check picks a radio the pick replaces with its summary 1 step 249ms
🟢 control inventory › a long press and a double click are chosen over a plain tap 1 step 880ms
🟢 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.3s
🟢 control inventory › back returns from the details view to the inventory 1 step 242ms
🟢 control inventory › scroll_to brings the footnote into view 1 step 360ms
🟢 tests-agent/login-form.e2e.ts · 1 passed 1 step 352ms
🟢 act signs in with the benchmark account 1 step 352ms
🟢 tests-agent/planted-bugs.e2e.ts · 3 passed 3 steps · 6 calls 8.5s
🟢 cart totals: a judgment catches the stale order summary 1 step · 2 calls 2.6s
🟢 checkout review: a judgment catches the broken copy 1 step · 1 call 1.5s
🟢 wishlist: a judgment catches the lost saved items 1 step · 3 calls 4.3s
🟢 tests-agent/scenarios.e2e.ts · 21 passed 21 steps · 12 calls 2m 29s
🟢 act completes shadow-dom-form 1 step · 3 calls 3.7s
🟢 act completes lying-labels 1 step · 3 calls 5.0s
🟢 act completes iframe-form 1 step · 3 calls 3.9s
🟢 act completes infinite-scroll 1 step 5.2s
🟢 act completes virtualized-table 1 step 1m 42s
🟢 act completes overlay-trap 1 step 837ms
🟢 act completes sticky-chrome 1 step 880ms
🟢 act completes async-states 1 step · 3 calls 6.4s
🟢 act completes debounced-search 1 step 2.3s
🟢 act completes hover-menu 1 step 434ms
🟢 act completes drag-and-drop 1 step 399ms
🟢 act completes kanban-board 1 step 570ms
🟢 act completes context-menu-trap 1 step 2.6s
🟢 act completes stale-dom 1 step 412ms
🟢 act completes otp-auto-advance 1 step 650ms
🟢 act completes date-picker 1 step 783ms
🟢 act completes rich-text-editor 1 step 7.8s
🟢 act completes playbook-cleanup 1 step 517ms
🟢 act completes promo-storefront 1 step 2.2s
🟢 act completes gift-card-purchase 1 step 2.4s
🟢 act filters the list and the URL carries the filter 1 step 206ms
🟢 tests-agent/unique-cache.e2e.ts · 1 passed 1 step 243ms
🟢 act adds an address with a run-unique label 1 step 243ms

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

@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

🟢 e2e ios agent: 1 flaky, 20 passed, 1 skipped

25 agent steps · 143 model calls · 1.0M tokens (79% cached) · $0.0756

⚠️ 1 flaky test passed on a retry

⚠️ act completes Gestures
tests-agent/scenarios.e2e.ts:257

ASSERTION_FAILED at step 4 of 4: agent.act "Complete this scenario as the screen instructs: long-press the first target, swipe the card left, then double-tap the last target", after 53.4s and 11 model calls

agent.act failed: Completed the long-press and left-swipe steps; the app advanced to Step 3. Double-tapped “Double-tap me” twice, but the latest screen still shows Step 3 of 3 with the same prompt and no visible completion outcome.

  • Turn 8: screenshot({}) → [screenshot] The screen changed substantially since revision b9. Current screen (revision b11, path dev.e2e.benchmark / Benchmark Examples, 11 nodes):
  • Turn 9: double_tap({"target":"n3764"}) → [double_tap] Double-tapped #n3764.
  • Turn 10: double_tap({"target":"n3794"}) → [double_tap] Double-tapped #n3794.
  • Screen: dev.e2e.benchmark / Benchmark Examples

Evidence: screenshot, log

All 22 tests in 1 file
Test Agent Time
⚠️ tests-agent/scenarios.e2e.ts · 1 flaky, 20 passed, 1 skipped 25 steps · 143 calls 15m 25s
🟢 act completes Login Form 1 step · 9 calls 1m 22s
🟢 act completes Infinite Scroll List 1 step · 3 calls 1m 1s
🟢 act completes Modal Flow 1 step · 4 calls 17.2s
🟢 act completes Bottom Tabs 1 step · 3 calls 14.1s
🟢 act completes Text Input Variations 1 step · 3 calls 32.5s
🟢 act completes Broken Accessibility 2 steps · 7 calls 40.3s
🟢 act completes Vision Only 2 steps · 6 calls 36.9s
⚠️ act completes Gestures (1 failed attempt first) 1 step · 10 calls 48.5s
🟢 act completes Async States 1 step · 8 calls 36.9s
🟢 act completes Debounced Search 1 step · 4 calls 22.2s
🟢 act completes Flattened Registration Form 2 steps · 19 calls 2m 31s
🟢 act completes Flattened Login 2 steps · 15 calls 1m 33s
🟢 act completes Sticky Chrome Target 1 step · 8 calls 42.2s
🟢 act completes WebView Accessibility 1 step · 6 calls 42.7s
🟢 act completes Permission Prompt 1 step · 3 calls 23.2s
🟢 act completes Photo Picker 1 step · 4 calls 28.7s
🟢 act completes Product Catalog 1 step · 5 calls 20.1s
🟢 act completes Error Recovery 1 step · 6 calls 20.0s
🟢 act completes Choice Controls 1 step · 8 calls 42.8s
🟢 act completes Stripe PaymentSheet 1 step · 8 calls 45.4s
🟢 act completes Apple Pay 1 step · 4 calls 25.0s
⏭️ 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 · 16m 28s · ios-simulator · run artifacts

@github-actions

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

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

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

🟢 e2e android agent: 20 passed

24 agent steps · 117 model calls · 674.6k tokens (84% cached) · $0.0419

All 20 tests in 1 file
Test Agent Time
🟢 tests-agent/scenarios.e2e.ts · 20 passed 24 steps · 117 calls 9m 29s
🟢 act completes Login Form 1 step · 3 calls 29.1s
🟢 act completes Infinite Scroll List 1 step · 3 calls 25.3s
🟢 act completes Modal Flow 1 step · 4 calls 11.5s
🟢 act completes Bottom Tabs 1 step · 3 calls 11.0s
🟢 act completes Text Input Variations 1 step · 3 calls 10.3s
🟢 act completes Broken Accessibility 2 steps · 6 calls 27.4s
🟢 act completes Vision Only 2 steps · 6 calls 28.7s
🟢 act completes Gestures 1 step · 9 calls 30.2s
🟢 act completes Async States 1 step · 10 calls 36.3s
🟢 act completes Debounced Search 1 step · 4 calls 10.0s
🟢 act completes Huge Virtualized List 1 step · 3 calls 1m 15s
🟢 act completes Flattened Registration Form 2 steps · 8 calls 38.9s
🟢 act completes Flattened Login 2 steps · 6 calls 27.1s
🟢 act completes Sticky Chrome Target 1 step · 4 calls 15.6s
🟢 act completes WebView Accessibility 1 step · 5 calls 15.4s
🟢 act completes Permission Prompt 1 step · 3 calls 8.7s
🟢 act completes Product Catalog 1 step · 5 calls 13.2s
🟢 act completes Error Recovery 1 step · 6 calls 12.7s
🟢 act completes Choice Controls 1 step · 6 calls 28.0s
🟢 act completes Sequential Onboarding 1 step · 20 calls 1m 54s

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

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

🟢 e2e ios: 52 passed, 1 skipped

All 53 tests in 7 files
Test Time
⏭️ tests/controls.e2e.ts · 23 passed, 1 skipped 5m 15s
🟢 control inventory › a label query resolves a labeled text field 12.0s
🟢 control inventory › a labeled field answers name, display value, value reads, fill, and clear 21.5s
🟢 control inventory › a placeholder query and attribute reads find the field 7.2s
🟢 control inventory › a secure field takes a fill and denies value reads 12.3s
🟢 control inventory › press sends a character and Enter through the soft keyboard 10.1s
🟢 control inventory › a field autofocuses on mount and focus() moves the focus 12.9s
🟢 control inventory › toBeFocused follows the focus 10.5s
🟢 control inventory › a switch checks, unchecks, and reports its state 14.7s
🟢 control inventory › checkbox and radio roles answer getByRole, and a checkbox toggles by tap 28.7s
🟢 control inventory › checkbox and radio roles check, uncheck, and report their state 28.4s
🟢 control inventory › a radio group reports the checked option 15.8s
🟢 control inventory › buttons report disabled, enabled, and a state that arrives later 13.3s
🟢 control inventory › a display: none element is absent rather than hidden, its visible twin attached 12.7s
🟢 control inventory › a header answers its accessible name 8.9s
🟢 control inventory › a tab row answers count, all, texts, filters, positions, and switching 13.5s
🟢 control inventory › a list answers counts, list-form text, reads, and boxes in order 15.9s
⏭️ 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 14.9s
🟢 control inventory › pointer verbs land at the point asked for 18.7s
🟢 control inventory › an ambiguous locator fails at once 10.5s
🟢 control inventory › screenshot, restart, and clearState reopen the app on its home list 30.1s
🟢 refusals › verbs a device never declares are refused before the engine 7ms
🟢 refusals › keys the soft keyboard cannot send are refused by the engine 820ms
🟢 refusals › a missing locator fails as not found once its timeout passes 1.5s
🟢 tests/device-fixture.e2e.ts · 9 passed 1m 34s
🟢 device fixture › setAppearance flips the color scheme the app reads 13.1s
🟢 device fixture › setOrientation rotates the window the app measures 9.3s
🟢 device fixture › the clipboard reads back what was written 7.3s
🟢 device fixture › home leaves the app, openApp brings it back where it was 8.8s
🟢 device fixture › closeApp then openApp relaunches on the home list 12.2s
🟢 device fixture › foregroundApp after closeApp reports the closed session as APP_NOT_OPEN 7.6s
🟢 device fixture › device.back pops the scenario 7.3s
🟢 device fixture › setLocation and clearLocation change what the app reads 15.2s
🟢 device fixture › enrollBiometrics and setBiometrics answer a biometric prompt 13.2s
🟢 tests/device.e2e.ts · 2 passed 1m 26s
🟢 sequential onboarding echoes the exact values 1m 4s
🟢 onboarding rejects a malformed email before advancing 21.6s
🟢 tests/flows-lists.e2e.ts · 7 passed 5m 54s
🟢 infinite scroll reaches the target item 42.3s
🟢 product catalog adds exactly two of the right variant 16.2s
🟢 gestures: long-press, then swipe left 14.7s
🟢 sticky chrome: accept below the fold, then continue 18.6s
🟢 async states: load, pull to refresh, claim through the toast 18.0s
🟢 huge virtualized list reaches row 512 3m 37s
🟢 web view coupon form applies the code shown on the page 26.8s
🟢 tests/flows.e2e.ts · 7 passed 2m 10s
🟢 text inputs unlock the submit button 25.6s
🟢 filled text inputs report their values 19.3s
🟢 modal flow confirms through the native alert 16.5s
🟢 bottom tabs act inside the last tab 15.2s
🟢 error recovery retries, then confirms the delete 15.9s
🟢 choice controls place the exact order 17.7s
🟢 debounced search selects the target once results arrive 20.0s
🟢 tests/login-form.e2e.ts · 3 passed 1m 28s
🟢 login form › rejects a malformed email 25.0s
🟢 login form › rejects an unknown account 23.7s
🟢 login form › signs in and logs out 39.2s
🟢 tests/smoke.e2e.ts · 1 passed 24.4s
🟢 home lists the scenarios and opens one 24.4s

e2e 0.17.0 · 9m 18s · ios-simulator · run artifacts

@okwasniewski
okwasniewski merged commit 13da94b into main Oct 6, 2026
23 checks passed
@okwasniewski
okwasniewski deleted the oskar/decision-release-fixes branch October 6, 2026 12:16
okwasniewski added a commit to pvedula7/e2e that referenced this pull request Oct 8, 2026
okwasniewski added a commit to pvedula7/e2e that referenced this pull request Oct 8, 2026
okwasniewski added a commit to Ashfaqbs/e2e that referenced this pull request Oct 8, 2026
okwasniewski added a commit to pvedula7/e2e that referenced this pull request Oct 8, 2026
SudoScientist161 pushed a commit to SudoScientist161/e2e that referenced this pull request Oct 9, 2026
Ethereal49 pushed a commit to Ethereal49/e2e that referenced this pull request Oct 12, 2026
…er-army#910)

* fix(decision): forward an element's selected state to the model

checked and expanded already reach the decision model through the
element table and target criteria; selected did not, even though the
engine already reports it in SemanticNode.states. On a tab bar every
tab therefore looked identical, so the completion check for a tab
switch landed near 50/50: a step that worked could still be blocked,
and a step could be marked done before anything was tapped.

Forward selected the same way checked already is, in actionSpace's
element table and in targetCriterion.

* test(decision): use scriptedDecision after tester-army#916

---------

Co-authored-by: Oskar Kwaśniewski <oskar@okwasniewski.com>
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