[GH-ISSUE #7406] [Bug] extract-artifact and three artifact inspections select the working directory for an empty target #4411

Open
opened 2026-10-31 00:49:35 +00:00 by bsakaguchi · 0 comments
Owner

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

Before submitting

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

Area

CLI

Observed behavior

With a synthetic application bundle as the working directory, extract-artifact "" --json, inspect-asset-catalog "" --json, decode-interface-builder "" --json and trace-dylib-resolution "" --json each exited 0 and returned Evidence for that bundle or its executable. The responses retained both parameters.input_path: "" and caller_input_path: "". Extraction also created copies of the bundle's plist and executable, whose bytes matched the fixture. Explicit . selected the same targets. The sibling control inspect-artifact "" --json rejected the empty input with exit 1 and VALIDATION_ERROR naming path.

Reproduction

  1. From the specified baseline checkout with locked dependencies and its built dispatcher available, select Node 24.22.1 and run the following shell command. It creates a fresh empty temporary directory, isolates HOME and TMPDIR, authors the bundle inline, compiles an inert executable using the macOS command-line tools and removes all generated files afterward. The fixture executable is never run.
node --input-type=module <<'JS'
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, realpathSync, existsSync, readFileSync } from 'node:fs';
import { join, resolve, relative } from 'node:path';
import { tmpdir } from 'node:os';
import { spawnSync } from 'node:child_process';
const cli = resolve('scripts/rea.mjs');
const root = realpathSync(mkdtempSync(join(tmpdir(), 'rea-empty-artifact-')));
const bundle = join(root, 'Sample.app');
const env = { ...process.env, HOME: join(root, 'home'), TMPDIR: join(root, 'temp'), REA_LOG_LEVEL: 'silent' };
try {
  mkdirSync(join(bundle, 'Contents/MacOS'), { recursive: true });
  mkdirSync(env.HOME);
  mkdirSync(env.TMPDIR);
  writeFileSync(join(bundle, 'Contents/Info.plist'), '<?xml version="1.0"?><plist version="1.0"><dict><key>CFBundleIdentifier</key><string>test.sample</string><key>CFBundleExecutable</key><string>Sample</string><key>CFBundlePackageType</key><string>APPL</string></dict></plist>');
  writeFileSync(join(root, 'main.c'), 'int main(void){return 0;}\n');
  const cc = spawnSync('clang', ['-o', 'Sample.app/Contents/MacOS/Sample', 'main.c'], { cwd: root, env, encoding: 'utf8' });
  if (cc.status !== 0) throw new Error(cc.stderr);
  for (let round=1;round<=2;round++) {
    for (const command of ['extract-artifact', 'inspect-asset-catalog', 'decode-interface-builder', 'trace-dylib-resolution']) {
      for (const input of ['', '.']) {
        const result = spawnSync(process.execPath, [cli, command, input, '--json'], { cwd: bundle, env, encoding: 'utf8', timeout: 20000 });
        const data = JSON.parse(result.stdout);
        const normalized = data.normalized_result;
        const projection = { round, command, input, exit: result.status, input_path: data.parameters?.input_path, caller_input_path: data.caller_input_path };
        if (normalized?.resource_root) projection.selected = relative(root,normalized.resource_root.caller_path);
        else if (data.subject?.local_path) projection.selected = relative(root,data.subject.local_path);
        if (normalized?.artifacts) projection.created = normalized.artifacts.map(a=>({path:a.path??a.relative_path,created:a.created}));
        if (normalized?.output_root) {
          projection.output_exists = existsSync(normalized.output_root);
          projection.copied_plist = readFileSync(join(normalized.output_root,'Contents/Info.plist'),'utf8')===readFileSync(join(bundle,'Contents/Info.plist'),'utf8');
          projection.copied_executable = readFileSync(join(normalized.output_root,'Contents/MacOS/Sample')).equals(readFileSync(join(bundle,'Contents/MacOS/Sample')));
        }
        if (data.code) projection.code=data.code;
        console.log(JSON.stringify(projection));
        if(result.stderr) console.error(result.stderr);
      }
    }
  }
  for (const input of ['', null]) {
    const args = ['inspect-artifact', ...(input===null?[]:[input]), '--json'];
    const result = spawnSync(process.execPath, [cli,...args], { cwd: bundle, env, encoding:'utf8',timeout:20000 });
    const data=JSON.parse(result.stdout);
    console.log(JSON.stringify({command:'inspect-artifact',input,exit:result.status,code:data.code,field:data.fieldErrors?.[0]?.path,issue:data.fieldErrors?.[0]?.code,missing:data.fieldErrors?.[0]?.missing}));
  }
} finally { rmSync(root, {recursive:true,force:true}); }
JS
  1. Observe the exact projected output below. Each subprocess invokes the public dispatcher as node scripts/rea.mjs <command> "" --json or with explicit ., using the resolved entry path while the synthetic bundle is cwd. selected is projected relative to the disposable fixture root; created comes from the returned extraction artifacts, while copied_plist and copied_executable compare the actual output bytes with the source files.
{"round":1,"command":"extract-artifact","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app","created":[{"path":"Contents/Info.plist","created":true},{"path":"Contents/MacOS/Sample","created":true}],"output_exists":true,"copied_plist":true,"copied_executable":true}
{"round":1,"command":"extract-artifact","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app","created":[{"path":"Contents/Info.plist","created":true},{"path":"Contents/MacOS/Sample","created":true}],"output_exists":true,"copied_plist":true,"copied_executable":true}
{"round":1,"command":"inspect-asset-catalog","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app"}
{"round":1,"command":"inspect-asset-catalog","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app"}
{"round":1,"command":"decode-interface-builder","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app"}
{"round":1,"command":"decode-interface-builder","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app"}
{"round":1,"command":"trace-dylib-resolution","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app/Contents/MacOS/Sample"}
{"round":1,"command":"trace-dylib-resolution","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app/Contents/MacOS/Sample"}
{"round":2,"command":"extract-artifact","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app","created":[{"path":"Contents/Info.plist","created":true},{"path":"Contents/MacOS/Sample","created":true}],"output_exists":true,"copied_plist":true,"copied_executable":true}
{"round":2,"command":"extract-artifact","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app","created":[{"path":"Contents/Info.plist","created":true},{"path":"Contents/MacOS/Sample","created":true}],"output_exists":true,"copied_plist":true,"copied_executable":true}
{"round":2,"command":"inspect-asset-catalog","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app"}
{"round":2,"command":"inspect-asset-catalog","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app"}
{"round":2,"command":"decode-interface-builder","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app"}
{"round":2,"command":"decode-interface-builder","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app"}
{"round":2,"command":"trace-dylib-resolution","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app/Contents/MacOS/Sample"}
{"round":2,"command":"trace-dylib-resolution","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app/Contents/MacOS/Sample"}
{"command":"inspect-artifact","input":"","exit":1,"code":"VALIDATION_ERROR","field":"path","issue":"too_small","missing":false}
{"command":"inspect-artifact","input":null,"exit":1,"code":"VALIDATION_ERROR","field":"path","issue":"invalid_type","missing":true}

