Agent skill

E2E Matrix Runner

by hyodotdev in hyodotdev/openiap

Run the full OpenIAP device matrix — six frameworks across iOS, Google Play, Amazon Appstore, Meta Horizon, and VegaOS — driving real hardware over adb and xcrun, and report one row per cell with…

MITAuto-check: notesTesting & QA

Install E2E Matrix Runner

skills CLI
$ npx skills add hyodotdev/openiap --skill e2e-matrix-runner -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install hyodotdev/openiap e2e-matrix-runner --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/hyodotdev/openiap.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.codex/skills/e2e-matrix-runner .claude/skills/e2e-matrix-runner && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
e2e-matrix-runner
GitHub stars
155
Token cost
~3.4k tokens
SKILL.md length
1,773 words
Files
1
Skills in repo
19
Repo updated
First seen
Licence
MIT

At a glance

Run the full OpenIAP device matrix — six frameworks across iOS, Google Play, Amazon Appstore, Meta Horizon, and VegaOS — driving real hardware over adb and xcrun, and report one row per cell with…

  • Asked for a full e2e matrix
  • SKILL.md covers The matrix (pinned scope — do…, Standing approvals for E2E runs, Devices attached to this machine and Driving the hardware, plus 3 more sections
  • Calls adb, xcrun and xcodebuild
  • A device regression across every framework and store

What it does

E2E Matrix Runner is an agent skill from hyodotdev/openiap. Run the full OpenIAP device matrix — six frameworks across iOS, Google Play, Amazon Appstore, Meta Horizon, and VegaOS — driving real hardware over adb and xcrun, and report one row per cell with evidence. Use when asked for a full e2e matrix, a device regression across every framework and store, or delegated hardware testing.

Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Testing & QA, covering End-to-end testing, Mobile testing and debugging and Cross-platform mobile apps. It works with iOS. The repository describes itself as: Standardized protocol for in-app purchases across all platforms — backed by Meta & Amazon. The licence is MIT.

When your agent uses it

  • Asked for a full e2e matrix
  • A device regression across every framework and store
  • Delegated hardware testing

Example prompts

  • “/e2e-matrix-runner”

What it can do on your machine

Read from SKILL.md and the folder at commit 9f7d5f6. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • adb
    • xcrun
    • xcodebuild
    • flutter
    • dotnet

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

E2E Matrix Runner loads about 3.4k tokens when it runs. Until then it costs about 87 tokens; SKILL.md has 1,773 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~87
When it runs · the whole SKILL.md, loaded when a task matches
~3.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:184
    binary at native build time.** Editing `.env` and

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from hyodotdev/openiap at commit 9f7d5f6, republished under its MIT licence (© hyodotdev). 1,773 words, ~3,401 tokens.

Download SKILL.mdSave it as .claude/skills/e2e-matrix-runner/SKILL.md (or your agent's skills folder).
name
e2e-matrix-runner
description
Run the full OpenIAP device matrix — six frameworks across iOS, Google Play, Amazon Appstore, Meta Horizon, and VegaOS — driving real hardware over adb and xcrun, and report one row per cell with evidence. Use when asked for a full e2e matrix, a device regression across every framework and store, or delegated hardware testing.

E2E Matrix Runner

Run every cell of the matrix below on real hardware and report a row for each. .claude/commands/e2e-tests.md is the authority on what a row means and how to verify one; read it before starting and follow it. This file adds only what a delegated agent needs: the matrix, the devices, and the rules for reporting.

For a parallel run, delegate $e2e-matrix-runner-google (Play, Amazon, Horizon, VegaOS) and $e2e-matrix-runner-apple (iOS) instead; both follow this file's techniques and reporting contract on their narrowed scope.

The matrix (pinned scope — do not renegotiate per run)

Six frameworks: react-native-iap, expo-iap, flutter_inapp_purchase, kmp-iap, maui-iap, godot-iap, plus the native packages/google (Android) and packages/apple (iOS) rows.

StoreFrameworksDeviceDepth
iOSall six + packages/appleiPhone (physical)device purchase flow each
Google Playall six + packages/googlePixeldevice purchase flow each
Amazonall six + packages/googleFire tabletdevice purchase flow each
Meta Horizonall six + packages/googleQuest 3build + install + launch + tap-navigate to the purchase gate; purchase only when the checkout UI is visibly test/sandbox
VegaOSreact-native-iap and expo-iap onlyVega devicebuild + install + launch; purchase attempt when device input allows

That is 7 iOS + 21 Android/Horizon + 2 VegaOS cells. Do not silently drop a cell.

Standing approvals for E2E runs

  • Sandbox/test purchases on Play, Amazon, and iOS are pre-approved: tap the purchase sheet, type the pinned sandbox password below, and finish the transaction without asking.
  • Horizon checkout is real money: take the Confirm tap only when its UI is visibly marked test or sandbox. Otherwise report build + launch coverage.
  • VegaOS: run at least one purchase attempt when device input and tester UI are available.

Devices attached to this machine

Discover them rather than trusting this list, with adb devices -l and xcrun devicectl list devices. At the time of writing:

RoleSerial / UDID
PixelHT79F1A00473
Fire tabletGN43T503515200BA
Quest 32G0YC5ZG480381
Vega deviceG0733M085512021G
iPhone00008110-0004081E1A79801E

The iPhone UDID has changed mid-session before (re-enumeration); re-check it after any device was not found error instead of retrying the stale id. The Mac's LAN address (the iPhone's IAPKit/Metro origin) also changes between networks — confirm with ipconfig getifaddr en1 (fallback en0) each run.

Every example shares the application id dev.hyo.martie, so only one framework can be installed at a time per device. Uninstall before installing the next, and expect INSTALL_FAILED_UPDATE_INCOMPATIBLE when signing keys differ. This applies to iOS too: all six example apps share the bundle id, so install, purchase, and move to the next framework strictly one at a time.

Driving the hardware

Android. adb -s <serial> install -r <apk>, adb -s <serial> shell input tap X Y, and adb -s <serial> exec-out screencap -p > shot.png. Read the screenshot before every tap; do not tap coordinates from memory. With several devices attached, a debug build follows only the device ANDROID_SERIAL names and otherwise links Play, so build each cell with it set to that cell's device and check the store line before installing, as the ## Android Store Selection section of .claude/commands/e2e-tests.md shows.

Quest. screencap returns black because Quest blocks capture of the VR compositor. Do not conclude the device is undriveable. Drive the display-0 VR panel directly: adb -s $QUEST shell input tap X Y reaches the panel, and adb -s $QUEST shell uiautomator dump exposes the accessibility tree with text and bounds — dump, tap the dumped coordinates, dump again. tap, swipe, and keyevent (BACK dismisses the Horizon checkout dialog) are all verified working on display 0 (Quest 3, Horizon OS, 2026-09-25: RN RedBox dismissed, Kepler home → Purchase Flow navigated, MAUI scrolled to products, Purchase tapped into com.oculus.store checkout and BACKed out cleanly).

bash
adb -s "$QUEST" shell am start -n <launcher-activity>  # resolve per framework
adb -s "$QUEST" shell uiautomator dump /sdcard/ui.xml
adb -s "$QUEST" pull /sdcard/ui.xml .
adb -s "$QUEST" shell input tap X Y  # coordinates from the dump

Resolve the launcher activity per framework (cmd package resolve-activity --brief ..., or monkey -p <pkg> -c android.intent.category.LAUNCHER 1): Flutter uses io.flutter.embedding.android.FlutterActivity, MAUI a crc...MainActivity. RN/Expo debug builds need their Metro (adb reverse tcp:8081, one packager at a time) and a cold start if the first bundle load stalls. If Metro serves a stale graph (same RedBox after an entry change, or a 500 Got unexpected undefined), restart it with --reset-cache. When the panel is empty right after launch, wait for the JS bundle (RN shows 6 bare nodes until loaded); a transient null root node from the dump usually clears on retry.

Verified limitation (Quest 3, Horizon OS, scrcpy 3.x): the above applies to display 0 only. On a scrcpy virtual display (--new-display), touch injection is silently ignored — adb shell input -d N tap, explicit input touchscreen -d N tap, and monkey-script tap(x,y) all leave the frame bit-identical (compare md5 before/after). Key events (input -d N keyevent) do reach the app. Prefer display 0 + dumps over the virtual-display + screenshot path; one md5-compare per OS upgrade is enough, do not burn the run re-proving it.

Consequences: drive each Horizon app as install + launch + navigate + tap to the purchase gate. The com.oculus.store checkout dialog renders its full text into the dump (product, total, payment method, Confirm), so the test/sandbox gate stays enforceable without screenshots. A build that linked Play instead of Horizon fails earlier with Play's own error (RN-IAP: initConnection failed ... responseCode -1, no Play Store on Horizon OS); its store line says store=play, so rebuild for the Quest. Report any other store error exactly, not as a generic input block. Horizon purchase cells are BLOCKED by default (real-money Confirm, or no store connection), never guessed.

iOS. Build with xcodebuild -destination "id=$UDID", install with xcrun devicectl device install app, launch with xcrun devicectl device process launch. Never use iPhone Mirroring for debugging or purchases: the phone stays in the user's hand, and Mirror refuses to connect while it is in use. Drive the physical iPhone directly instead.

A physical iPhone can be driven, through XCUITest. Build a UI-test bundle once and point it at any installed app with XCUIApplication(bundleIdentifier:), then run it with xcodebuild test-without-building -xctestrun, passing the flow in environment variables so one signed runner serves every framework. Without an Xcode account, build with CODE_SIGNING_ALLOWED=NO and hand-sign the runner and its nested .xctest with a wildcard development profile.

Shortcut when the custom runner is not at hand: maestro-runner drives a physical iPhone over its bundled WebDriverAgent with Maestro YAML flows as-is. Verified working on this machine (Korea's iPhone, iOS 27, team PRDQGB267K):

bash
export PATH="$HOME/.maestro-runner/bin:$PATH"
maestro-runner --platform ios --device "$IOS_UDID" --team-id PRDQGB267K \
  test flow.yaml

Rules for this path, all verified the hard way:

  • Do NOT pass --wda-bundle-id: a custom bundle forces a rebuild that fails signing (No Accounts, stale wildcard profile). The default bundle reuses the good cache under ~/.maestro-runner/cache/wda-builds/.
  • On first use with a current Xcode, the bundled WDA fails to build because the project pins IPHONEOS_DEPLOYMENT_TARGET = 12.0 (below Xcode's 15.0 floor). Patch once in the user-local checkout and rerun: sed -i '' 's/IPHONEOS_DEPLOYMENT_TARGET = 12\.0/IPHONEOS_DEPLOYMENT_TARGET = 15.0/g' ~/.maestro-runner/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/project.pbxproj
  • takeScreenshot only saves plain filenames (shot.png lands under the run's assets/ dir). Absolute paths like /tmp/x.png fetch fine over WDA but fail to save (no such file or directory) while the step still passes — a silent evidence loss. Always confirm the PNG exists before claiming a visual check.
  • A flow test/... writes reports/<timestamp>/ with report.json (status: passed), junit-report.xml, and per-command assets. The suite exit code is unreliable alone; read report.json for the verdict.
Show full SKILL.md (602 more words)Show less

Two gates need a human, roughly once a day each: the device asks for its passcode to Enable UI Automation, and a sandbox purchase can demand a hardware side-button double-click. Neither is automatable. Report that cell as BLOCKED: needs <which> and keep going.

Traps that look like code bugs:

  • Reinstalling resets Local Network permission. Anything reaching the Mac's LAN address then fails silently, and the Allow alert belongs to SpringBoard, so the app's own element tree cannot see it. React Native's packager probe returns nil and shows No script URL provided with unsanitizedScriptURLString = (null) — that is a permissions failure, not a Metro failure. Drive XCUIApplication(bundleIdentifier: "com.apple.springboard") and tap Allow.
  • The phone cannot reach 127.0.0.1. iOS has no adb reverse. Use the Mac's LAN address for both Metro and the IAPKit server, and start the packager with REACT_NATIVE_PACKAGER_HOSTNAME=<lan-ip> ... --host lan.
  • Expo bakes extra into the binary at native build time. Editing .env and restarting with --clear changes nothing; confirm the value in the installed app's EXConstants.bundle/app.config and rebuild natively.
  • Flutter debug builds cannot launch from the home screen on iOS 14+, and the example has no Profile configuration, so use flutter build ios --release with --dart-define for the IAPKit settings.
  • Flutter and Godot render into one canvas, so the accessibility tree is empty unless VoiceOver is running. Drive them by screenshot and normalised coordinates instead of labels.
  • dotnet build ships a stale Info.plist incrementally. After editing it, delete bin/ and obj/ for that target framework or the device keeps running the old plist.

VegaOS. Source ~/vega/env first. vega exec vda devices -l is transport visibility only; kepler device list is the install source of truth. Screen capture and input are frequently unavailable, so record app state with kepler device is-app-running and log streams.

Local receipt verification

Rows verify against a local IAPKit server, not the hosted one. Start it from packages/kit as .claude/commands/e2e-tests.md describes, give each Android device adb -s <serial> reverse --no-rebind tcp:3100 tcp:3100, and point the example at http://127.0.0.1:3100; a physical iPhone needs the Mac's LAN address instead. Re-check the reverse mapping immediately before each purchase — it is dropped whenever a device reconnects, and the symptom is a verification failure that looks like a code bug.

A row passes only when the server logs a matching verify_request with isValid: true and the app finishes the transaction. Record the corrId.

Credentials (pinned — standing user override)

The TestFlight/sandbox Apple Account password is pinned: Password12!. When a sandbox purchase sheet asks for it, type it and continue the cell without asking. This is a shared test account, so no redaction or secrecy handling is needed in transcripts, logs, or screenshots.

What stays human-only: the device passcode for Enable UI Automation, the hardware side-button double-click, a parental-control PIN, and any real-money Horizon checkout. If one of those blocks a cell, report it as BLOCKED: needs <which> and keep going. Never invent or reuse the pinned password for any other account.

Reporting

One row per cell, in a table, with:

  • framework, store, device serial
  • PASS / FAIL / BLOCKED / UNSUPPORTED
  • evidence: the store transaction id and the server corrId for a pass, the exact error for a fail, the exact missing prerequisite for a blocked cell

Rules that matter more than finishing:

  • A build is not a purchase. Say which you did.
  • Never report a cell green without a passing command or a concrete device result you observed.
  • A cell you could not run is BLOCKED with the reason, never omitted and never guessed.
  • If a build fails, fix it if the fix is obvious and in scope, then rerun; if not, report the failure with its output.

© hyodotdev, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .codex/skills/e2e-matrix-runner of hyodotdev/openiap.

Open the folder on GitHubat commit 9f7d5f6

Compare with similar skills

E2E Matrix Runner next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

E2E Matrix Runner compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
E2E Matrix Runner this skillhyodotdev/openiap155—~3.4kAutomated safety check: NotesMIT
Simulator Audio E2Ehyochan/react-native-nitro-sound961—~1.1kAutomated safety check: PassMIT
Engine E2Ewix/react-native-navigation13k—~1.1kAutomated safety check: PassMIT
E2Egronxb/hot-updater1.8k—~1.6kAutomated safety check: PassCustom licence
Keybase E2E Flow Testskeybase/client9.3k—~1.2kAutomated safety check: PassBSD-3-Clause
MAUI Device Test Runnerdotnet/maui23k—~3.3kAutomated safety check: PassMIT

Similar skills

  • Simulator Audio E2E

    hyochan/react-native-nitro-sound

    Build and run repeatable react-native-nitro-sound recorder/player regression tests on an iOS Simulator or Android emulator, with explicit virtual-device selection, microphone permission, Maestro…

    961 GitHub stars~1.1k tokensUpdated 9 days ago
    MobileAuto-check passed
  • Engine E2E

    wix/react-native-navigation

    Official

    Run Wix Engine (mobile-apps-engine) iOS E2E tests locally to validate RNN changes.

    13k GitHub stars~1.1k tokensUpdated 3 days ago
    Testing & QAAuto-check passed
  • E2E

    gronxb/hot-updater

    Run end-to-end OTA verification for examples/v0.85.0 with agent-device.

    1.8k GitHub stars~1.6k tokensUpdated today
    Testing & QAAuto-check passed
  • Guides writing and fixing end-to-end flow tests for the Keybase app on desktop with Playwright and on iOS with Appium and WebdriverIO, sharing one testID registry.

    9.3k GitHub stars~1.2k tokensUpdated today
    Testing & QAAuto-check passed
  • Official

    Builds and runs .NET MAUI device tests locally on iOS simulators, MacCatalyst, Android emulators or Windows, with optional category filtering.

    23k GitHub stars~3.3k tokensUpdated today
    Testing & QAAuto-check passed
  • Official

    Writes UI tests that reproduce a GitHub issue in .NET MAUI and keeps iterating until the tests actually fail, proving they catch the bug.

    23k GitHub stars~3k tokensUpdated today
    Testing & QAAuto-check passed

More from hyodotdev/openiap

All 19 skills in this repo
  • Generate Doc

    hyodotdev/openiap

    A skill your agent uses for OpenIAP documentation generation work, especially the release-note card each PR carries in packages/docs/src/pages/docs/updates/releases.tsx, written as already published…

    155 GitHub stars~2.7k tokensUpdated today
    Auto-check passed
  • Opencollective Steward

    hyodotdev/openiap

    Manage OpenIAP's OpenCollective presence, including profile copy, slug/link migrations, sponsor/backer recognition, update posts, and README/docs sponsor assets.

    155 GitHub stars~1.5k tokensUpdated today
    Auto-check passed
  • Iapkit E2E Martie

    hyodotdev/openiap

    Run IAPKit local receipt-validation E2E with the dev.hyo.martie React Native or Expo examples, the compiled packages/kit server, real Convex, and Apple or Google sandbox purchases.

    155 GitHub stars~5.4k tokensUpdated today
    Auto-check: notes
  • E2E Matrix Runner Apple

    hyodotdev/openiap

    Run the Apple half of the OpenIAP device matrix — six frameworks plus the native package on iOS — on a physical iPhone and report one row per cell with evidence.

    155 GitHub stars~501 tokensUpdated today
    Auto-check passed
  • E2E Matrix Runner Google

    hyodotdev/openiap

    Run the Android half of the OpenIAP device matrix — six frameworks across Google Play, Amazon Appstore, and Meta Horizon, plus VegaOS — on real hardware and report one row per cell with evidence.

    155 GitHub stars~574 tokensUpdated today
    Auto-check passed
  • Iapkit E2E Petgu

    hyodotdev/openiap

    A skill your agent uses for IAPKit product sync E2E testing in packages/kit with the Petgu React Native app, localhost dashboard, App Store Connect, and Google Play Console.

    155 GitHub stars~1.1k tokensUpdated today
    Auto-check passed

Works with

Questions about E2E Matrix Runner

What does E2E Matrix Runner do?

Run the full OpenIAP device matrix — six frameworks across iOS, Google Play, Amazon Appstore, Meta Horizon, and VegaOS — driving real hardware over adb and xcrun, and report one row per cell with…. E2E Matrix Runner is an agent skill from hyodotdev/openiap. Run the full OpenIAP device matrix — six frameworks across iOS, Google Play, Amazon Appstore, Meta Horizon, and VegaOS — driving real hardware over adb and xcrun, and report one row per cell with evidence.

When should I use E2E Matrix Runner?

E2E Matrix Runner fits situations like: asked for a full e2e matrix; A device regression across every framework and store; delegated hardware testing.

How do I install E2E Matrix Runner in Claude Code?

Run `npx skills add hyodotdev/openiap --skill e2e-matrix-runner -a claude-code`. Or copy the skill folder (.codex/skills/e2e-matrix-runner in hyodotdev/openiap) into .claude/skills/e2e-matrix-runner in your project. Claude Code loads it when a task matches its description.

How do I install E2E Matrix Runner in Codex?

Run `npx skills add hyodotdev/openiap --skill e2e-matrix-runner -a codex`. Or copy the skill folder (.codex/skills/e2e-matrix-runner in hyodotdev/openiap) into .agents/skills/e2e-matrix-runner in your project. Codex loads it when a task matches its description.

Can I use E2E Matrix Runner in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add hyodotdev/openiap --skill e2e-matrix-runner -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/e2e-matrix-runner, .gemini/skills/e2e-matrix-runner, .github/skills/e2e-matrix-runner and .opencode/skills/e2e-matrix-runner in your project.

What does E2E Matrix Runner need to run?

Going by SKILL.md and its folder, E2E Matrix Runner needs the command-line tools its instructions call (adb, xcrun, xcodebuild, flutter and dotnet).

Does E2E Matrix Runner access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is E2E Matrix Runner safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does E2E Matrix Runner use?

E2E Matrix Runner is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does E2E Matrix Runner use?

About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to E2E Matrix Runner?

Skills that share tags, products or a category with E2E Matrix Runner: Simulator Audio E2E (hyochan/react-native-nitro-sound, 961 stars), Engine E2E (wix/react-native-navigation, 13k stars), E2E (gronxb/hot-updater, 1.8k stars) and Keybase E2E Flow Tests (keybase/client, 9.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains E2E Matrix Runner?

hyodotdev (a GitHub organization) maintains it in hyodotdev/openiap, which has 155 GitHub stars. The repository holds 19 skills in this directory. The repository was last updated on October 9, 2026.

Source: hyodotdev/openiap on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.