Skip to content

ci(release): publish through npm trusted publishing (OIDC) - #707

Merged
okwasniewski merged 1 commit into
mainfrom
oskar/npm-trusted-publishing
Oct 1, 2026
Merged

okwasniewski merged 1 commit into
mainfrom
oskar/npm-trusted-publishing

Conversation

@okwasniewski

@okwasniewski okwasniewski commented Sep 30, 2026 •

Copy link
Copy Markdown
Member

Publishing now authenticates with npm Trusted Publishing (OIDC) instead of the NPM_TOKEN secret, same setup as callstack/react-native-bottom-tabs. Once the repo is public, npm attaches provenance automatically: the "built and signed on GitHub Actions" badge.

  • release.yml gains id-token: write and drops NODE_AUTH_TOKEN; the OIDC exchange in npm publish (npm 11.5.1+, bundled with node 26) replaces it.
  • The release job moves to ubuntu-latest: npm rejects OIDC tokens from self-hosted runners, and Blacksmith registers as one (npm docs: "Self-hosted runners are not currently supported"). AGENTS.md records the exception to the Blacksmith rule. Timeout bumped 20 to 30 min for the slower runner.
  • registry-url removed from setup-node: its .npmrc template reads NODE_AUTH_TOKEN and errors once the variable is gone.
  • publishConfig.provenance: false removed from all 6 public packages. Default is auto: npm skips provenance while the repo is private, attaches it once public. No changeset: metadata only, no behavior change.
  • All 6 packages (e2e, @e2e-dev/web, @e2e-dev/mobile, @e2e-dev/github, @e2e-dev/kernel, @e2e-dev/eas) already have the trusted publisher connection on npmjs: GitHub Actions, tester-army/e2e, release.yml, Allow npm publish checked.
  • CONTRIBUTING.md documents the per-package connection and the recipe for a new package (first publish by hand, then add the trusted publisher; npm has no org-wide setting). AGENTS.md's release notes updated to match.

Verified

Ran it locally: no - the publish path only runs on a release push to main, and OIDC cannot be exercised from a laptop (the token exchange only works inside the configured workflow on a GitHub-hosted runner).

Checked statically instead:

Fresh-context review found 3 issues, all fixed here: the Blacksmith/OIDC incompatibility, provenance claims contradicted by the publishConfig pins and repo visibility, and the stale AGENTS.md release notes.


Devin Review

Review in cubic

Drops NPM_TOKEN from release.yml; each package grants release.yml publish
rights via an npm trusted publisher. Release job moves to ubuntu-latest
because npm rejects OIDC from self-hosted runners (Blacksmith included).
publishConfig.provenance pins removed so provenance attaches automatically
once the repo is public. Setup recipe documented in CONTRIBUTING.md.

@devin-ai-integration devin-ai-integration 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.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Devin Review

@github-actions

Copy link
Copy Markdown
Contributor

🟢 e2e web: 90 passed