Each of the four artifact commands failed the empty-path contract in both rounds. An earlier independent replay ran the same two-round matrix and produced byte-for-byte identical projected output, giving four failures in four attempts per command overall, with four successful explicit-dot controls per command. Empty and omitted inspect-artifact targets were rejected in both replays.

Expected behavior

Reject an empty target with a nonzero validation result identifying path before resolving or inspecting any local target or creating extracted output. Retain explicit . for intentional working-directory selection. The “Run a command” section of docs/cli.md, lines 42–45, states: “Local file inspection commands reject empty paths and NUL bytes before resolving relative inputs, auxiliary files or output destinations. An empty string never selects the working directory; use an explicit . when selecting that directory is supported by the command.”

Impact and scope

The observed empty selections produced successful Evidence for a target the argument did not name; extraction additionally materialized its two regular files in a fresh temporary output directory. This can conceal an empty target variable as a successful local operation. The executed scope is these four commands on one synthetic macOS application bundle. The resource commands reported empty asset/interface inventories for that bundle; this does not establish decoding of nonempty catalogs or nibs. Other working-directory kinds, platforms, real application resources and downstream consumers were not tested. Callers can reject empty variables and pass a nonempty intended target; explicit . was verified for intentional selection. No input files were modified or target code executed.

REA version

