From c2a6f4bc437671c25ba318d21b82818c8e6bf2ce Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Tue, 29 Sep 2026 11:38:16 +0800 Subject: [PATCH] refactor(ghidra): remove redundant schema markers --- AGENTS.md | 2 +- bridge/ghidra/ReaGhidraBridge.java | 5 -- .../providers/ghidra/ghidraLauncher.test.ts | 64 +++++++++++-------- 3 files changed, 39 insertions(+), 32 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index e938846f8..48a47f43d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -78,7 +78,7 @@ See [docs/architecture.mermaid](docs/architecture.mermaid) for a visual architec - `npm run verify:browser`: build and run the real Chrome verifier against `REA_BROWSER_EXECUTABLE` or a platform-default Chrome-family executable, including browser-scenario CLI parity, attach disconnect-only ownership, launched-process termination, and temporary-profile cleanup. - `npm run verify:inspector`: build and run the real attach-only Node Inspector verifier through the public CLI. - `npm run verify:managed`: build and run the source-owned managed PE/CLI conformance verifier for artifact triage, member inspection, managed/native boundary declarations, token drift comparison, malformed metadata, non-managed degradation, managed application-graph projection, manifest-verifier self-test, and optional BYO ILSpy oracle checks; set `REA_MANAGED_APP_MANIFEST_PATH` to verify an operator-local managed app manifest, including optional graph/trace assertions, and set `REA_ILSPY_CMD_PATH` to an absolute `ilspycmd` path to run the real ILSpy reconstruction oracle. -- `npm run evidence:generate`: regenerate the managed conformance manifest and Evidence v2 completion ledger from live verifier output. +- `npm run evidence:generate`: regenerate the managed conformance manifest and evidence completion ledger from live verifier output. - `npm run evidence:check`: rerun managed conformance and fail on generated manifest, completion ledger, or bundled skill drift. - `npm run verify:replay`: build and run the real Linux Bubblewrap/seccomp/cgroup verifier against source-owned replay fixtures; set `REA_REPLAY_INPUT_PATH` to verify an operator-local manifest. - `npm run verify:package`: pack and test the CLI, setup transaction, skill, and canonical target-free MCP catalog in an isolated environment. diff --git a/bridge/ghidra/ReaGhidraBridge.java b/bridge/ghidra/ReaGhidraBridge.java index 3460ee4a1..cfcbedf5e 100644 --- a/bridge/ghidra/ReaGhidraBridge.java +++ b/bridge/ghidra/ReaGhidraBridge.java @@ -85,7 +85,6 @@ public final class ReaGhidraBridge extends HeadlessScript { private static final int DECOMPILE_PAYLOAD_MBYTES = 8; private static final Gson GSON = new GsonBuilder().serializeNulls().create(); private static final Set DESCRIPTOR_KEYS = Set.of( - "schema_version", "transport", "endpoint_path", "token", @@ -203,7 +202,6 @@ public final class ReaGhidraBridge extends HeadlessScript { server.bind(new InetSocketAddress(InetAddress.getByName("127.0.0.1"), 0)); InetSocketAddress address = (InetSocketAddress) server.getLocalAddress(); JsonObject endpoint = new JsonObject(); - endpoint.addProperty("schema_version", 1); endpoint.addProperty("host", "127.0.0.1"); endpoint.addProperty("port", address.getPort()); Files.writeString( @@ -1749,9 +1747,6 @@ public final class ReaGhidraBridge extends HeadlessScript { JsonParser.parseString(Files.readString(path, StandardCharsets.UTF_8)), DESCRIPTOR_KEYS ); - if (requireInteger(object, "schema_version") != 2) { - throw new IllegalArgumentException("REA session descriptor version is invalid"); - } return new SessionDescriptor( requireString(object, "transport"), requireString(object, "endpoint_path"), diff --git a/tests/boundary/providers/ghidra/ghidraLauncher.test.ts b/tests/boundary/providers/ghidra/ghidraLauncher.test.ts index 63d9d93a5..69f756230 100644 --- a/tests/boundary/providers/ghidra/ghidraLauncher.test.ts +++ b/tests/boundary/providers/ghidra/ghidraLauncher.test.ts @@ -22,6 +22,39 @@ const fixturePath = fileURLToPath( ); const roots: string[] = []; +const expectIsolatedEnvironment = ( + environment: Record, + runtimeRoot: string, + javaHome: string, +) => { + expect(environment).toMatchObject({ + HOME: join(runtimeRoot, "home"), + ...(process.platform === "win32" + ? { + USERPROFILE: join(runtimeRoot, "home"), + TEMP: join(runtimeRoot, "tmp"), + TMP: join(runtimeRoot, "tmp"), + } + : {}), + TMPDIR: join(runtimeRoot, "tmp"), + XDG_CACHE_HOME: join(runtimeRoot, "cache"), + XDG_CONFIG_HOME: join(runtimeRoot, "config"), + XDG_DATA_HOME: join(runtimeRoot, "data"), + GHIDRA_HEADLESS_MAXMEM: "2G", + GHIDRA_JAVA_OPTIONS: "", + JAVA_TOOL_OPTIONS: "", + JDK_JAVA_OPTIONS: "", + _JAVA_OPTIONS: "", + JAVA_HOME: javaHome, + REA_PROCESS_RUN_ID: "d6fcbb66-e829-4ff6-a535-0035aec63139", + }); + expect(environment.PATH).toMatch( + process.platform === "win32" + ? /^C:\\Java\\jdk-21\\bin;/u + : /^\/opt\/jdk-21\/bin:/u, + ); +}; + beforeAll(async () => { if (process.platform !== "win32") await chmod(fixturePath, 0o755); }); @@ -139,40 +172,19 @@ describe("Ghidra headless launcher", () => { const capturePath = join(runtimeRoot, "launch-capture.json"); await waitFor(capturePath); const capture = JSON.parse(await readFile(capturePath, "utf8")); + const descriptor = JSON.parse( + await readFile(join(runtimeRoot, "session.json"), "utf8"), + ); const encodedArguments = JSON.stringify(capture.arguments); const encodedEnvironment = JSON.stringify(capture.environment); + expect(descriptor).not.toHaveProperty("schema_version"); expect(encodedArguments).not.toContain(token); expect(encodedEnvironment).not.toContain(token); expect(capture).toMatchObject({ ...(process.platform === "win32" ? {} : { descriptor_mode: 0o600 }), descriptor_has_token: true, - environment: { - HOME: join(runtimeRoot, "home"), - ...(process.platform === "win32" - ? { - USERPROFILE: join(runtimeRoot, "home"), - TEMP: join(runtimeRoot, "tmp"), - TMP: join(runtimeRoot, "tmp"), - } - : {}), - TMPDIR: join(runtimeRoot, "tmp"), - XDG_CACHE_HOME: join(runtimeRoot, "cache"), - XDG_CONFIG_HOME: join(runtimeRoot, "config"), - XDG_DATA_HOME: join(runtimeRoot, "data"), - GHIDRA_HEADLESS_MAXMEM: "2G", - GHIDRA_JAVA_OPTIONS: "", - JAVA_TOOL_OPTIONS: "", - JDK_JAVA_OPTIONS: "", - _JAVA_OPTIONS: "", - JAVA_HOME: javaHome, - REA_PROCESS_RUN_ID: "d6fcbb66-e829-4ff6-a535-0035aec63139", - }, }); - expect(capture.environment.PATH).toMatch( - process.platform === "win32" - ? /^C:\\Java\\jdk-21\\bin;/u - : /^\/opt\/jdk-21\/bin:/u, - ); + expectIsolatedEnvironment(capture.environment, runtimeRoot, javaHome); expect(capture.environment.GHIDRA_HEADLESS_JAVA_OPTIONS).toContain( `-Duser.home=${join(runtimeRoot, "home")}`, );