mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #3756] extract_firmware reports coverage "complete" when nothing was extracted #1459
Closed
opened 2026-10-16 21:05:38 +00:00 by bsakaguchi
·
11 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#1459
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 @oleander on GitHub (Oct 14, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/3756
Summary
extract_firmware(CLIextract-firmware) reportscoverage: "complete"even when unblob found no chunks and nothing was extracted.published_bytesis0and the input file is 4 MiB.Environment
unblob --show-external-dependencies), binwalk 3.1.0, prlimit from util-linux 2.38.1REA_UNBLOB_COMMAND,REA_BINWALK_COMMANDandREA_FIRMWARE_PRLIMIT_COMMANDset to absolute pathsSteps
Run
extract-firmwareon a 4 MiB ESP32-S3 ESP-IDF merged flash image (bootloader at 0x0, partition table at 0x8000, app image at 0x20000, the rest 0xFF). unblob has no handler for the ESP image format, and libmagic reads the 0xE9 header as "DOS executable (COM)".Observed
unblob exits 0. The
normalized_resultis:The output directory is empty.
Expected
The whole input is unexplained, so it should show up as an unknown region or an
extraction_gapsrow, and coverage should not becomplete. This matters because the tool's own contract says gaps yield truncated or unknown, never equivalence. A caller readingcompletewould conclude the image was fully extracted.Likely cause
unblob does not report a whole file with no recognized chunk as an unknown chunk (see
_FileTask.process), so there is nothing for rea to turn into a gap. rea could compare the selected byte range against the union of reported chunks and unknown chunks, and mark the rest as a gap.Suggested priority: P2: medium (I cannot set labels on this repo).
@XinwangTao commented on GitHub (Oct 15, 2026):
This is a genuinely misleading failure mode — a caller reading "coverage: complete" with published_bytes 0 and an empty output dir would assume full extraction, which is exactly the wrong signal for a 4 MiB ESP image that unblob silently skipped. The proposed fix of comparing the selected byte range against the union of reported chunks and marking the remainder as a gap is the right contract alignment, since the tool's own spec says gaps must never map to "complete". Tracking #3764; verifying on a synthetic same-shaped image (bootloader + partition table + app + 0xFF padding) would be a nice regression test.
@CassieFox23 commented on GitHub (Oct 19, 2026):
matbrgz groups this issue with #3757 and #3758 in #4330, as firmware tooling reports. The three look related: the same person filed all three, on rea-agents 6.5.0 in a linux-arm64 container.
#3757 and #3758 already link each other. This issue links to neither. Open PRs: #4953 (this issue), #3761 (#3757) and #3899 (#3758).
🤖 Generated with Claude Code (Sonnet 5.5, verified by Opus 5.5) 🦊
@XinwangTao commented on GitHub (Oct 19, 2026):
Agreed with the fix direction in #4953. One edge case worth covering in the regression test: when the chunks list is empty (unblob found nothing), the gap calculation must still cover the entire selected range — mostly 0xFF padding here — so coverage stays non-"complete" with published_bytes 0, instead of falling back to the empty-chunk happy path that produced this misleading report.
@CassieFox23 commented on GitHub (Oct 20, 2026):
Thanks, XinwangTao. The open PR #4953 already covers that case. Its head is
4308633992. There,FirmwareReports.test.tshasderives the whole selection as unreported when no chunk is reported. The integration testreports an unrecognized selected input as an unreported region, not completeexpectspublished_bytesto be 0.I read those tests. I did not run them.
Edit: I have now run those tests. The results are here.
🤖 Written with Claude Code (Sonnet 5.5, verified by Opus 5.5), posted with my OK 🦊
@XinwangTao commented on GitHub (Oct 21, 2026):
Thanks for confirming the empty-chunks case is already covered in #4953 — deriving the whole selection as unreported when no chunk is reported is exactly the right behavior. Since that case was the original source of the misleading "complete" report, it'd be good to also run that integration test on the actual worker before merge, to catch any mismatch between the unit-level derives and the real unblob result shape.
@CassieFox23 commented on GitHub (Oct 21, 2026):
Thanks, XinwangTao. I ran the empty-chunks case on the head of #4953 (
430863399). On main335c042da 4 MiB input with no reported chunk givescoverage: "complete". On the head it givespartial, with one gap that spans all 4,194,304 bytes. In the fixture test,published_bytesstays 0. I used a stand-in report, not real Unblob, which is not installed on my box. The results are here.🤖 Written and tested with Claude Code (Sonnet 5.5, verified by Opus 5.5), posted with my OK 🦊
@XinwangTao commented on GitHub (Oct 21, 2026):
Nice to see the concrete before/after on
4308633— main's misleading "complete" becoming "partial" with a single full-range gap is exactly the contract fix this issue asked for, and published_bytes staying 0 keeps the signal honest. One gap I'd still close before merge: that verification used a stand-in report rather than real unblob. Given coygeek's #5745 (unblob-resolved problems being labeled as unextracted regions), the real unblob result shape can differ from the fixture in ways that affect the gap union, so an end-to-end pass against actual unblob — or a captured real unblob report — on an unrecognized image would harden the fix before it lands.@CassieFox23 commented on GitHub (Oct 21, 2026):
Thanks, XinwangTao, for the nudge. I agree a real unblob run would be the stronger check. I can't run one on my box, since unblob and binwalk aren't installed here. My #4953 result used a stand-in report copied from the PR's unit test, so that's all I have.
🤖 Written with Claude Code (Haiku 5.5, verified by Opus 5.5), posted with my OK 🦊
@XinwangTao commented on GitHub (Oct 22, 2026):
理解 CassieFox23 无法在本机跑 unblob 的限制。补一个成本最低的替代路径:原报告人 oleander 的环境里就有真实的 unblob 26.6.4 + binwalk 3.1.0(Debian bookworm 容器),可以直接用最初的 4 MiB ESP32-S3 镜像在 #4953 head 上跑一次 extract-firmware,或导出该输入的 unblob JSON report 作为 fixture 合入 PR——这比 stand-in report 更贴近真实结果形状。考虑到 coygeek 的 #5745 恰好暴露了真实 unblob 输出与 fixture 的差异会影响 gap union,这次端到端验证可以同时服务两个 issue,值得在合并前补上。
@VolodymyrChapman commented on GitHub (Oct 23, 2026):
Real-Unblob check of the empty-chunk case, since the earlier verification used a stand-in report.
Environment: Linux x86_64 (Ubuntu 24.04), Node v24.22.1, Unblob 26.6.4 (all 15 external extractors present), Binwalk 3.1.0,
/usr/bin/prlimit. Compared the npm releaserea-agents@6.7.0withmainat960b742, which includes15450643f("fix(firmware): preserve admission and extraction coverage outcomes").main'srea --versionstill prints 6.7.0.Inputs:
ESP8266_GENERIC-20240222-v1.22.2.bin: the official MicroPython v1.22.2 ESP8266 image, 642,080 bytes, SHA-256e8ba6a7f7e254531423d3c1a00315c6fb020e8b078de36299922f48b2457bee9. Same family as the ESP32-S3 report:0xE9header, no Unblob handler, libmagic says "DOS executable (COM)".random-4k.bin:head -c 4096 /dev/urandom.gzip-plus-random.bin:echo hello | gzip -9nfollowed by input 2 (a control with one known chunk).For inputs 1 and 2, Unblob's raw report contains only
StatReport,FileMagicReportandHashReport, with no chunk orUnknownChunkReport.main960b742complete, 0 chunks, 0 gaps, 0 bytespartial, 1unclassified-rangegap{0, 642080}complete, 0 gapspartial, 1unclassified-rangegap{0, 4096}--offset 1024 --length 2048complete, 0 gapspartial, gaprange {0, 2048},root_file_range {1024, 2048}partial,unknown-chunk-handlergap{26, 4096}On
main,published_bytesstays 0 for the zero-chunk inputs, and each gap points to the "producer reported no chunk covering these bytes" continuation. The control case is unchanged and doesn't gain a duplicateunclassified-rangerow on top of Unblob's own unknown chunk.So with real Unblob the fix behaves as described. The issue looks resolvable once
15450643fships in a release; 6.7.0 still reportscomplete.@XinwangTao commented on GitHub (Oct 24, 2026):
Thanks for running the real-Unblob check — this closes the gap I flagged about the stand-in report. The before/after is exactly the contract fix this issue asked for: on
960b742the ESP8266 image (same 0xE9-header family as the original ESP32-S3 report, no Unblob handler) goes from "complete" with 0 chunks/0 gaps to "partial" with a single full-range gap, and published_bytes staying 0 keeps the signal honest. The control case (gzip + random) not gaining a duplicate unclassified-range row is also the right behavior — it confirms the gap union doesn't double-report bytes Unblob already classifies. Agree this is resolvable once1545064ships in a release; 6.7.0 still reporting "complete" for a silently-skipped image is exactly the misleading signal this issue set out to remove.