6.8.0 (source commit a905a71e31)

Runtime and platform

Node 24.22.1; macOS 27.0.1 (build 26A434), arm64.

Target and artifact context

Synthetic Sample.app containing an inline XML Info.plist and a locally compiled arm64 Mach-O with an inert main function. No authored asset catalogs or nibs were present. HOME and extraction temporary storage were isolated. No external analysis engine or API was used.

Interface

CLI

Earliest failure stage

Request parsing or validation

Relevant output or evidence

Observed: the full public CLI responses supplied the projected fields in the replay output. Both resource inspections identified Sample.app through normalized_result.resource_root.caller_path; extraction identified the bundle as its subject and created Contents/Info.plist and Contents/MacOS/Sample; dylib tracing identified Contents/MacOS/Sample as its Mach-O subject. Extraction output files were inspected before removal and matched the fixture bytes. Both empty-target control errors used VALIDATION_ERROR and field path; omission set missing: true.

Source-only (not executed as a separate source test): the four argument declarations use plain strings at src/cli/artifactCommands.ts:81, src/cli/artifactCommands.ts:119, src/cli/artifactCommands.ts:156 and src/cli/artifactCommands.ts:206. The sibling nonempty constraint is at src/cli/artifactCommands.ts:238. The shared application stores the original argument at src/application/DirectAnalysis.ts:211. Resource operations take the directory branch at src/application/DirectAnalysis.ts:347, check the resolved path at line 754 and open the resource session at line 354. The other two commands reach session.open at line 455 and the target resolver's absolute-path construction at src/application/BinaryTargetResolver.ts:144. Actual CLI execution above establishes reachability through the guards.

Typed outcome or recovery expected

Refuse the empty path before local inspection or extraction and return a nonzero input error. The executed inspect-artifact control shows an existing parser shape: VALIDATION_ERROR with fieldErrors[0].path: "path" and code: "too_small". Repeat the four empty and explicit-dot cases to check restoration; a later provider error after selecting cwd would not restore the documented contract.

Analysis or suspected cause

Source-derived: src/filesystem/callerPath.ts:35 anchors a relative path against cwd; empty input therefore becomes cwd. The four artifact schemas admit that invalid selection before the shared workflow reaches normalization. A nonempty local-path constraint already exists at src/domain/localPath.ts:20. The native utility commands have separate declarations at src/cli/utilityCommands.ts:193; correcting those declarations can leave every artifact case above failing because these command schemas are independent. No global change to path-helper semantics is necessary to express this report's acceptance criteria.

Additional context

Open issue #7280 and open PR #7284 cover the decompile-all target and pseudocode export. That PR changes only the decompile-all declaration and its test. The related merged analyze/inspect-artifact correction is reflected by the successful rejection control above.

Related (closed):
Issue #6757 covered desktop inspection; the four artifact entrypoints here still admit the empty target and reproduce at this baseline despite that historical closure.

The npm registry reported rea-agents 6.8.0 as the latest published version when checked. This report exercises the pinned source checkout's provided built dispatcher; no source change, rebuild or publication was performed.

Related (open): Issue #7280 reports the same empty-target behavior for decompile-all and issue #7377 for inspect-keyed-archive; each command family has its own argument declarations, so this report covers only the commands named above.

