Skip to content

Make the screenshots and CI workflows ride out their flakes - #54

Merged
hatstand merged 4 commits into
mainfrom
claude/project-thread-mtg8ti
Oct 22, 2026
Merged

hatstand merged 4 commits into
mainfrom
claude/project-thread-mtg8ti

Conversation

@hatstand

Copy link
Copy Markdown
Contributor

Requested by John · project thread

The intermittent failures in the last month of runs, and what this does about each.

screenshots (failed on main in 4 of its last 10 runs, each time in only one of the light and dark runs):

  • Typing the search failed with "Neither element nor any descendant has keyboard focus" (15 and 22 October). The test now waits for the field to have the keyboard after tapping it, and taps again if it doesn't.
  • Because that failure was XCTest's own and not a throw, the test saved no failure.png, and post_screenshots.sh replaced main's screenshots with a set missing the screens after the search. The failure files are now saved in tearDown, for any failure.
  • Other one-offs: the app stopped answering XCTest for two minutes on the connection sheet (7 October), a tap on the radio streams opened nothing (8 October), and the simulator failed to launch the test runner (a PR run on 7 October). Each light or dark run now runs again once if it fails. The first run's result bundle is kept as Screenshots-<appearance>-1.xcresult.

ci (1 flaky failure in about 150 runs since 26 September):

  • On 12 October, xcodebuild couldn't find the simulator it had just booted, and listed no simulators at all. On that exit code (70), the job now builds and tests once more. Any other failure still fails straight away.

Already fixed, and not seen again since: givesUpWhenClementineIsGone and DownloadTests.notOnTheLocalNetwork (fake Clementine fixes, 2 and 5 October), and ConnectUITests timing out while the simulator booted (fixed by booting it first). The String Catalog check's failures on 6 and 7 October were real: those commits were missing strings.


Generated by Claude Code

On a runner, the screenshots test's tap on the search field sometimes
left it without the keyboard, and typing the search then failed:
"Neither element nor any descendant has keyboard focus", in two of the
last five failed screenshots runs on main. Wait for the focus after the
tap, and tap again if it doesn't come.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016kHgrqkADmcriUTgZBEMDP
The screenshots test saved failure.png and failure.txt only when it
threw. When typing into the search field failed, XCTest recorded the
failure without a throw, so there was no failure.png, and
post_screenshots.sh took the run for a complete one: on 15 and 22
October, main's screenshots were replaced by a run's without the screens
after the search. Save them in tearDown, whenever the test failed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016kHgrqkADmcriUTgZBEMDP
The screenshots workflow failed on main in four of its last ten runs,
each time in only one of the light and dark runs, which passed the next
day on the same code. Besides the search field without the keyboard,
the app once stopped answering XCTest ("App event loop idle notification
not received") for two minutes on the connection sheet, a tap on the
radio streams once opened nothing, and the simulator once failed to
launch the test runner. A second run of the failed appearance gets past
these, and its first run's result bundle is kept to see what went wrong.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016kHgrqkADmcriUTgZBEMDP
On 12 October, CI's app job booted its simulator, then xcodebuild
said it couldn't find it, and listed no simulators at all, as though the
simulator service had gone from under it. xcodebuild exits with 70
then, so try once more on that exit code; any other failure still fails
the job straight away.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016kHgrqkADmcriUTgZBEMDP
@hatstand hatstand self-assigned this Oct 22, 2026
@github-actions

Copy link
Copy Markdown

Screenshots

From run 39812249538, against a real Clementine. Left: main. Right: this pull request, light and dark.

Screen main This PR This PR, dark
01_connect
02_queue
03_player
04_connection
05_settings
06_library
07_library_album
08_search
09_outputs
10_internet
11_internet_radio

Screens at a failure

dark_failure

failure

@hatstand
hatstand merged commit 8d9dc92 into main Oct 22, 2026
4 checks passed
@hatstand
hatstand deleted the claude/project-thread-mtg8ti branch October 22, 2026 16:43
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.

2 participants