All 90 tests in 41 files
Test Time
🟢 tests/aria-hidden-flow.e2e.ts · 2 passed 731ms
🟢 aria hidden flow › picks the Pro plan by its visible text and confirms it 496ms
🟢 aria hidden flow › another plan shows the error and keeps the picker open 235ms
🟢 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.7s
🟢 tests/canvas-only.e2e.ts · 2 passed 251ms
🟢 canvas only › taps square, circle, then diamond at their pixel coordinates 115ms
🟢 canvas only › a shape out of order paints the error and resets progress 136ms
🟢 tests/canvas-whiteboard.e2e.ts · 2 passed 416ms
🟢 canvas whiteboard › drags both shapes into their slots and saves 199ms
🟢 canvas whiteboard › bounces a shape off the wrong slot and refuses to save early 217ms
🟢 tests/cart-totals.e2e.ts · 2 passed 415ms
🟢 cart totals › increasing a quantity updates the line total but the order summary stays stale (planted bug) 262ms
🟢 cart totals › a quantity never drops below one 153ms
🟢 tests/checkout-review.e2e.ts · 1 passed 169ms
🟢 shows a raw greeting token and an undefined delivery date (planted bug), yet places the order 169ms
🟢 tests/context-menu-trap.e2e.ts · 2 passed 586ms
🟢 context menu trap › right-click opens nothing; the row menu renames the file 293ms
🟢 context menu trap › the decoy menu items refuse and keep the file 293ms
🟢 tests/control-inventory.e2e.ts · 7 passed 3.2s
🟢 control inventory › check sets the checkbox and the radio without flipping a set one 243ms
🟢 control inventory › a long press and a double click are told apart from a tap 1.0s
🟢 control inventory › the file menu opens on right-click only and Rename renames the file 235ms
🟢 control inventory › setInputFiles attaches files named from the project root 120ms
🟢 control inventory › the details view is left through the browser history 138ms
🟢 control inventory › scrollIntoView brings the footnote into view 245ms
🟢 control inventory › every exercise done shows the success message 1.2s
🟢 tests/css-content-ui.e2e.ts · 2 passed 293ms
🟢 css content ui › the tile labelled Ship it advances and confirming ships 172ms
🟢 css content ui › a wrong tile shows the CSS-rendered error and keeps the picker 121ms
🟢 tests/date-picker.e2e.ts · 2 passed 654ms
🟢 date picker › navigates three months ahead and books the required date 349ms
🟢 date picker › confirming without the exact date shows the error 305ms
🟢 tests/debounced-search.e2e.ts · 2 passed 3.0s
🟢 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 597ms
🟢 div soup › a wrong code is rejected 262ms
🟢 div soup › the right code grants access after the delete tile fixes a typo 335ms
🟢 tests/drag-and-drop.e2e.ts · 2 passed 631ms
🟢 drag and drop › an out-of-order item resets the dropzone 314ms
🟢 drag and drop › dropping Banana then Cherry passes 317ms
🟢 tests/filter-deep-link.e2e.ts · 2 passed 229ms
🟢 filter deep link › filtering writes the query to the URL 125ms
🟢 filter deep link › opening a shared link restores the filter 104ms
🟢 tests/gift-card-purchase.e2e.ts · 3 passed 516ms
🟢 gift card purchase › refuses to buy without an amount 168ms
🟢 gift card purchase › refuses a recipient without an at sign 177ms
🟢 gift card purchase › sends the gift card 171ms
🟢 tests/hover-menu.e2e.ts · 2 passed 430ms
🟢 hover menu › a decoy leaf is refused 197ms
🟢 hover menu › hovering Account, then Billing, reaches Redeem voucher 233ms
🟢 tests/iframe-form.e2e.ts · 2 passed 517ms
🟢 iframe form › a wrong code is refused by the host page 207ms
🟢 iframe form › the code read from one frame applies through the other 310ms
🟢 tests/image-only-ui.e2e.ts · 3 passed 480ms
🟢 image only ui › the icons have no names, so the bare svg locator is ambiguous 126ms
🟢 image only ui › a wrong icon shows the error image and keeps the icons 160ms
🟢 image only ui › tapping the star, then the heart, verifies the icons 194ms
🟢 tests/infinite-scroll.e2e.ts · 1 passed 4.0s
🟢 scrolls the feed until the Golden Ticket loads, then claims it 4.0s
🟢 tests/kanban-board.e2e.ts · 3 passed 797ms
🟢 kanban board › pointer drags move both cards into the goal layout 378ms
🟢 kanban board › a swipe along a path drags a card as well 154ms
🟢 kanban board › a plain tap moves nothing and the untouched board is rejected 265ms
🟢 tests/login-form.e2e.ts · 4 passed 952ms
🟢 login form › rejects a malformed email 219ms
🟢 login form › rejects a short password 218ms
🟢 login form › rejects an unknown account 219ms
🟢 login form › signs in and logs out 296ms
🟢 tests/lying-labels.e2e.ts · 4 passed 671ms
🟢 lying labels › the button whose accessible name says Pay now is the wrong one 158ms
🟢 lying labels › a text match for Pay now catches the decoy phrase too 118ms
🟢 lying labels › the field whose accessible name says Amount is the wrong one 199ms
🟢 lying labels › visible text drives the payment through 196ms
🟢 tests/native-dialogs.e2e.ts · 3 passed 533ms
🟢 native dialogs › answers the confirm, prompt, and alert chain 168ms
🟢 native dialogs › dismissing the confirm cancels the order 182ms
🟢 native dialogs › a wrong gift code is rejected 183ms
🟢 tests/newsletter-signup.e2e.ts · 1 passed 2.3s
🟢 subscribe renders no feedback and logs a TypeError (planted bug) 2.3s
🟢 tests/onboarding-wizard.e2e.ts · 5 passed 5.2s
🟢 onboarding wizard › back keeps what was typed and the brief comes back with it 347ms
🟢 onboarding wizard › the address step takes the brief through its bare-div dropdown 426ms
🟢 onboarding wizard › the profile step steers the calendar three decades back 1.4s
🟢 onboarding wizard › the preferences step flips the toggles the brief names and leaves the trap off 1.4s
🟢 onboarding wizard › the review step repeats the brief and finishes with the PIN 1.7s
🟢 tests/order-history.e2e.ts · 2 passed 1.6s
🟢 order history › overview and settings render their panels 257ms
🟢 order history › the orders tab never leaves its loading state (planted bug) 1.4s
🟢 tests/otp-auto-advance.e2e.ts · 3 passed 1.6s
🟢 otp auto-advance › focus advances with each digit and the full code verifies 551ms
🟢 otp auto-advance › backspace on an empty box clears and refocuses the previous one 191ms
🟢 otp auto-advance › a wrong code clears every box and starts over 855ms
🟢 tests/overlay-trap.e2e.ts · 1 passed 677ms
🟢 continues only after the banner and the overlay are gone 677ms
🟢 tests/playbook-cleanup.e2e.ts · 2 passed 649ms
🟢 playbook cleanup › deleting the draft removes it from an exact-name search 302ms
🟢 playbook cleanup › cancelling the dialog keeps the draft searchable 347ms
🟢 tests/price-sorting.e2e.ts · 3 passed 495ms
🟢 price sorting › opens in the featured order with sale prices struck through 166ms
🟢 price sorting › low to high sorts by the original price, not the paid one (planted bug) 168ms
🟢 price sorting › high to low is the same wrong order reversed (planted bug) 161ms
🟢 tests/product-reviews.e2e.ts · 1 passed 1.2s
🟢 the running-shoe page lists coffee-grinder reviews (planted bug) 1.2s
🟢 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 535ms
🟢 rich text editor › bolding exactly the required word passes the check 264ms
🟢 rich text editor › bold that spills into the previous word fails the check 271ms
🟢 tests/saved-addresses.e2e.ts · 3 passed 746ms
🟢 saved addresses › adds an address and clears the form 245ms
🟢 saved addresses › ignores an add with an empty field 243ms
🟢 saved addresses › delete shows its toast but keeps the address, on retry too (planted bug) 258ms
🟢 tests/shadow-dom-form.e2e.ts · 2 passed 611ms
🟢 shadow DOM form › rejects a wrong access code 299ms
🟢 shadow DOM form › grants access with the code from the hint inside the root 312ms
🟢 tests/smoke.e2e.ts · 1 passed 436ms
🟢 home lists the scenarios and opens one 436ms
🟢 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 221ms
🟢 accepts the terms once the button clears the sticky footer 221ms
🟢 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.6s
🟢 wishlist › saving toggles the button and the tab badge 267ms
🟢 wishlist › the wishlist tab renders the empty state despite the badge count (planted bug) 1.3s

