Part of #3069.
Purpose
#3055 adds hostRefusal: true to the device_offline classification in packages/platform-android/src/adb-failure.ts, meaning the host adb refused the command before it reached the device. Five other reasons in the same matcher table are host refusals too and carry no flag: device_unauthorized, multiple_devices, no_devices, device_not_found, server_version_mismatch. On the dispatched branch, discloseAdbInputDispatch in input-actions.ts says no only for TOOL_MISSING, so an input tap refused for an unauthorized device reads unknown today.
Required behavior
- Each host-refusal reason in
ANDROID_ADB_FAILURE_MATCHERS carries hostRefusal: true. A reason that can also come from a command that ran on the device (install_*, connection_dropped, timeout) does not.
attachAdbFailureHint keeps stamping details.adbHostRefusal.
discloseAdbInputDispatch and the helper-session producers say dispatched: "no" when adbHostRefusal === true and no earlier step was dispatched (dispatchedSteps === 0). The classifier is the single source; no second string match.
- One row per host refusal in
contracts/fixtures/dispatch-disclosure.json, each driven through attachAdbFailureHint and the real executor.
Completion conditions
adb-failure.test.ts asserts hostRefusal for the six reasons and its absence for the rest.
- The dispatch-disclosure gate passes with the new rows owned by the Android driver test.
pnpm check:affected --run passes.
Dependencies
Blocked by: #3055 (introduces hostRefusal) and #3071 (introduces the table).
Part of #3069.
Purpose
#3055 adds
hostRefusal: trueto thedevice_offlineclassification inpackages/platform-android/src/adb-failure.ts, meaning the host adb refused the command before it reached the device. Five other reasons in the same matcher table are host refusals too and carry no flag:device_unauthorized,multiple_devices,no_devices,device_not_found,server_version_mismatch. On thedispatchedbranch,discloseAdbInputDispatchininput-actions.tssaysnoonly forTOOL_MISSING, so aninput taprefused for an unauthorized device readsunknowntoday.Required behavior
ANDROID_ADB_FAILURE_MATCHERScarrieshostRefusal: true. A reason that can also come from a command that ran on the device (install_*,connection_dropped,timeout) does not.attachAdbFailureHintkeeps stampingdetails.adbHostRefusal.discloseAdbInputDispatchand the helper-session producers saydispatched: "no"whenadbHostRefusal === trueand no earlier step was dispatched (dispatchedSteps === 0). The classifier is the single source; no second string match.contracts/fixtures/dispatch-disclosure.json, each driven throughattachAdbFailureHintand the real executor.Completion conditions
adb-failure.test.tsassertshostRefusalfor the six reasons and its absence for the rest.pnpm check:affected --runpasses.Dependencies
Blocked by: #3055 (introduces
hostRefusal) and #3071 (introduces the table).