mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[PR #2331] [MERGED] feat(diagnostics): report a byte entropy profile for one local file #5167
Closed
opened 2026-10-31 01:04:30 +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#5167
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?
📋 Pull Request Information
Original PR: https://github.com/morluto/rea/pull/2331
Author: @mvanhorn
Created: 10/12/2026
Status: ✅ Merged
Merged: 10/22/2026
Merged by: @morluto
Base:
main← Head:fix/byte-entropy-profile📝 Commits (10+)
519ebaafeat(diagnostics): report a byte entropy profile for one local fileb82e190fix(diagnostics): flag zero-size files as not shown emptyb87f511fix(diagnostics): merge main and preserve entropy boundary failures7a67707fix(mcp): reject unsupported diagnostic summaries before inspectioneccc741Merge remote-tracking branch 'origin/main' into fix/byte-entropy-profilea156b1dfix(ci): repair integrated checks and Hopper test baselinea2f6136test(entropy): use shared MCP schema verification after merge4df3682chore: merge current main into PR #2331f54b2aeMerge branch 'main' into fix/byte-entropy-profile3a794e9Merge branch 'main' into fix/byte-entropy-profile📊 Changes
29 files changed (+1510 additions, -3 deletions)
View changed files
📝
.agents/skills/reverse-engineer-anything/references/native-and-artifacts.md(+2 -0)📝
docs/binary-diagnostics.md(+84 -0)📝
docs/user-visible-errors.csv(+2 -0)📝
scripts/lib/catalog-builders.mjs(+10 -1)📝
src/application/CapabilityInventory.ts(+1 -0)📝
src/application/InvestigationProviders.ts(+7 -0)➕
src/application/binaryDiagnostics/ByteEntropyService.test.ts(+373 -0)➕
src/application/binaryDiagnostics/ByteEntropyService.ts(+355 -0)📝
src/cli/binaryDiagnosticsCommands.ts(+40 -0)📝
src/cliCommandNames.ts(+1 -0)📝
src/composition/binaryDiagnostics.ts(+7 -0)➕
src/contracts/native/binaryDiagnosticsToolContracts.test.ts(+33 -0)📝
src/contracts/native/binaryDiagnosticsToolContracts.ts(+36 -0)📝
src/contracts/toolContractExamples.ts(+1 -0)📝
src/contracts/toolEffects.test.ts(+1 -0)📝
src/contracts/toolEffects.ts(+1 -0)📝
src/contracts/toolOutputSchemaGroups.ts(+9 -0)📝
src/domain/analysisView/analysisView.ts(+29 -0)➕
src/domain/analysisView/byteEntropyView.ts(+66 -0)➕
src/domain/native/byteEntropy.test.ts(+53 -0)...and 9 more files
📄 Description
Summary
REA can now report a byte entropy profile for one local file:
inspect_byte_entropy(CLIinspect-byte-entropy) reads an absolute path offline and returns file-wide SHA-256 and Shannon entropy, per-block entropy for an optional byte window, and adjacenthighandlowruns with exact file offsets. It runs no analysis engine, executes nothing, extracts nothing and makes no network requests.No issue is linked. This is a new diagnostics tool, proposed here with the implementation.
Demo
Full-quality MP4
The sample is a generated 32 KB file (8 KB zeros, 8 KB text, 12 KB random bytes, 4 KB zeros), and every number in the video is copied from the CLI output on this branch.
Problem and expected behavior
Before opening an unknown blob in a disassembler or trying to extract it, a useful first question is where the padding, the plain data and the packed or compressed regions sit.
inspect_binary_layout,inspect_pe_resourcesandinspect_recorded_crashreport structure, but none of them reports entropy, so onupstream/main(2e45b4d) there is no file-wide entropy, no block series and no high or low runs to cite as Evidence.With this change, one call on a regular file returns observed Evidence with
artifact(path, byte size, SHA-256),block_size,window,file_entropy,thresholds,blocks(offset,length,entropy) andruns(offset,length,classification). On the demo sample that isfile_entropy: 5.4872, two text blocks at 4.4006 and 4.4011 left unclassified, and three runs:0+8192 low,16384+12288 high,28672+4096 low.Change and scope
ByteEntropyService(src/application/binaryDiagnostics/ByteEntropyService.ts) backs both CLI and MCP. It streams the file once with one block-sized buffer and a 256-entry histogram, hashing and counting every byte so SHA-256 andfile_entropyalways cover the whole file, while blocks are recorded only inside the selected window. Blocks start atoffset(default 0); an omittedlengthruns to EOF, and the final block may be shorter.block_sizemust be a power of two from 256 through 65536, default 4096.Entropy is bits per byte from 0 to 8, rounded to four places. Adjacent blocks with reported entropy >= 7.2 merge into
highruns and blocks <= 1.0 intolowruns; anything in between breaks a run. Classification uses the rounded value that is reported, so a reader can recompute it from the output. The thresholds are returned in the result, and three limitations go with every result: entropy cannot tell compressed from encrypted bytes, small blocks can underestimate entropy, and file-wide fields cover the whole file while blocks and runs cover only the window. Empty files and empty windows are accepted with entropy 0 by convention.Errors are typed rather than clipped or guessed: a relative path, a missing path, a non-regular file, a window past EOF or a file larger than
Number.MAX_SAFE_INTEGERis an input error;EACCES/EPERMis access denied; a change in device, inode, size, mtime or ctime between the firststatand the end of the read is an artifact-changed error; cancellation is checked before and during the read.detail: "summary"retains the complete Evidence in the session and returns file entropy, block and run counts, thresholds, the window and the ten longest runs (ties by offset), withparent_evidence_idfor the full series.inspect_analysis_viewgains a summary projection for this parent operation; any other view kind is rejected with a pointer to the parent Evidence. Summary detail requires a session that can retain Evidence.Memory: the read itself is bounded by one block buffer, but the returned block list grows with the number of selected blocks, and summary detail still retains that full series. The docs say so and point to a narrower window or a larger block size. A local run on a 100,000,000-byte cached file with 4096-byte blocks, recorded in
docs/binary-diagnostics.md, took about 1.1 s and 145 MiB peak RSS for 24,415 blocks; complete Evidence serialized to 1,122,303 bytes and the summary to 2,705 bytes.Out of scope: extraction or carving of high-entropy regions, compression or encryption classification, configurable thresholds, and any other summary view kinds for this parent.
Contract and boundary impact
src/domain/native/byteEntropy.ts(inspectByteEntropyInputSchema,byteEntropySchema,entropyFromCounts,mergeEntropyRuns); I/O insrc/application/binaryDiagnostics/ByteEntropyService.ts; summary projection insrc/domain/analysisView/byteEntropyView.ts, dispatched fromprojectAnalysisViewinsrc/domain/analysisView/analysisView.ts.inspect_byte_entropy(src/contracts/native/binaryDiagnosticsToolContracts.ts, output schema insrc/contracts/toolOutputSchemaGroups.ts, example insrc/contracts/toolContractExamples.ts, effectevidenceinsrc/contracts/toolEffects.ts, availability insrc/application/CapabilityInventory.ts) registered insrc/server/registerBinaryDiagnosticsTools.tsandsrc/server/createServer.ts; new CLI commandinspect-byte-entropy <path> --block-size --offset --lengthinsrc/cli/binaryDiagnosticsCommands.tsandsrc/cliCommandNames.ts.inspect_analysis_viewparent_operationaddsinspect_byte_entropy. Existing tools are unchanged;inspect_binary_layoutregistration now shares one runner with the new tool.src/composition/binaryDiagnostics.ts), works on any regular file, no Hopper, Ghidra or external binary needed.confidence: "observed", providerbyte-entropyv1, artifact identity is the file SHA-256, parameters record path, block size, offset and length (when given), and limitations are carried into the summary view.O_RDONLY | O_NONBLOCKand closed infinally. No processes, no writes, no temp files.docs/public/product-catalog.json), package, or installation impact: authored skill line in.agents/skills/reverse-engineer-anything/references/native-and-artifacts.md("Useinspect_byte_entropyto triage high- and low-entropy ranges before extraction."); docs indocs/binary-diagnostics.mdand two rows (91, 92) indocs/user-visible-errors.csv.metadata:checkanddocs:checkpass; no build outputs committed.Expected effects (check known effects; use documentation-only on its own).
Unchecked items do not establish absence; leave uncertainties visible.
Evidence and regression coverage
src/domain/native/byteEntropy.test.ts(known Shannon answers including partial and empty blocks; threshold-edge merging that skips unclassified blocks and gaps; rejection of unsafe windows, unknown fields and non-power-of-two or out-of-range block sizes);src/application/binaryDiagnostics/ByteEntropyService.test.ts(whole-file identity and entropy with an unaligned window and partial tail; missing files, non-files and windows past EOF rejected while empty windows are accepted; cancellation before and during streaming);tests/boundary/mcp/binaryDiagnosticsMcp.test.ts(real bytes at exact offsets, advertised schemas valid, read-only effects);tests/boundary/mcp/analysisSummaryDetailMcp.test.ts(complete Evidence retained, runs summarized, CLI JSON matches MCP);src/contracts/toolEffects.test.ts(new tool registered as Evidence-only).2e45b4dthere is no entropy computation anywhere undersrc/ordocs/(git grep -il entropyreturns nothing), so none of these outputs can be produced on the base.rea inspect-byte-entropy sample.binon the 32,768-byte demo file returnsfile_entropy: 5.4872,thresholds: {high: 7.2, low: 1}, eight 4096-byte blocks (0, 0, 4.4006, 4.4011, 7.9591, 7.9597, 7.9501, 0) and runs0+8192 low,16384+12288 high,28672+4096 low, withconfidence: observedand SHA-256cd7a1e58...675f.For evidence-bearing changes:
Validation performed
All on macOS arm64 with Node 26.5.0 and npm 12.2.0 (
.nvmrcpins 24.18.0, which is not installed on this host;enginesallows>=26.0.0).npm run check:prwas not run for this change.Compatibility, safety, and release
inspect_binary_layoutbehavior and schema are unchanged.Author readiness
This PR was prepared with AI assistance (Claude Code and Grok). The declarations below are left for the human owner to complete.
Human owner: @mvanhorn
Before merge
type(scope): outcome.Summary by CodeRabbit
Maintainer blocker verification
The artifact descriptor now has one retryable cleanup owner shared by CLI/MCP. Failed close retains that exact owner; subsequent access retries cleanup before admission, preserving the primary failure and secondary cleanup causes. Cancellation from open or final close maps to
AnalysisCancelledErrorwith the AbortSignal reason. If final close also fails, public projection retains cancellation as the execution failure and exposes incomplete cleanup until retry succeeds.The producer rejects more than 32,768 selected rows before scanning or allocating retained results. This is an explicit output-capacity budget, not a file-format limit. A cap-sized sparse-file task retained 1,514,877 serialized bytes and showed approximately +21.2 MiB V8 heap / +18.1 MiB RSS on this macOS/Node 24 host; these are host-specific observations, not portable peak-memory guarantees. The refusal is
retryable: falseand directs callers to a smaller window or larger block size.Latest focused ByteEntropy/MCP regressions: 12 passed, 1 skipped;
npm run check:fastpassed. They cover open cancellation, finalization cancellation plus failed close, cause ordering, retry ownership and public capacity projection. The/proccase was skipped on this host. The earlier public-input-helper finding citesmorluto/preference; REA has nopublicInputStrictObjectpolicy/helper, so importing that unrelated wrapper is not applicable.Restack
Local merge of this tip with origin/main (
c537c52c9) is clean. This branch does not edit.github/workflows; main's workflow files are taken when the pull request merges.inspect_byte_entropyis registered fromsrc/server/registerByteEntropyTool.ts, andinspect_binary_layoutrefuses an unretained summary before inspection.npm run typecheck— pass on this tip and on the merged treenpm run test:local— byte entropy, service, contracts, tool effects, and public input: 23 passednpm run test:focused—binaryDiagnosticsMcp,analysisSummaryDetailMcp, andproductCatalogon the merged tree: 16 passed🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.