e2e 0.15.0 · 1m 56s · web · run artifacts

@github-actions

Copy link
Copy Markdown
Contributor

🟢 e2e web agent: 32 passed

33 agent steps · 25 replayed from cache · 20 model calls · 76.4k tokens (92% cached) · $0.0036

All 32 tests in 5 files
Test Agent Time
🟢 tests-agent/control-inventory.e2e.ts · 6 passed 6 steps 3.3s
🟢 control inventory › check sets the checkbox and the radio 1 step 645ms
🟢 control inventory › a long press and a double click are chosen over a plain tap 1 step 1.1s
🟢 control inventory › a right-click opens the file menu and Rename renames the file 1 step 572ms
🟢 control inventory › upload attaches the named project files 1 step 265ms
🟢 control inventory › back returns from the details view to the inventory 1 step 365ms
🟢 control inventory › scroll_to brings the footnote into view 1 step 359ms
🟢 tests-agent/login-form.e2e.ts · 1 passed 1 step 339ms
🟢 act signs in with the benchmark account 1 step 339ms
🟢 tests-agent/planted-bugs.e2e.ts · 3 passed 4 steps · 8 calls 12.5s
🟢 cart totals: a judgment catches the stale order summary 2 steps · 4 calls 5.3s
🟢 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 5.7s
🟢 tests-agent/scenarios.e2e.ts · 21 passed 21 steps · 12 calls 2m 46s
🟢 act completes shadow-dom-form 1 step · 3 calls 4.6s
🟢 act completes lying-labels 1 step · 3 calls 5.0s
🟢 act completes iframe-form 1 step · 3 calls 5.1s
🟢 act completes infinite-scroll 1 step 14.2s
🟢 act completes virtualized-table 1 step 1m 50s
🟢 act completes overlay-trap 1 step 901ms
🟢 act completes sticky-chrome 1 step 7.0s
🟢 act completes async-states 1 step · 3 calls 6.9s
🟢 act completes debounced-search 1 step 2.2s
🟢 act completes hover-menu 1 step 435ms
🟢 act completes drag-and-drop 1 step 434ms
🟢 act completes kanban-board 1 step 580ms
🟢 act completes context-menu-trap 1 step 469ms
🟢 act completes stale-dom 1 step 397ms
🟢 act completes otp-auto-advance 1 step 658ms
🟢 act completes date-picker 1 step 840ms
🟢 act completes rich-text-editor 1 step 1.5s
🟢 act completes playbook-cleanup 1 step 679ms
🟢 act completes promo-storefront 1 step 1.4s
🟢 act completes gift-card-purchase 1 step 2.4s
🟢 act filters the list and the URL carries the filter 1 step 219ms
🟢 tests-agent/unique-cache.e2e.ts · 1 passed 1 step 291ms
🟢 act adds an address with a run-unique label 1 step 291ms

