Source: API-29 E2E flake investigation — definitive fix (follow-up to the quick-unblock retry ticket).
The matrix e2e job (.github/workflows/ci.yml:193-202) delegates emulator boot to reactivecircus/android-emulator-runner, whose post-boot adb shell input keyevent 82 is un-guarded and fatal — it races system_server on snapshot resume (full diagnosis: run 28667366203). The e2e-preview (API 37) job is immune because it boots manually and guards adb shell input keyevent 82 || true (ci.yml:300-303) with a boot-retry loop.
Definitive fix: converge the matrix e2e job on the e2e-preview manual-boot pattern — a bounded adb wait-for-device + sys.boot_completed loop with boot retry, keyevent 82 || true, and a readiness gate (e.g. pm path android succeeds / init.svc.bootanim = stopped) before any adb shell input / disable-animations call. Removes the fatal keyevent entirely and unifies both E2E jobs on one proven boot path. Lets the retry from the quick-unblock ticket be removed.
**Source:** API-29 E2E flake investigation — definitive fix (follow-up to the quick-unblock retry ticket).
The matrix `e2e` job (`.github/workflows/ci.yml:193-202`) delegates emulator boot to `reactivecircus/android-emulator-runner`, whose post-boot `adb shell input keyevent 82` is un-guarded and fatal — it races `system_server` on snapshot resume (full diagnosis: run 28667366203). The `e2e-preview` (API 37) job is immune because it boots manually and guards `adb shell input keyevent 82 || true` (`ci.yml:300-303`) with a boot-retry loop.
**Definitive fix:** converge the matrix `e2e` job on the `e2e-preview` manual-boot pattern — a bounded `adb wait-for-device` + `sys.boot_completed` loop with boot retry, `keyevent 82 || true`, and a readiness gate (e.g. `pm path android` succeeds / `init.svc.bootanim = stopped`) before any `adb shell input` / `disable-animations` call. Removes the fatal keyevent entirely and unifies both E2E jobs on one proven boot path. Lets the retry from the quick-unblock ticket be removed.
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.
Source: API-29 E2E flake investigation — definitive fix (follow-up to the quick-unblock retry ticket).
The matrix
e2ejob (.github/workflows/ci.yml:193-202) delegates emulator boot toreactivecircus/android-emulator-runner, whose post-bootadb shell input keyevent 82is un-guarded and fatal — it racessystem_serveron snapshot resume (full diagnosis: run 28667366203). Thee2e-preview(API 37) job is immune because it boots manually and guardsadb shell input keyevent 82 || true(ci.yml:300-303) with a boot-retry loop.Definitive fix: converge the matrix
e2ejob on thee2e-previewmanual-boot pattern — a boundedadb wait-for-device+sys.boot_completedloop with boot retry,keyevent 82 || true, and a readiness gate (e.g.pm path androidsucceeds /init.svc.bootanim = stopped) before anyadb shell input/disable-animationscall. Removes the fatal keyevent entirely and unifies both E2E jobs on one proven boot path. Lets the retry from the quick-unblock ticket be removed.