[PR #6422] feat(ghidra): admit PS2 Emotion Engine executables through ghidra-emotionengine-reloaded #7349

Open
opened 2026-11-01 21:47:14 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/6422
Author: @Kendy619
Created: 10/23/2026
Status: 🔄 Open

Base: main ← Head: pr/ghidra-ps2-emotion-engine


📝 Commits (8)

  • 97df28c refactor(ghidra): share processor-extension inspection between profiles
  • c331bae feat(ghidra): admit PS2 Emotion Engine executables through ghidra-emotionengine-reloaded
  • 2a45710 test(ghidra): verify PS2 executables through real CLI/MCP workflows
  • 379c477 docs(ghidra): document the PS2 Emotion Engine profile
  • 9586137 test(ghidra): make the PS2SDK fixture build path-independent
  • f39592a docs(ghidra): record the reproducible PS2 fixture digests
  • a1dfb7e perf(ghidra): shorten the PS2 limitations repeated in every response
  • 61f7b8d docs(ghidra): record the PS2 profile on caller-owned retail executables

📊 Changes

24 files changed (+2457 additions, -402 deletions)

View changed files

📝 docs/ghidra-mips.md (+2 -0)
➕ docs/ghidra-ps2.md (+166 -0)
📝 docs/index.md (+1 -1)
📝 scripts/verify-real-ghidra-mips.mjs (+167 -42)
📝 src/ghidra/GhidraAnalysisProfile.ts (+31 -0)
📝 src/ghidra/GhidraLauncher.ts (+102 -34)
➕ src/ghidra/GhidraProcessorExtension.ts (+375 -0)
📝 src/ghidra/GhidraProvider.ts (+8 -4)
📝 src/ghidra/GhidraProviderClient.ts (+42 -0)
➕ src/ghidra/GhidraPs2Extension.ts (+95 -0)
➕ src/ghidra/GhidraPs2Profile.ts (+146 -0)
📝 src/ghidra/GhidraPspExtension.ts (+46 -304)
📝 src/ghidra/GhidraPspProfile.ts (+6 -1)
➕ tests/boundary/filesystem/ghidraPs2Extension.test.ts (+616 -0)
📝 tests/conformance/ghidra/mips-checks.d.mts (+6 -1)
📝 tests/conformance/ghidra/mips-checks.mjs (+22 -15)
➕ tests/conformance/ghidra/ps2-checks.test.ts (+165 -0)
➕ tests/conformance/ghidra/ps2-fixture.d.mts (+25 -0)
➕ tests/conformance/ghidra/ps2-fixture.mjs (+357 -0)
➕ tests/conformance/ps2/Makefile (+24 -0)

...and 4 more files

📄 Description

Summary

Every provider refuses PlayStation 2 Emotion Engine executables: MIPS ELF32
files that declare EF_MIPS_MACH_5900 fail with "Machine-specific MIPS
variants … need a separately supported processor profile". This adds a bounded
PS2 profile to the existing Ghidra provider, following the PSP precedent. REA
pins the language of the caller-installed
ghidra-emotionengine-reloaded
extension and fingerprints the extension, but never installs it.

Related: #5240 takes a similar approach for legacy ee-gcc retail executables.
This PR is kept separate so each can be reviewed on its own. The differences
are listed under "Change and scope".

Problem and expected behavior

rea function <PS2 ELF> <name> --provider ghidra fails with
architecture_unsupported. With the extension installed and its r5900.sla
precompiled, CLI and MCP:

  • resolve lane ps2-ee-elf32-exec-r5900-v1;
  • import with ElfLoader / r5900:LE:32:default / default;
  • serve the ordinary inventory, instruction, reference, string and function
    operations.

Without the extension they fail with PS2_EXTENSION_UNAVAILABLE and an
installation remedy.

Change and scope

  • GhidraProcessorExtension.ts: the PSP extension inspection, generalized and
    parameterized by id, label, profile, failure code, required files and an
    optional installed-state check. PSP exports, messages and identity are
    unchanged.

  • GhidraPs2Profile.ts / GhidraPs2Extension.ts: admission and the extension
    spec. Admitted targets run on Linux x64 hosts and are little-endian ELF32
    ET_EXEC, R5900 machine, MIPS III, with only NOREORDER/CPIC hints, and
    either:

    • n32 with the R5900 ABI flags record that PS2SDK emits (ps2dev v2.0.0), or
    • EABI64 (legacy-SDK shape) with that record, or with the record absent
      after every declaration table was inspected.

    Everything else is refused: o32/EABI32/mixed ABIs, PIC/ASE/FP64/NAN2008,
    unknown records, incomplete or carved inspections, and caller language
    overrides.

  • Precompiled SLEIGH requirement. Release archives ship only sources, and
    Ghidra 12.1 SleighLanguage recompiles a missing, wrong-format or stale
    .sla inside the installation. REA refuses an r5900.sla without the
    format-4 header or older than its .slaspec/.sinc sources. Analysis
    therefore never modifies the installation, and the fingerprint stays stable.

  • Wiring:

    • processor dispatcher and analysis profile;
    • provider host check;
    • provider client: expected language at handshake, Evidence limitations;
    • launcher: re-inspection before launch.

    The PS2 limitations are kept short because every response repeats them.

  • tests/conformance/ps2/ fixtures, --ps2 / --ps2-missing-extension modes
    for scripts/verify-real-ghidra-mips.mjs, and docs/ghidra-ps2.md.

Not included: IRX/ERX, relocatable or shared images, ISO and other
containers, runtime overlays, VU microprograms, emulation, non-Linux-x64
hosts, and static recompilation.

Differences from #5240:

  1. This PR admits current PS2SDK n32 homebrew. #5240 refuses it because it
    carries an ABI flags record.
  2. It requires a precompiled, fresh r5900.sla instead of letting Ghidra
    write into the installation.
  3. It uses reproducible source-owned fixtures with a real CLI/MCP verifier.

#5240 also admits an unspecified-ABI header. This PR does not, because no
producer evidence for that shape was available.

Contract and boundary impact

  • Semantic owner and earliest changed stage: Ghidra target admission
    (ghidraProcessorUnsupportedReason), then analysis-profile resolution.
  • Contribution scope fit and linked maintainer decision: static decompilation
    of a new processor family through an existing provider. No maintainer
    decision yet; feedback welcome.
  • CLI and MCP/tool-catalog contract: unchanged, apart from newly admitted
    targets and the new failure code PS2_EXTENSION_UNAVAILABLE.
  • Provider, bridge, target-format, or platform compatibility: Ghidra only,
    Linux x64 only; bridge unchanged. Generic MIPS, PSP and IOP (R3000)
    headers keep their lanes or refusals.
  • Evidence, artifact, provenance, or reconstruction contract:
    • new profile parameters: mips_support_lane, ps2_abi_declaration,
      ps2_extension, and the pinned loader, language and compiler;
    • five PS2 limitations, plus one for a recordless EABI64 header.
  • Target selection, authority, upstream behavior, and cleanup details: not
    applicable (static import; ephemeral project as before).
  • Generated metadata, package, or installation impact: none.

Expected effects:

  • Read existing files or captured data.
  • Launch or attach to a process.
  • Inject instrumentation or run scripts/code. Note: for .mdebug targets,
    the caller-installed extension's STABS analyzer runs its bundled
    stdump, as installed Ghidra code. This is documented and can be
    disabled with REA_GHIDRA_DISABLED_ANALYZERS.
  • 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:
    • tests/boundary/filesystem/ghidraPs2Extension.test.ts;
    • tests/conformance/ghidra/ps2-checks.test.ts;
    • tests/conformance/ghidra/mips-checks.mjs, which now accepts a null ABI
      record.
  • Base reproduction or other evidence: on the base revision, both PS2
    fixtures are refused as machine-specific MIPS variants.
  • Real provider, both fixtures (PS2SDK n32 e312d08b…, legacy EABI64
    dcc503da…):
    • observed r5900:LE:32:default / default;
    • exact bytes and mnemonics of li, paddw, pcpyld, three-operand
      mult and vadd.xyzw;
    • caller, call-site xref, global xref, and the marker string together with
      its EE RAM mirrors;
    • snapshot reopen, A-B-A target switch and CLI Evidence;
    • process lineage verified with no descendants.
  • Caller-owned retail executables (outside the suite; no game data in the
    repository). This was 11 EE executables from 7 discs: 6 USA titles from
    2003–2006 and one modified disc.
    • All 11 declare the legacy-SDK EABI64 shape (0x20924000/0x20924001)
      with no record and are admitted.
    • All 7 boot executables analyze as r5900:LE:32:default and their entry
      functions decompile. They have 4,183–28,022 procedures each.
    • One title built with Metrowerks CodeWarrior has all 4,183 function names
      recovered from its symbol table; its runtime overlay sections stay outside
      the image, as documented.
    • Two tasks hit REA's general 10 MiB MCP response budget rather than a
      profile limit: a 28k-function string list, and the load image of the
      CodeWarrior title with 56,477 relocations. A separate issue will propose
      smaller responses.
    • For one title, God Hand, the boot ELF SHA-256 equals the public
      god-hand-decomp record. With that project's function list as
      REA_GHIDRA_SEED_FILE seeds:
      • all 10,122 decomp function starts are found, and 2,922/2,922 names sit
        at the exact address;
      • call sites match raw jal decoding (902/902 on the most-called
        function);
      • the callees of 19 functions with matched C equal that C (85/85).
  • Remaining proof gaps:
    • carved PS2 images and non-EABI64 retail header shapes not observed;
    • only Ghidra 12.1.3 with extension v2.1.38;
    • no CI lane with the extension;
    • reopening a snapshot re-runs auto-analysis (about 150 s for a 2.8 MB
      .text).

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

All on this branch, rebased onto main 47353e494; the branch also merges cleanly with b7f8bbb49, whose 5 newer commits touch no PS2, Ghidra, ELF or MIPS files. Environment: WSL2 Ubuntu
24.04 (Linux x64), Node 24.18, Temurin JDK 21, Ghidra 12.1.3.

  • npm ci && npm run build:cached — passed.
  • npm run check — passed (lint 0 errors, module boundaries, architecture guards).
  • npm run test:focused -- <34 Ghidra extension/conformance/provider test files> — 945 passed, 1 skipped.
  • node scripts/verify-real-ghidra-mips.mjs --ps2 — passed (256 s).
  • node scripts/verify-real-ghidra-mips.mjs --ps2-missing-extension — passed.
  • node scripts/verify-real-ghidra-mips.mjs --psp (ghidra-allegrex v21.4, PSPDEV v20261001) — passed (186 s); --psp-missing-extension — passed.
  • npm run docs:check / npm run verify:test-discovery — passed (re-run for the docs update).
  • Generic MIPS verifier (Clang/LLD 18.1.3), on the pre-rebase branch with the EE
    and Allegrex extensions installed — passed for 6 fixtures. The generic
    MIPS32r2 control is still observed as MIPS:LE:32:default, and the
    IOP-shaped R3000 ELF is still refused.
  • Full npm run check:pr on the pre-rebase branch: 18 tests in 10 files
    failed. All of them are outside Ghidra/MIPS/PSP/PS2 and fail identically, or
    flakily, on unmodified main in this environment (Kuna, WindowsHandleClose,
    ciStaticArtifacts, runtime URL mapping, mutation workflow, symlink race).

Compatibility, safety, and release

  • Breaking changes or migration steps: none.
  • Real Hopper/Ghidra, browser, or OS coverage: Ghidra 12.1.3, Temurin JDK 21,
    Linux x64 (WSL2). Windows and macOS hosts are refused for this profile.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: same model as PSP. The
    extension is identified by content, not signed or sandboxed. The .sla
    freshness rule keeps analysis from writing into the installation.

Author readiness

Human owner:

  • 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.

🔄 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/6422 **Author:** [@Kendy619](https://github.com/Kendy619) **Created:** 10/23/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `pr/ghidra-ps2-emotion-engine` --- ### 📝 Commits (8) - [`97df28c`](https://github.com/morluto/rea/commit/97df28ce2d8ac2fcc662c791abf70799d0caebc1) refactor(ghidra): share processor-extension inspection between profiles - [`c331bae`](https://github.com/morluto/rea/commit/c331baec8786b35159c51be0856902fcc72faf53) feat(ghidra): admit PS2 Emotion Engine executables through ghidra-emotionengine-reloaded - [`2a45710`](https://github.com/morluto/rea/commit/2a457109e8b8d9d1f486b91dd131f2f2f3fa7f88) test(ghidra): verify PS2 executables through real CLI/MCP workflows - [`379c477`](https://github.com/morluto/rea/commit/379c477c74744b02988ec453690d6e1d52d358f9) docs(ghidra): document the PS2 Emotion Engine profile - [`9586137`](https://github.com/morluto/rea/commit/9586137c86161dddd688fe4beb2f771b232c032b) test(ghidra): make the PS2SDK fixture build path-independent - [`f39592a`](https://github.com/morluto/rea/commit/f39592abe076927323b885d24cc00ea6c4acd7dc) docs(ghidra): record the reproducible PS2 fixture digests - [`a1dfb7e`](https://github.com/morluto/rea/commit/a1dfb7e2b05c403b703a0f6ee63668ac78073b98) perf(ghidra): shorten the PS2 limitations repeated in every response - [`61f7b8d`](https://github.com/morluto/rea/commit/61f7b8d526c58db7db0f9729a18fc7fd133af75e) docs(ghidra): record the PS2 profile on caller-owned retail executables ### 📊 Changes **24 files changed** (+2457 additions, -402 deletions) <details> <summary>View changed files</summary> 📝 `docs/ghidra-mips.md` (+2 -0) ➕ `docs/ghidra-ps2.md` (+166 -0) 📝 `docs/index.md` (+1 -1) 📝 `scripts/verify-real-ghidra-mips.mjs` (+167 -42) 📝 `src/ghidra/GhidraAnalysisProfile.ts` (+31 -0) 📝 `src/ghidra/GhidraLauncher.ts` (+102 -34) ➕ `src/ghidra/GhidraProcessorExtension.ts` (+375 -0) 📝 `src/ghidra/GhidraProvider.ts` (+8 -4) 📝 `src/ghidra/GhidraProviderClient.ts` (+42 -0) ➕ `src/ghidra/GhidraPs2Extension.ts` (+95 -0) ➕ `src/ghidra/GhidraPs2Profile.ts` (+146 -0) 📝 `src/ghidra/GhidraPspExtension.ts` (+46 -304) 📝 `src/ghidra/GhidraPspProfile.ts` (+6 -1) ➕ `tests/boundary/filesystem/ghidraPs2Extension.test.ts` (+616 -0) 📝 `tests/conformance/ghidra/mips-checks.d.mts` (+6 -1) 📝 `tests/conformance/ghidra/mips-checks.mjs` (+22 -15) ➕ `tests/conformance/ghidra/ps2-checks.test.ts` (+165 -0) ➕ `tests/conformance/ghidra/ps2-fixture.d.mts` (+25 -0) ➕ `tests/conformance/ghidra/ps2-fixture.mjs` (+357 -0) ➕ `tests/conformance/ps2/Makefile` (+24 -0) _...and 4 more files_ </details> ### 📄 Description ## Summary Every provider refuses PlayStation 2 Emotion Engine executables: MIPS ELF32 files that declare `EF_MIPS_MACH_5900` fail with "Machine-specific MIPS variants … need a separately supported processor profile". This adds a bounded PS2 profile to the existing Ghidra provider, following the PSP precedent. REA pins the language of the caller-installed [ghidra-emotionengine-reloaded](https://github.com/chaoticgd/ghidra-emotionengine-reloaded) extension and fingerprints the extension, but never installs it. Related: #5240 takes a similar approach for legacy ee-gcc retail executables. This PR is kept separate so each can be reviewed on its own. The differences are listed under "Change and scope". ## Problem and expected behavior `rea function <PS2 ELF> <name> --provider ghidra` fails with `architecture_unsupported`. With the extension installed and its `r5900.sla` precompiled, CLI and MCP: - resolve lane `ps2-ee-elf32-exec-r5900-v1`; - import with `ElfLoader` / `r5900:LE:32:default` / `default`; - serve the ordinary inventory, instruction, reference, string and function operations. Without the extension they fail with `PS2_EXTENSION_UNAVAILABLE` and an installation remedy. ## Change and scope - `GhidraProcessorExtension.ts`: the PSP extension inspection, generalized and parameterized by id, label, profile, failure code, required files and an optional installed-state check. PSP exports, messages and identity are unchanged. - `GhidraPs2Profile.ts` / `GhidraPs2Extension.ts`: admission and the extension spec. Admitted targets run on Linux x64 hosts and are little-endian ELF32 `ET_EXEC`, R5900 machine, MIPS III, with only NOREORDER/CPIC hints, and either: - n32 with the R5900 ABI flags record that PS2SDK emits (ps2dev v2.0.0), or - EABI64 (legacy-SDK shape) with that record, or with the record absent after every declaration table was inspected. Everything else is refused: o32/EABI32/mixed ABIs, PIC/ASE/FP64/NAN2008, unknown records, incomplete or carved inspections, and caller language overrides. - Precompiled SLEIGH requirement. Release archives ship only sources, and Ghidra 12.1 `SleighLanguage` recompiles a missing, wrong-format or stale `.sla` inside the installation. REA refuses an `r5900.sla` without the format-4 header or older than its `.slaspec`/`.sinc` sources. Analysis therefore never modifies the installation, and the fingerprint stays stable. - Wiring: - processor dispatcher and analysis profile; - provider host check; - provider client: expected language at handshake, Evidence limitations; - launcher: re-inspection before launch. The PS2 limitations are kept short because every response repeats them. - `tests/conformance/ps2/` fixtures, `--ps2` / `--ps2-missing-extension` modes for `scripts/verify-real-ghidra-mips.mjs`, and `docs/ghidra-ps2.md`. Not included: IRX/ERX, relocatable or shared images, ISO and other containers, runtime overlays, VU microprograms, emulation, non-Linux-x64 hosts, and static recompilation. Differences from #5240: 1. This PR admits current PS2SDK n32 homebrew. #5240 refuses it because it carries an ABI flags record. 2. It requires a precompiled, fresh `r5900.sla` instead of letting Ghidra write into the installation. 3. It uses reproducible source-owned fixtures with a real CLI/MCP verifier. #5240 also admits an unspecified-ABI header. This PR does not, because no producer evidence for that shape was available. ## Contract and boundary impact - Semantic owner and earliest changed stage: Ghidra target admission (`ghidraProcessorUnsupportedReason`), then analysis-profile resolution. - Contribution scope fit and linked maintainer decision: static decompilation of a new processor family through an existing provider. No maintainer decision yet; feedback welcome. - CLI and MCP/tool-catalog contract: unchanged, apart from newly admitted targets and the new failure code `PS2_EXTENSION_UNAVAILABLE`. - Provider, bridge, target-format, or platform compatibility: Ghidra only, Linux x64 only; bridge unchanged. Generic MIPS, PSP and IOP (R3000) headers keep their lanes or refusals. - Evidence, artifact, provenance, or reconstruction contract: - new profile parameters: `mips_support_lane`, `ps2_abi_declaration`, `ps2_extension`, and the pinned loader, language and compiler; - five PS2 limitations, plus one for a recordless EABI64 header. - Target selection, authority, upstream behavior, and cleanup details: not applicable (static import; ephemeral project as before). - Generated metadata, package, or installation impact: none. Expected effects: - [x] Read existing files or captured data. - [ ] Launch or attach to a process. - [ ] Inject instrumentation or run scripts/code. Note: for `.mdebug` targets, the caller-installed extension's STABS analyzer runs its bundled `stdump`, as installed Ghidra code. This is documented and can be disabled with `REA_GHIDRA_DISABLED_ANALYZERS`. - [ ] 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: - `tests/boundary/filesystem/ghidraPs2Extension.test.ts`; - `tests/conformance/ghidra/ps2-checks.test.ts`; - `tests/conformance/ghidra/mips-checks.mjs`, which now accepts a null ABI record. - Base reproduction or other evidence: on the base revision, both PS2 fixtures are refused as machine-specific MIPS variants. - Real provider, both fixtures (PS2SDK n32 `e312d08b…`, legacy EABI64 `dcc503da…`): - observed `r5900:LE:32:default` / `default`; - exact bytes and mnemonics of `li`, `paddw`, `pcpyld`, three-operand `mult` and `vadd.xyzw`; - caller, call-site xref, global xref, and the marker string together with its EE RAM mirrors; - snapshot reopen, A-B-A target switch and CLI Evidence; - process lineage verified with no descendants. - Caller-owned retail executables (outside the suite; no game data in the repository). This was 11 EE executables from 7 discs: 6 USA titles from 2003–2006 and one modified disc. - All 11 declare the legacy-SDK EABI64 shape (`0x20924000`/`0x20924001`) with no record and are admitted. - All 7 boot executables analyze as `r5900:LE:32:default` and their entry functions decompile. They have 4,183–28,022 procedures each. - One title built with Metrowerks CodeWarrior has all 4,183 function names recovered from its symbol table; its runtime overlay sections stay outside the image, as documented. - Two tasks hit REA's general 10 MiB MCP response budget rather than a profile limit: a 28k-function string list, and the load image of the CodeWarrior title with 56,477 relocations. A separate issue will propose smaller responses. - For one title, God Hand, the boot ELF SHA-256 equals the public god-hand-decomp record. With that project's function list as `REA_GHIDRA_SEED_FILE` seeds: - all 10,122 decomp function starts are found, and 2,922/2,922 names sit at the exact address; - call sites match raw `jal` decoding (902/902 on the most-called function); - the callees of 19 functions with matched C equal that C (85/85). - Remaining proof gaps: - carved PS2 images and non-EABI64 retail header shapes not observed; - only Ghidra 12.1.3 with extension v2.1.38; - no CI lane with the extension; - reopening a snapshot re-runs auto-analysis (about 150 s for a 2.8 MB `.text`). 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 All on this branch, rebased onto `main` `47353e494`; the branch also merges cleanly with `b7f8bbb49`, whose 5 newer commits touch no PS2, Ghidra, ELF or MIPS files. Environment: WSL2 Ubuntu 24.04 (Linux x64), Node 24.18, Temurin JDK 21, Ghidra 12.1.3. - `npm ci && npm run build:cached` — passed. - `npm run check` — passed (lint 0 errors, module boundaries, architecture guards). - `npm run test:focused -- <34 Ghidra extension/conformance/provider test files>` — 945 passed, 1 skipped. - `node scripts/verify-real-ghidra-mips.mjs --ps2` — passed (256 s). - `node scripts/verify-real-ghidra-mips.mjs --ps2-missing-extension` — passed. - `node scripts/verify-real-ghidra-mips.mjs --psp` (ghidra-allegrex v21.4, PSPDEV v20261001) — passed (186 s); `--psp-missing-extension` — passed. - `npm run docs:check` / `npm run verify:test-discovery` — passed (re-run for the docs update). - Generic MIPS verifier (Clang/LLD 18.1.3), on the pre-rebase branch with the EE and Allegrex extensions installed — passed for 6 fixtures. The generic MIPS32r2 control is still observed as `MIPS:LE:32:default`, and the IOP-shaped R3000 ELF is still refused. - Full `npm run check:pr` on the pre-rebase branch: 18 tests in 10 files failed. All of them are outside Ghidra/MIPS/PSP/PS2 and fail identically, or flakily, on unmodified `main` in this environment (Kuna, WindowsHandleClose, ciStaticArtifacts, runtime URL mapping, mutation workflow, symlink race). ## Compatibility, safety, and release - Breaking changes or migration steps: none. - Real Hopper/Ghidra, browser, or OS coverage: Ghidra 12.1.3, Temurin JDK 21, Linux x64 (WSL2). Windows and macOS hosts are refused for this profile. - Package or release metadata impact: none. - Security, privacy, process, or containment review: same model as PSP. The extension is identified by content, not signed or sandboxed. The `.sla` freshness rule keeps analysis from writing into the installation. ## Author readiness Human owner: <!-- @GitHub-handle --> - [ ] 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. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
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#7349
No description provided.