e2e 0.15.0 · 3m 3s · web · run artifacts

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

No issues found across 9 files

Re-trigger cubic

@github-actions

github-actions Bot commented Sep 30, 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.1s

  • 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 34s
🟢 control inventory › a label query resolves a labeled text field 11.9s
🟢 control inventory › a labeled field answers name, display value, value reads, fill, and clear 18.6s
🟢 control inventory › a placeholder query and attribute reads find the field 5.4s
🟢 control inventory › a secure field takes a fill and denies value reads 11.1s
🟢 control inventory › press sends a character and Enter through the soft keyboard 12.5s
🟢 control inventory › a field autofocuses on mount and focus() moves the focus 12.0s
⚠️ control inventory › toBeFocused follows the focus (2 failed attempts first) 14.2s
🟢 control inventory › a switch checks, unchecks, and reports its state 11.9s
🟢 control inventory › checkbox and radio roles answer getByRole, and a checkbox toggles by tap 9.3s
🟢 control inventory › checkbox and radio roles check, uncheck, and report their state 14.9s
🟢 control inventory › a radio group reports the checked option 10.8s
🟢 control inventory › buttons report disabled, enabled, and a state that arrives later 9.2s
🟢 control inventory › a display: none element is absent rather than hidden, its visible twin attached 8.3s
🟢 control inventory › a header answers its accessible name 4.9s
🟢 control inventory › a tab row answers count, all, texts, filters, positions, and switching 8.5s
🟢 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 9.1s
🟢 control inventory › pointer verbs land at the point asked for 12.1s
🟢 control inventory › an ambiguous locator fails at once 6.6s
🟢 control inventory › screenshot, restart, and clearState reopen the app on its home list 12.3s
🟢 refusals › verbs a device never declares are refused before the engine 3ms
🟢 refusals › keys the soft keyboard cannot send are refused by the engine 499ms
🟢 refusals › a missing locator fails as not found once its timeout passes 1.3s
🟢 tests/device-fixture.e2e.ts · 9 passed 1m 25s
🟢 device fixture › setAppearance flips the color scheme the app reads 12.3s
🟢 device fixture › setOrientation rotates the window the app measures 9.8s
🟢 device fixture › the clipboard reads back what was written 5.9s
🟢 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 11.8s
🟢 device fixture › foregroundApp after closeApp reports the closed session as APP_NOT_OPEN 5.4s
🟢 device fixture › device.back pops the scenario 6.6s
🟢 device fixture › setLocation and clearLocation change what the app reads 12.8s
🟢 device fixture › enrollBiometrics and setBiometrics answer a biometric prompt 14.3s
🟢 tests/device.e2e.ts · 2 passed 59.3s
🟢 sequential onboarding echoes the exact values 44.9s
🟢 onboarding rejects a malformed email before advancing 14.5s
🟢 tests/flows-lists.e2e.ts · 7 passed 3m 51s
🟢 infinite scroll reaches the target item 30.1s
🟢 product catalog adds exactly two of the right variant 11.3s
🟢 gestures: long-press, then swipe left 9.8s
🟢 sticky chrome: accept below the fold, then continue 15.2s
🟢 async states: load, pull to refresh, claim through the toast 13.4s
🟢 huge virtualized list reaches row 512 2m 17s
🟢 web view coupon form applies the code shown on the page 14.8s
🟢 tests/flows.e2e.ts · 7 passed 1m 19s
🟢 text inputs unlock the submit button 17.1s
🟢 filled text inputs report their values 10.7s
🟢 modal flow confirms through the native alert 11.3s
🟢 bottom tabs act inside the last tab 8.5s
🟢 error recovery retries, then confirms the delete 10.9s
🟢 choice controls place the exact order 9.4s
🟢 debounced search selects the target once results arrive 10.9s
🟢 tests/login-form.e2e.ts · 3 passed 49.8s
🟢 login form › rejects a malformed email 12.5s
🟢 login form › rejects an unknown account 13.7s
🟢 login form › signs in and logs out 23.7s
🟢 tests/smoke.e2e.ts · 1 passed 13.5s
🟢 home lists the scenarios and opens one 13.5s

