[GH-ISSUE #5401] [Bug] inspect-with-objdump loses missing-file and directory failure reasons #3271

Closed
opened 2026-10-31 00:38:38 +00:00 by bsakaguchi · 2 comments
Owner

Originally created by @coygeek on GitHub (Oct 20, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/5401

Before submitting

  • I searched the open and closed issues for a related report.
  • I removed credentials, tokens, private paths, and sensitive target data.

Area

CLI

Observed behavior

inspect-with-objdump <path> symbols --format json returns byte-identical generic argument errors for an absent file and a directory. Neither reply identifies the selected path or filesystem reason, and both say retryable: true. An independent verifier ran each case once; both exited 1 with empty stderr, before objdump launched.

Reproduction

From the built source checkout, the verifier ran the following command arguments with equivalent isolated HOME/XDG directories:

case_dir="$(mktemp -d)"
mkdir -p "$case_dir/home" "$case_dir/config" "$case_dir/data" \
  "$case_dir/cache" "$case_dir/state" "$case_dir/artifact-directory"
run_rea() {
  env HOME="$case_dir/home" XDG_CONFIG_HOME="$case_dir/config" \
    XDG_DATA_HOME="$case_dir/data" XDG_CACHE_HOME="$case_dir/cache" \
    XDG_STATE_HOME="$case_dir/state" \
    node scripts/rea.mjs "$@"
}
run_rea inspect-with-objdump "$case_dir/missing.bin" symbols --format json
run_rea inspect-with-objdump "$case_dir/artifact-directory" symbols --format json
run_rea list-architectures "$case_dir/missing.bin" --format json

Leave missing.bin absent. The final command is the observed diagnostic control. No objdump-specific configuration was used.

Expected behavior

Preserve a meaningful acquisition reason: identify the absent selected file versus a target that is not a regular file, and explain what must change before retrying. AGENTS.md:31 requires meaningful failure reasons for expected failures. The observed list-architectures control already identifies the selected missing path and ENOENT with retryable: false. This report does not require a particular replacement error code.

Impact and scope

Callers lose the distinction needed to recover from these two failed inputs and receive misleading retry metadata. Both commands still reject the inputs safely. The verifier reproduced each once; no downstream retry loop, data loss, or successful-analysis corruption was tested or observed. Permission-denied and timeout handling are outside the reproduced scope. The missing-file workaround was verified: use list-architectures on the same path to obtain the acquisition reason. Checking that the input is a regular file also resolves the directory selection.

REA version

6.7.0; source commit 074768901f3cdc8205b61773fb1faf6f6c7b3ca8.

Runtime and platform

Node.js v26.12.0; macOS 27.0.1; arm64. The failure precedes any objdump process launch, so no objdump engine version is involved in the observed failure.

Target and artifact context

An absent local missing.bin and an empty local directory named artifact-directory; no binary format is involved because acquisition fails first.

Interface

CLI

Earliest failure stage

Transport or result projection

Relevant output or evidence

Both objdump CLI invocations above returned exactly this stdout, with exit 1 and empty stderr:

{"code":"invalid_request","category":"invalid_input","message":"Analysis input is invalid. Check the arguments and try again.","retryable":true,"remediation":{"action":"Correct the listed arguments and retry."}}

There are no listed arguments, details, selected path, or acquisition reason. The list-architectures control exited 1 but returned target_unavailable, retryable: false, and the selected path plus ENOENT in its message and details. A separately executed read-bytes <missing-path> 0x0 --provider hopper --format json control returned the same precise classification.

Typed outcome or recovery expected

Keep both operations as failures while distinguishing the missing-file and non-regular-file reasons and naming the selected target. Recovery guidance and retry metadata should show that the target must be corrected before repeating the unchanged request. Preserve the control's precise missing-target diagnostic.

Analysis or suspected cause

Source-derived reasoning at the cited baseline: src/cli/reverseEngineeringCommands.ts:109 reaches the production service. The digest catch in src/application/reverse/ReverseEngineeringService.ts:304-321 wraps these causes in an input error without input issues or a specific user message. The missing path raises ENOENT during stat; the regular-file guard at lines 873-877 raises EINVAL for the directory. The original cause remains internal. src/domain/analysisErrorProjection.ts:312 emits input details only when issues exist, and src/domain/analysisErrorPresentation.ts:132,252 supplies the generic recovery text. The response is structurally schema-valid; the defect is loss of meaningful diagnostic reasons.

Additional context

Prepared with AI assistance and independently reproduced by a separate verifier. Freshness check: no commits change the cited contract, CLI, service, or error-projection/presentation files between the tested baseline and origin/main at e84468c0bb0476412ac0c8161f7c2ecc9a6864ca. The latest published release is 6.7.0.

NOT_ENOUGH_INFO: the last known good version and first introducing commit are unknown. A readable supported binary with working GNU objdump is a proposed success regression control; it was not run in this verification.

Originally created by @coygeek on GitHub (Oct 20, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/5401 ### Before submitting - [x] I searched the open and closed issues for a related report. - [x] I removed credentials, tokens, private paths, and sensitive target data. ### Area CLI ### Observed behavior `inspect-with-objdump <path> symbols --format json` returns byte-identical generic argument errors for an absent file and a directory. Neither reply identifies the selected path or filesystem reason, and both say `retryable: true`. An independent verifier ran each case once; both exited 1 with empty stderr, before objdump launched. ### Reproduction From the built source checkout, the verifier ran the following command arguments with equivalent isolated HOME/XDG directories: ```sh case_dir="$(mktemp -d)" mkdir -p "$case_dir/home" "$case_dir/config" "$case_dir/data" \ "$case_dir/cache" "$case_dir/state" "$case_dir/artifact-directory" run_rea() { env HOME="$case_dir/home" XDG_CONFIG_HOME="$case_dir/config" \ XDG_DATA_HOME="$case_dir/data" XDG_CACHE_HOME="$case_dir/cache" \ XDG_STATE_HOME="$case_dir/state" \ node scripts/rea.mjs "$@" } run_rea inspect-with-objdump "$case_dir/missing.bin" symbols --format json run_rea inspect-with-objdump "$case_dir/artifact-directory" symbols --format json run_rea list-architectures "$case_dir/missing.bin" --format json ``` Leave `missing.bin` absent. The final command is the observed diagnostic control. No objdump-specific configuration was used. ### Expected behavior Preserve a meaningful acquisition reason: identify the absent selected file versus a target that is not a regular file, and explain what must change before retrying. `AGENTS.md:31` requires meaningful failure reasons for expected failures. The observed `list-architectures` control already identifies the selected missing path and ENOENT with `retryable: false`. This report does not require a particular replacement error code. ### Impact and scope Callers lose the distinction needed to recover from these two failed inputs and receive misleading retry metadata. Both commands still reject the inputs safely. The verifier reproduced each once; no downstream retry loop, data loss, or successful-analysis corruption was tested or observed. Permission-denied and timeout handling are outside the reproduced scope. The missing-file workaround was verified: use `list-architectures` on the same path to obtain the acquisition reason. Checking that the input is a regular file also resolves the directory selection. ### REA version 6.7.0; source commit `074768901f3cdc8205b61773fb1faf6f6c7b3ca8`. ### Runtime and platform Node.js v26.12.0; macOS 27.0.1; arm64. The failure precedes any objdump process launch, so no objdump engine version is involved in the observed failure. ### Target and artifact context An absent local `missing.bin` and an empty local directory named `artifact-directory`; no binary format is involved because acquisition fails first. ### Interface CLI ### Earliest failure stage Transport or result projection ### Relevant output or evidence Both objdump CLI invocations above returned exactly this stdout, with exit 1 and empty stderr: ```json {"code":"invalid_request","category":"invalid_input","message":"Analysis input is invalid. Check the arguments and try again.","retryable":true,"remediation":{"action":"Correct the listed arguments and retry."}} ``` There are no listed arguments, `details`, selected path, or acquisition reason. The `list-architectures` control exited 1 but returned `target_unavailable`, `retryable: false`, and the selected path plus ENOENT in its message and details. A separately executed `read-bytes <missing-path> 0x0 --provider hopper --format json` control returned the same precise classification. ### Typed outcome or recovery expected Keep both operations as failures while distinguishing the missing-file and non-regular-file reasons and naming the selected target. Recovery guidance and retry metadata should show that the target must be corrected before repeating the unchanged request. Preserve the control's precise missing-target diagnostic. ### Analysis or suspected cause Source-derived reasoning at the cited baseline: `src/cli/reverseEngineeringCommands.ts:109` reaches the production service. The digest catch in `src/application/reverse/ReverseEngineeringService.ts:304-321` wraps these causes in an input error without input issues or a specific user message. The missing path raises ENOENT during stat; the regular-file guard at lines 873-877 raises EINVAL for the directory. The original cause remains internal. `src/domain/analysisErrorProjection.ts:312` emits input details only when issues exist, and `src/domain/analysisErrorPresentation.ts:132,252` supplies the generic recovery text. The response is structurally schema-valid; the defect is loss of meaningful diagnostic reasons. ### Additional context Prepared with AI assistance and independently reproduced by a separate verifier. Freshness check: no commits change the cited contract, CLI, service, or error-projection/presentation files between the tested baseline and `origin/main` at `e84468c0bb0476412ac0c8161f7c2ecc9a6864ca`. The latest published release is 6.7.0. NOT_ENOUGH_INFO: the last known good version and first introducing commit are unknown. A readable supported binary with working GNU objdump is a proposed success regression control; it was not run in this verification.
Author
Owner

@CassieFox23 commented on GitHub (Oct 20, 2026):

TL;DR: This still happens on main on Linux. A missing file and a directory get the same error from inspect-with-objdump. Neither names the path, and both say retry.

Checked on main b3aadaf47 (Node 24.18.0, GNU objdump 2.46.1). inspect-with-objdump <path> symbols --format json exits 1 for both inputs. Both give invalid_request and "Analysis input is invalid. Check the arguments and try again." Both say retryable: true. The two outputs are byte-identical. The list-architectures control on the missing file names the path and ENOENT, with retryable: false.

Not run

  • Permission-denied and timeout cases, a real objdump run, MCP.

Thanks, coygeek, for the clear report.

Commands
node scripts/rea.mjs inspect-with-objdump <case_dir>/missing.bin symbols --format json
node scripts/rea.mjs inspect-with-objdump <case_dir>/artifact-directory symbols --format json
node scripts/rea.mjs list-architectures <case_dir>/missing.bin --format json

Each exit 1, stderr 0 bytes. The first two print:

{"code":"invalid_request","category":"invalid_input","message":"Analysis input is invalid. Check the arguments and try again.","retryable":true,"remediation":{"action":"Read the declared input schema or CLI usage for inspect_with_objdump; ... Do not repeat the unchanged call."},"recovery":{"kind":"inspect_input_contract","operation":"inspect_with_objdump"}}

The control prints "code":"target_unavailable", "retryable":false, and a message with ENOENT ... '<case_dir>/missing.bin'. Isolated HOME, XDG and TMPDIR; run once per case.

Test setup
  • Box: Nobara 44 (Fedora 44 base), Linux 7.2.11
  • CPU: AMD Ryzen 9 5900X, 12 cores / 24 threads
  • RAM: 32 GB DDR4-3600
  • Node: 24.18.0
  • Head: b3aadaf47
  • Other: GNU objdump 2.46.1 (GPL-3.0-or-later)

🤖 Generated with Claude Code (Sonnet 5.5, verified by Opus 5.5) 🦊

<!-- gh-comment-id:6298171951 --> @CassieFox23 commented on GitHub (Oct 20, 2026): **TL;DR:** This still happens on main on Linux. A missing file and a directory get the same error from `inspect-with-objdump`. Neither names the path, and both say retry. Checked on main b3aadaf47 (Node 24.18.0, GNU objdump 2.46.1). `inspect-with-objdump <path> symbols --format json` exits 1 for both inputs. Both give `invalid_request` and "Analysis input is invalid. Check the arguments and try again." Both say `retryable: true`. The two outputs are byte-identical. The `list-architectures` control on the missing file names the path and ENOENT, with `retryable: false`. ### Not run - Permission-denied and timeout cases, a real objdump run, MCP. Thanks, coygeek, for the clear report. <details> <summary>Commands</summary> ```sh node scripts/rea.mjs inspect-with-objdump <case_dir>/missing.bin symbols --format json node scripts/rea.mjs inspect-with-objdump <case_dir>/artifact-directory symbols --format json node scripts/rea.mjs list-architectures <case_dir>/missing.bin --format json ``` Each exit 1, stderr 0 bytes. The first two print: ```json {"code":"invalid_request","category":"invalid_input","message":"Analysis input is invalid. Check the arguments and try again.","retryable":true,"remediation":{"action":"Read the declared input schema or CLI usage for inspect_with_objdump; ... Do not repeat the unchanged call."},"recovery":{"kind":"inspect_input_contract","operation":"inspect_with_objdump"}} ``` The control prints `"code":"target_unavailable"`, `"retryable":false`, and a message with `ENOENT ... '<case_dir>/missing.bin'`. Isolated HOME, XDG and TMPDIR; run once per case. </details> <details> <summary>Test setup</summary> - Box: Nobara 44 (Fedora 44 base), Linux 7.2.11 - CPU: AMD Ryzen 9 5900X, 12 cores / 24 threads - RAM: 32 GB DDR4-3600 - Node: 24.18.0 - Head: b3aadaf47 - Other: GNU objdump 2.46.1 (GPL-3.0-or-later) </details> 🤖 Generated with Claude Code (Sonnet 5.5, verified by Opus 5.5) 🦊
Author
Owner

@morluto commented on GitHub (Oct 21, 2026):

Closing as fixed on main by github.com/morluto/rea@1629266e3c, retained at 67a6477f01.

Objdump target admission now preserves selected paths and distinct missing-file versus non-regular-file reasons as structured input issues. The public CLI regression checks both cases, exit status, error-schema conformance and non-retryable recovery. The later issue reproduction predates this landed fix; no new real objdump success control is claimed.

This audit inspected the current producer, regression source, issue discussion and main ancestry. Tests/runtime reproductions were not rerun, and no additional real-provider or platform coverage is implied.

<!-- gh-comment-id:6324343921 --> @morluto commented on GitHub (Oct 21, 2026): Closing as fixed on main by https://github.com/morluto/rea/commit/1629266e3c08c90fed6bba5383528af7986a12b7, retained at 67a6477f011ae358fc333e5a6e26c86d932654ed. Objdump target admission now preserves selected paths and distinct missing-file versus non-regular-file reasons as structured input issues. The public CLI regression checks both cases, exit status, error-schema conformance and non-retryable recovery. The later issue reproduction predates this landed fix; no new real objdump success control is claimed. This audit inspected the current producer, regression source, issue discussion and main ancestry. Tests/runtime reproductions were not rerun, and no additional real-provider or platform coverage is implied.
Sign in to join this conversation.
No milestone
No project
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#3271
No description provided.