[PR #5425] [MERGED] fix(ghidra): treat format-specific disabled analyzers as not applicable #6926

Closed
opened 2026-11-01 21:44:06 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/5425
Author: @vishal-tambi
Created: 10/20/2026
Status: ✅ Merged
Merged: 10/22/2026
Merged by: @morluto

Base: main ← Head: fix/5342-ghidra-disabled-analyzer-applicability


📝 Commits (4)

  • 1bb98ca fix(ghidra): treat format-specific disabled analyzers as not applicable
  • 217eb54 Merge branch 'main' into fix/5342-ghidra-disabled-analyzer-applicability
  • 424584d test(json): assert composed cancellation cleanup for staged output
  • 8e425dc Merge branch 'main' into fix/5342-ghidra-disabled-analyzer-applicability

📊 Changes

12 files changed (+439 additions, -53 deletions)

View changed files

📝 bridge/ghidra/ReaGhidraAnalysisOptions.java (+65 -12)
📝 bridge/ghidra/ReaGhidraBridge.java (+5 -0)
📝 docs/installation.md (+16 -11)
📝 docs/testing.md (+10 -10)
📝 scripts/verify/ghidra/seeds.mjs (+29 -2)
📝 src/ghidra/GhidraAnalysisProfile.ts (+2 -1)
➕ src/ghidra/GhidraDisabledAnalyzers.ts (+77 -0)
📝 src/ghidra/GhidraProvider.behavior.test.ts (+174 -17)
📝 src/ghidra/GhidraProviderClient.ts (+19 -0)
📝 src/ghidra/GhidraSessionValues.test.ts (+37 -0)
📝 src/ghidra/GhidraSessionValues.ts (+2 -0)
📝 tests/conformance/ghidra/ReaAnalyzerOptionsRegressionProbe.java (+3 -0)

📄 Description

Summary

Fixes #5342.

REA_GHIDRA_DISABLED_ANALYZERS is process-wide, but the pre-script checked each name against the analyzers Ghidra registered for the program being imported. Ghidra registers only the installed analyzers whose canAnalyze(program) accepts the program, so a format-specific name such as Objective-C Message Analyzer or Demangler Swift aborted every ELF, PE and plain Mach-O import with a generic execution_failure.

Now a name that an installed analyzer provides but that Ghidra did not register for this program is reported as not applicable and the import continues. A name that no installed analyzer provides still aborts the import, so typos are still caught.

Problem and expected behavior

Smallest trigger (observed on main at 4eaf3a117 with real Ghidra 12.1.4): REA_GHIDRA_DISABLED_ANALYZERS="Objective-C Message Analyzer" rea analyze /usr/bin/true --provider ghidra --json exits 1 with execution_failure; the only mention of the cause is in details.diagnostics.stdout.text: java.lang.IllegalArgumentException: Unknown Ghidra analyzer for this program: Objective-C Message Analyzer.

Expected:

  • installed but not registered for this program → not applicable, recorded, import continues;
  • not provided by any installed analyzer → import still aborts, naming REA_GHIDRA_DISABLED_ANALYZERS and the analyzer.

Change and scope

  • bridge/ghidra/ReaGhidraAnalysisOptions.java: a name AutoAnalysisManager.getAnalyzer finds is disabled and read back as before. Otherwise the script checks the name against ClassSearcher.getInstances(Analyzer.class), the same set that AutoAnalysisManager.initializeAnalyzers filters by canAnalyze(program) in Ghidra 12.1.4. That set is only built when a name is unregistered. The script stores a per-name report (rea-ghidra-disabled-analyzers-v1, statuses disabled/not_applicable) as a program property, and every failure message now names the setting and the analyzer.
  • bridge/ghidra/ReaGhidraBridge.java: returns that report in the handshake as disabled_analyzers. This follows the existing analysis_seeds pattern.
  • src/ghidra/GhidraDisabledAnalyzers.ts (new): owns the report schema, the fail-closed check against the committed names, and the not-applicable limitation. GhidraProviderClient applies them. Non-health operations now verify the handshake whenever analyzers are configured. Without that, the outcome check and limitation were skipped for operations such as list_procedures on non-PE targets.

Not-applicable analyzers are recorded in result limitations, not in the committed analyzer_preset. The analysis profile and its digest are committed before Ghidra imports the target, and they gate snapshot reuse before launch. Applicability is only known after import, so the committed analyzer_preset keeps the configured names, and results report the applied preset as Applied analyzer preset: ghidra-default+disabled:Objective-C Message Analyzer(n/a). …. No hardcoded format list. The top-level error for an unknown name is still the generic execution_failure; the setting and analyzer are named in the Ghidra output carried in details.diagnostics.

Rebased onto main ee12d517a. The docs/installation.md conflict with 98a5e5638 keeps its server-wide scope and restart guidance and drops the separate-server workaround, which this fix makes unnecessary.

Merged main f86206535 at 8e425dc4d. The earlier test-only commit 424584d17 fixed a stale assertion in tests/boundary/filesystem/jsonOutputOwnership.test.ts. main has since fixed the same assertion (#5601), so the merge keeps main's version and this PR no longer changes that file.

Contribution scope: ordinary fix within existing provider boundaries; maintainer scope decision not applicable.

Contract and boundary impact

  • Semantic owner and earliest changed stage: Ghidra analyzer-options pre-script; GhidraDisabledAnalyzers.ts owns the reported outcome.
  • Contribution scope fit and linked maintainer decision: existing Ghidra configuration; not applicable.
  • CLI and MCP/tool-catalog contract: no schema change. Results add one limitation only when a configured analyzer is not applicable.
  • Provider, bridge, target-format, or platform compatibility: new optional handshake field disabled_analyzers, required whenever the setting is configured. The pre-script and bridge ship together. Unset configuration is unchanged.
  • Evidence, artifact, provenance, or reconstruction contract: committed profile and digest unchanged for every configuration.
  • Target selection, authority, upstream behavior, and cleanup details: unchanged; ephemeral read-only import.
  • Generated metadata, package, or installation impact: none.

Expected effects (check known effects; use documentation-only on its own).
Unchecked items do not establish absence; leave uncertainties visible.

  • Read existing files or captured data.
  • Launch or attach to a process.
  • Inject instrumentation or run scripts/code.
  • Change process memory, registers, files, or configuration.
  • Contact network services.
  • Recover protected code or work around protections.
  • Documentation or usability only; no target interaction.
  • Not sure yet; investigation or maintainer guidance needed.

Evidence and regression coverage

  • Tests added or updated:

    • src/ghidra/GhidraProvider.behavior.test.ts: all names disabled (no added limitation); a not-applicable name (operation succeeds, limitation carries the (n/a) preset, committed preset and digest unchanged); a missing report, a report for other names, or a report missing a configured name fails closed before any analysis call; a report the profile did not commit fails closed.
    • src/ghidra/GhidraSessionValues.test.ts: report schema accepts both statuses in configured order and rejects an unknown status, an empty list, another format and undeclared fields.
    • scripts/verify/ghidra/seeds.mjs + ReaAnalyzerOptionsRegressionProbe.java (real Ghidra): adds the not-applicable report case and the new unknown-name message.
  • Base reproduction (executed, real Ghidra 12.1.4, ELF /usr/bin/true, rea analyze … --provider ghidra --json, one run per cell):

    REA_GHIDRA_DISABLED_ANALYZERS main 4eaf3a117 this branch 74484681c
    unset exit 0, ghidra-default exit 0, identical JSON to main
    Decompiler Switch Analysis exit 0 exit 0, identical JSON to main
    Objective-C Message Analyzer exit 1, execution_failure (Unknown Ghidra analyzer for this program) exit 0, (n/a) limitation
    Decompiler Switch Analysis,Objective-C Message Analyzer exit 1, execution_failure exit 0, (n/a) limitation
    Objective-C Mesage Analyzer (typo) exit 1, execution_failure exit 1, execution_failure

    "Identical" means 0 differing JSON leaf values (256 and 257 leaves). Target SHA-256 was unchanged after all runs.

  • User-visible CLI/MCP output:

    • not applicable: Ghidra (ghidra 12.1.4) read_binary_inventory_summary: Applied analyzer preset: ghidra-default+disabled:Objective-C Message Analyzer(n/a). Ghidra did not register the (n/a) analyzers for this program, so REA_GHIDRA_DISABLED_ANALYZERS had nothing to disable for them; the analysis profile still commits every configured name.
    • typo, details.diagnostics.stdout.text: java.lang.IllegalArgumentException: REA_GHIDRA_DISABLED_ANALYZERS names Objective-C Mesage Analyzer, which is not an analyzer in this Ghidra installation
  • Remaining proof gaps: Objective-C Mach-O target (analyzer registered and disabled on a real ObjC program) not run; Windows Ghidra lane not run.

For evidence-bearing changes:

  • Observed, derived, and inferred claims remain distinguishable.
  • Artifact identity, source provenance, and failed attempts remain preserved.
  • Unsupported, incomplete, unavailable, or uncertain outcomes remain visible.

Validation performed

Head 8e425dc4d (merge of main f86206535), Windows 11, Node 24.18.0: npm run check:fast and npm run docs:check passed. npm run test:local passed for GhidraProvider.behavior.test.ts and GhidraSessionValues.test.ts (161 tests). npm run test:focused passed for GhidraDisabledAnalyzers.test.ts, ghidraLauncher.test.ts (35 tests) and jsonOutputOwnership.test.ts (14 tests). Real Ghidra was not rerun on this head. The merged main changes under src/ghidra/ are type renames and a test-helper refactor that do not overlap with this fix.

Rebased commit 1bb98ca6f (WSL, same toolchain as below): npm run verify:ghidra:seeds passed; the five rea analyze /usr/bin/true settings gave the same results as the table above. Windows: npm run check:fast, npm run docs:check and the four focused test files (195 tests) passed.

WSL Ubuntu 24.04 x86_64, Node 24.18.0, Temurin JDK 21.0.12.1, Ghidra 12.1.4 PUBLIC (20260921, release SHA-256 verified), commit 74484681c (before rebase):

  • npm run verify:ghidra:seeds — passed (41 s), including analyzer readback, the not-applicable report and the unknown-name abort before post-scripts.
  • rea analyze /usr/bin/true --provider ghidra --json × 5 settings on main and this branch — results in the table above.
  • npm run check — exit 0.
  • npm run test:prepare && vitest run (full suite) — 20,700 passed, 8 failed, 170 skipped. All 8 failures are host-tool gaps: tests/boundary/filesystem/ciStaticArtifacts.test.ts (3, spawn zip ENOENT) and tests/boundary/providers/kuna/kunaVerifier.test.ts (5, spawn cc ENOENT). The host has no zip or C compiler. The same full suite on main 4eaf3a117 in the same environment: 20,689 passed, 8 failed, 170 skipped. The 8 failures are the same tests with the same errors; no test fails only on this branch, which adds 11 tests.

Head 424584d17 (after the maintainer merge of main): Linux, the four Ghidra test files passed and npm run verify:ghidra:seeds passed with real Ghidra 12.1.4; Windows npm run check:fast passed.

Windows 11 host, same commit:

  • npm run check:fast, npm run docs:check — passed.
  • npm run test:focused -- src/ghidra/GhidraProvider.behavior.test.ts src/ghidra/GhidraSessionValues.test.ts src/ghidra/GhidraDisabledAnalyzers.test.ts tests/boundary/providers/ghidra/ghidraLauncher.test.ts — 195 passed.

Compatibility, safety, and release

  • Breaking changes or migration steps: none. A configuration that previously aborted on a not-applicable name now succeeds; misspelled names still abort.
  • Real Hopper/Ghidra, browser, or OS coverage: real Ghidra 12.1.4 on Linux (WSL) as above; Objective-C Mach-O and Windows Ghidra not run.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: no new process, network or mutation authority. The pre-script additionally instantiates Ghidra's installed analyzer classes, only when a configured name is unregistered; Ghidra does the same per program during AutoAnalysisManager initialization.

Author readiness

Human owner: @vishal-tambi

  • I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work.
  • I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps.
  • I declare this PR ready for initial maintainer review.

Before merge

  • This PR addresses a concrete problem or an agreed enhancement.
  • Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff.
  • The PR has one focused outcome and the title follows type(scope): outcome.
  • Related issue is linked, or the reason for not linking one is stated above.
  • Tests cover changed observable behavior and meaningful failure paths.
  • Owning docs, contracts, and generated metadata are updated where needed.
  • User-visible CLI/MCP changes include representative output.
  • I checked the final diff for secrets, unrelated cleanup, and unsupported claims.

Maintainer blocker verification

macOS arm64, Ghidra 12.1.4/JDK 21, Node 24.18.0/npm 11.16.0, exact head 8e425dc4da53702e787475accd89c351e74df756: npm run verify:ghidra:seeds passed against the existing local Ghidra installation. Coverage includes seed ordering, out-of-range seed, BSS label/code handling, disabled-analyzer readback, unknown-analyzer abort and owned-process cleanup. This is the seed/pre-script lane, not every Ghidra format or provider workflow.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/morluto/rea/pull/5425 **Author:** [@vishal-tambi](https://github.com/vishal-tambi) **Created:** 10/20/2026 **Status:** ✅ Merged **Merged:** 10/22/2026 **Merged by:** [@morluto](https://github.com/morluto) **Base:** `main` ← **Head:** `fix/5342-ghidra-disabled-analyzer-applicability` --- ### 📝 Commits (4) - [`1bb98ca`](https://github.com/morluto/rea/commit/1bb98ca6f052a967dc8cf03afc2a614c30b787bd) fix(ghidra): treat format-specific disabled analyzers as not applicable - [`217eb54`](https://github.com/morluto/rea/commit/217eb54ed308b37d9b788b2e9cc362f34134b7e8) Merge branch 'main' into fix/5342-ghidra-disabled-analyzer-applicability - [`424584d`](https://github.com/morluto/rea/commit/424584d172a365b837bc15e9fabcb2ef76cf7961) test(json): assert composed cancellation cleanup for staged output - [`8e425dc`](https://github.com/morluto/rea/commit/8e425dc4da53702e787475accd89c351e74df756) Merge branch 'main' into fix/5342-ghidra-disabled-analyzer-applicability ### 📊 Changes **12 files changed** (+439 additions, -53 deletions) <details> <summary>View changed files</summary> 📝 `bridge/ghidra/ReaGhidraAnalysisOptions.java` (+65 -12) 📝 `bridge/ghidra/ReaGhidraBridge.java` (+5 -0) 📝 `docs/installation.md` (+16 -11) 📝 `docs/testing.md` (+10 -10) 📝 `scripts/verify/ghidra/seeds.mjs` (+29 -2) 📝 `src/ghidra/GhidraAnalysisProfile.ts` (+2 -1) ➕ `src/ghidra/GhidraDisabledAnalyzers.ts` (+77 -0) 📝 `src/ghidra/GhidraProvider.behavior.test.ts` (+174 -17) 📝 `src/ghidra/GhidraProviderClient.ts` (+19 -0) 📝 `src/ghidra/GhidraSessionValues.test.ts` (+37 -0) 📝 `src/ghidra/GhidraSessionValues.ts` (+2 -0) 📝 `tests/conformance/ghidra/ReaAnalyzerOptionsRegressionProbe.java` (+3 -0) </details> ### 📄 Description ## Summary Fixes #5342. `REA_GHIDRA_DISABLED_ANALYZERS` is process-wide, but the pre-script checked each name against the analyzers Ghidra registered for the program being imported. Ghidra registers only the installed analyzers whose `canAnalyze(program)` accepts the program, so a format-specific name such as `Objective-C Message Analyzer` or `Demangler Swift` aborted every ELF, PE and plain Mach-O import with a generic `execution_failure`. Now a name that an installed analyzer provides but that Ghidra did not register for this program is reported as not applicable and the import continues. A name that no installed analyzer provides still aborts the import, so typos are still caught. ## Problem and expected behavior Smallest trigger (observed on `main` at 4eaf3a117 with real Ghidra 12.1.4): `REA_GHIDRA_DISABLED_ANALYZERS="Objective-C Message Analyzer" rea analyze /usr/bin/true --provider ghidra --json` exits 1 with `execution_failure`; the only mention of the cause is in `details.diagnostics.stdout.text`: `java.lang.IllegalArgumentException: Unknown Ghidra analyzer for this program: Objective-C Message Analyzer`. Expected: - installed but not registered for this program → not applicable, recorded, import continues; - not provided by any installed analyzer → import still aborts, naming `REA_GHIDRA_DISABLED_ANALYZERS` and the analyzer. ## Change and scope - `bridge/ghidra/ReaGhidraAnalysisOptions.java`: a name `AutoAnalysisManager.getAnalyzer` finds is disabled and read back as before. Otherwise the script checks the name against `ClassSearcher.getInstances(Analyzer.class)`, the same set that `AutoAnalysisManager.initializeAnalyzers` filters by `canAnalyze(program)` in Ghidra 12.1.4. That set is only built when a name is unregistered. The script stores a per-name report (`rea-ghidra-disabled-analyzers-v1`, statuses `disabled`/`not_applicable`) as a program property, and every failure message now names the setting and the analyzer. - `bridge/ghidra/ReaGhidraBridge.java`: returns that report in the handshake as `disabled_analyzers`. This follows the existing `analysis_seeds` pattern. - `src/ghidra/GhidraDisabledAnalyzers.ts` (new): owns the report schema, the fail-closed check against the committed names, and the not-applicable limitation. `GhidraProviderClient` applies them. Non-health operations now verify the handshake whenever analyzers are configured. Without that, the outcome check and limitation were skipped for operations such as `list_procedures` on non-PE targets. Not-applicable analyzers are recorded in result limitations, not in the committed `analyzer_preset`. The analysis profile and its digest are committed before Ghidra imports the target, and they gate snapshot reuse before launch. Applicability is only known after import, so the committed `analyzer_preset` keeps the configured names, and results report the applied preset as `Applied analyzer preset: ghidra-default+disabled:Objective-C Message Analyzer(n/a). …`. No hardcoded format list. The top-level error for an unknown name is still the generic `execution_failure`; the setting and analyzer are named in the Ghidra output carried in `details.diagnostics`. Rebased onto `main` ee12d517a. The `docs/installation.md` conflict with 98a5e5638 keeps its server-wide scope and restart guidance and drops the separate-server workaround, which this fix makes unnecessary. Merged `main` f86206535 at 8e425dc4d. The earlier test-only commit 424584d17 fixed a stale assertion in `tests/boundary/filesystem/jsonOutputOwnership.test.ts`. `main` has since fixed the same assertion (#5601), so the merge keeps `main`'s version and this PR no longer changes that file. Contribution scope: ordinary fix within existing provider boundaries; maintainer scope decision not applicable. ## Contract and boundary impact - Semantic owner and earliest changed stage: Ghidra analyzer-options pre-script; `GhidraDisabledAnalyzers.ts` owns the reported outcome. - Contribution scope fit and linked maintainer decision: existing Ghidra configuration; not applicable. - CLI and MCP/tool-catalog contract: no schema change. Results add one limitation only when a configured analyzer is not applicable. - Provider, bridge, target-format, or platform compatibility: new optional handshake field `disabled_analyzers`, required whenever the setting is configured. The pre-script and bridge ship together. Unset configuration is unchanged. - Evidence, artifact, provenance, or reconstruction contract: committed profile and digest unchanged for every configuration. - Target selection, authority, upstream behavior, and cleanup details: unchanged; ephemeral read-only import. - Generated metadata, package, or installation impact: none. Expected effects (check known effects; use documentation-only on its own). Unchecked items do not establish absence; leave uncertainties visible. - [x] Read existing files or captured data. - [x] Launch or attach to a process. - [x] Inject instrumentation or run scripts/code. - [x] Change process memory, registers, files, or configuration. - [x] Contact network services. - [x] Recover protected code or work around protections. - [x] Documentation or usability only; no target interaction. - [x] Not sure yet; investigation or maintainer guidance needed. ## Evidence and regression coverage - Tests added or updated: - `src/ghidra/GhidraProvider.behavior.test.ts`: all names disabled (no added limitation); a not-applicable name (operation succeeds, limitation carries the `(n/a)` preset, committed preset and digest unchanged); a missing report, a report for other names, or a report missing a configured name fails closed before any analysis call; a report the profile did not commit fails closed. - `src/ghidra/GhidraSessionValues.test.ts`: report schema accepts both statuses in configured order and rejects an `unknown` status, an empty list, another format and undeclared fields. - `scripts/verify/ghidra/seeds.mjs` + `ReaAnalyzerOptionsRegressionProbe.java` (real Ghidra): adds the not-applicable report case and the new unknown-name message. - Base reproduction (executed, real Ghidra 12.1.4, ELF `/usr/bin/true`, `rea analyze … --provider ghidra --json`, one run per cell): | `REA_GHIDRA_DISABLED_ANALYZERS` | `main` 4eaf3a117 | this branch 74484681c | | --- | --- | --- | | unset | exit 0, `ghidra-default` | exit 0, identical JSON to main | | `Decompiler Switch Analysis` | exit 0 | exit 0, identical JSON to main | | `Objective-C Message Analyzer` | exit 1, `execution_failure` (`Unknown Ghidra analyzer for this program`) | exit 0, `(n/a)` limitation | | `Decompiler Switch Analysis,Objective-C Message Analyzer` | exit 1, `execution_failure` | exit 0, `(n/a)` limitation | | `Objective-C Mesage Analyzer` (typo) | exit 1, `execution_failure` | exit 1, `execution_failure` | "Identical" means 0 differing JSON leaf values (256 and 257 leaves). Target SHA-256 was unchanged after all runs. - User-visible CLI/MCP output: - not applicable: `Ghidra (ghidra 12.1.4) read_binary_inventory_summary: Applied analyzer preset: ghidra-default+disabled:Objective-C Message Analyzer(n/a). Ghidra did not register the (n/a) analyzers for this program, so REA_GHIDRA_DISABLED_ANALYZERS had nothing to disable for them; the analysis profile still commits every configured name.` - typo, `details.diagnostics.stdout.text`: `java.lang.IllegalArgumentException: REA_GHIDRA_DISABLED_ANALYZERS names Objective-C Mesage Analyzer, which is not an analyzer in this Ghidra installation` - Remaining proof gaps: Objective-C Mach-O target (analyzer registered and disabled on a real ObjC program) not run; Windows Ghidra lane not run. For evidence-bearing changes: - [x] Observed, derived, and inferred claims remain distinguishable. - [x] Artifact identity, source provenance, and failed attempts remain preserved. - [x] Unsupported, incomplete, unavailable, or uncertain outcomes remain visible. ## Validation performed Head 8e425dc4d (merge of `main` f86206535), Windows 11, Node 24.18.0: `npm run check:fast` and `npm run docs:check` passed. `npm run test:local` passed for `GhidraProvider.behavior.test.ts` and `GhidraSessionValues.test.ts` (161 tests). `npm run test:focused` passed for `GhidraDisabledAnalyzers.test.ts`, `ghidraLauncher.test.ts` (35 tests) and `jsonOutputOwnership.test.ts` (14 tests). Real Ghidra was not rerun on this head. The merged `main` changes under `src/ghidra/` are type renames and a test-helper refactor that do not overlap with this fix. Rebased commit 1bb98ca6f (WSL, same toolchain as below): `npm run verify:ghidra:seeds` passed; the five `rea analyze /usr/bin/true` settings gave the same results as the table above. Windows: `npm run check:fast`, `npm run docs:check` and the four focused test files (195 tests) passed. WSL Ubuntu 24.04 x86_64, Node 24.18.0, Temurin JDK 21.0.12.1, Ghidra 12.1.4 PUBLIC (20260921, release SHA-256 verified), commit 74484681c (before rebase): - `npm run verify:ghidra:seeds` — passed (41 s), including analyzer readback, the not-applicable report and the unknown-name abort before post-scripts. - `rea analyze /usr/bin/true --provider ghidra --json` × 5 settings on `main` and this branch — results in the table above. - `npm run check` — exit 0. - `npm run test:prepare && vitest run` (full suite) — 20,700 passed, 8 failed, 170 skipped. All 8 failures are host-tool gaps: `tests/boundary/filesystem/ciStaticArtifacts.test.ts` (3, `spawn zip ENOENT`) and `tests/boundary/providers/kuna/kunaVerifier.test.ts` (5, `spawn cc ENOENT`). The host has no `zip` or C compiler. The same full suite on `main` 4eaf3a117 in the same environment: 20,689 passed, 8 failed, 170 skipped. The 8 failures are the same tests with the same errors; no test fails only on this branch, which adds 11 tests. Head 424584d17 (after the maintainer merge of `main`): Linux, the four Ghidra test files passed and `npm run verify:ghidra:seeds` passed with real Ghidra 12.1.4; Windows `npm run check:fast` passed. Windows 11 host, same commit: - `npm run check:fast`, `npm run docs:check` — passed. - `npm run test:focused -- src/ghidra/GhidraProvider.behavior.test.ts src/ghidra/GhidraSessionValues.test.ts src/ghidra/GhidraDisabledAnalyzers.test.ts tests/boundary/providers/ghidra/ghidraLauncher.test.ts` — 195 passed. ## Compatibility, safety, and release - Breaking changes or migration steps: none. A configuration that previously aborted on a not-applicable name now succeeds; misspelled names still abort. - Real Hopper/Ghidra, browser, or OS coverage: real Ghidra 12.1.4 on Linux (WSL) as above; Objective-C Mach-O and Windows Ghidra not run. - Package or release metadata impact: none. - Security, privacy, process, or containment review: no new process, network or mutation authority. The pre-script additionally instantiates Ghidra's installed analyzer classes, only when a configured name is unregistered; Ghidra does the same per program during `AutoAnalysisManager` initialization. ## Author readiness <!-- The human owner completes these declarations before requesting review. The PR author is the owner by default. A different owner must explicitly accept ownership on this PR. AI agents must leave these declarations to a human to dictate to them or there could be catastrophic consequences for many users of REA. Draft PRs may leave them unchecked. These declarations record initial readiness when opening the PR for review; later pushes do not require a new human sign-off. Keep the description and validation evidence current as the work changes. See CONTRIBUTING.md#pull-request-ownership-and-readiness. --> Human owner: @vishal-tambi - [x] I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work. - [x] I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps. - [x] I declare this PR ready for initial maintainer review. ## Before merge <!-- Draft PRs may leave pending items unchecked. Resolve material scope and authority questions before integration. --> - [x] This PR addresses a concrete problem or an agreed enhancement. - [x] Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff. - [x] The PR has one focused outcome and the title follows `type(scope): outcome`. - [x] Related issue is linked, or the reason for not linking one is stated above. - [x] Tests cover changed observable behavior and meaningful failure paths. - [x] Owning docs, contracts, and generated metadata are updated where needed. - [x] User-visible CLI/MCP changes include representative output. - [x] I checked the final diff for secrets, unrelated cleanup, and unsupported claims. <!-- maintainer-blocker-review --> ### Maintainer blocker verification macOS arm64, Ghidra 12.1.4/JDK 21, Node 24.18.0/npm 11.16.0, exact head `8e425dc4da53702e787475accd89c351e74df756`: `npm run verify:ghidra:seeds` passed against the existing local Ghidra installation. Coverage includes seed ordering, out-of-range seed, BSS label/code handling, disabled-analyzer readback, unknown-analyzer abort and owned-process cleanup. This is the seed/pre-script lane, not every Ghidra format or provider workflow. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-11-01 21:44:06 +00:00
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#6926
No description provided.