e2e 0.15.0 · 6m 34s · ios-simulator · run artifacts

@github-actions

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 58s
🟢 control inventory › a label query resolves a labeled text field 22.0s
🟢 control inventory › a labeled field answers name, display value, value reads, fill, and clear 11.8s
🟢 control inventory › a placeholder query and attribute reads find the field 5.4s
🟢 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 8.3s
🟢 control inventory › a field autofocuses on mount and focus() moves the focus 10.5s
🟢 control inventory › toBeFocused follows the focus 10.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 6.5s
🟢 control inventory › checkbox and radio roles check, uncheck, and report their state 11.7s
🟢 control inventory › a tab role answers getByRole 3.5s
🟢 control inventory › a radio group reports the checked option 9.3s
🟢 control inventory › buttons report disabled, enabled, and a state that arrives later 9.4s
🟢 control inventory › a display: none element is absent rather than hidden, its visible twin attached 6.4s
🟢 control inventory › a header answers its accessible name 3.6s
🟢 control inventory › a tab row answers count, all, texts, filters, positions, and switching 5.2s
🟢 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.2s
🟢 control inventory › a double tap lands inside the 300 ms window 7.8s
🟢 control inventory › an ambiguous locator fails at once 5.2s
🟢 control inventory › screenshot, restart, and clearState reopen the app on its home list 10.2s
🟢 refusals › verbs a device never declares are refused before the engine 5ms
🟢 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 8s
🟢 device fixture › setOrientation rotates the window the app measures 5.4s
🟢 device fixture › home leaves the app, openApp brings it back where it was 6.1s
🟢 device fixture › foregroundApp sees the home screen after home() 3.4s
🟢 device fixture › closeApp then openApp relaunches on the home list 6.1s
🟢 device fixture › foregroundApp after closeApp reports the closed session as APP_NOT_OPEN 4.4s
🟢 device fixture › device.back pops the scenario 4.5s
🟢 device fixture › setNetwork and setAirplaneMode change what the app sees 17.8s
🟢 device fixture › setLocation and clearLocation change what the app reads 20.5s
🟢 tests/device.e2e.ts · 4 passed 36.8s
🟢 permission prompt › allowing the system dialog enables the microphone 6.7s
🟢 permission prompt › a denied prompt recovers once the permission is granted outside 12.9s
🟢 sequential onboarding echoes the exact values 10.4s
🟢 onboarding rejects a malformed email before advancing 6.8s
🟢 tests/flows-lists.e2e.ts · 7 passed 2m 15s
🟢 infinite scroll reaches the target item 17.2s
🟢 product catalog adds exactly two of the right variant 9.6s
🟢 gestures: long-press, then swipe left 7.3s
🟢 gestures: double-tap completes the flow 9.4s
🟢 sticky chrome: accept below the fold, then continue 11.4s
🟢 async states: load, pull to refresh, claim through the toast 12.4s
🟢 huge virtualized list reaches row 512 1m 7s
🟢 tests/flows.e2e.ts · 7 passed 53.5s
🟢 text inputs unlock the submit button 6.3s
🟢 filled text inputs report their values 5.9s
🟢 modal flow confirms through the native alert 8.4s
🟢 bottom tabs act inside the last tab 7.1s
🟢 error recovery retries, then confirms the delete 8.8s
🟢 choice controls place the exact order 8.6s
🟢 debounced search selects the target once results arrive 8.5s
🟢 tests/login-form.e2e.ts · 3 passed 29.7s
🟢 login form › rejects a malformed email 8.5s
🟢 login form › rejects an unknown account 8.4s
🟢 login form › signs in and logs out 12.8s
🟢 tests/smoke.e2e.ts · 1 passed 5.5s
🟢 home lists the scenarios and opens one 5.5s

