Skip to content

Test farm fixes - #1184

Merged
davecraig merged 39 commits into
Scottish-Tech-Army:mainfrom
davecraig:main
Oct 28, 2026
Merged

davecraig merged 39 commits into
Scottish-Tech-Army:mainfrom
davecraig:main

Conversation

@davecraig

Copy link
Copy Markdown
Contributor

No description provided.

davecraig and others added 30 commits October 28, 2026 14:05
- SwipeAndTap's escape parameter is now escapeId. escape is a global
  JavaScript function, so it was never undefined and every caller paid
  for the visibility check meant only for those that pass it.
- StopBeacon swiped from 70%, which on the Cubot's 480x854 screen is
  Home's fixed bottom bar, so it scrolled nothing and left a beacon
  playing. It now swipes from 60%, and scrolls back to the top after.
- LaunchHome's scroll back to the top of Home didn't run with Places
  Nearby scrolled under the search bar, because Maestro counts it as
  visible there. It now needs the button below the search bar. On the
  Cubot, MarkerBrowse then tapped a hidden Markers button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
…ing it

When the download finishes the Offline maps list comes back before its
"Maps already downloaded" section is added above, so the first match for
the extract was the nearby entry, moving down as the section appeared. On
the Cubot the tap landed on nothing and Delete wasn't found. Wait for the
extract to be listed twice first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
… a thread

