[GH-ISSUE #5159] [Feature] Select native objdump disassembly by symbol before collecting output #3169

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

Originally created by @gensokyo-dev on GitHub (Oct 19, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/5159

Current limitation

The analyst wants the instructions of one known symbol with GNU objdump Evidence. inspect_with_objdump currently accepts only the whole disassemble operation; the native producer supports --disassemble=<sym> but REA cannot request it. Filtering after materializing the whole disassembly preserves its production and serialization cost.

Observed on main dfe8378cf5a727e3d93d47a5986233175c6ef898, Linux x86-64, Node 24.18.0, GNU objdump 2.40, using the actual source stdio MCP entry (node --import tsx src/main.ts) and SDK client:

  • /usr/bin/true (35,664 bytes): complete disassembly MCP reply was 971,393 serialized bytes.
  • Debian libcurl.so.4.8.0 (712,120 bytes, SHA-256 02fbea31e63cd827ee61644851f1d336de6850a7df0f7af30ba74da97c4b99ab): {"path":"/usr/lib/x86_64-linux-gnu/libcurl.so.4","operation":"disassemble"} completed analysis but returned the existing typed transport resource_constraint; the complete reply exceeded the 10,484,736-byte result budget. The error preserved its retained Evidence reference. This is the documented guard working, not a request to raise its limit.
  • Direct native objdump --disassemble=curl_version_info /usr/lib/x86_64-linux-gnu/libcurl.so.4 returned the selected symbol's disassembly. This is producer feasibility evidence, not yet proof of a completed optimized REA task.

These are single probe observations, not a timing/token benchmark. The initial private audit harness also failed in its own error-formatting assertion after saving the transport refusal; no completed libcurl baseline task or model-token improvement is claimed yet.

Desired outcome and success criteria

Allow the existing disassembly operation to select an exact native symbol before output collection. Keep omitted selection behavior, raw output, pre/post artifact digests, provider selection, cancellation/cleanup, and existing resource bounds. Retain the selection and native argv in Evidence, with explicit symbol-scoped coverage. CLI and MCP must call the same application workflow.

Verify equivalent selected instructions and source bytes on a small ELF and real libcurl; preserve no-match behavior and reject selectors on incompatible operations before provider execution. Compare completed baseline and selected tasks, including retained-Evidence recovery after transport refusal, discovery, extra calls, tokenizer estimates, elapsed/CPU time, and process-family memory. Distinguish source-entry execution from packaged-runtime coverage and report unavailable model usage.

Expected interaction with targets

Read existing ELF files; launch the caller-supplied objdump analysis process. No target execution, attachment, mutation, injection, network acquisition, or protection recovery. This is selection within the existing read-only static inspection capability; no new provider is proposed.

Alternatives considered

The existing complete-output CLI and retained Evidence export can recover a large observation, but require producing the whole disassembly. A new cache is unjustified: selection can remove the work at its native producer and avoids defining cross-call freshness for artifact and executable contents. Full disassembly remains useful when explicitly requested.

Verification available so far

Implemented in #5171, head a4e3aa6ed, integrated with main 0fc8462be. Optional native symbol selection runs before collection; omitted selection preserves the previous full-disassembly behavior. Canonical runtime validation preserves symbol identity and rejects malformed UTF-16 before artifact/provider admission; published JSON Schema uses a portable NUL exclusion. CLI and MCP share the implementation and preserve complete Evidence access.

Executed on the final integration head: build, whole-repository type/lint/boundaries, docs (6 tasks and 5 README cases), and 293 focused tests across 28 files passed (2 skipped). This includes all four prior main test failures repaired by b999e7247. No unrelated patch or CI bypass was added.

Real packaged Linux GNU objdump 2.40 CLI/MCP checks passed for zlib, libcurl and an empty-match artifact, with native stdout equality and retained complete Evidence. Earlier independent ELF64 mapping checked all selected 8/422 source bytes. The three final public-artifact MCP replies remain byte-identical after latest-main integration. Controlled Unicode ELF checks reject four malformed forms and select distinct expected valid astral/U+FFFD functions; the fixture was never executed. Other platforms/formats remain unverified.

Final sequential validation scopes used one CPU, had a 4.20 GiB maximum process-family peak under the 8 GiB hard cap, zero OOM kills and verified owned cleanup. Counters were observed at payload exit with the observer alive, not terminal whole-scope counters.

Historical before/after task benchmarks remain pinned to baseline dfe8378cf and initial selection 2ddcfd84a; current verification is not a repeated cold benchmark. Catalog-only cl100k estimates pinned to main 69aa5465c and 4d263beab are 807,446 -> 807,550 (+104) raw SDK tokens. Actual model usage, local exported-file consumption and other client rendering are unmeasured. No overall curl token saving, consistent end-to-end latency win or complex-agent effectiveness is claimed; unexplained timing outliers and all measurements remain recorded in the PR.

Merged as 3ea0d9489 after all required PR CI checks, all five test shards and automated review passed. The pre-merge CI workflow records those results.

Post-merge main also contains the separate 49e67aa1d / dc936f433 process-ownership changes. A fresh build passed, but the expanded check had 306 passed, 16 failed and 2 skipped; actual MCP zlib analysis returned cleanup_incomplete after correct native output and exit 0. The unchanged, original file_headers operation without selection reproduces on clean pre-feature main dc936f433 with native exit 0 and 151 bytes equal to GNU objdump. This intermittent shared Linux cleanup problem is recorded with actual controls on #4322; post-merge provider verification is not claimed successful. No unrelated patch was mixed into this feature.

Originally created by @gensokyo-dev on GitHub (Oct 19, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/5159 ## Current limitation The analyst wants the instructions of one known symbol with GNU objdump Evidence. `inspect_with_objdump` currently accepts only the whole `disassemble` operation; the native producer supports `--disassemble=<sym>` but REA cannot request it. Filtering after materializing the whole disassembly preserves its production and serialization cost. Observed on main `dfe8378cf5a727e3d93d47a5986233175c6ef898`, Linux x86-64, Node 24.18.0, GNU objdump 2.40, using the actual source stdio MCP entry (`node --import tsx src/main.ts`) and SDK client: - `/usr/bin/true` (35,664 bytes): complete disassembly MCP reply was 971,393 serialized bytes. - Debian `libcurl.so.4.8.0` (712,120 bytes, SHA-256 `02fbea31e63cd827ee61644851f1d336de6850a7df0f7af30ba74da97c4b99ab`): `{"path":"/usr/lib/x86_64-linux-gnu/libcurl.so.4","operation":"disassemble"}` completed analysis but returned the existing typed transport `resource_constraint`; the complete reply exceeded the 10,484,736-byte result budget. The error preserved its retained Evidence reference. This is the documented guard working, not a request to raise its limit. - Direct native `objdump --disassemble=curl_version_info /usr/lib/x86_64-linux-gnu/libcurl.so.4` returned the selected symbol's disassembly. This is producer feasibility evidence, not yet proof of a completed optimized REA task. These are single probe observations, not a timing/token benchmark. The initial private audit harness also failed in its own error-formatting assertion after saving the transport refusal; no completed libcurl baseline task or model-token improvement is claimed yet. ## Desired outcome and success criteria Allow the existing disassembly operation to select an exact native symbol before output collection. Keep omitted selection behavior, raw output, pre/post artifact digests, provider selection, cancellation/cleanup, and existing resource bounds. Retain the selection and native argv in Evidence, with explicit symbol-scoped coverage. CLI and MCP must call the same application workflow. Verify equivalent selected instructions and source bytes on a small ELF and real libcurl; preserve no-match behavior and reject selectors on incompatible operations before provider execution. Compare completed baseline and selected tasks, including retained-Evidence recovery after transport refusal, discovery, extra calls, tokenizer estimates, elapsed/CPU time, and process-family memory. Distinguish source-entry execution from packaged-runtime coverage and report unavailable model usage. ## Expected interaction with targets Read existing ELF files; launch the caller-supplied objdump analysis process. No target execution, attachment, mutation, injection, network acquisition, or protection recovery. This is selection within the existing read-only static inspection capability; no new provider is proposed. ## Alternatives considered The existing complete-output CLI and retained Evidence export can recover a large observation, but require producing the whole disassembly. A new cache is unjustified: selection can remove the work at its native producer and avoids defining cross-call freshness for artifact and executable contents. Full disassembly remains useful when explicitly requested. ## Verification available so far Implemented in #5171, head `a4e3aa6ed`, integrated with main `0fc8462be`. Optional native symbol selection runs before collection; omitted selection preserves the previous full-disassembly behavior. Canonical runtime validation preserves symbol identity and rejects malformed UTF-16 before artifact/provider admission; published JSON Schema uses a portable NUL exclusion. CLI and MCP share the implementation and preserve complete Evidence access. Executed on the final integration head: build, whole-repository type/lint/boundaries, docs (6 tasks and 5 README cases), and 293 focused tests across 28 files passed (2 skipped). This includes all four prior main test failures repaired by `b999e7247`. No unrelated patch or CI bypass was added. Real packaged Linux GNU objdump 2.40 CLI/MCP checks passed for zlib, libcurl and an empty-match artifact, with native stdout equality and retained complete Evidence. Earlier independent ELF64 mapping checked all selected 8/422 source bytes. The three final public-artifact MCP replies remain byte-identical after latest-main integration. Controlled Unicode ELF checks reject four malformed forms and select distinct expected valid astral/U+FFFD functions; the fixture was never executed. Other platforms/formats remain unverified. Final sequential validation scopes used one CPU, had a 4.20 GiB maximum process-family peak under the 8 GiB hard cap, zero OOM kills and verified owned cleanup. Counters were observed at payload exit with the observer alive, not terminal whole-scope counters. Historical before/after task benchmarks remain pinned to baseline `dfe8378cf` and initial selection `2ddcfd84a`; current verification is not a repeated cold benchmark. Catalog-only cl100k estimates pinned to main `69aa5465c` and `4d263beab` are 807,446 -> 807,550 (+104) raw SDK tokens. Actual model usage, local exported-file consumption and other client rendering are unmeasured. No overall curl token saving, consistent end-to-end latency win or complex-agent effectiveness is claimed; unexplained timing outliers and all measurements remain recorded in the PR. Merged as `3ea0d9489` after all required PR CI checks, all five test shards and automated review passed. The [pre-merge CI workflow](https://github.com/morluto/rea/actions/runs/39248496874) records those results. Post-merge main also contains the separate `49e67aa1d` / `dc936f433` process-ownership changes. A fresh build passed, but the expanded check had 306 passed, 16 failed and 2 skipped; actual MCP zlib analysis returned cleanup_incomplete after correct native output and exit 0. The unchanged, original file_headers operation without selection reproduces on clean pre-feature main dc936f433 with native exit 0 and 151 bytes equal to GNU objdump. This intermittent shared Linux cleanup problem is recorded with actual controls [on #4322](https://github.com/morluto/rea/issues/4322#issuecomment-6267248389); post-merge provider verification is not claimed successful. No unrelated patch was mixed into this feature.
bsakaguchi 2026-10-31 00:37:27 +00:00
Author
Owner

@XinwangTao commented on GitHub (Oct 19, 2026):

This closes a real pain point: the libcurl case (complete disassembly blowing the 10MB transport budget while --disassemble= works natively) shows filtering after materialization is the wrong layer. Selecting at the native producer keeps the resource-bounds design intact instead of making everything bigger.

Appreciate the scoping discipline — retaining the omitted-selection behavior, preserving digests/provider selection/cancellation, and rejecting selectors on incompatible operations before provider execution are exactly the guards that keep this a safe read-only enhancement. The regression coverage (4 failing cases on main vs 15 passing after the change) and the packaged CLI/MCP/native equality checks on zlib, libcurl and a no-match case give reviewers solid confidence. Selecting disassembly by symbol should be a nice win for symbol-scoped analysis workflows.

<!-- gh-comment-id:6259611509 --> @XinwangTao commented on GitHub (Oct 19, 2026): This closes a real pain point: the libcurl case (complete disassembly blowing the 10MB transport budget while --disassemble=<sym> works natively) shows filtering after materialization is the wrong layer. Selecting at the native producer keeps the resource-bounds design intact instead of making everything bigger. Appreciate the scoping discipline — retaining the omitted-selection behavior, preserving digests/provider selection/cancellation, and rejecting selectors on incompatible operations before provider execution are exactly the guards that keep this a safe read-only enhancement. The regression coverage (4 failing cases on main vs 15 passing after the change) and the packaged CLI/MCP/native equality checks on zlib, libcurl and a no-match case give reviewers solid confidence. Selecting disassembly by symbol should be a nice win for symbol-scoped analysis workflows.
Author
Owner

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

Nice to see #5171 merged and riding into the 6.8.0 release — symbol-scoped objdump requests should now stay well within the transport budget that the whole-disassembly path was blowing through. One thing worth keeping on the radar: the intermittent shared Linux cleanup problem tracked on #4322 (cleanup_incomplete reported after native exit 0) also affected the post-merge verification of this feature, so it'd be good to re-run the objdump selection checks once that ownership/cleanup issue is resolved.

<!-- gh-comment-id:6281160906 --> @XinwangTao commented on GitHub (Oct 20, 2026): Nice to see #5171 merged and riding into the 6.8.0 release — symbol-scoped objdump requests should now stay well within the transport budget that the whole-disassembly path was blowing through. One thing worth keeping on the radar: the intermittent shared Linux cleanup problem tracked on #4322 (cleanup_incomplete reported after native exit 0) also affected the post-merge verification of this feature, so it'd be good to re-run the objdump selection checks once that ownership/cleanup issue is resolved.
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#3169
No description provided.