e2e 0.15.0 · 8m 27s · android-emulator · run artifacts

@github-actions

Copy link
Copy Markdown
Contributor

🟢 e2e android agent: 1 flaky, 19 passed

24 agent steps · 11 replayed from cache · 41 model calls · 262.1k tokens (86% cached) · $0.0156

⚠️ 1 flaky test passed on a retry

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

ACTION_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 29.4s and 9 model calls

agent.act failed: Long-pressing the first target advanced to Step 2. Several leftward swipes across the visible “Swipe me left” card did not advance the scenario; it remains on Step 2, so the final double-tap target was not reached.

  • Turn 6: screenshot({}) → [screenshot] The screen changed substantially since revision b7. Current screen (revision b9, path dev.e2e.benchmark, 18 nodes):
  • Turn 7: swipe({"from":{"x":250,"y":460},"to":{"x":30,"y":460}}) → [swipe] Swiped from (250, 460) to (30, 460).
  • Turn 8: screenshot({}) → [screenshot] The screen changed substantially since revision b9. Current screen (revision b11, path dev.e2e.benchmark, 18 nodes):
  • Screen: dev.e2e.benchmark

Evidence: screenshot, log

All 20 tests in 1 file
Test Agent Time
⚠️ tests-agent/scenarios.e2e.ts · 1 flaky, 19 passed 24 steps · 41 calls 9m 58s
🟢 act completes Login Form 1 step · 4 calls 53.1s
🟢 act completes Infinite Scroll List 1 step · 3 calls 2m 15s
🟢 act completes Modal Flow 1 step 9.8s
🟢 act completes Bottom Tabs 1 step · 3 calls 22.8s
🟢 act completes Text Input Variations 1 step 6.0s
🟢 act completes Broken Accessibility 2 steps · 5 calls 29.4s
🟢 act completes Vision Only 2 steps · 1 call 11.4s
⚠️ act completes Gestures (1 failed attempt first) 1 step · 10 calls 37.0s
🟢 act completes Async States 1 step 10.8s
🟢 act completes Debounced Search 1 step 7.2s
🟢 act completes Huge Virtualized List 1 step · 2 calls 1m 29s
🟢 act completes Flattened Registration Form 2 steps · 1 call 22.1s
🟢 act completes Flattened Login 2 steps · 6 calls 31.4s
🟢 act completes Sticky Chrome Target 1 step 52.0s
🟢 act completes WebView Accessibility 1 step · 4 calls 17.0s
🟢 act completes Permission Prompt 1 step · 2 calls 23.0s
🟢 act completes Product Catalog 1 step 10.0s
🟢 act completes Error Recovery 1 step 9.4s
🟢 act completes Choice Controls 1 step 10.8s
🟢 act completes Sequential Onboarding 1 step 11.0s

