mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #4673] [Bug] uninstall-adb-package requests all-users removal while reporting user-0 scope #2436
Closed
opened 2026-10-17 21:04:37 +00:00 by bsakaguchi
·
6 comments
No Branch/Tag specified
main
codex/procedure-reference-stacked
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/kuna-independent-retry
codex/byte-search-overlay-coverage
codex/open-failure-target-receipt
codex/kuna-xref-evidence
codex/ghidra-ambiguous-procedure-recovery
codex/function-source-bundle
codex/trace-function-integration-prototype
codex/snapshot-source-closure
codex/recorded-evidence-array-pages
codex/evidence-recovery-redesign
codex/trace-feature-address-scope
codex/call-discovery-scope
codex/ghidra-literal-candidate-evidence
codex/decompile-directory-independent-retry
codex/retry-provenance-base
codex/value-flow-capability-experiment
codex/ghidra-containing-instruction
cursor/readme-discord-button-ef9f
dependabot/github_actions/actions/setup-node-7.1.0
dependabot/github_actions/actions/upload-artifact-7.0.2
dependabot/npm_and_yarn/npm-minor-and-patch-d8d97ce6df
codex/kuna-1989
fix/8559-native-ui-fixture-ownership
fix/8555-go-verifier-mcp-ownership
codex/provider-capability-recovery
fix/8642-rizin-target-stdin
codex/ghidra-memory-effect-scope
codex/ghidra-annotation-entry-selector
codex/ghidra-readonly-recovery
codex/ghidra-regex-verifier-recovery
codex/evidence-discovery-view-guidance
fix/8545-bulk-append-overflow
fix/8428-navigation-refusal-alternatives
codex/address-context-recovery
codex/matching-member-limitations
codex/unknown-scope-contract
codex/evidence-view-guidance
feat/8373-native-trace-views
codex/ghidra-snapshot-verifier-binding
codex/elf-export-visibility
codex/evidence-view-recovery
codex/native-reference-cli-help
codex/provider-candidate-observation-scope
codex/kuna-session-verification
codex/ghidra-switch-lifetime-guidance
codex/pseudocode-paging-discovery
codex/clarify-evidence-view-support
codex/kuna-xrefs-selector-recovery
codex/context-capacity-recovery
codex/evidence-closure-large-links
codex/same-function-evidence-identity
codex/ghidra-verifier-inspected-jdk
codex/audit-guided-workflows
codex/crash-prompt-retained-dossiers
codex/analysis-view-error-recovery
codex/kuna-verifier-target-selection
codex/ghidra-selected-project-call-coverage
codex/docs-native-analysis-scope
codex/ghidra-java-socket-boundary
codex/ghidra-retained-snapshot-verifier
codex/ghidra-search-inventory-facts
fix/8284-zero-argument-parameter-bindings
fix/8198-ui-action-handler-offset
fix/8257-elf-entry-label-identity
fix/8304-deferred-output-schema-projection
fix/8277-call-path-computed-target-uncertainty
fix/pr-8089-conflicts
fix/ci-static-duplicate-export
dependabot/npm_and_yarn/lint-staged-17.6.0
dependabot/github_actions/actions/download-artifact-8.0.2
dependabot/npm_and_yarn/write-file-atomic-8.0.0
dependabot/npm_and_yarn/canonicalize-5.1.0
dependabot/github_actions/actions/cache/restore-6.1.0
dependabot/npm_and_yarn/toon-format/toon-4.4.0
dependabot/github_actions/actions/deploy-pages-5.0.1
codex/review-fixes-pr-2403
codex/review-fixes-pr-2400
codex/process-terminal-width
codex/test-brittleness-cleanup
verify/7167-browser-connect-macos
fix/7167-browser-connect
feat/native-matching-allowance-setting
feat/browser-scenario-dry-run
test/managed-caller-parameters-20261024
codex/parser-fortythird-boundaries
fix/6926-pinvoke-platform-decorations-20261023
fix/6889-har-body-encoding-20261023
fix/6888-sqlite-schema-budget-20261023
fix/dependency-security-gates-6708
cursor/evidence-overwrite-rebase-b4ac
feat/4057-verify-native-exports
fix/windows-acl-observer-overhead-20261022
cursor/erlang-beam-restack-4476
cursor/pe-certificate-review-bf32
fix/6116-javascript-application-fs-errors
fix/6061-unmapped-runtime-script-unknown
feat/browser-scenario-summary
fix/pe-certificates
codex/verify-3407
cursor/rebase-5699
cursor/rebase-5352
cursor/rebase-5600
cursor/fix-cli-schema-omission-10a8
codex/audit-hopper-shutdown-reasons-20261021
fix/demangle-swift-omitted-record
fix/nib-boolean-value-types
cursor/cancellation-partial-observation-a5ac
fix/ib-object-limit-reasons
fix/electron-fuse-limit-advice
fix/kuna-doctor-dangling-cache
fix/fixed-budget-refusal-advice
fix/js-ipc-listener-dedup
fix/js-return-member-provenance
fix/dmg-integrity-retry-advice
fix/ida-doctor-readiness
fix/kuna-version-probe-output-drain
fix/legacy-swift-runtime-name-matching
fix/dylib-lazy-load-commands
fix/browser-scenario-startup-cancel
fix/swift-nested-punycode-classification
fix/compare-unselected-scopes
fix/objc-method-budget-coverage
fix/dmg-mounted-root-observations
audit/ci-tests-20261019-round2
release/6.7.0
fix/wabt-cleanup-retry-resolution
fix/electron-fuse-elf-pe-architecture
fix/native-plist-descriptor-ownership
fix/kuna-caller-cleanup-ownership
experiment/atomic-codemode-20261016
review/first-contributor-3776
fix/call-resolution-full-read-cycles
fix/member-mutation-selection-repeat
experiment/atomic-re-tools-20261015
perf/member-mutation-lazy-origins
perf/static-network-mutation-index
fix/hopper-startup-lifecycle
audit/3050-windows-proof-20261015
feat/windows-window-capture-2183
audit/3049-windows-proof-20261015
audit/3735-macos-fixtures-20261015
fix/batch-decompile-null-pseudocode
fix/kuna-inventory-honors-jobs
experiment/browser-codemode-tool-design-20261015
fix/hopper-clean-runtime-argv
codex/review-2049-27f1b367
review-fixes/pr-2787-routing
fix/3360-scoped-this-emitters
fix/3367-replaced-global-effects
fix/3838-compact-any-value-items
test/hopper-download-probe-20261015
codex/windows-runtime-creation-red-green-20261015
codex/windows-readonly-root-red-green-20261015
codex/windows-root-share-red-green-20261015
codex/exp-1685-win-mcp-startup
codex/bug-sweep-20261015
investigate/2190-windows-package-phases
investigate/3543-macos-cli-deadline
perf/3281-reverse-tools-feedback-quality
fix/3406-hopper-doctor-fixture
fix/3341-wrapper-require-test-context
fix/3301-owned-uninstall-fixtures
fix/3164-compiler-input-ownership
fix/pcap-cleanup-stdout-newline-20261014
perf/interface-builder-summary
codex/review-fixes-pr-1977
fix/ghidra-effective-jvm-platform
fix/docs-turkish-rust-link-20261013
fix/main-maintenance-ci-20261010
fix/recover-binary-session-process-effects
codex/review-fixes-pr-2457
codex/ci-required-cancellation-gate
fix/main-format-baseline-20261013
fix/setup-preserve-entry-fields
cursor/restore-main-checks-1ffc
fix/ghidra-bridge-hashmap-import
codex/shared-ci-jadx-json-default-20261013
codex/shared-ci-ghidra-test-groups-20261013
codex/shared-ci-java-fixture-format-20261013
codex/fix-intrinsic-invocation-boundaries
test/release-preflight-reusable-jobs
test/js-parameter-provenance-expectation
fix/linux-hopper-verification-current
test/2419-ghidra-elf-probe-size
followup/pr-1544-native-ida
codex/fold-pr-2230-contribution
docs/readme-responsible-use
fix/issue-2064
fix/issue-2050
fix/issue-2053
fix/issue-1968
fix/issue-1945
experiment/codemode-bridge-20261011
fix/tool-effects-negative-wording-1904-20261012
fix/1842-electron-interop-provenance
feat/recover-javascript-multi-input
refactor/website-i18n-prep
fix/nativeaot-pe-virtual-extent
fix/browser-verifier-ci-hang
fix/pe-resources-input-selection
docs/beginner-friendly-guides
docs/beginner-setup-guide
fix/javascript-analysis-worker-1563
fix/1649-ghidra-duplicate-names
fix/javascript-export-keys-integration-1369
test/maintenance-boundary-contracts-20261011
review/javascript-export-keys-1369
review/process-live-progress-1483
test/javascript-1495-growth-ratio
fix/ci-escape-timing
docs/normalized-terminal-geometry-1450
release/6.3.0
archive/release-6.3.0-pr1381
release/6.2.0
fix/electron-preload-dynamic-override
fix/javascript-self-referential-bundler-edges
release/6.1.0
cursor/grok-client-cherry-pick-0b56
feat/signature-posture
feat/dyld-shared-cache
feat/artifact-integrity-policy
feat/pkg-inventory
release/6.0.0
chore/sync-release-5.0.0
release/5.0.0
cursor/cloud-agent-node-787e
fix/javascript-xhr-open-endpoints
review/pr-711-realpath-fallback-wording
cleanup/replay-confinement
codex/test-suite-performance
codex/issue-foundations
codex/address-open-issues-2026-07-20
agent/javascript-vite-rollup-esbuild-adapters
agent/process-cleanup
agent/triage-integration
agent/unknown-commands-registry
feat/mcp-identity-metadata
morlvps/issue_cleanup
codex/installer-redesign
morl/roadmap-investigation-core
morl/roadmap-investigation-docs
release-please--branches--main--components--rea
rea-agents-6.8.0
rea-agents-6.7.0
rea-agents-6.6.0
experiment/atomic-codemode-wait-runtime-20261016
rea-agents-6.5.0
rea-agents-6.4.0
rea-agents-6.3.0
rea-agents-6.2.0
rea-agents-6.1.0
rea-agents-6.0.0
rea-agents-5.0.0
rea-agents-4.1.0
rea-agents-4.0.1
rea-agents-4.0.0
rea-agents-3.2.1
rea-agents-3.2.0
rea-agents-3.1.0
rea-agents-3.0.0
rea-agents-2.7.0
rea-agents-2.6.0
rea-agents-2.5.1
rea-agents-2.5.0
rea-agents-2.4.0
rea-agents-2.3.0
rea-agents-2.2.0
rea-agents-2.1.0
rea-agents-2.0.0
rea-agents-1.7.0
rea-agents-1.6.0
rea-agents-1.5.0
rea-agents-1.4.0
rea-agents-1.3.0
rea-agents-1.2.0
rea-agents-1.1.0
rea-agents-1.0.0
rea-agents-0.5.0
rea-agents-0.4.0
rea-agents-0.3.0
rea-0.2.1
rea-0.2.0
Labels
Clear labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
Mirrored from GitHub Pull Request
question
roadmap
triage
No labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
question
roadmap
triage
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
morluto/rea#2436
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @coygeek on GitHub (Oct 17, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/4673
Before submitting
Area
CLI
Observed behavior
With a fake adb selected through
REA_ADB_PATH,rea uninstall-adb-package emulator-5554 com.example.app --jsonsends["-s", "emulator-5554", "uninstall", "com.example.app"]. After the fixture returnsSuccess, REA exits 0 and reports:Uninstall removes the package and its data for user 0; keeping data (-k) is not exposed.Both tested builds produced this mismatch in 2/2 attempts each. The command has no user selector. AOSP source establishes that this requests all-users uninstall, without requesting data retention. Only the outgoing command and REA result were executed; no real device or data deletion was tested.
Reproduction
Use a source checkout with dependencies installed and
npm run build:cachedcompleted, or an unpacked published npm archive with its production dependencies installed. The source build used its pinned Node/npm toolchain. Python 3 and Node must be on PATH. No device or platform-tools installation is needed.Save this as
reproduce.pyoutside the checkout:From the directory containing that script, run one of the following with the entry point for the build under test. The fixture directories must be new. The script uses an isolated HOME and a minimal environment, so client-config overrides are absent.
Both commands above were exercised against the corresponding builds. The fixture only records arguments and supplies synthetic success; it does not simulate Android deletion.
Expected behavior
The ADB operations guide describes this tool as removing a package and its data for user 0. The tool description also specifies user-0 data removal, and the success result repeats that scope. An operation advertised with this scope should preserve another user's installation and app data while removing the requested package and data for user 0.
Impact and scope
For an ordinary removable app installed for user 0 and a secondary user, a successful all-users uninstall can remove the secondary user's app and local data beyond the documented scope. Reinstalling the app does not itself restore that data. No real-device data-loss incident was observed. Protected or system packages, APEX, policy refusals, and vendor-specific behavior were not tested.
adb -s emulator-5554 shell pm uninstall --user 0 com.example.appalternative outside REA, but its device result was not tested here. This is a prospective way to avoid the excess scope, not recovery for deleted data.REA version
Published npm package
rea-agents@6.5.0, the latest published release at testing; freshmaincheckout atcc2e18a265198492dff1587a343bfb802d8c591b. Both entry points report that package version.Runtime and platform
Node.js v24.18.0; npm 11.16.0 for the source build; macOS 27.0.1, Darwin arm64. No Hopper or Ghidra provider was used.
Target and artifact context
Synthetic serial
emulator-5554, packagecom.example.app, and fake adb version34.0.5-fixture. No Android device, real APK, or private app data was used. The semantic comparison uses AOSP's Android 14 release-tag sources.Interface
CLI
Earliest failure stage
Capture or observation
Relevant output or evidence
docs/adb-device-analysis.md:101,src/contracts/adb/adbToolContracts.ts:314, and the success limitation insrc/adb/AdbProvider.ts:2658on the tested main checkout. The release tag has the same guide/contract wording and the same limitation atsrc/adb/AdbProvider.ts:1944.src/adb/AdbProvider.ts:2627and release-tagsrc/adb/AdbProvider.ts:1913construct the unqualified uninstall request.src/adb/AdbCommand.ts:57adds the serial selector.Each build produced the following two-call output; all four captured CLI calls exited 0 with empty stderr:
AOSP source-derived semantics:
cmd packageor legacypm, without adding a user selector.USER_ALLand flags to zero.--userchanges that selection; only-kenablesDELETE_KEEP_DATA. The default selectsDELETE_ALL_USERSand forwards it to the package installer, even though the translated installer user argument becomes user 0. The same file's help at lines 4320–4327 describes user-scoped removal and data/cache retention.Typed outcome or recovery expected
The failing observable is an unqualified uninstall request followed by a result asserting user-0 scope. A passing argument-capture check should establish that the request honors that promised scope. A proposed device check uses an ordinary test app installed for users 0 and 10, with distinct sentinel data: after the operation, user 0's installation/data should be removed while user 10's installation/data remains. That device check has not been run.
Analysis or suspected cause
Source-derived reasoning: the public CLI reaches the shared
uninstall_adb_packagehandler, which constructs an uninstall request containing only the package operand. The serial helper does not select a user. This contradicts the scope stated by the guide, tool description, and returned limitation. No Android authorization bypass was demonstrated; the caller already supplies an authorized adb connection.Additional context
No matching report was found in open/closed issue and PR searches for the command name, adb uninstall, all-users, or multi-user removal. No last known good version was established.
@XinwangTao commented on GitHub (Oct 17, 2026):
Confirmed — the captured argv matches the unqualified form:
adb uninstall <package>without--usermaps to AOSP's all-users uninstall (PackageManagerShellCommand treats an absent user as USER_ALL on the cmd path), so the "user 0" wording in the tool description and success limitation overstates the actual scope. The P1 framing is right: on a multi-user device this can silently delete a secondary user's app and local data that the documented contract claims is preserved. A concrete fix: add an explicit--user <id>option (default 0) and emit-s <serial> shell pm uninstall --user <id> <package>so the executed request matches the advertised scope; and until that lands, update adbToolContracts, docs/adb-device-analysis.md and the limitation string to describe the real all-users behavior. Your AOSP source citations (adb_install.cpp 88–128) are the right evidence basis.@XinwangTao commented on GitHub (Oct 17, 2026):
Confirmed — the captured argv matches the unqualified form: adb uninstall package without --user maps to AOSP's all-users uninstall (PackageManagerShellCommand treats an absent user as USER_ALL on the cmd path), so the "user 0" wording in the tool description and success limitation overstates the actual scope. The P1 framing is right: on a multi-user device this can silently delete a secondary user's app and local data that the documented contract claims is preserved. A concrete fix: add an explicit --user id option (default 0) and emit "-s serial shell pm uninstall --user id package" so the executed request matches the advertised scope; and until that lands, update adbToolContracts, docs/adb-device-analysis.md and the limitation string to describe the real all-users behavior. Your AOSP source citations (adb_install.cpp 88-128) are the right evidence basis.
@morluto commented on GitHub (Oct 17, 2026):
Published in
be0b2d138con main.The shared provider now sends
adb -s SERIAL shell pm uninstall --user 0 PACKAGEthrough the existing quoted shell-operand boundary. This explicitly selects the user promised by the current contract. No user-selection surface was added. Tool guidance and returned limitations describe the request, including omitted data retention, without claiming independent verification of device enforcement. AOSP Android14 PackageManagerShellCommand distinguishes the absent-user default from--user 0and sets DELETE_ALL_USERS only for USER_ALL.Validation executed on Node24.18/Darwin arm64:
shell pm uninstall --user 0, and the selected package on both interfaces; no broader fallback command appears. Success Evidence facts/parameters/limitations agree across interfaces, and device refusal reasons remain typedunsupported_target.This verifies REA's request construction and adapter behavior. No real device was contacted or mutated. The proposed multi-user installation/data sentinel test, real platform-tools/device lane, system/APEX/vendor behavior and performance/full-task tokens/peak-family-memory costs remain unverified. The issue stays open for supported-device qualification. The separate multi-display focus issue #4660 remains pending.
@XinwangTao commented on GitHub (Oct 17, 2026):
Thanks for the fix in
be0b2d1— sendingadb -s SERIAL shell pm uninstall --user 0 PACKAGEexplicitly selects the user the contract promises, and updating the tool guidance to describe the actual request (including omitted data retention) closes the scope mismatch cleanly. The AOSP evidence (USER_ALL vs --user 0 distinction in PackageManagerShellCommand) makes the fix easy to verify. One follow-up suggestion: since the CLI still has no user-selection surface, a--user <id>flag (default 0) would let multi-user workflows target a specific secondary profile without dropping to a manual adb call — otherwise a user-0-scoped uninstall is all the CLI can ever express. The strengthened provider controls are a good guard against regressing back to the unqualified form.@XinwangTao commented on GitHub (Oct 17, 2026):
Confirmed the fix closes the scope mismatch: routing through
shell pm uninstall --user 0makes the executed request match the documented user-0 contract instead of AOSP's USER_ALL default. One follow-up worth considering: expose an explicit--useroption for multi-user targets, since the current contract only covers user 0 and some setups may legitimately target a secondary user. The sentinel test (user 0 vs user 10 data retention) remains a good final validation once a device lane is available.@coygeek commented on GitHub (Oct 18, 2026):
Closing as addressed on
mainby be0b2d138. Package uninstall now explicitly sends shell pm uninstall --user 0, and its Evidence describes the requested scope without claiming independent device enforcement. I verified the committed source and regression coverage; I have not rerun the runtime reproduction.