docs/plans/2026-04-11-appium-android-setup-proof.md
Prove the smallest honest Android browser-mobile setup with local open-source tools.
adbappium_android could see the emulator only after setup, but
launchBrowser() still hungadb through Homebrew android-platform-toolsappiumuiautomator2 driveremulator-5554uiautomator2:chromedriver_autodownloadThe proof path now works with local open-source tooling:
ANDROID_HOMEANDROID_SDK_ROOTuiautomator2:chromedriver_autodownloadhttp://10.0.2.2:3100/examples/placeholder?debug=1In /Users/zbeyens/git/slate-v2:
pnpm proof:appium:android:localRequired local setup captured by the proof:
android-platform-toolsappiumuiautomator2 driverANDROID_HOME and ANDROID_SDK_ROOTuiautomator2:chromedriver_autodownloadAdditional packaged behavior probes now exist:
pnpm proof:appium:android:placeholder-input:localpnpm proof:appium:android:inline-edge-input:localpnpm proof:appium:android:void-edge-input:localThis is enough to say:
It is not yet enough to say:
slate-browser_android can see the emulator, which is goodlaunchBrowser() still hangs here, which is badSo the honest winner for this environment today is:
Use this proof to decide whether the next Android tranche should:
The first narrow Appium behavior spike is now possible and reveals a real problem instead of just setup success:
execute/syncsushiType somethingSlate placeholder IME proof surfaceblockTextsmobile: type also left the debug overlay unchangedadb shell input text sushi after focusing the textbox also left the debug
overlay unchanged[data-slate-zero-width="n"] instead of the textbox still
produced polluted placeholder textRerunning the packaged proof against the current shared proof-core now gives a clean placeholder commit/readback, and the same upgraded runner also closes the next two edge rows:
blockTexts is sushiplaceholderShape is nullslateSelection is 0.0:5|0.0:5beforeinput:insertText:* events are present through the full sushi burstThat means Appium is now a green Android proof lane on the emulator Chrome row for:
The reusable primitive that unlocked inline-edge and void-edge is:
It does not yet close every broader Android composition/diff/flush concern that the legacy Android manager handled.