e2e 0.15.0 · 10m 34s · android-emulator · run artifacts

@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

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

25 agent steps · 11 replayed from cache · 57 model calls · 380.4k tokens (81% cached) · $0.0271

⚠️ 1 flaky test passed on a retry

⚠️ act completes Login Form
tests-agent/scenarios.e2e.ts:266

ASSERTION_FAILED at step 6 of 6: expect.toHaveText getByTestId("success-message"), after 5.2s

  • Expected: text "Logged in successfully"
  • Observed: no node (0 matches)
  • Screen: dev.e2e.benchmark / Benchmark Examples

Evidence: log

All 22 tests in 1 file
Test Agent Time
⚠️ tests-agent/scenarios.e2e.ts · 1 flaky, 20 passed, 1 skipped 25 steps · 57 calls 10m 33s
⚠️ act completes Login Form (1 failed attempt first) 1 step · 9 calls 1m 4s
🟢 act completes Infinite Scroll List 1 step 43.6s
🟢 act completes Modal Flow 1 step 14.1s
🟢 act completes Bottom Tabs 1 step 10.7s
🟢 act completes Text Input Variations 1 step 19.1s
🟢 act completes Broken Accessibility 2 steps · 6 calls 37.3s
🟢 act completes Vision Only 2 steps · 1 call 16.1s
🟢 act completes Gestures 1 step · 9 calls 59.3s
🟢 act completes Async States 1 step · 6 calls 28.4s
🟢 act completes Debounced Search 1 step · 3 calls 21.2s
🟢 act completes Flattened Registration Form 2 steps · 1 call 38.2s
🟢 act completes Flattened Login 2 steps · 10 calls 1m 18s
🟢 act completes Sticky Chrome Target 1 step 19.6s
🟢 act completes WebView Accessibility 1 step 17.5s
🟢 act completes Permission Prompt 1 step · 2 calls 30.5s
🟢 act completes Photo Picker 1 step · 2 calls 27.8s
🟢 act completes Product Catalog 1 step 13.6s
🟢 act completes Error Recovery 1 step 14.2s
🟢 act completes Choice Controls 1 step 18.2s
🟢 act completes Stripe PaymentSheet 1 step · 7 calls 42.7s
🟢 act completes Apple Pay 1 step · 1 call 19.7s
⏭️ 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.15.0 · 11m 33s · ios-simulator · run artifacts

@okwasniewski
okwasniewski merged commit 6fa2bc2 into main Oct 1, 2026
18 of 19 checks passed
@okwasniewski
okwasniewski deleted the oskar/npm-trusted-publishing branch October 1, 2026 09:35
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