SafPickerRoundTripTest's save tests have two failure shapes still unexplained after #269 #270
Open
opened 2026-09-07 22:08:33 +00:00 by JMR-dev
·
0 comments
No Branch/Tag Specified
main
fix/102-picker-back-press-overshoot
fix/268-saf-picker-determinism
feat/ogg-vorbis-libvorbis
feat/expedited-conversion-work
fix/gate-cache-in-worktrees
chore/gate-runs-shellcheck
test/publish-delete-arm-real-provider
docs/e8-instrumented-coverage
docs/api37-carrier-count-drift
docs/e7-second-constraint
test/publish-to-a-real-saf-destination
fix/api37-report-match-line
fix/api37-task-snapshot-crash
test/join-failure-message-on-device
docs/e2e-read-findings-e7
test/cancelling-a-running-export
test/reattach-to-a-running-job
test/content-uri-reaches-ffmpeg
fix/launcher-wiring-waits-for-the-pick
fix/cancel-tests-need-a-slower-encode
test/cancelling-a-running-join
test/cancelling-a-running-session
test/notification-cancel-action
test/ffmpeg-progress-is-observed
test/fallback-asserts-the-path
test/flac-and-opus-assert-their-format
docs/e2e-read-findings
docs/wave4-coverage-numbers
fix/injectable-startup-sweep-scope
test/session-outcome-seam
test/launcher-callback-identity
test/theme-follows-system-dark
test/audio-drop-arm
fix/rotation-waits-for-recreation
fix/convert-guards-on-ready
test/retry-save-mime
test/hardware-progress-reaches-workmanager
test/ffprobe-mapping-seam
test/device-codec-enumeration-seam
test/unknown-container-row
test/null-message-fallbacks
test/cancel-reaches-workmanager
docs/coverage-wave3-recovery
test/concat-engine-seam
docs/coverage-wave3
test/mediaprobe-merge-seam
test/adaptive-shell-wiring
test/aac-audio-args
test/notification-progress-text
test/media3-muxer-guard
test/hardware-fallback-and-cancellation
test/unprobeable-join-clip
test/one-branch-outcomes
test/foreground-type-regimes
fix/bound-wedge-diagnostics
docs/coverage-wave2
test/screen-wiring
test/viewmodel-setters
test/join-state-mapping
test/conversion-state-mapping
test/dedupe-user-messages
fix/restore-stack-merges
test/refused-jobs
test/concatworker-failure-arms
test/container-capabilities-audio
test/readspec-enum-fallbacks
test/outputpublisher-seams
test/mediaprobe-track-seam
test/outputpublisher-partial-branches
test/fake-provider-scaffolding
docs/coverage-read-findings
chore/gitignore-kotlin
test/bound-the-hangs
docs/coverage-remeasure
ci/baseline-counter-precision
fix/invalid-suggestion-chip
ci/wedged-leg-report
fix/reattachment-overwrites-pick
test/theme-live-branches
fix/failed-save-retry
fix/empty-composition-crash
ci/advisory-failure-report
docs/seven-run-counts
test/release-permission-guard
ci/build-workflow-permissions
docs/api37-point-release
docs/benchmark-populate-path
fix/dead-assertion-probe-test
ci/actionlint
test/device-codecs-encode-consequence
fix/sdkmanager-pipefail
docs/readme-restart-claim
fix/saf-picker-root-discovery
fix/probe-dispatcher-seam
test/media3engine-mime-tables
test/mediaprobe-pure-helpers
fix/codec-vocabulary-drift
docs/robolectric-rationale-correction
docs/api37-advisory-counts
test/r38-8-saf-e2e
test/r38-7-join-states
test/r38-6-conversion-states
test/r38-5-state-seam
fix/jacoco-robolectric-coverage
docs/instrumented-tests-correction
test/r38-2-filecard
test/r38-4-advanced-picker
test/r38-3-pickers
tools/file-issue-script
tools/api-37-emulator
fix/review-app-gaps
docs/review-corrections
No results found.
Labels
Clear labels
above-cut
accessibility
backlog
bug
confirmed
documentation
duplicate
enhancement
good first issue
help wanted
invalid
plausible
question
sev:high
sev:low
sev:medium
wontfix
Worked autonomously overnight: local, JVM-verifiable, no product decision
Barrier affecting people with disabilities
Held for manual review: product/UX call, CI/workflow, hardware, or unverifiable here
Something isn't working
Reviewer demonstrated the defect
Improvements or additions to documentation
This issue or pull request already exists
New feature or request
Good for newcomers
Extra attention is needed
This doesn't seem right
Reviewer could not fully demonstrate it; treat as unproven
Further information is requested
High severity
Low severity
Medium severity
This will not be worked on
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: JMR-dev/LibreMediaConverter#270
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Split out of the #102 census (
docs/ci-failure-modes.md). #102's mode 6 — the SAF save testsfailing on API 33-36 — turned out to be six failures with five different messages, not one
mode. One of them has a traced mechanism and a fix. Two do not, and this is those two.
Where they came from
The two save tests (#226, #250) landed on 2026-09-06 and account for every gating failure on API
33-36 since. Seven leg-attempts failed in the 88 that ran them. Sorting by the message under the
FAILEDmarker rather than by the test name:34041593697a1 (35)fa10d94, the commit that added the testNo compose hierarchies found, thrown directlyb23ff0f34056545386a1 (35)cbbaf74ComposeTimeoutException ... after 120000 ms19e3539; not a system-service failure at all34161043035a1 (35)9fd96d0NPE: Cannot run onActivity since Activity has been destroyed already34146936252a2 (35)73482520waited 300000ms ...; last composition error: No compose hierarchies34057706195a1 (34)19e3539No compose hierarchies found×2, thrown directly34067653670a1 (35),34146936252a1 (35)d45abe7,73482520waited 300000ms for a node tagged action.saveFile, no composition errorShape A —
b23ff0fdid not close the "no compose hierarchies" caseb23ff0f("Wait for the app to come back before asking Compose about it") was written for exactlythis message.
34057706195's head is19e3539, andgit merge-base --is-ancestor b23ff0f 19e3539says it contains that fix — and both save testsfailed on it anyway, with the exception thrown directly rather than through
awaitNode.So either the wait is in the wrong place or there is a second way for the composition to go away.
The direct throw is the clue worth starting from:
awaitNodecatches and re-labels, so a rawIllegalStateException: No compose hierarchies foundcame from a call site that is not behindthat helper.
Shape B — the app is alive and well, and the conversion never starts
This is the more interesting one and it is not an Activity-lifecycle failure at all.
34067653670's per-test logcat foraSaveWritesToTheDocumentTheSystemPickerCreated:MainActivityisRESUMEDfor the whole 300 s, andawaitNodeappends itslast composition erroronly whenfetchSemanticsNodesactually threw — it did not, so the composition wasreadable throughout. The app was fine. What never happened is the conversion.
The green attempt of the same test on the same run (
34146936252a3) is the control:None of those three lines appears anywhere in the failing run. So
action.saveFileneverappeared because no conversion ever ran, not because the UI was unreachable.
A hypothesis, explicitly unproved
The
Waiting 5000ms for ... permissioncontrollerimmediately after the Convert tap is thepermission-dialog helper as it stood before #269 — tap Convert, wait for the dialog, press back on
it.
ConverterScreenwires Convert torequestNotifications.launch(POST_NOTIFICATIONS)and startsthe conversion from the permission result, so a back press on that dialog is a denial, and a
denial would leave the screen exactly where this logcat leaves it. That fits, and it is a
hypothesis, not a finding — I have not shown the dialog was up on that run.
What to do first, and it is not a fix
Re-count over post-#269 leg-attempts before touching anything. #269 replaced that helper with
pm grantplus an assertion that the permission is held, so shape B's most plausible mechanism mayalready be gone; and shape A's two occurrences both predate #269 as well. At the time of writing
there are zero post-#269 gating leg-attempts on
main— the only run on #269's own head is34161043035, whose attempt 1 is the mode that has now been fixed separately.docs/ci-failure-modes.mdhas the counting rules: per leg-attempt, and with these tests'own denominator (API 33-36 only — they carry
@FailsOnEmulatorApi37— and only from2026-09-06T15:12).
Done means
Each of the two shapes either reproduced and fixed, or re-counted to zero over a stated number
of post-#269 leg-attempts and closed with that number written down. Not "has not been seen
lately".