mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #5306] [Bug] observe_native_ui treats a wrong PID or window as provider unavailability and withdraws the tool in binary_session #3233
Open
opened 2026-10-31 00:38:08 +00:00 by bsakaguchi
·
3 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#3233
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 @cathrynlavery on GitHub (Oct 19, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/5306
Before submitting
Area
Process capture or runtime observation
Observed behavior
When the native UI helper cannot match the caller's
pidorwindow_id,observe_native_uiandcapture_native_ui_scenariofail withcapability_unavailable/unsupported_providerand the message "This analysis is unavailable for the current target. Choose another analysis or target." The reason the helper gave is only indetails.reason.The session also records the failure as runtime unavailability. After one call with a wrong PID,
binary_sessionlists the operation asavailable: false, reason: "provider_unavailable"until a later call to the same operation succeeds. Each operation is marked separately, soobserve_native_uican be advertised as unavailable whilecapture_native_ui_scenariois still advertised as available.Reproduction
Ran on main at
b4938aed5(built withnpm run build:cached), drivingnode scripts/rea.mjs mcpover stdio with@modelcontextprotocol/client. Step 5 against the published 6.4.0 package returns the same error. Each case below reproduced every time I ran it.open -a Calculator. Read its PID and window ID fromCGWindowListCopyWindowInfo(owner Calculator, layer 0).sleep 300 &to get a PID that is not an application.open_binary {"path": "/System/Applications/Calculator.app"}observe_native_ui {"pid": <Calculator PID>, "window_id": <window ID>, "screenshot": false, "max_nodes": 5}succeeds.observe_native_uiwith thesleepPID and the same window ID fails (output below).binary_session {}now reports theobserve_native_uigroup as unavailable.The same thing happens with Calculator's PID and
window_id: 1(window-mismatch), with TextEdit's PID and Calculator's window (target-mismatch: Selected PID executable /System/Applications/TextEdit.app/Contents/MacOS/TextEdit differs from active target /System/Applications/Calculator.app/Contents/MacOS/Calculator), and withcapture_native_ui_scenarioand a single wait step.Expected behavior
A PID or window ID that does not match the active target is a problem with the call's arguments. I expected
invalid_inputthat namespidorwindow_idand carries the helper's reason, with advertised availability left alone. For host failures such as Accessibility or Screen Recording denial, I expected the helper's own remediation ("Grant Accessibility to the REA host in System Settings > Privacy & Security, then retry") as the message. docs/native-investigation.md says missing permissions "produce actionable errors".Impact and scope
An agent that checks
binary_sessionafter one wrong PID is told the operation is unavailable on this host, and the error text tells it to choose another target or analysis, when the fix is a different PID or window ID. Every wrong PID or window I tried was affected. I did not test the element-path failures inside scenario steps.REA version
main
b4938aed58(rea --version6.7.0); also rea-agents 6.4.0 vianpx -y rea-agents@6.4.0 mcpRuntime and platform
Node 24.18.0; macOS 27.0 (26A428) arm64; swiftc from Xcode command-line tools
Target and artifact context
/System/Applications/Calculator.app (universal Mach-O, arm64 selected)
Interface
MCP
Earliest failure stage
Capture or observation
Relevant output or evidence
Step 5, main:
Step 6,
tool_availability.groupsentries for the native UI tools before and after step 5:Analysis or suspected cause
Source-derived, at
b4938aed5:bridge/native/ReaNativeUI.swift#L46-L48: one guard coversNSRunningApplication(processIdentifier:)returning nil and a nilexecutableURL, and both producetarget-mismatch: Selected PID does not expose an application executable URL. The same code is used for a PID that runs another executable (L53) and for changed executable bytes (L63).src/native/NativeUiObservation.ts#L174-L181: every{ok: false}helper reply becomesAnalysisCapabilityUnavailableErrorwithout auserMessage, so presentation falls back to the generic unsupported-provider text (analysisErrorPresentation.ts#L373-L374).src/application/binary/BinarySession.ts#L811-L815: anyAnalysisCapabilityUnavailableErrormarks that operation unavailable in session status.Permissions do not explain the PID message. The PID check runs before the Screen Recording and Accessibility checks (L73-L78), and
NSRunningApplicationneeds neither. A small Swift probe run over SSH on the same Mac, whereCGPreflightScreenCaptureAccess()andAXIsProcessTrusted()both returned false, still got Calculator'sNSRunningApplicationwith its executable URL and launch date. Path canonicalization, App Translocation, and universal versus thin paths would fail later with "differs from active target", and universal Calculator passes.Additional context
I first saw this message with a Developer ID-signed third-party app in /Applications that was launched with
open -a. Its PID and window ID came fromCGWindowListCopyWindowInfo(owner name matched, layer 0). I have not found out whyNSRunningApplicationreturned nil or a nilexecutableURLfor that process: NOT_ENOUGH_INFO. The current message does not say which of the two happened or whether the PID was still running, which is why I could not tell.Proposed fix, with a PR to follow:
proc_pidpath), "application has no executable URL", and "PID runs another executable".AnalysisInputErrorwith an issue onpidorwindow_id. A window or process that changes after a successful capture inside a scenario stays a capability failure, since the arguments were valid.userMessagefor the remaining helper failures, so permission denials show their remediation.@XinwangTao commented on GitHub (Oct 20, 2026):
This classification matters for agent behavior: a wrong PID/window is retryable within the same target (fix the arguments), while provider_unavailable tells the agent to give up or switch targets. Conflating the two makes an agent burn a session thinking the host lacks the capability. The #5307 direction of surfacing an invalid_input with the helper's reason (and reserving capability_unavailable for actual host-permission failures like Accessibility/Screen Recording denial) matches the expected behavior described here and keeps binary_session availability accurate.
@chordpli commented on GitHub (Nov 3, 2026):
Thanks for the detailed write-up. It made this easy to re-check.
I re-ran your steps on current
main(9bea563e3), and the behavior you reported no longer reproduces.Setup: macOS 26.5.2 (arm64), Node 24.22.1, built with
npm run build:cached, drivingnode scripts/rea.mjs mcpover stdio with@modelcontextprotocol/client. I opened Calculator withopen -a Calculatorand took its PID and window ID fromCGWindowListCopyWindowInfo.What I saw:
observe_native_uiwith Calculator's PID and windowsleep 300PIDinvalid_request, issue onpid(pid-not-application)window_id: 1invalid_request, issue onwindow_id(window-mismatch: Selected window is absent or belongs to another process)invalid_request, issue onpid(target-mismatch: Selected PID executable .../TextEdit differs from active target .../Calculator)capture_native_ui_scenariowith thesleepPID and onewaitstepinvalid_request, issue onpidbinary_sessionafter each failureobserve_native_uiandcapture_native_ui_scenarioboth stayavailable: true,reason: "available"Retrying with the correct PID and window on the same connection succeeded.
One extra data point, by accident: on my first run, Calculator had already quit before the calls went out. Its stale PID came back as
invalid_requestonpidwithpid-not-application, and availability stayed untouched. That lines up with the helper's wording that this code "does not establish that the process is absent."Source only, not verified at runtime: other helper failures, including
accessibility-deniedandscreen-recording-denied, now pass the helper's message through asuserMessage(NativeUiObservation.tsL205-L210), and the helper now separatespid-not-applicationfromapplication-executable-unavailable(ReaNativeUI.swiftL46-L51). Accessibility is already granted on this machine, so I didn't hit a denial. The helper also doesn't report whether the PID is still running, which was part of your first proposed fix. These changes landed incc90771af(2026-10-24).As far as I can tell, the issue as reported is resolved on
main. The permission-denial message might still be worth a quick check on a host without Accessibility granted.@XinwangTao commented on GitHub (Nov 4, 2026):
Verified results look solid — returning invalid_request with an issue on pid/window_id while leaving availability untouched is exactly the classification this issue asked for, and it makes agent retry behavior correct instead of burning a session. Agreed the permission-denial path deserves a runtime check on a host without Accessibility/Screen Recording granted. One small gap from the original proposal remains: the helper still doesn't report whether the PID is running (the stale-PID case was only caught by accident), so a stale PID could be misread as a different problem. Adding a pid-running / proc_pidpath detail to the reason would close that. Happy to help verify on a non-granted host if that's useful.