[GH-ISSUE #4689] [Bug] Kuna procedure search reports inventory failures and cancellation as list_procedures #2447

Closed
opened 2026-10-17 21:04:47 +00:00 by bsakaguchi · 2 comments
Owner

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

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

rea search <target.elf> main --kind procedures --provider kuna --json returns details.operation: "list_procedures" when its initial callable inventory produces malformed JSON, exits unsuccessfully, times out, or is cancelled while the search waits. The requested operation is search_procedures. Each failing case reproduced twice through the public CLI with a deterministic fake Kuna executable and no real target execution.

Both version probes succeed before the inventory is invoked. The working inventory control returns the expected main procedure under search_procedures. A malformed string-inventory control correctly reports search_strings and retains producer_operation: "kuna:strings", showing that the existing caller-remapping wrapper applies on that separate path.

Reproduction

  1. Use the source revision below with its repository-pinned Node/npm toolchain and locked dependencies. The source checkout was freshly cloned, installed with npm ci, and built with npm run build:cached using an isolated install home. Run this from the repository root. It creates a synthetic ELF header and a disposable launcher, gives each CLI child a fresh HOME, TMPDIR and cache with a whitelist environment, and removes the generated fixture directories after completion. No real Kuna installation is required.
node --input-type=module <<'NODE'
import assert from 'node:assert/strict';
import { spawn } from 'node:child_process';
import { mkdtemp, writeFile, readFile, rm } from 'node:fs/promises';
import { join, dirname } from 'node:path';
import { setTimeout as delay } from 'node:timers/promises';
import { tmpdir } from 'node:os';

const root = await mkdtemp(join(tmpdir(), 'rea-kuna-inventory-'));
const target = join(root, 'target.elf');
const bytes = Buffer.alloc(64);
bytes.set([127,69,76,70,2,1,1]);
bytes.writeUInt16LE(62,18); bytes.writeUInt32LE(1,20); bytes.writeUInt16LE(64,52);
await writeFile(target,bytes);
try {
 for(let repeat=1; repeat<=2; repeat++) for(const mode of ['working','malformed','exit','timeout','cancel','string-malformed']) {
  const home=await mkdtemp(join(root,'home-'));
  const command=join(home,'kuna');
  await writeFile(command, `#!${process.execPath}
const fs=require('node:fs');
const args=process.argv.slice(2);
fs.appendFileSync(__filename+'.calls',JSON.stringify({pid:process.pid,args})+'\\n');
if(args[0]==='--version') console.log('kuna 1.833');
else if(args[0]==='functions') {
 const mode=${JSON.stringify(mode)};
 if(mode==='malformed') console.log('not inventory JSON');
 else if(mode==='exit') { console.error('fixture inventory refusal'); process.exitCode=7; }
 else if(mode==='timeout'||mode==='cancel') setInterval(()=>{},1000);
 else console.log(JSON.stringify({binary:args[1],count:1,total:1,error:null,functions:[{name:'main',address:4096,address_hex:'0x1000',aliases:[],object_location:null,size:16}]}));
} else if(args[0]==='strings') console.log('not string JSON');
else process.exitCode=9;
`,{mode:0o700});
  const args=[process.env.REA_REPRO_ENTRY ?? 'scripts/rea.mjs','search',target,'main','--kind',mode==='string-malformed'?'strings':'procedures','--provider','kuna','--json'];
  const child=spawn(process.execPath,args,{env:{PATH:dirname(process.execPath)+':/usr/bin:/bin:/usr/sbin:/sbin',HOME:home,TMPDIR:home,REA_KUNA_COMMAND:command,REA_KUNA_CACHE_DIR:join(home,'cache'),REA_KUNA_TIMEOUT_MS:'1000',REA_LOG_LEVEL:'silent'}});
  let stdout='',stderr='';
  child.stdout.on('data',x=>stdout+=x);child.stderr.on('data',x=>stderr+=x);
  const completion=new Promise((resolve,reject)=>{child.on('error',reject);child.on('close',(code,signal)=>resolve({code,signal}));});
  const watchdog=setTimeout(()=>child.kill('SIGTERM'),15000);
  if(mode==='cancel') {
   let ready=false;
   for(let i=0;i<500;i++) {
    try{ready=(await readFile(command+'.calls','utf8')).includes('functions');}catch(e){if(e.code!=='ENOENT')throw e;}
    if(ready) break;
    await delay(10);
   }
   assert(ready,'functions was never invoked');
   child.kill('SIGINT');
  }
  const exit=await completion;clearTimeout(watchdog);
  const outcome=JSON.parse(stdout);
  const calls=(await readFile(command+'.calls','utf8')).trim().split('\n').map(JSON.parse);
  const row={repeat,mode,...exit,error:outcome.code??null,operation:outcome.details?.operation??outcome.operation,result:outcome.normalized_result??null,message:outcome.message??null,cleanup:outcome.details?.cleanup??null,producer_operation:outcome.details?.diagnostics?.producer_operation??null,calls:calls.map(x=>x.args[0]),stderr};
  console.log(JSON.stringify(row));
  assert.deepEqual(row.calls,['--version','--version',mode==='string-malformed'?'strings':'functions']);
  for(const {pid} of calls){assert.throws(()=>process.kill(pid,0),{code:'ESRCH'});}
  assert.equal(stderr,'');
  if(mode==='working'){assert.equal(exit.code,0);assert.equal(row.operation,'search_procedures');assert.deepEqual(row.result,[{address:'0x1000',value:'main'}]);}
  else if(mode==='string-malformed'){assert.equal(exit.code,1);assert.equal(row.operation,'search_strings');assert.equal(outcome.details.diagnostics.producer_operation,'kuna:strings');}
  else {assert.equal(exit.code,1);assert.equal(row.operation,'list_procedures');assert.equal(row.error,mode==='cancel'?'cancelled':mode==='timeout'?'provider_timeout':'execution_failure');if(mode==='cancel')assert.equal(outcome.details.cleanup,'complete');}
 }
} finally { await rm(root,{recursive:true,force:true}); }
NODE
  1. Read the malformed, exit, timeout and cancel rows. Each returns an error naming list_procedures. Cancellation is synchronized with the launcher's logged functions invocation; it does not use an assumed startup delay. Both version probes succeed in every row. All fixture processes are checked absent when each CLI command has completed.

  2. Compare the working rows, which return [{"address":"0x1000","value":"main"}] under search_procedures, and string-malformed, which retains the correct caller identity. The six cases each completed twice with assertions passing. The script asserts the observed incorrect identity for the four failing procedure cases; change that assertion to search_procedures when checking restoration.

Expected behavior

The error returned to a procedure-search caller should identify search_procedures, including when its lazy inventory fails or its inventory wait is cancelled. Preserve the error category, available diagnostics, retryability and cleanup status. The provider guide describes inventory as shared prerequisite work for procedure search, and the existing Kuna caller-context helper explicitly preserves a producer failure while giving each waiter its requested operation.

Impact and scope

Eight observed procedure-search failures across four simulated conditions returned an unrequested machine-readable operation identity. The command still returned an error, both working controls returned the expected procedure, and cancellation reported complete cleanup. No false success or target mutation was observed. Real Kuna occurrence frequency and downstream client effects remain unmeasured. Only the CLI search path was exercised; reachability from other inventory-dependent operations and MCP remains source-derived.

  • Impact level: P2
  • Assessment status: supported
  • Impact basis: Typed failures and cancellation from a supported public procedure search identify an internal inventory operation, preventing reliable attribution using the operation field while preserving the failure category.
  • Workaround status: unverified
  • Workaround basis: A working inventory avoids these triggers, but no workaround preserving correct operation identity when the inventory fails or its wait is cancelled was verified.

REA version

Source main commit 5853089885 (package version 6.5.0); separately installed latest npm release rea-agents@6.5.0. The source build reproduces this defect; the release rejects Kuna as an unknown provider before invoking the launcher.

Runtime and platform

Node.js v24.18.0; npm 11.16.0; macOS 27.0.1 arm64 (Darwin). The fake launcher advertises kuna 1.833; this is fixture output, not a measured real-engine version. Both builds were exercised using the pinned runtime, isolated HOME/TMPDIR/cache and no inherited client configuration.

Target and artifact context

A generated 64-byte x86_64 ELF header passes target admission. The working fake inventory returns one procedure named main at 0x1000; no real image, analysis database or external service is used, and the target is never executed.

Interface

CLI

Earliest failure stage

Native analysis or reconstruction

Relevant output or evidence

  • Expected source: src/kuna/KunaQueryErrors.ts:15-25 and :66-89, per-waiter caller context and typed remapping; docs/kuna-provider.md, callable inventory for procedure search; src/cli/coreBinaryCommands.ts:489, search_procedures dispatch.
  • Failure source: src/kuna/KunaSessionClient.ts:719-720, unsuccessful inventory returned unchanged; :1516, wait uses list_procedures; :1536 and :1546, native inventory and parse failure identities; :391, failed answer returns before the completion check.
  • Evidence provenance: observed
  • Local verification: reproduced
  • Reproduction completeness: complete

The script invokes node scripts/rea.mjs search <generated-target.elf> main --kind procedures --provider kuna --json; the string control changes --kind to strings. Both repetitions produced these fields, where operation is details.operation for failures and Evidence.operation for success:

mode              exit  code                operation           launcher calls
working           0     none                search_procedures   --version,--version,functions
malformed         1     execution_failure   list_procedures     --version,--version,functions
exit              1     execution_failure   list_procedures     --version,--version,functions
timeout           1     provider_timeout    list_procedures     --version,--version,functions
cancel            1     cancelled           list_procedures     --version,--version,functions
string-malformed  1     unreadable_output   search_strings      --version,--version,strings

The malformed inventory message is Kuna's function inventory is not usable: the function inventory is not JSON. The cancelled result has details: {"operation":"list_procedures","cleanup":"complete"}. The string control retains diagnostics.producer_operation: "kuna:strings". Every CLI stderr stream was empty.

The published release was separately installed with npm install --prefix <temporary-prefix> --no-audit --no-fund rea-agents@6.5.0 and invoked via its installed scripts/rea.mjs. Each of the six fixture configurations was tried twice. All 12 requests returned exit 1, capability_unavailable, details.operation: "open_binary", selection_reason: "unknown_provider", and candidate IDs ghidra, hopper, ida, with no launcher calls. For these release-only admission checks, the probe recorded the early refusal rather than waiting for a nonexistent functions invocation or sending SIGINT. This is a limitation of release applicability, not an observed inventory-attribution failure in the release.

Typed outcome or recovery expected

Run the same four failing procedure-search cases: each must remain a failure with its existing error category, available diagnostics, retryability and cleanup status, while details.operation becomes search_procedures. The working control must still return the same procedure, and malformed string inventory must retain search_strings plus its producer diagnostic. These controls distinguish caller-context restoration from suppressing failures or replacing every operation with the procedure-search name.

Analysis or suspected cause

Source-derived reasoning: the shared inventory wait and producer use the inventory operation name, then the procedure-search path returns an unsuccessful Result unchanged. The existing caller-context helper is invoked by the string-query wrapper only. Its guards do not exclude these error variants: the reproduced failures have a differing string operation and supported adapter, timeout or cancellation types. The session's post-success cancellation check is bypassed by the earlier unsuccessful return, and the catch does not run because the inventory wait returns a Result instead of throwing. Public CLI output demonstrates that no later wrapper corrects these identities.

Additional context

Related #4631 concerns installation-acquisition failures named health, before any functions invocation. This reproduction has two successful version probes and reaches functions, so installation and inventory failures have independent restoration checks. #4680 concerns Hopper regex search and its separate bridge-inventory path. #4374 concerns empty-stderr fallback wording. Open and closed issue and PR searches for Kuna, inventory/operation, and list_procedures found no matching Kuna inventory-attribution report. No last-known-good revision is established. The fixture measures REA's response to simulated provider conditions; real-engine incidence, MCP behavior and downstream client effects were not exercised.

Originally created by @coygeek on GitHub (Oct 17, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/4689 ### 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 `rea search <target.elf> main --kind procedures --provider kuna --json` returns `details.operation: "list_procedures"` when its initial callable inventory produces malformed JSON, exits unsuccessfully, times out, or is cancelled while the search waits. The requested operation is `search_procedures`. Each failing case reproduced twice through the public CLI with a deterministic fake Kuna executable and no real target execution. Both version probes succeed before the inventory is invoked. The working inventory control returns the expected `main` procedure under `search_procedures`. A malformed string-inventory control correctly reports `search_strings` and retains `producer_operation: "kuna:strings"`, showing that the existing caller-remapping wrapper applies on that separate path. ### Reproduction 1. Use the source revision below with its repository-pinned Node/npm toolchain and locked dependencies. The source checkout was freshly cloned, installed with `npm ci`, and built with `npm run build:cached` using an isolated install home. Run this from the repository root. It creates a synthetic ELF header and a disposable launcher, gives each CLI child a fresh HOME, TMPDIR and cache with a whitelist environment, and removes the generated fixture directories after completion. No real Kuna installation is required. ```sh node --input-type=module <<'NODE' import assert from 'node:assert/strict'; import { spawn } from 'node:child_process'; import { mkdtemp, writeFile, readFile, rm } from 'node:fs/promises'; import { join, dirname } from 'node:path'; import { setTimeout as delay } from 'node:timers/promises'; import { tmpdir } from 'node:os'; const root = await mkdtemp(join(tmpdir(), 'rea-kuna-inventory-')); const target = join(root, 'target.elf'); const bytes = Buffer.alloc(64); bytes.set([127,69,76,70,2,1,1]); bytes.writeUInt16LE(62,18); bytes.writeUInt32LE(1,20); bytes.writeUInt16LE(64,52); await writeFile(target,bytes); try { for(let repeat=1; repeat<=2; repeat++) for(const mode of ['working','malformed','exit','timeout','cancel','string-malformed']) { const home=await mkdtemp(join(root,'home-')); const command=join(home,'kuna'); await writeFile(command, `#!${process.execPath} const fs=require('node:fs'); const args=process.argv.slice(2); fs.appendFileSync(__filename+'.calls',JSON.stringify({pid:process.pid,args})+'\\n'); if(args[0]==='--version') console.log('kuna 1.833'); else if(args[0]==='functions') { const mode=${JSON.stringify(mode)}; if(mode==='malformed') console.log('not inventory JSON'); else if(mode==='exit') { console.error('fixture inventory refusal'); process.exitCode=7; } else if(mode==='timeout'||mode==='cancel') setInterval(()=>{},1000); else console.log(JSON.stringify({binary:args[1],count:1,total:1,error:null,functions:[{name:'main',address:4096,address_hex:'0x1000',aliases:[],object_location:null,size:16}]})); } else if(args[0]==='strings') console.log('not string JSON'); else process.exitCode=9; `,{mode:0o700}); const args=[process.env.REA_REPRO_ENTRY ?? 'scripts/rea.mjs','search',target,'main','--kind',mode==='string-malformed'?'strings':'procedures','--provider','kuna','--json']; const child=spawn(process.execPath,args,{env:{PATH:dirname(process.execPath)+':/usr/bin:/bin:/usr/sbin:/sbin',HOME:home,TMPDIR:home,REA_KUNA_COMMAND:command,REA_KUNA_CACHE_DIR:join(home,'cache'),REA_KUNA_TIMEOUT_MS:'1000',REA_LOG_LEVEL:'silent'}}); let stdout='',stderr=''; child.stdout.on('data',x=>stdout+=x);child.stderr.on('data',x=>stderr+=x); const completion=new Promise((resolve,reject)=>{child.on('error',reject);child.on('close',(code,signal)=>resolve({code,signal}));}); const watchdog=setTimeout(()=>child.kill('SIGTERM'),15000); if(mode==='cancel') { let ready=false; for(let i=0;i<500;i++) { try{ready=(await readFile(command+'.calls','utf8')).includes('functions');}catch(e){if(e.code!=='ENOENT')throw e;} if(ready) break; await delay(10); } assert(ready,'functions was never invoked'); child.kill('SIGINT'); } const exit=await completion;clearTimeout(watchdog); const outcome=JSON.parse(stdout); const calls=(await readFile(command+'.calls','utf8')).trim().split('\n').map(JSON.parse); const row={repeat,mode,...exit,error:outcome.code??null,operation:outcome.details?.operation??outcome.operation,result:outcome.normalized_result??null,message:outcome.message??null,cleanup:outcome.details?.cleanup??null,producer_operation:outcome.details?.diagnostics?.producer_operation??null,calls:calls.map(x=>x.args[0]),stderr}; console.log(JSON.stringify(row)); assert.deepEqual(row.calls,['--version','--version',mode==='string-malformed'?'strings':'functions']); for(const {pid} of calls){assert.throws(()=>process.kill(pid,0),{code:'ESRCH'});} assert.equal(stderr,''); if(mode==='working'){assert.equal(exit.code,0);assert.equal(row.operation,'search_procedures');assert.deepEqual(row.result,[{address:'0x1000',value:'main'}]);} else if(mode==='string-malformed'){assert.equal(exit.code,1);assert.equal(row.operation,'search_strings');assert.equal(outcome.details.diagnostics.producer_operation,'kuna:strings');} else {assert.equal(exit.code,1);assert.equal(row.operation,'list_procedures');assert.equal(row.error,mode==='cancel'?'cancelled':mode==='timeout'?'provider_timeout':'execution_failure');if(mode==='cancel')assert.equal(outcome.details.cleanup,'complete');} } } finally { await rm(root,{recursive:true,force:true}); } NODE ``` 2. Read the `malformed`, `exit`, `timeout` and `cancel` rows. Each returns an error naming `list_procedures`. Cancellation is synchronized with the launcher's logged `functions` invocation; it does not use an assumed startup delay. Both version probes succeed in every row. All fixture processes are checked absent when each CLI command has completed. 3. Compare the `working` rows, which return `[{"address":"0x1000","value":"main"}]` under `search_procedures`, and `string-malformed`, which retains the correct caller identity. The six cases each completed twice with assertions passing. The script asserts the observed incorrect identity for the four failing procedure cases; change that assertion to `search_procedures` when checking restoration. ### Expected behavior The error returned to a procedure-search caller should identify `search_procedures`, including when its lazy inventory fails or its inventory wait is cancelled. Preserve the error category, available diagnostics, retryability and cleanup status. The provider guide describes inventory as shared prerequisite work for procedure search, and the existing Kuna caller-context helper explicitly preserves a producer failure while giving each waiter its requested operation. ### Impact and scope Eight observed procedure-search failures across four simulated conditions returned an unrequested machine-readable operation identity. The command still returned an error, both working controls returned the expected procedure, and cancellation reported complete cleanup. No false success or target mutation was observed. Real Kuna occurrence frequency and downstream client effects remain unmeasured. Only the CLI search path was exercised; reachability from other inventory-dependent operations and MCP remains source-derived. - Impact level: P2 - Assessment status: supported - Impact basis: Typed failures and cancellation from a supported public procedure search identify an internal inventory operation, preventing reliable attribution using the operation field while preserving the failure category. - Workaround status: unverified - Workaround basis: A working inventory avoids these triggers, but no workaround preserving correct operation identity when the inventory fails or its wait is cancelled was verified. ### REA version Source main commit 58530898852d3dc5c7415afac1b92d3fec2f8fb5 (package version 6.5.0); separately installed latest npm release `rea-agents@6.5.0`. The source build reproduces this defect; the release rejects Kuna as an unknown provider before invoking the launcher. ### Runtime and platform Node.js v24.18.0; npm 11.16.0; macOS 27.0.1 arm64 (Darwin). The fake launcher advertises `kuna 1.833`; this is fixture output, not a measured real-engine version. Both builds were exercised using the pinned runtime, isolated HOME/TMPDIR/cache and no inherited client configuration. ### Target and artifact context A generated 64-byte x86_64 ELF header passes target admission. The working fake inventory returns one procedure named `main` at `0x1000`; no real image, analysis database or external service is used, and the target is never executed. ### Interface CLI ### Earliest failure stage Native analysis or reconstruction ### Relevant output or evidence - Expected source: src/kuna/KunaQueryErrors.ts:15-25 and :66-89, per-waiter caller context and typed remapping; docs/kuna-provider.md, callable inventory for procedure search; src/cli/coreBinaryCommands.ts:489, search_procedures dispatch. - Failure source: src/kuna/KunaSessionClient.ts:719-720, unsuccessful inventory returned unchanged; :1516, wait uses list_procedures; :1536 and :1546, native inventory and parse failure identities; :391, failed answer returns before the completion check. - Evidence provenance: observed - Local verification: reproduced - Reproduction completeness: complete The script invokes `node scripts/rea.mjs search <generated-target.elf> main --kind procedures --provider kuna --json`; the string control changes `--kind` to `strings`. Both repetitions produced these fields, where operation is `details.operation` for failures and `Evidence.operation` for success: ```text mode exit code operation launcher calls working 0 none search_procedures --version,--version,functions malformed 1 execution_failure list_procedures --version,--version,functions exit 1 execution_failure list_procedures --version,--version,functions timeout 1 provider_timeout list_procedures --version,--version,functions cancel 1 cancelled list_procedures --version,--version,functions string-malformed 1 unreadable_output search_strings --version,--version,strings ``` The malformed inventory message is `Kuna's function inventory is not usable: the function inventory is not JSON`. The cancelled result has `details: {"operation":"list_procedures","cleanup":"complete"}`. The string control retains `diagnostics.producer_operation: "kuna:strings"`. Every CLI stderr stream was empty. The published release was separately installed with `npm install --prefix <temporary-prefix> --no-audit --no-fund rea-agents@6.5.0` and invoked via its installed `scripts/rea.mjs`. Each of the six fixture configurations was tried twice. All 12 requests returned exit 1, `capability_unavailable`, `details.operation: "open_binary"`, `selection_reason: "unknown_provider"`, and candidate IDs `ghidra`, `hopper`, `ida`, with no launcher calls. For these release-only admission checks, the probe recorded the early refusal rather than waiting for a nonexistent `functions` invocation or sending SIGINT. This is a limitation of release applicability, not an observed inventory-attribution failure in the release. ### Typed outcome or recovery expected Run the same four failing procedure-search cases: each must remain a failure with its existing error category, available diagnostics, retryability and cleanup status, while `details.operation` becomes `search_procedures`. The working control must still return the same procedure, and malformed string inventory must retain `search_strings` plus its producer diagnostic. These controls distinguish caller-context restoration from suppressing failures or replacing every operation with the procedure-search name. ### Analysis or suspected cause Source-derived reasoning: the shared inventory wait and producer use the inventory operation name, then the procedure-search path returns an unsuccessful Result unchanged. The existing caller-context helper is invoked by the string-query wrapper only. Its guards do not exclude these error variants: the reproduced failures have a differing string operation and supported adapter, timeout or cancellation types. The session's post-success cancellation check is bypassed by the earlier unsuccessful return, and the catch does not run because the inventory wait returns a Result instead of throwing. Public CLI output demonstrates that no later wrapper corrects these identities. ### Additional context Related [#4631](https://github.com/morluto/rea/issues/4631) concerns installation-acquisition failures named `health`, before any `functions` invocation. This reproduction has two successful version probes and reaches `functions`, so installation and inventory failures have independent restoration checks. [#4680](https://github.com/morluto/rea/issues/4680) concerns Hopper regex search and its separate bridge-inventory path. [#4374](https://github.com/morluto/rea/issues/4374) concerns empty-stderr fallback wording. Open and closed issue and PR searches for Kuna, inventory/operation, and `list_procedures` found no matching Kuna inventory-attribution report. No last-known-good revision is established. The fixture measures REA's response to simulated provider conditions; real-engine incidence, MCP behavior and downstream client effects were not exercised.
Author
Owner

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

Fixed in 54c71313a, pushed to main, building on canonical cleanup attribution in 6eb55be4e.

The session boundary now attributes shared installation/inventory failures to the requested operation and retains the original operation in diagnostics.producer_operation. Typed outcomes, captured/partial facts and live cleanup dependencies remain attached. Pre-admission and shared-wait cancellation retain the exact caller reason without adopting cleanup authority from that value.

Validation: the report's tiny fake-Kuna public CLI matrix ran 12 cases before and 12 after (success, malformed JSON, nonzero exit, one-second timeout, synchronized SIGINT, plus string controls). Search inventory failures now identify search_procedures; exit outcomes, categories, command traces and success results were preserved. Fake child processes were checked absent afterward. Seven final inventory controls passed, including one cancelled waiter retaining its peer's single shared inventory; installation attribution and cleanup projection controls also passed in the focused run. Cached typecheck/lint, docs checks and hooks passed.

This is fake-provider CLI and production-boundary evidence on Darwin/Node 24.18, not real Kuna, Windows or MCP-specific failure qualification. The bounded combined-task cost comparison is recorded on #4693; no heavy profiling/stress. Installation cancellation during acquisition and later completion cancellation remain separate source audit candidates.

<!-- gh-comment-id:6230566899 --> @morluto commented on GitHub (Oct 17, 2026): Fixed in 54c71313a, pushed to main, building on canonical cleanup attribution in 6eb55be4e. The session boundary now attributes shared installation/inventory failures to the requested operation and retains the original operation in diagnostics.producer_operation. Typed outcomes, captured/partial facts and live cleanup dependencies remain attached. Pre-admission and shared-wait cancellation retain the exact caller reason without adopting cleanup authority from that value. Validation: the report's tiny fake-Kuna public CLI matrix ran 12 cases before and 12 after (success, malformed JSON, nonzero exit, one-second timeout, synchronized SIGINT, plus string controls). Search inventory failures now identify search_procedures; exit outcomes, categories, command traces and success results were preserved. Fake child processes were checked absent afterward. Seven final inventory controls passed, including one cancelled waiter retaining its peer's single shared inventory; installation attribution and cleanup projection controls also passed in the focused run. Cached typecheck/lint, docs checks and hooks passed. This is fake-provider CLI and production-boundary evidence on Darwin/Node 24.18, not real Kuna, Windows or MCP-specific failure qualification. The bounded combined-task cost comparison is recorded on #4693; no heavy profiling/stress. Installation cancellation during acquisition and later completion cancellation remain separate source audit candidates.
Author
Owner

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

Closing as addressed on main by 54c71313a. Kuna now attributes shared procedure-inventory failures and cancelled waits to the requested search operation while preserving producer diagnostics, typed failure facts and caller cancellation reasons. I verified the committed source and regression coverage; I have not rerun the runtime reproduction.

<!-- gh-comment-id:6244108172 --> @coygeek commented on GitHub (Oct 18, 2026): Closing as addressed on `main` by [54c71313a](https://github.com/morluto/rea/commit/54c71313aeb2cbdf21626af9557673a6f6397180). Kuna now attributes shared procedure-inventory failures and cancelled waits to the requested search operation while preserving producer diagnostics, typed failure facts and caller cancellation reasons. 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#2447
No description provided.