Originally created by @coygeek on GitHub (Oct 27, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/7406 ### 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 CLI ### Observed behavior With a synthetic application bundle as the working directory, `extract-artifact "" --json`, `inspect-asset-catalog "" --json`, `decode-interface-builder "" --json` and `trace-dylib-resolution "" --json` each exited 0 and returned Evidence for that bundle or its executable. The responses retained both `parameters.input_path: ""` and `caller_input_path: ""`. Extraction also created copies of the bundle's plist and executable, whose bytes matched the fixture. Explicit `.` selected the same targets. The sibling control `inspect-artifact "" --json` rejected the empty input with exit 1 and `VALIDATION_ERROR` naming `path`. ### Reproduction 1. From the specified baseline checkout with locked dependencies and its built dispatcher available, select Node 24.22.1 and run the following shell command. It creates a fresh empty temporary directory, isolates HOME and TMPDIR, authors the bundle inline, compiles an inert executable using the macOS command-line tools and removes all generated files afterward. The fixture executable is never run. ```sh node --input-type=module <<'JS' import { mkdtempSync, mkdirSync, writeFileSync, rmSync, realpathSync, existsSync, readFileSync } from 'node:fs'; import { join, resolve, relative } from 'node:path'; import { tmpdir } from 'node:os'; import { spawnSync } from 'node:child_process'; const cli = resolve('scripts/rea.mjs'); const root = realpathSync(mkdtempSync(join(tmpdir(), 'rea-empty-artifact-'))); const bundle = join(root, 'Sample.app'); const env = { ...process.env, HOME: join(root, 'home'), TMPDIR: join(root, 'temp'), REA_LOG_LEVEL: 'silent' }; try { mkdirSync(join(bundle, 'Contents/MacOS'), { recursive: true }); mkdirSync(env.HOME); mkdirSync(env.TMPDIR); writeFileSync(join(bundle, 'Contents/Info.plist'), '<?xml version="1.0"?><plist version="1.0"><dict><key>CFBundleIdentifier</key><string>test.sample</string><key>CFBundleExecutable</key><string>Sample</string><key>CFBundlePackageType</key><string>APPL</string></dict></plist>'); writeFileSync(join(root, 'main.c'), 'int main(void){return 0;}\n'); const cc = spawnSync('clang', ['-o', 'Sample.app/Contents/MacOS/Sample', 'main.c'], { cwd: root, env, encoding: 'utf8' }); if (cc.status !== 0) throw new Error(cc.stderr); for (let round=1;round<=2;round++) { for (const command of ['extract-artifact', 'inspect-asset-catalog', 'decode-interface-builder', 'trace-dylib-resolution']) { for (const input of ['', '.']) { const result = spawnSync(process.execPath, [cli, command, input, '--json'], { cwd: bundle, env, encoding: 'utf8', timeout: 20000 }); const data = JSON.parse(result.stdout); const normalized = data.normalized_result; const projection = { round, command, input, exit: result.status, input_path: data.parameters?.input_path, caller_input_path: data.caller_input_path }; if (normalized?.resource_root) projection.selected = relative(root,normalized.resource_root.caller_path); else if (data.subject?.local_path) projection.selected = relative(root,data.subject.local_path); if (normalized?.artifacts) projection.created = normalized.artifacts.map(a=>({path:a.path??a.relative_path,created:a.created})); if (normalized?.output_root) { projection.output_exists = existsSync(normalized.output_root); projection.copied_plist = readFileSync(join(normalized.output_root,'Contents/Info.plist'),'utf8')===readFileSync(join(bundle,'Contents/Info.plist'),'utf8'); projection.copied_executable = readFileSync(join(normalized.output_root,'Contents/MacOS/Sample')).equals(readFileSync(join(bundle,'Contents/MacOS/Sample'))); } if (data.code) projection.code=data.code; console.log(JSON.stringify(projection)); if(result.stderr) console.error(result.stderr); } } } for (const input of ['', null]) { const args = ['inspect-artifact', ...(input===null?[]:[input]), '--json']; const result = spawnSync(process.execPath, [cli,...args], { cwd: bundle, env, encoding:'utf8',timeout:20000 }); const data=JSON.parse(result.stdout); console.log(JSON.stringify({command:'inspect-artifact',input,exit:result.status,code:data.code,field:data.fieldErrors?.[0]?.path,issue:data.fieldErrors?.[0]?.code,missing:data.fieldErrors?.[0]?.missing})); } } finally { rmSync(root, {recursive:true,force:true}); } JS ``` 2. Observe the exact projected output below. Each subprocess invokes the public dispatcher as `node scripts/rea.mjs <command> "" --json` or with explicit `.`, using the resolved entry path while the synthetic bundle is cwd. `selected` is projected relative to the disposable fixture root; `created` comes from the returned extraction artifacts, while `copied_plist` and `copied_executable` compare the actual output bytes with the source files. ```json {"round":1,"command":"extract-artifact","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app","created":[{"path":"Contents/Info.plist","created":true},{"path":"Contents/MacOS/Sample","created":true}],"output_exists":true,"copied_plist":true,"copied_executable":true} {"round":1,"command":"extract-artifact","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app","created":[{"path":"Contents/Info.plist","created":true},{"path":"Contents/MacOS/Sample","created":true}],"output_exists":true,"copied_plist":true,"copied_executable":true} {"round":1,"command":"inspect-asset-catalog","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app"} {"round":1,"command":"inspect-asset-catalog","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app"} {"round":1,"command":"decode-interface-builder","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app"} {"round":1,"command":"decode-interface-builder","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app"} {"round":1,"command":"trace-dylib-resolution","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app/Contents/MacOS/Sample"} {"round":1,"command":"trace-dylib-resolution","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app/Contents/MacOS/Sample"} {"round":2,"command":"extract-artifact","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app","created":[{"path":"Contents/Info.plist","created":true},{"path":"Contents/MacOS/Sample","created":true}],"output_exists":true,"copied_plist":true,"copied_executable":true} {"round":2,"command":"extract-artifact","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app","created":[{"path":"Contents/Info.plist","created":true},{"path":"Contents/MacOS/Sample","created":true}],"output_exists":true,"copied_plist":true,"copied_executable":true} {"round":2,"command":"inspect-asset-catalog","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app"} {"round":2,"command":"inspect-asset-catalog","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app"} {"round":2,"command":"decode-interface-builder","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app"} {"round":2,"command":"decode-interface-builder","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app"} {"round":2,"command":"trace-dylib-resolution","input":"","exit":0,"input_path":"","caller_input_path":"","selected":"Sample.app/Contents/MacOS/Sample"} {"round":2,"command":"trace-dylib-resolution","input":".","exit":0,"input_path":".","caller_input_path":".","selected":"Sample.app/Contents/MacOS/Sample"} {"command":"inspect-artifact","input":"","exit":1,"code":"VALIDATION_ERROR","field":"path","issue":"too_small","missing":false} {"command":"inspect-artifact","input":null,"exit":1,"code":"VALIDATION_ERROR","field":"path","issue":"invalid_type","missing":true} ``` Each of the four artifact commands failed the empty-path contract in both rounds. An earlier independent replay ran the same two-round matrix and produced byte-for-byte identical projected output, giving four failures in four attempts per command overall, with four successful explicit-dot controls per command. Empty and omitted inspect-artifact targets were rejected in both replays. ### Expected behavior Reject an empty target with a nonzero validation result identifying `path` before resolving or inspecting any local target or creating extracted output. Retain explicit `.` for intentional working-directory selection. The “Run a command” section of `docs/cli.md`, lines 42–45, states: “Local file inspection commands reject empty paths and NUL bytes before resolving relative inputs, auxiliary files or output destinations. An empty string never selects the working directory; use an explicit `.` when selecting that directory is supported by the command.” ### Impact and scope The observed empty selections produced successful Evidence for a target the argument did not name; extraction additionally materialized its two regular files in a fresh temporary output directory. This can conceal an empty target variable as a successful local operation. The executed scope is these four commands on one synthetic macOS application bundle. The resource commands reported empty asset/interface inventories for that bundle; this does not establish decoding of nonempty catalogs or nibs. Other working-directory kinds, platforms, real application resources and downstream consumers were not tested. Callers can reject empty variables and pass a nonempty intended target; explicit `.` was verified for intentional selection. No input files were modified or target code executed. ### REA version 6.8.0 (source commit a905a71e31f71457cb21fd056b234f872126974e) ### Runtime and platform Node 24.22.1; macOS 27.0.1 (build 26A434), arm64. ### Target and artifact context Synthetic Sample.app containing an inline XML Info.plist and a locally compiled arm64 Mach-O with an inert main function. No authored asset catalogs or nibs were present. HOME and extraction temporary storage were isolated. No external analysis engine or API was used. ### Interface CLI ### Earliest failure stage Request parsing or validation ### Relevant output or evidence Observed: the full public CLI responses supplied the projected fields in the replay output. Both resource inspections identified Sample.app through `normalized_result.resource_root.caller_path`; extraction identified the bundle as its subject and created Contents/Info.plist and Contents/MacOS/Sample; dylib tracing identified Contents/MacOS/Sample as its Mach-O subject. Extraction output files were inspected before removal and matched the fixture bytes. Both empty-target control errors used `VALIDATION_ERROR` and field `path`; omission set `missing: true`. Source-only (not executed as a separate source test): the four argument declarations use plain strings at `src/cli/artifactCommands.ts:81`, `src/cli/artifactCommands.ts:119`, `src/cli/artifactCommands.ts:156` and `src/cli/artifactCommands.ts:206`. The sibling nonempty constraint is at `src/cli/artifactCommands.ts:238`. The shared application stores the original argument at `src/application/DirectAnalysis.ts:211`. Resource operations take the directory branch at `src/application/DirectAnalysis.ts:347`, check the resolved path at line 754 and open the resource session at line 354. The other two commands reach `session.open` at line 455 and the target resolver's absolute-path construction at `src/application/BinaryTargetResolver.ts:144`. Actual CLI execution above establishes reachability through the guards. ### Typed outcome or recovery expected Refuse the empty `path` before local inspection or extraction and return a nonzero input error. The executed inspect-artifact control shows an existing parser shape: `VALIDATION_ERROR` with `fieldErrors[0].path: "path"` and `code: "too_small"`. Repeat the four empty and explicit-dot cases to check restoration; a later provider error after selecting cwd would not restore the documented contract. ### Analysis or suspected cause Source-derived: `src/filesystem/callerPath.ts:35` anchors a relative path against cwd; empty input therefore becomes cwd. The four artifact schemas admit that invalid selection before the shared workflow reaches normalization. A nonempty local-path constraint already exists at `src/domain/localPath.ts:20`. The native utility commands have separate declarations at `src/cli/utilityCommands.ts:193`; correcting those declarations can leave every artifact case above failing because these command schemas are independent. No global change to path-helper semantics is necessary to express this report's acceptance criteria. ### Additional context [Open issue #7280](https://github.com/morluto/rea/issues/7280) and [open PR #7284](https://github.com/morluto/rea/pull/7284) cover the decompile-all target and pseudocode export. That PR changes only the decompile-all declaration and its test. The related merged analyze/inspect-artifact correction is reflected by the successful rejection control above. Related (closed): [Issue #6757](https://github.com/morluto/rea/issues/6757) covered desktop inspection; the four artifact entrypoints here still admit the empty target and reproduce at this baseline despite that historical closure. The npm registry reported rea-agents 6.8.0 as the latest published version when checked. This report exercises the pinned source checkout's provided built dispatcher; no source change, rebuild or publication was performed. Related (open): [Issue #7280](https://github.com/morluto/rea/issues/7280) reports the same empty-target behavior for `decompile-all` and [issue #7377](https://github.com/morluto/rea/issues/7377) for `inspect-keyed-archive`; each command family has its own argument declarations, so this report covers only the commands named above.
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#4411
No description provided.