On the Moto under memory pressure the location calls in FixReceiver
sometimes took longer than the broadcast timeout. The helper was then
reported as not responding, and now that KeepAlive makes it a
foreground app the ANR dialog sat over Soundscape and failed the next
flows. The receiver now hands the fix to a worker thread and answers
straight away; a fix that fails is reported with the next one. Only
the newest fix waits, so a slow phone skips fixes rather than falling
behind, and the test providers are added once rather than every fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
The monkey adds markers, and on the A52s marker C ended up only partly on
screen at the bottom of the list, behind the navigation bar, where the tap
on it missed and Location Details never opened. SwipeAndTap brings each
into view first, with escapeId for a swipe that lands as a tap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
The monkey adds markers, so B and C can be below the fold of the Markers
list. Restore checked for them with visible/notVisible, so one off screen
looked gone and another B or C would be made; and its asserts and the
route's waypoint taps needed them on screen. It now scrolls for each
first (scrollUntilVisible also wants them wholly on screen, so a marker
half behind the navigation bar isn't tapped).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
…s first tap

The farm runs DownloadExtract after every soak on the Cubot, whose shell
can't see whether the extract is there, so it's usually already
downloaded. Offline maps adds that section after the nearby list, moving
the list down, and the first tap landed between entries, so Delete
wasn't found. Wait for the section's heading first (it has no testTag).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
StopBeacon swipes Home down to look for a beacon card below the fold and
back up after, beacon or not. On the Cubot a swipe now and then lands as
a tap, and on its Home every row a swipe can start on is a button: one
opened Current Location's details and Callouts couldn't find My
Location. After each swipe, Back if Home has gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
The monkey left the search open on the Cubot and Back didn't close it:
six Backs over four minutes, with the navigation bar showing the keyboard
as open though none was drawn. Tap the search's own back button when it's
there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
After the monkey left the full screen search open on the Cubot, the
keyboard's window stayed on top though undrawn: Back went to it, and
Maestro saw only the keyboard, not the app, so Restore couldn't get
back to Home even after the app was brought to the front. Stop the
default input method there too; it starts again when a text field next
wants it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
…command

Now and then a Maestro run hangs straight after "Selected device", before
its first command (the Moto and the Cubot, once each since yesterday),
until the 15 minute flow timeout, and the next flow then fails to reach
the driver. A run with no command started in its debug log after 3
minutes is now killed and tried again with the driver reinstalled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
…'t open

The list re-sorts by distance as the walk moves, and on the Moto a tap
that landed while the rows were rebuilt was dropped: the list stayed and
Location Details never came. Wait 5 seconds for the details and tap again
if they haven't opened.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
…g dialog

On the Cubot under memory pressure after a soak, Soundscape was slow long
enough to be reported as not responding, then recovered, but the dialog
stayed over it and Restore couldn't reach Home until the pause ran out.
Bringing the app to the front now taps the dialog's Wait. That doesn't
stop the app: one still hung is restarted as before, and the ANR is
counted either way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
A retry after a launch failure started straight away and failed the same
way (the A54 losing its driver; the A52s just after a farm restart),
while the next flow a few seconds later was fine. Force-stop the driver
on the phone and wait 5 seconds first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
With the Markers list sorted furthest first (the monkey's choice; the
flow's two sort taps put it back), C sits just above B, and the list came
back from B's details on the A54 with C off the top. SwipeAndTap only
looks further down, so scroll up for C first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
…nother screen

On the Cubot a swipe in the menu drawer now and then lands as a tap, and
one opened Offline maps instead of scrolling to About. Wrap the step in a
retry that goes back to Home and opens the menu again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
The mock location helper is a foreground app now (KeepAlive), so when a
busy Moto delivered a fix's broadcast late the helper was reported as
not responding with a dialog over Soundscape, though its receiver
answers at once and it was idle, and the next flow couldn't see Home.
Check for the dialog before every flow, not only when the app is
brought to the front.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
…stions

On the Cubot the keyboard's window stayed on top after the search ran, so
Maestro saw only the keyboard: no searchResult-*, no distances, and the
fallback that looks for the searched word tapped "Library" in the
keyboard's suggestion strip. Hide the keyboard after searching, and skip
that fallback while any of the keyboard is still in view.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
Maestro's hideKeyboard closed the search results on every phone: none of
the three runs since c187dd2 opened a result, against 118 of 139 before.
Keep only the check that stops the searched-word fallback tapping one of
the keyboard's suggestions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
A broadcast has a delivery timeout, and on a busy Moto late fixes got the
mock location helper reported as not responding, now (with KeepAlive) with
a dialog over Soundscape that failed the flow it appeared in, though the
helper itself was idle. The farm now sends each fix with `content call`
to a new FixProvider, whose call() runs on a binder thread with no
timeout; it checks the caller holds DUMP, as the receiver's permission
did. The fix logic moves to Fixes, shared with FixReceiver, which stays
for the broadcast way in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
A farm restart can stop a phone mid-soak or mid-Restore, and the next
cycle went straight to roaming with whatever the monkey left: on the A52s
a guided tutorial still running, whose next instruction dialog covered
Places Nearby and failed NearbyBeacon. The first cycle on a set-up phone
now begins with Restore (idempotent), as it already did after a set-up
that didn't complete.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
The restart that stopped the Cubot mid-soak also skipped the offline map
check after it, and the monkey had deleted the map: Search found nothing
and All Places stayed empty, failing NearbyBeacon twice. The first cycle
now runs ensure_extract before its Restore.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
The Markers list is in whatever order the monkey left it, and sorted by
name Z to A it has B below C, so scrolling up from C never found B and
Restore failed on the A54 with both markers there. Look further down
for B first, then back up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
SwipeAndTap's default nudge (up, for items revealed below) pushed Home's
Markers button under the search bar on the Cubot, where Home scrolls with
a beacon card showing; the tap missed and Restore failed. Markers and
Routes are near the top of Home, so nudge down for them, as Restore
already did for Places Nearby.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
The Markers list's distances update as the walk moves, and on the Cubot a
tap on B that landed while the rows were redrawn was dropped, so Location
Details never opened. Wait 5 seconds for the details and tap again, as
NearbyBeacon does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
…nly from a sub-screen

StopBeacon's look below the fold and its swipe back up ran on every phone,
though only the Cubot's Home scrolls; on the Moto a check for Home's
search bar straight after one of them missed it, and the Back meant for
a screen a swipe had opened left the app. The swipes now run only with
HOME_SCROLLS (a phone's home_scrolls, set for the Cubot), and Back only
when a screen with a Back button is showing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
A farm still running without it (or any other runner) leaves the variable
undefined, which Maestro's JavaScript treats as an error.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
The walk can leave the area during the 30 seconds asleep (quickly on a
bus), and the app then wakes up on its own; on the Moto Wake Up Now was
gone and the flow failed. Tap it only if it's there; WaitForScreen Home
still checks the app came back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
As with the place and marker taps, a tap on Location Details' Start Audio
Beacon was dropped on the Moto while the page redrew for the moving walk,
and the app stayed on the details instead of going back to Home. In
NearbyBeacon and Search, wait 5 seconds for Home and tap again if not.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
The monkey leaves the Markers list in any order, and with B last (Z to A)
its row sat at the very bottom above the A52s's gesture bar, where the
list couldn't scroll it higher and both taps on it were lost. Step through
the sort orders to A to Z, which puts B and C near the top.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
davecraig and others added 9 commits October 28, 2026 14:06
Live Caption was on on the Moto, and its panel transcribing Soundscape's
speech covered Home's search bar, so Search's return to Home failed. Its
switch is on the volume panel, which quieten()'s volume-down presses can
open. quieten() now turns it off.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
Setting odi_captions_enabled to 0 left the panel on the Moto's screen;
force-stopping Android System Intelligence, which draws it, closed it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
…a tap

On the Cubot SwipeAndTap's nudge on Home landed as a tap on Current
Location, which opens Location Details, and RouteWalk then couldn't find
Routes. Pass escapeId (Location Details' Start Audio Beacon) to every
SwipeAndTap to a Home button in the farm flows, so Back returns to Home
and the scrolling carries on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
On the Cubot Search failed at once with the driver unreachable and wasn't
retried: the debug log naming the gRPC error wasn't there yet when the
farm read it, and the console only said [Failed] Search (0s). A flow that
failed in no time ran no command, so count that as a launch failure too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
…looking for one

The loop meant to stop at name, A to Z (1e11c9c) never could: the sort
button reports its order as a state description, which Maestro's text
matching doesn't see, so it tapped four times and failed on the Moto with
the list still Z to A. Four taps go round the whole cycle and end where
the list started, and the flow changes nothing again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
A soak on the A52s stopped after 18 seconds when the phone's launcher ran
out of memory and crashed: monkey stops at a crash in any app, as it did
at any ANR before --ignore-timeouts. Add --ignore-crashes; Soundscape's
crashes are still counted from the dropbox.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
…lure

On the A52s the driver was still unreachable 5 seconds after a launch
failure, twice, so both the flow and its retry failed, while the next
flow's retry about 15 seconds after the first failure worked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
…route

On the Cubot a swipe looking for Stop Route landed as a tap on a nearby
place, and the remaining swipes all happened on its Location Details.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
On the Cubot a scroll of the Markers list landed as a tap on one of the
monkey's markers, and Restore then looked for the New button on its
Location Details. ScrollMarkers backs out and scrolls again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ex6Fdp5ftuhE1ZEyhZb7WQ
@davecraig
davecraig merged commit 26f76c3 into Scottish-Tech-Army:main Oct 28, 2026
5 checks passed

This branch was previously deployed

1 inactive deployment
development — ff3b6b2a Deployed Oct 28, 2026 by davecraig via lint #1642
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