# Reported issues for tapp

Pod holds 16 of 17 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to [tapp](/mcp/tapp).

## Most discussed

### `tapp ci` / the GitHub Action reject `max-actions: 0` — there is no flows-only gate

### `tapp ci` / the GitHub Action reject `max-actions: 0` — there is no flows-only gate

Our app and site talk to the production backend. An autonomous explorer typing into forms
there creates real leads, applications and coach messages, so in CI we only want the
committed Flows replayed. Setting `max-actions: "0"` in the action (0.17.9) fails the gate
with `❌ --actions must be a positive integer` and `TAPP_OUTCOME: error`.

Workaround in place: `max-actions: "1"`, which still spends one real…

[Read the thread](https://github.com/aarwitz/tapp/issues/11) · 2026-09-14 · closed · external user · 2 comments

### open --wait-for: on timeout the screenshot path is not printed

`tapp open <url> --wait-for "Text"` prints `📸 Screenshot: …png` when the text appears, but when it times out the only output is

    ❌ Timed out waiting for visible text “Session Package”

with no screenshot path and no visible-text hint — exactly the case where the screenshot matters most (0.17.10, web/headless Chromium; same for iOS `open` with `--wait-for`).

In my case the page had rendered an error state ("We couldn't load that coach's packages.") because I'd passed the wrong query…

[Read the thread](https://github.com/aarwitz/tapp/issues/22) · 2026-09-18 · closed · external user · 1 comment

### iOS flow login: surface a simulator keychain fix when Firebase reports 'An error occurred when accessing the keychain'

First run of a flow on a freshly installed simulator build (0.17.10, iPhone 17 Pro simulator, Firebase Auth email/password):

    ❌ 🔐 sign in — An error occurred when accessing the keychain. The NSLocalizedFailureReasonErrorKey field in the NSError.userInfo dictionary will contain more information about the error encountered
    First failure: step 3 (login)

The credentials were fine; the simulator's keychain was in a bad state. Fix was

    xcrun simctl keychain <udid|booted> reset

after…

[Read the thread](https://github.com/aarwitz/tapp/issues/21) · 2026-09-18 · closed · external user · 1 comment

### Flow wait_for has a fixed 6s timeout — no per-step or per-flow override

`wait_for:` fails after 6000 ms with `'X' never appeared within 6000ms` and there is no way to give one step (or the flow) a longer budget.

Case (0.17.10, iOS simulator): after `login:` our coach app shows a splash while it prefetches the dashboard for up to ~8 s, so `wait_for: Menu` right after login failed on a healthy app. The workaround is a blind `wait: 10000` before the `wait_for`, which either wastes time on fast runs or is still too short on slow ones. Flows on CI macOS runners are…

[Read the thread](https://github.com/aarwitz/tapp/issues/20) · 2026-09-18 · closed · external user · 1 comment

### Web tree --json omits the visible text of custom card buttons (labels, prices)

On a page whose main choices are custom card buttons, `tapp tree <url> --json` returns the buttons but none of their visible text, so an agent can't assert what the user sees without falling back to a screenshot.

Repro (0.17.10, macOS, headless Chromium):

    tapp open "https://montrafit.com/buy-package.html?coach=victor-finjap-boston-ma&intake=off" --wait-for "Session Package"
    tapp tree "https://montrafit.com/buy-package.html?coach=victor-finjap-boston-ma&intake=off" --json

- The…

[Read the thread](https://github.com/aarwitz/tapp/issues/19) · 2026-09-18 · closed · external user · 1 comment

### Gate is INCONCLUSIVE (exit 1) even when every Flow passed, because max-actions=1 can't meet the coverage floor

**What happened.** A `workflow_dispatch` run of the GitHub Action for iOS (0.17.9, `max-actions: "1"` because 0 is rejected, #11) replayed all five committed Flows green (9/9, 11/11, 11/11, 11/11, 15/15) and then reported:

```
**Gate (gate): 🟡 INCONCLUSIVE** — run was inconclusive (coverage floor not met)
##[error]Tapp gate did not pass (outcome: inconclusive).
```

so the job exits 1. With the exploration budget pinned at one action the coverage floor can never be met, which makes the Action…

[Read the thread](https://github.com/aarwitz/tapp/issues/18) · 2026-09-18 · closed · external user · 1 comment

### Web flow tap failure drops Playwright's 'intercepts pointer events' reason

**What happened.** Four of our six web Flows failed at their first `tap:` with only:

```
First failure: step 2 (tap) — locator.click: Timeout 6000ms exceeded.
```

The real cause was a full-screen location-consent modal overlaying the page, which intercepted the click. Playwright knows this — its own error text includes the retry log (`<div id="location-intake-modal"> intercepts pointer events`, "element is visible, enabled and stable", "scrolling into view", …) — but tapp's first-failure line…

[Read the thread](https://github.com/aarwitz/tapp/issues/17) · 2026-09-18 · closed · external user · 1 comment

### CLI flow run needs PyYAML on macOS runners: raw ModuleNotFoundError, no doctor check

**What happened.** On a GitHub `macos-15` runner, `tapp flow run FILE --actor client` failed every iOS flow instantly with a raw Python traceback:

```
File ".../node_modules/@aarwitz/tapp/scripts/flow_lib.py", line 21, in load_flow
    import yaml
ModuleNotFoundError: No module named 'yaml'
```

The app had built, the simulator had booted and installed fine. The runner's `python3` has no PyYAML. The GitHub Action quietly `pip3 install`s pyyaml for itself (with a `--break-system-packages`…

[Read the thread](https://github.com/aarwitz/tapp/issues/16) · 2026-09-18 · closed · external user · 1 comment

## Most recent

### CI gate replays web Flows at the gate --url, ignoring each Flow's own url

### CI gate replays every web Flow at the gate's `--url`, ignoring the Flow's own `url:`

Web gate (action 0.17.9 @70c3527, `url: https://montrafit.com`, `flows: .tapp/flows/web-*.yml`).
All six Flows fail at their first step. Every failure screenshot shows the **homepage**, not
the page the Flow declares:

- `web-pricing-to-quiz` (`url: https://montrafit.com/pricing.html?intake=off`) → screenshot is
  the homepage; `wait_for: How Pricing Works on MONTRA` never appears.
-…

[Read the thread](https://github.com/aarwitz/tapp/issues/15) · 2026-09-14 · closed · external user · 1 comment

### Web gate: the Flow started in a browser state the exploration had already changed

### Web gate: the Flow started in a browser state the exploration had already changed

Web gate on 0.17.9 (`url: https://montrafit.com`, `max-actions: 1`, one web Flow). Locally the
Flow's first step `wait_for: Find coaches closer to you` (our location-consent prompt, shown to
every fresh browser context) passes every time. In the gate it failed with
`‘Find coaches closer to you’ never appeared`, right after the 1-action exploration of the
same origin.

The prompt hides itself after a dismissal…

[Read the thread](https://github.com/aarwitz/tapp/issues/13) · 2026-09-14 · closed · external user · 1 comment

### `tapp ci install` pins `uses: aarwitz/tapp@v0.17.9`, but no `v0.17.9` tag exists

### `tapp ci install` pins `uses: aarwitz/tapp@v0.17.9`, but no `v0.17.9` tag exists

`tapp ci install . --dry-run` on 0.17.9 generates jobs with `uses: aarwitz/tapp@v0.17.9`.
The first CI run failed in "Set up job" with
`Unable to resolve action aarwitz/tapp@v0.17.9, unable to find version v0.17.9` — the repo's
tags stop at `v0.17.8` even though 0.17.9 is on npm and `package.json` on main says 0.17.9.

Workaround: pinned to the release commit sha (`70c352783074934a09465ef5b804bf1a53a862ae`).…

[Read the thread](https://github.com/aarwitz/tapp/issues/12) · 2026-09-14 · closed · external user · 1 comment

### Session back action reports ok without navigating (NavigationStack inside a sheet)

### Session `back` reports `ok` when nothing navigated

Driving the MONTRA client app (iOS 26.5 sim, tapp 0.17.9, `tapp mcp` over stdio): on a pushed
screen inside a sheet (Profile → "My Plan & Billing", a `NavigationStack` push with a visible
`Back` button in the tree), `tapp_session_act {action:"back"}` returned

```
◀️ Went back — ok → now on **No active plans**
```

four times in a row while the screen title stayed `No active plans`. Every following `tap` on a
row of the parent screen then…

[Read the thread](https://github.com/aarwitz/tapp/issues/10) · 2026-09-14 · closed · external user · 1 comment

### Session tap by id on the Save Password system sheet reports ok without dismissing it

### F6 · Session: `tap` by id on a system alert reports `ok` without effect

On the "Save Password?" springboard sheet, `tapp_session_act {action:"tap", id:"Not Now"}`
returned *"Tapped `Not Now` — ok"* three times while the sheet stayed up (the tree still read
`Save Password?`). Tapping the same button by `x`/`y` dismissed it. The id path is hitting an
element that isn't the alert's button (there's a "Not Now"-ish label under it?) — either way the
result should not be `ok` when the screen…

[Read the thread](https://github.com/aarwitz/tapp/issues/6) · 2026-09-14 · closed · external user · 1 comment

### Share sheet (UIActivityContentView → Reminders) scored as a high app defect; left_app detector doesn't fire for in-process system surfaces

### F4 · The share sheet is still reported as a high-severity app defect (0.17.8 changelog says otherwise)

The explorer opens the client's "share" action → `UIActivityContentView` → taps the
**Reminders** extension → reports:

- 🟠 `high` Limited interaction surface — on *Reminders*
- 🟡 `medium` Blank or inaccessible screen — on *Reminders*
- 🟡 `medium` Blank or inaccessible screen — on *UIActivityContentView*

Identical on 0.17.7 and 0.17.8. The 0.17.8 changelog promises `left_app`…

[Read the thread](https://github.com/aarwitz/tapp/issues/4) · 2026-09-14 · closed · external user · 1 comment

### explore JSON reports credentialsProvided=false on a run that signed in with --email/--password (0.17.9)

### F3 · `explore` JSON says no credentials were supplied on a run that signed in (regression-class honesty bug)

Run: `tapp explore <bundle> --actor client --email … --password …` on 0.17.8. The run reached
"Good afternoon, Taylor!" (signed-in dashboard) and explored 15 screens behind login. The JSON:

```
loginEncountered      true
credentialsProvided   false
credentialsUsed       false
```

and the console footer still prints *"sign-in behavior (login form reached, no test
credentials…

[Read the thread](https://github.com/aarwitz/tapp/issues/3) · 2026-09-14 · closed · external user · 1 comment

### Flow step vocabulary undocumented; validate accepts coordinate taps and web click that fail at runtime; assert_screen semantics

### F2 · The Flow step vocabulary is undocumented and the validator doesn't enforce it (≈1 hour)

`tapp flow example` shows `login` / `wait_for` / `assert_screen`. The real vocabulary (read out
of `ExplorerTests.swift`) is `tap`, `type`, `login`, `swipe`, `back`, `wait`, `wait_for`,
`assert_screen`, `assert_exists`, `assert_absent`, `assert_text`, `assert_ai`. Three traps
followed directly from the gap:

- **`assert_screen` compares the detected screen *title*, not "text is present".** The…

[Read the thread](https://github.com/aarwitz/tapp/issues/2) · 2026-09-14 · closed · external user · 1 comment

The remaining reports are on [the project's issue tracker](https://github.com/aarwitz/tapp/issues).
