[GH-ISSUE #4597] [Bug] JEB list and decompile errors identify an unrequested client inspection #2384

Closed
opened 2026-10-17 21:03:59 +00:00 by bsakaguchi · 3 comments
Owner

Originally created by @coygeek on GitHub (Oct 16, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/4597

Before submitting

  • I searched the open and closed issues for a related report.
  • I removed credentials, tokens, private paths, and sensitive target data.

Area

Native analysis or decompilation

Observed behavior

The public commands list-jeb-units and decompile-jeb-item return an unsupported_target error naming inspect_jeb_client when their primary JEB call succeeds but the following client-information probe refuses the request. Both the message and details.operation identify client inspection rather than the operation submitted by the caller. The engine refusal reason is preserved.

Reproduction

  1. For the source build, use the revision and pinned Node/npm versions listed below, run npm ci and npm run build:cached, then run this fixture from the checkout root. For the published package, run npm install --prefix release --ignore-scripts --no-audit --no-fund rea-agents@6.5.0, change directory to release/node_modules/rea-agents, and run the same fixture. Both roots contain scripts/rea.mjs. The fixture starts a loopback HTTP MCP endpoint, advertises the relevant JEB tools, and invokes the real CLI with a fresh HOME for each child and a whitelist environment. No JEB installation or target file is needed.
node --input-type=module <<'NODE'
import { createServer } from 'node:http';
import { spawn } from 'node:child_process';
import assert from 'node:assert/strict';
import { mkdtemp, mkdir, rm } from 'node:fs/promises';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
const repo = process.cwd();
const root = await mkdtemp(join(tmpdir(), 'rea-jeb-repro-'));
const scratch = root + '/';

try {
for (const operation of ['list', 'decompile']) {
  for (const mode of ['auxiliary-refusal', 'primary-refusal', 'success']) {
    const calls = [];
    const home = await mkdtemp(join(root, 'home-'));
    const server = createServer((req, res) => {
      const chunks = [];
      req.on('data', x => chunks.push(x));
      req.on('end', () => {
        if (!chunks.length) { res.writeHead(202).end(); return; }
        const m = JSON.parse(Buffer.concat(chunks));
        const send = result => res.writeHead(200, {'Content-Type':'application/json'}).end(JSON.stringify({jsonrpc:'2.0', id:m.id, result}));
        if (m.method === 'initialize') {
          send({protocolVersion:m.params.protocolVersion,capabilities:{tools:{}},serverInfo:{name:'jeb-refusal-fixture',version:'1'}}); return;
        }
        if (m.method === 'tools/list') {
          send({tools:['get_client_information','list_units','decompile_code_item'].map(name=>({name,inputSchema:{type:'object',properties:{}}}))}); return;
        }
        if (m.method === 'tools/call') {
          const name=m.params.name;
          calls.push(name);
          let payload;
          if (name === 'get_client_information') payload=mode === 'auxiliary-refusal' ? {success:false,message:'Client information temporarily refused'} : {success:true,version:'5.48.0',gui_client:false};
          else if (mode === 'primary-refusal') payload={success:false,message:'Primary operation refused'};
          else payload=name === 'list_units' ? {success:true,units:[{unit_path:'sample.dex',unit_type:'dex'}]} : {success:true,text:'int value() { return 1; }'};
          send({content:[{type:'text',text:JSON.stringify(payload)}],structuredContent:payload}); return;
        }
        res.writeHead(202).end();
      });
    });
    await new Promise(r=>server.listen(0,'127.0.0.1',r));
    try {
      const args=operation === 'list' ? ['list-jeb-units','--count','2','--json'] : ['decompile-jeb-item','LSample;->value()I','method','--unit-path','sample.dex','--json'];
      const env={PATH:process.env.PATH,HOME:home,REA_JEB_MCP_URL:`http://127.0.0.1:${server.address().port}/mcp`,REA_LOG_LEVEL:'silent'};
      const child=spawn(process.execPath,['scripts/rea.mjs',...args],{cwd:repo,env});
      let stdout='',stderr='';
      child.stdout.on('data',x=>stdout+=x);
      child.stderr.on('data',x=>stderr+=x);
      const code=await new Promise((resolve,reject)=>{child.on('error',reject);child.on('close',resolve)});
      const output=JSON.parse(stdout);
      console.log(JSON.stringify({operation,mode,calls,code,error:output.code,reportedOperation:output.details?.operation ?? output.operation,reason:output.details?.reason,message:output.message}));
      const expectedOperation=operation === 'list' ? 'list_jeb_units' : 'decompile_jeb_item';
      if (mode === 'success') { assert.equal(code,0); assert.equal(output.operation,expectedOperation); assert.deepEqual(output.raw_result,operation === 'list' ? {success:true,units:[{unit_path:'sample.dex',unit_type:'dex'}]} : {success:true,text:'int value() { return 1; }'}); }
      else { assert.equal(code,1); assert.equal(output.code,'unsupported_target'); assert.equal(output.details.operation,mode === 'auxiliary-refusal' ? 'inspect_jeb_client' : expectedOperation); assert.equal(output.details.reason,mode === 'auxiliary-refusal' ? 'Client information temporarily refused' : 'Primary operation refused'); if (mode === 'auxiliary-refusal') assert.match(output.message,/inspect_jeb_client/); }
    } finally {
      server.closeAllConnections();
      await new Promise(r=>server.close(r));
    }
  }
}
} finally { await rm(root, {recursive:true, force:true}); }
NODE
  1. Read the auxiliary-refusal output for each operation. Both traces show a successful primary call followed by get_client_information, exit code 1, and reportedOperation: "inspect_jeb_client". The primary-refusal controls identify the correct requested operations; the success controls return Evidence with those same correct operation names.
  2. Both commands reproduced the attribution error twice on each tested build. Each build also passed the four control cases, including preservation of the refusal reason and successful primary raw payload.

Expected behavior

The error should preserve the caller's requested operation, list_jeb_units or decompile_jeb_item, while preserving the engine's refusal reason. The shared workflow says callers retain their operation vocabulary, and primary-refusal controls already return the caller's operation. This report does not require REA to return successful Evidence after a failed metadata probe.

Impact and scope

The observed defect changes a machine-readable operation identity and the operation named in the diagnostic. The refused metadata probe prevents delivery of the successful primary payload in this execution. No Evidence record has been constructed at that point, so this is not loss of already retained Evidence. The reproduction covers fresh one-shot CLI providers; source inspection shows that a cached non-null engine version bypasses the auxiliary probe. Real JEB refusal frequency and downstream automated-client consequences remain unknown.

  • Impact level: P2
  • Assessment status: supported
  • Impact basis: Both public commands return the wrong typed operation identity under a bounded, reproduced upstream refusal sequence; this misattributes which requested analysis failed.
  • Workaround status: unverified
  • Workaround basis: Accepting client-information calls avoids the trigger in the controls, but no practical workaround for a real engine refusing that call was verified.

REA version

Current main source commit 0d224742808e32106e2ee93340c6755ee5e0a0db (package version 6.5.0), built from locked dependencies; separately installed published npm package rea-agents@6.5.0. The registry and GitHub latest release both identify that package version as latest.

Runtime and platform

Node.js v24.18.0; Darwin arm64. The source build used the repository-pinned npm 11.16.0 and Node runtime. No JEB installation was used.

Target and artifact context

A simulated JEB MCP endpoint returns one sample.dex unit or the text int value() { return 1; }. No real executable, project database, or artifact is opened.

Interface

CLI

Earliest failure stage

Native analysis or reconstruction

Relevant output or evidence

  • Expected source: src/application/ProviderOperationExecution.ts:33; docs/jeb-analysis.md:54; src/cli/jebCommands.ts:20
  • Failure source: src/jeb/JebProvider.ts:243
  • Evidence provenance: observed
  • Local verification: reproduced
  • Reproduction completeness: complete

Commands invoked by the fixture:

node scripts/rea.mjs list-jeb-units --count 2 --json
node scripts/rea.mjs decompile-jeb-item 'LSample;->value()I' method --unit-path sample.dex --json

Smallest meaningful output, with the same values on both tested builds (endpoint ports and expanded messages omitted):

{"operation":"list","mode":"auxiliary-refusal","calls":["list_units","get_client_information"],"code":1,"error":"unsupported_target","reportedOperation":"inspect_jeb_client"}
{"operation":"list","mode":"primary-refusal","calls":["list_units"],"code":1,"error":"unsupported_target","reportedOperation":"list_jeb_units"}
{"operation":"list","mode":"success","calls":["list_units","get_client_information"],"code":0,"reportedOperation":"list_jeb_units"}
{"operation":"decompile","mode":"auxiliary-refusal","calls":["decompile_code_item","get_client_information"],"code":1,"error":"unsupported_target","reportedOperation":"inspect_jeb_client"}
{"operation":"decompile","mode":"primary-refusal","calls":["decompile_code_item"],"code":1,"error":"unsupported_target","reportedOperation":"decompile_jeb_item"}
{"operation":"decompile","mode":"success","calls":["decompile_code_item","get_client_information"],"code":0,"reportedOperation":"decompile_jeb_item"}

Both auxiliary-refusal results retain details.reason: "Client information temporarily refused" and name inspect_jeb_client in the message. The successful controls retain the primary responses in raw_result.

Typed outcome or recovery expected

For the identical auxiliary-refusal fixture, the current result is an error with details.operation: "inspect_jeb_client". Restoration requires a failure identifying list_jeb_units for the list command and decompile_jeb_item for the decompile command, with the auxiliary refusal reason preserved. The direct-primary-refusal controls must continue to identify those requested operations, and the success controls must continue returning their complete Evidence. The fixture asserts current behavior; change its auxiliary-refusal expectation to the requested operation when checking restoration.

Analysis or suspected cause

Source-derived reasoning: the metadata refresh labels its refusal as client inspection. List and decompile call that refresh after their primary replies succeed. The outer failure handler preserves an existing typed error, so the auxiliary operation name reaches the CLI unchanged. Engine metadata is required only while the provider has no cached version.

Additional context

Live searches of open and closed issues and pull requests found no matching operation-attribution report using the command names, inspect_jeb_client, get_client_information, JEB refusal, operation, label, and metadata terms. Related #3908 concerns target-path attribution on direct refusal; #3069 concerns availability discovery; PR #3754 concerns stale-session reconnection. This reproduction verifies REA against a fake HTTP MCP endpoint and does not establish that a real JEB version emits this refusal sequence. The MCP caller path was not independently exercised.

Originally created by @coygeek on GitHub (Oct 16, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/4597 ### Before submitting - [X] I searched the open and closed issues for a related report. - [X] I removed credentials, tokens, private paths, and sensitive target data. ### Area Native analysis or decompilation ### Observed behavior The public commands `list-jeb-units` and `decompile-jeb-item` return an `unsupported_target` error naming `inspect_jeb_client` when their primary JEB call succeeds but the following client-information probe refuses the request. Both the message and `details.operation` identify client inspection rather than the operation submitted by the caller. The engine refusal reason is preserved. ### Reproduction 1. For the source build, use the revision and pinned Node/npm versions listed below, run `npm ci` and `npm run build:cached`, then run this fixture from the checkout root. For the published package, run `npm install --prefix release --ignore-scripts --no-audit --no-fund rea-agents@6.5.0`, change directory to `release/node_modules/rea-agents`, and run the same fixture. Both roots contain `scripts/rea.mjs`. The fixture starts a loopback HTTP MCP endpoint, advertises the relevant JEB tools, and invokes the real CLI with a fresh HOME for each child and a whitelist environment. No JEB installation or target file is needed. ```sh node --input-type=module <<'NODE' import { createServer } from 'node:http'; import { spawn } from 'node:child_process'; import assert from 'node:assert/strict'; import { mkdtemp, mkdir, rm } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; const repo = process.cwd(); const root = await mkdtemp(join(tmpdir(), 'rea-jeb-repro-')); const scratch = root + '/'; try { for (const operation of ['list', 'decompile']) { for (const mode of ['auxiliary-refusal', 'primary-refusal', 'success']) { const calls = []; const home = await mkdtemp(join(root, 'home-')); const server = createServer((req, res) => { const chunks = []; req.on('data', x => chunks.push(x)); req.on('end', () => { if (!chunks.length) { res.writeHead(202).end(); return; } const m = JSON.parse(Buffer.concat(chunks)); const send = result => res.writeHead(200, {'Content-Type':'application/json'}).end(JSON.stringify({jsonrpc:'2.0', id:m.id, result})); if (m.method === 'initialize') { send({protocolVersion:m.params.protocolVersion,capabilities:{tools:{}},serverInfo:{name:'jeb-refusal-fixture',version:'1'}}); return; } if (m.method === 'tools/list') { send({tools:['get_client_information','list_units','decompile_code_item'].map(name=>({name,inputSchema:{type:'object',properties:{}}}))}); return; } if (m.method === 'tools/call') { const name=m.params.name; calls.push(name); let payload; if (name === 'get_client_information') payload=mode === 'auxiliary-refusal' ? {success:false,message:'Client information temporarily refused'} : {success:true,version:'5.48.0',gui_client:false}; else if (mode === 'primary-refusal') payload={success:false,message:'Primary operation refused'}; else payload=name === 'list_units' ? {success:true,units:[{unit_path:'sample.dex',unit_type:'dex'}]} : {success:true,text:'int value() { return 1; }'}; send({content:[{type:'text',text:JSON.stringify(payload)}],structuredContent:payload}); return; } res.writeHead(202).end(); }); }); await new Promise(r=>server.listen(0,'127.0.0.1',r)); try { const args=operation === 'list' ? ['list-jeb-units','--count','2','--json'] : ['decompile-jeb-item','LSample;->value()I','method','--unit-path','sample.dex','--json']; const env={PATH:process.env.PATH,HOME:home,REA_JEB_MCP_URL:`http://127.0.0.1:${server.address().port}/mcp`,REA_LOG_LEVEL:'silent'}; const child=spawn(process.execPath,['scripts/rea.mjs',...args],{cwd:repo,env}); let stdout='',stderr=''; child.stdout.on('data',x=>stdout+=x); child.stderr.on('data',x=>stderr+=x); const code=await new Promise((resolve,reject)=>{child.on('error',reject);child.on('close',resolve)}); const output=JSON.parse(stdout); console.log(JSON.stringify({operation,mode,calls,code,error:output.code,reportedOperation:output.details?.operation ?? output.operation,reason:output.details?.reason,message:output.message})); const expectedOperation=operation === 'list' ? 'list_jeb_units' : 'decompile_jeb_item'; if (mode === 'success') { assert.equal(code,0); assert.equal(output.operation,expectedOperation); assert.deepEqual(output.raw_result,operation === 'list' ? {success:true,units:[{unit_path:'sample.dex',unit_type:'dex'}]} : {success:true,text:'int value() { return 1; }'}); } else { assert.equal(code,1); assert.equal(output.code,'unsupported_target'); assert.equal(output.details.operation,mode === 'auxiliary-refusal' ? 'inspect_jeb_client' : expectedOperation); assert.equal(output.details.reason,mode === 'auxiliary-refusal' ? 'Client information temporarily refused' : 'Primary operation refused'); if (mode === 'auxiliary-refusal') assert.match(output.message,/inspect_jeb_client/); } } finally { server.closeAllConnections(); await new Promise(r=>server.close(r)); } } } } finally { await rm(root, {recursive:true, force:true}); } NODE ``` 2. Read the `auxiliary-refusal` output for each operation. Both traces show a successful primary call followed by `get_client_information`, exit code 1, and `reportedOperation: "inspect_jeb_client"`. The `primary-refusal` controls identify the correct requested operations; the `success` controls return Evidence with those same correct operation names. 3. Both commands reproduced the attribution error twice on each tested build. Each build also passed the four control cases, including preservation of the refusal reason and successful primary raw payload. ### Expected behavior The error should preserve the caller's requested operation, `list_jeb_units` or `decompile_jeb_item`, while preserving the engine's refusal reason. The shared workflow says callers retain their operation vocabulary, and primary-refusal controls already return the caller's operation. This report does not require REA to return successful Evidence after a failed metadata probe. ### Impact and scope The observed defect changes a machine-readable operation identity and the operation named in the diagnostic. The refused metadata probe prevents delivery of the successful primary payload in this execution. No Evidence record has been constructed at that point, so this is not loss of already retained Evidence. The reproduction covers fresh one-shot CLI providers; source inspection shows that a cached non-null engine version bypasses the auxiliary probe. Real JEB refusal frequency and downstream automated-client consequences remain unknown. - Impact level: P2 - Assessment status: supported - Impact basis: Both public commands return the wrong typed operation identity under a bounded, reproduced upstream refusal sequence; this misattributes which requested analysis failed. - Workaround status: unverified - Workaround basis: Accepting client-information calls avoids the trigger in the controls, but no practical workaround for a real engine refusing that call was verified. ### REA version Current main source commit `0d224742808e32106e2ee93340c6755ee5e0a0db` (package version 6.5.0), built from locked dependencies; separately installed published npm package `rea-agents@6.5.0`. The registry and GitHub latest release both identify that package version as latest. ### Runtime and platform Node.js v24.18.0; Darwin arm64. The source build used the repository-pinned npm 11.16.0 and Node runtime. No JEB installation was used. ### Target and artifact context A simulated JEB MCP endpoint returns one `sample.dex` unit or the text `int value() { return 1; }`. No real executable, project database, or artifact is opened. ### Interface CLI ### Earliest failure stage Native analysis or reconstruction ### Relevant output or evidence - Expected source: src/application/ProviderOperationExecution.ts:33; docs/jeb-analysis.md:54; src/cli/jebCommands.ts:20 - Failure source: src/jeb/JebProvider.ts:243 - Evidence provenance: observed - Local verification: reproduced - Reproduction completeness: complete Commands invoked by the fixture: ```sh node scripts/rea.mjs list-jeb-units --count 2 --json node scripts/rea.mjs decompile-jeb-item 'LSample;->value()I' method --unit-path sample.dex --json ``` Smallest meaningful output, with the same values on both tested builds (endpoint ports and expanded messages omitted): ```json {"operation":"list","mode":"auxiliary-refusal","calls":["list_units","get_client_information"],"code":1,"error":"unsupported_target","reportedOperation":"inspect_jeb_client"} {"operation":"list","mode":"primary-refusal","calls":["list_units"],"code":1,"error":"unsupported_target","reportedOperation":"list_jeb_units"} {"operation":"list","mode":"success","calls":["list_units","get_client_information"],"code":0,"reportedOperation":"list_jeb_units"} {"operation":"decompile","mode":"auxiliary-refusal","calls":["decompile_code_item","get_client_information"],"code":1,"error":"unsupported_target","reportedOperation":"inspect_jeb_client"} {"operation":"decompile","mode":"primary-refusal","calls":["decompile_code_item"],"code":1,"error":"unsupported_target","reportedOperation":"decompile_jeb_item"} {"operation":"decompile","mode":"success","calls":["decompile_code_item","get_client_information"],"code":0,"reportedOperation":"decompile_jeb_item"} ``` Both auxiliary-refusal results retain `details.reason: "Client information temporarily refused"` and name `inspect_jeb_client` in the message. The successful controls retain the primary responses in `raw_result`. ### Typed outcome or recovery expected For the identical auxiliary-refusal fixture, the current result is an error with `details.operation: "inspect_jeb_client"`. Restoration requires a failure identifying `list_jeb_units` for the list command and `decompile_jeb_item` for the decompile command, with the auxiliary refusal reason preserved. The direct-primary-refusal controls must continue to identify those requested operations, and the success controls must continue returning their complete Evidence. The fixture asserts current behavior; change its auxiliary-refusal expectation to the requested operation when checking restoration. ### Analysis or suspected cause Source-derived reasoning: the metadata refresh labels its refusal as client inspection. List and decompile call that refresh after their primary replies succeed. The outer failure handler preserves an existing typed error, so the auxiliary operation name reaches the CLI unchanged. Engine metadata is required only while the provider has no cached version. ### Additional context Live searches of open and closed issues and pull requests found no matching operation-attribution report using the command names, `inspect_jeb_client`, `get_client_information`, JEB refusal, operation, label, and metadata terms. Related [#3908](https://github.com/morluto/rea/issues/3908) concerns target-path attribution on direct refusal; [#3069](https://github.com/morluto/rea/issues/3069) concerns availability discovery; [PR #3754](https://github.com/morluto/rea/pull/3754) concerns stale-session reconnection. This reproduction verifies REA against a fake HTTP MCP endpoint and does not establish that a real JEB version emits this refusal sequence. The MCP caller path was not independently exercised.
Author
Owner

@morluto commented on GitHub (Oct 16, 2026):

Pushed metadata fixes to main in ece277b30 and 67384b23e.

The metadata producer now receives the caller's operation. Client inspection consumes that producer's parsed facts rather than parsing/updating metadata independently. List, decompile and open-project refusals preserve the requested operation through both real CLI and SDK MCP boundaries, with the original refusal reason and successful primary raw payload controls retained.

Authoritative baseline at cd9252bc6: 6 failed, 14 passed across the CLI/MCP files. Final affected suite: 58 passed across six files. Typecheck/lint, documentation checks (including 5 tests), formatting, 1444-file test discovery and pre-push checks passed. An early test draft used the in-process CLI harness for exit status and the wrong MCP envelope shape; both were corrected before the authoritative baseline.

Related #4600 corrects unknown-version metadata caching and binds results/provider identity to selected facts under concurrent inspection. #4603 records a separate source-only cleanup ownership gap. PR3754 was reviewed for overlap; its broader reconnect integration remains separate. Upstream transport timeout/cancellation operation labels are additional follow-up scope, not claimed fixed here.

No real JEB engine or target/project execution was performed. Tests use a real loopback HTTP MCP endpoint with simulated engine replies and actual public adapters. Leaving the issue open for maintainer review.

<!-- gh-comment-id:6225579724 --> @morluto commented on GitHub (Oct 16, 2026): Pushed metadata fixes to main in ece277b30 and 67384b23e. The metadata producer now receives the caller's operation. Client inspection consumes that producer's parsed facts rather than parsing/updating metadata independently. List, decompile and open-project refusals preserve the requested operation through both real CLI and SDK MCP boundaries, with the original refusal reason and successful primary raw payload controls retained. Authoritative baseline at cd9252bc6: 6 failed, 14 passed across the CLI/MCP files. Final affected suite: 58 passed across six files. Typecheck/lint, documentation checks (including 5 tests), formatting, 1444-file test discovery and pre-push checks passed. An early test draft used the in-process CLI harness for exit status and the wrong MCP envelope shape; both were corrected before the authoritative baseline. Related #4600 corrects unknown-version metadata caching and binds results/provider identity to selected facts under concurrent inspection. #4603 records a separate source-only cleanup ownership gap. PR3754 was reviewed for overlap; its broader reconnect integration remains separate. Upstream transport timeout/cancellation operation labels are additional follow-up scope, not claimed fixed here. No real JEB engine or target/project execution was performed. Tests use a real loopback HTTP MCP endpoint with simulated engine replies and actual public adapters. Leaving the issue open for maintainer review.
Author
Owner

@morluto commented on GitHub (Oct 16, 2026):

Additional same-family attribution fix: d74e72406 projects typed catalog/tool timeouts to the caller-selected REA operation, preserving the exact cause, deadline budget, partial facts, cleanup dependencies and provider-authored guidance. Previously these paths exposed jeb_mcp_catalog or upstream tool names.

Four controlled real SDK/HTTP cases fail before the fix: catalog and tool timeout for both inspect_jeb_client and list_jeb_units. They pass after the fix. A separate control preserves provider-authored timeout guidance added by the intervening Ghidra change. Final rebased validation: 189 tests across ten affected files, including existing CLI/MCP attribution workflows and Ghidra regressions; typecheck/lint, docs, formatting, discovery and pre-push checks pass.

No real JEB engine, target execution or native-provider verification claimed. Related cleanup/cancellation evidence is recorded on #4603. No issue closure or PR merge performed.

<!-- gh-comment-id:6225938380 --> @morluto commented on GitHub (Oct 16, 2026): Additional same-family attribution fix: d74e72406 projects typed catalog/tool timeouts to the caller-selected REA operation, preserving the exact cause, deadline budget, partial facts, cleanup dependencies and provider-authored guidance. Previously these paths exposed `jeb_mcp_catalog` or upstream tool names. Four controlled real SDK/HTTP cases fail before the fix: catalog and tool timeout for both `inspect_jeb_client` and `list_jeb_units`. They pass after the fix. A separate control preserves provider-authored timeout guidance added by the intervening Ghidra change. Final rebased validation: 189 tests across ten affected files, including existing CLI/MCP attribution workflows and Ghidra regressions; typecheck/lint, docs, formatting, discovery and pre-push checks pass. No real JEB engine, target execution or native-provider verification claimed. Related cleanup/cancellation evidence is recorded on #4603. No issue closure or PR merge performed.
Author
Owner

@coygeek commented on GitHub (Oct 18, 2026):

Closing as addressed on main by ece277b30, 67384b23e, d74e72406. JEB metadata probes now carry the requested list/decompile operation instead of reporting inspect_jeb_client, preserving refusal reasons. Follow-up main commits also retain selected metadata facts and attribute transport timeouts to callers. I verified the committed source and regression coverage; I have not rerun the runtime reproduction.

<!-- gh-comment-id:6244122011 --> @coygeek commented on GitHub (Oct 18, 2026): Closing as addressed on `main` by [ece277b30](https://github.com/morluto/rea/commit/ece277b30ba2934084913078bba810a521e61a46), [67384b23e](https://github.com/morluto/rea/commit/67384b23e56e95da780d73f8e019f9c1585652f8), [d74e72406](https://github.com/morluto/rea/commit/d74e72406ad6b962160cc93c2ce44134a93b987e). JEB metadata probes now carry the requested list/decompile operation instead of reporting inspect_jeb_client, preserving refusal reasons. Follow-up main commits also retain selected metadata facts and attribute transport timeouts to callers. I verified the committed source and regression coverage; I have not rerun the runtime reproduction.
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#2384
No description provided.