mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #674] [Bug] inspect-macho fails on universal x86_64 + arm64e Mach-O binaries such as /bin/ls #314
Closed
opened 2026-10-15 18:23:48 +00:00 by bsakaguchi
·
0 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#314
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 6, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/674
Before submitting
Area
Native analysis or decompilation
Observed behavior
On an Apple Silicon Mac,
rea inspect-macho(MCPinspect_macho, providernative-macos) fails with a genericexecution_failureon every universal Mach-O with x86_64 and arm64e slices that we tried:/bin/ls,/bin/cat,/usr/bin/true,/usr/bin/zip, and a clang-built x86_64 + arm64e test program. REA admits the target and selects itsarm64architecture, but the operation returns no evidence. The same command succeeds on a universal x86_64 + arm64 binary, on an arm64e-only binary, and on the arm64e slice thinned out of the failing file. The error tells the caller to retry and runrea doctor, which cannot help because the failure is deterministic.Observed locally with both tested builds:
lipo -inforeportsx86_64 arm64efor the failing fixture andx86_64 arm64for the control. On this macOS build,lipo -info /bin/lsreportsx86_64 arm64e arm64e.x1, and/System/Applications/Calculator.app(slicesarm64e arm64e.x1, no x86_64) succeeds with exit 0.The JSON written to stdout for each failing target:
With
REA_LOG_LEVEL=trace, stderr adds only{"level":50,...,"command":"inspect-macho","status":"error","msg":"CLI command failed"}, so the output does not identify which native command failed.rea list-architectureson the same failing fixture exits 0 and reports both slices.For the x86_64 + arm64 control, the provenance in the successful result shows the provider passing the selected architecture to the slice-aware tools:
otool -h -l -arch arm64,nm -gjU -arch arm64,dyld_info -imports -arch arm64,dyld_info -exports -arch arm64,dwarfdump --uuid --arch=arm64,vtool -show-build -arch arm64. When the native tools are run directly against the failing fixture or/bin/ls,-arch arm64fails forotool,nm,dyld_info, andvtool:The two failing inputs carry different arm64e ABI variants.
lipo -detailed_inforeports the/bin/lsslice asarm64e(PTR_AUTH_VERSION USERSPACE 0) and the clang-built slice asarm64e.v1(PTR_AUTH_VERSION USERSPACE 1). On/bin/ls,otool,nm, anddyld_infoall exit 0 with-arch arm64e. On the clang-built fixture,otoolandnmexit 0 with-arch arm64e, butdyld_info -imports/-exports -arch arm64eexits 1 ("does not contain specified arch(s)") and exits 0 with-arch arm64e.v1, wherenm -arch arm64e.v1exits 1. All three tools exit 0 with-arch x86_64on both inputs.Reproduction
The steps use a two-line C program so the failing input is reproducible without relying on a particular macOS build. Run them on an Apple Silicon Mac with Xcode installed.
Optionally, compare the native tools that the provider runs with an explicit architecture:
Expected behavior
inspect_machois documented as "Inspect Mach-O slices, load commands, imports, exports, dependencies, build metadata, segments, sections, permissions, and exact command provenance without launching Hopper" (src/contracts/nativeToolContracts.ts). REA admits the universal x86_64 + arm64e file as a supportedmach-otarget with host-compatible architecturearm64, the same way it admits a universal x86_64 + arm64 file, which it inspects successfully. Since #601, the universal x86_64 + arm64 case returns evidence for the selected arm64 slice (itsnormalized_result.uuidmatches that slice) whilearchitectureslists both slices. The x86_64 + arm64e file should give the same kind of result: exit 0, evidence for the slice REA selected for the arm64 host (the arm64e slice), and both slices listed inarchitectures.Impact and scope
inspect_machofails on every universal x86_64 + arm64e Mach-O we tried. This class includes/bin/lsand other macOS system binaries that ship x86_64 and arm64e slices. The failure is deterministic. On the same inputslist-architectureskeeps working, as doesinspect-signatureon/bin/ls. arm64e-only targets such as Calculator.app are unaffected, and no data is lost.lipo <file> -thin arm64e -output <copy>produces a thin copy thatinspect-machoinspects successfully (verified locally). The resulting evidence names the copy's digest rather than the original file's, and the inventory loses the x86_64 slice, so the workaround preserves the slice data but not the original artifact identity.REA version
REA:
rea-agents4.0.1 from npm (latestdist-tag; release tagrea-agents-4.0.1, commitfeeb19b8b3172b2827b80fde8f09570ce5aeed88), and a source build ofmainat19f8cddfd6f283188567b8ff1e49b810d79952ee. Both builds behave identically.Runtime and platform
Node.js v24.21.0; macOS 27.0.1 (26A434) on Apple Silicon (arm64); Xcode 27.0 (27A266a), Apple clang 21.0.0.
Target and artifact context
Universal (FAT) Mach-O executables with x86_64 and arm64e slices: macOS system binaries such as
/bin/ls(x86_64 arm64e arm64e.x1) and a clang-builtx86_64 arm64e.v1test program.Interface
CLI
Earliest failure stage
Native analysis or reconstruction
Relevant output or evidence
inspect_machotool contract insrc/contracts/nativeToolContracts.ts, target admission insrc/domain/binaryTarget.ts, which accepts the FAT file with host architecturearm64, and the successful x86_64 + arm64 control described under #601 and observed here.inspect-machoon a clang-built universal x86_64 + arm64e fixture and on/bin/ls, with both tested builds, shown under Observed behavior.Typed outcome or recovery expected
With the universal x86_64 + arm64e fixture built in Reproduction,
rea inspect-macho hello-x86_64-arm64e --jsoncurrently exits 1 withexecution_failure. It passes when the command exits 0,normalized_result.uuidequals the arm64e UUID thatxcrun dwarfdump --uuid hello-x86_64-arm64eprints, andnormalized_result.architectures.itemsnames both slices. A UUID equal to the x86_64 slice's fails the check, because an x86_64 result would hide the defect./bin/lson Apple Silicon must also exit 0, report the UUID thatxcrun dwarfdump --uuid /bin/lslabels(arm64e)(not thearm64e.x1or x86_64 UUID) on a host that runs the plain arm64e slice, and name all three slices innormalized_result.architectures.items. The fixture (arm64e.v1) and/bin/ls(arm64e) carry different arm64e variants, so both must pass. As a regression control, the universal x86_64 + arm64 fixture must still exit 0 with its arm64 UUID, as it does today.Analysis or suspected cause
Source breadcrumbs, offered only to help retrace the evidence: at both tested builds,
machArchitectureinsrc/domain/binaryTarget.tsmaps CPU type0x0100000ctoarm64for every subtype, including arm64e, and the FAT parser selectsarm64on an arm64 host.selectedArchitectureArgumentsinsrc/native/NativeMachoInspection.ts(added in #601) then passes-arch arm64or--arch=arm64to the slice-aware tools whenever a target lists two or more architectures. For a thin arm64e file or an arm64e-only universal file such as Calculator.app, the deduplicatedavailableArchitecturesholds one entry, which matches the passing controls. This is a reading of the source, not a confirmed diagnosis.Additional context
Related: #656 reports the Ghidra provider analyzing a different slice of the same kind of universal Mach-O. It is a separate provider and failure; this issue covers only
inspect-machoon thenative-macosprovider.