[GH-ISSUE #5099] [Bug] Inspecting inferior-tty permanently revokes persistent GDB session TTY verification #3136

Closed
opened 2026-10-31 00:37:02 +00:00 by bsakaguchi · 7 comments
Owner

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

Before submitting

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

Area

MCP or agent integration

Observed behavior

With a synthetic MI peer through the production MCP registration, show version preserved inferior_tty_verified: true, but successful show inferior-tty changed it to false. Setting the original terminal again left verification false. Close with a synthetic live thread group then returned capability_unavailable and required explicit disposition. The session remained ready; simulated disposition followed by close with the same ID succeeded.

This is a mocked boundary observation. No real GNU GDB, target or terminal was used. Source confirms the flag has no restoration path within a started session.

Reproduction

From the source checkout at the revision below, with its locked dependencies installed, create an isolated workspace:

WORK=$(mktemp -d)
mkdir "$WORK/home"

Save this probe as $WORK/probe.mts:

import assert from 'node:assert/strict';
import { createRequire } from 'node:module';
import { pathToFileURL } from 'node:url';
import { writeFile, rm } from 'node:fs/promises';
const checkout = process.env.REA_CHECKOUT!;
const work = process.env.REA_WORK!;
const provider = `${work}/fake-gdb.mjs`;
await writeFile(provider, String.raw`#!${process.execPath}
import { createInterface } from 'node:readline';
let live = true;
process.stdout.write('(gdb)\n');
createInterface({input:process.stdin}).on('line', line => {
 const token = /^(\d+)/.exec(line)?.[1];
 if (!token) return;
 if (line.includes('console "kill"')) live = false;
 const result = line.includes('-inferior-tty-show') ? 'done,inferior_tty_terminal="/dev/pts/7"'
 : line.includes('list-thread-groups') ? (live ? 'done,groups=[{id="i1",type="process",pid="4242"}]' : 'done,groups=[]') : 'done';
 process.stdout.write(token + '^' + result + '\n(gdb)\n');
 if (line.includes('-gdb-exit')) process.exit(0);
});
`, {mode:0o700});
const require = createRequire(`${checkout}/package.json`);
const { Client, InMemoryTransport } = await import(require.resolve('@modelcontextprotocol/client'));
const { McpServer } = await import(require.resolve('@modelcontextprotocol/server'));
const load = (p:string) => import(pathToFileURL(`${checkout}/src/${p}.ts`).href);
const { GdbSessionManager, commandMayChangeInferiorOutput } = await load('gdb/GdbSessionManager');
const { registerGdbTools } = await load('server/registerGdbTools');
const { createToolResultDelivery } = await load('server/toolResult');
const { silentLogger } = await load('logger');
const manager = new GdbSessionManager({ platform:'linux', environment:{HOME:process.env.HOME, PATH:process.env.PATH, REA_GDB_COMMAND:provider} });
const server = new McpServer({name:'tty-check',version:'1'});
registerGdbTools(server, manager, silentLogger, createToolResultDelivery(undefined));
const client = new Client({name:'tty-check',version:'1'});
const [ct, st] = InMemoryTransport.createLinkedPair();
const call = (name:string,args:Record<string,unknown>) => client.callTool({name,arguments:args});
let session_id:string|undefined;
try {
 await server.connect(st); await client.connect(ct);
 const start = await call('start_gdb_session',{inferior_tty:'/dev/pts/7'});
 assert(!start.isError); session_id = start.structuredContent!.session_id as string;
 const status = async () => (await call('gdb_session_status',{session_id})).structuredContent!;
 assert.equal((await status()).inferior_tty_verified,true);
 assert(!(await call('gdb_console',{session_id,command:'show version'})).isError);
 assert.equal((await status()).inferior_tty_verified,true);
 console.log('show version: inferior_tty_verified=true');
 assert(!(await call('gdb_console',{session_id,command:'show inferior-tty'})).isError);
 assert.equal((await status()).inferior_tty_verified,false);
 console.log('show inferior-tty: inferior_tty_verified=false');
 assert(!(await call('gdb_console',{session_id,command:'set inferior-tty /dev/pts/7'})).isError);
 assert.equal((await status()).inferior_tty_verified,false);
 console.log('set inferior-tty to original value: inferior_tty_verified=false');
 const close = await call('close_gdb_session',{session_id});
 assert(close.isError);
 const error = JSON.parse(close.content.find((x:any)=>x.type==='text')!.text).error;
 assert.match(JSON.stringify(error),/explicit disposition/);
 console.log(JSON.stringify({close_error:error}));
 assert.equal((await status()).state,'ready');
 assert(!(await call('gdb_console',{session_id,command:'kill'})).isError);
 assert(!(await call('close_gdb_session',{session_id})).isError);
 console.log('synthetic kill then same-ID close: success');
 for (const command of ['show version','show inferior-tty','help inferior-tty']) console.log(JSON.stringify({command,may_change_output:commandMayChangeInferiorOutput(command)}));
 console.log('PASS: production MCP registration, manager and MI parser; synthetic provider only');
} finally {
 if(session_id){await manager.execute(session_id,'kill'); await manager.close(session_id);}
 await Promise.allSettled([client.close(),server.close()]); await manager.closeAll();
 await rm(provider,{force:true});
}

Run from the checkout root:

env -i HOME="$WORK/home" PATH="$PATH" REA_CHECKOUT="$PWD" REA_WORK="$WORK" node --import "$PWD/node_modules/tsx/dist/loader.mjs" "$WORK/probe.mts"

The check completed once with exit 0. It starts only a disposable Node MI peer and uses platform: 'linux' to exercise the Linux manager branch on the host described below. The fixture represents one live group; it does not execute an inferior or touch the fixture PID.

Expected behavior

A built-in read-only inspection of the inferior TTY should preserve its configured verification. The GDB guide describes permanent revocation for commands that can change the terminal or redirect a run. Plain show inferior-tty does neither. The console contract accepts GDB console commands, and the close contract documents automatic detach when the required live-group and verified-output conditions hold.

Impact and scope

The false revocation unnecessarily removes the verified-TTY prerequisite for automatic detach and requires an explicit inferior disposition before close when a live group remains. It persists for the session even after setting the original TTY again. This is bounded to commands whose text matches the classifier, in Linux persistent MCP sessions. Avoiding the inspection prevents this trigger; simulated disposition and same-ID close recovered successfully. No data loss or target termination was observed. Real-provider frequency and downstream client behavior are NOT_ENOUGH_INFO.

REA version

Current main source 3537e58c1ab29309f06eabf50bc52adba9817a0c, package version 6.7.0. Relevant manager, registration, contract and guide files are identical to stable tag rea-agents-6.7.0; the published release runtime was not tested.

Runtime and platform

Node v26.12.0; Darwin 27.0.0; arm64. Node 26 satisfies package engines; the repository's pinned Node 24.18.0 was not exercised. Persistent native macOS GDB support is not claimed. The explicit Linux option and fake peer exercise REA's supported-branch state handling without establishing real Linux/GDB descriptor behavior.

Target and artifact context

Synthetic MI3 peer, selected terminal string /dev/pts/7, and one simulated live group with fixture PID 4242. No executable target, actual terminal, provider installation or remote service.

Interface

MCP

Earliest failure stage

Capture or observation

Relevant output or evidence

Observed through production registration, manager, MI parser and status/error projection:

show version: inferior_tty_verified=true
show inferior-tty: inferior_tty_verified=false
set inferior-tty to original value: inferior_tty_verified=false
close: capability_unavailable / unavailable / retryable=true
synthetic kill then same-ID close: success

The error reason was Live GDB inferiors require an explicit disposition because no durable inferior TTY is verified.

Source-derived path: registration forwards the accepted console command; execute clears verification; classifier matches any inferior-tty mention; status exposes the flag; live-group close refuses without it. The only assignment of true is startup readback verification.

Typed outcome or recovery expected

Successful read-only gdb_console should return its Evidence while retaining inferior_tty_verified: true. Other live-inferior and descriptor checks must still apply at close. After actual output-affecting commands, retaining ownership and requiring disposition remains appropriate.

Analysis or suspected cause

Source-derived: the classifier searches the whole command for inferior-tty, so the setting name alone causes revocation before the command runs. This covers both show inferior-tty and help inferior-tty, independently of setting or redirection syntax. The helper returned true for both in the probe; only show was exercised through MCP.

Additional context

Related #4653 concerns incorrect error classification when disposition is required, rather than this read-only trigger that unnecessarily removes verification. #3656 concerns provider integration scope. Neither covers this contract and trigger. No known-good release was established. Real GDB execution, live-target automatic detach, and published-package runtime coverage remain NOT_ENOUGH_INFO.

Originally created by @coygeek on GitHub (Oct 18, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/5099 ## 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 MCP or agent integration ## Observed behavior With a synthetic MI peer through the production MCP registration, `show version` preserved `inferior_tty_verified: true`, but successful `show inferior-tty` changed it to false. Setting the original terminal again left verification false. Close with a synthetic live thread group then returned `capability_unavailable` and required explicit disposition. The session remained ready; simulated disposition followed by close with the same ID succeeded. This is a mocked boundary observation. No real GNU GDB, target or terminal was used. Source confirms the flag has no restoration path within a started session. ## Reproduction From the source checkout at the revision below, with its locked dependencies installed, create an isolated workspace: ```sh WORK=$(mktemp -d) mkdir "$WORK/home" ``` Save this probe as `$WORK/probe.mts`: ```typescript import assert from 'node:assert/strict'; import { createRequire } from 'node:module'; import { pathToFileURL } from 'node:url'; import { writeFile, rm } from 'node:fs/promises'; const checkout = process.env.REA_CHECKOUT!; const work = process.env.REA_WORK!; const provider = `${work}/fake-gdb.mjs`; await writeFile(provider, String.raw`#!${process.execPath} import { createInterface } from 'node:readline'; let live = true; process.stdout.write('(gdb)\n'); createInterface({input:process.stdin}).on('line', line => { const token = /^(\d+)/.exec(line)?.[1]; if (!token) return; if (line.includes('console "kill"')) live = false; const result = line.includes('-inferior-tty-show') ? 'done,inferior_tty_terminal="/dev/pts/7"' : line.includes('list-thread-groups') ? (live ? 'done,groups=[{id="i1",type="process",pid="4242"}]' : 'done,groups=[]') : 'done'; process.stdout.write(token + '^' + result + '\n(gdb)\n'); if (line.includes('-gdb-exit')) process.exit(0); }); `, {mode:0o700}); const require = createRequire(`${checkout}/package.json`); const { Client, InMemoryTransport } = await import(require.resolve('@modelcontextprotocol/client')); const { McpServer } = await import(require.resolve('@modelcontextprotocol/server')); const load = (p:string) => import(pathToFileURL(`${checkout}/src/${p}.ts`).href); const { GdbSessionManager, commandMayChangeInferiorOutput } = await load('gdb/GdbSessionManager'); const { registerGdbTools } = await load('server/registerGdbTools'); const { createToolResultDelivery } = await load('server/toolResult'); const { silentLogger } = await load('logger'); const manager = new GdbSessionManager({ platform:'linux', environment:{HOME:process.env.HOME, PATH:process.env.PATH, REA_GDB_COMMAND:provider} }); const server = new McpServer({name:'tty-check',version:'1'}); registerGdbTools(server, manager, silentLogger, createToolResultDelivery(undefined)); const client = new Client({name:'tty-check',version:'1'}); const [ct, st] = InMemoryTransport.createLinkedPair(); const call = (name:string,args:Record<string,unknown>) => client.callTool({name,arguments:args}); let session_id:string|undefined; try { await server.connect(st); await client.connect(ct); const start = await call('start_gdb_session',{inferior_tty:'/dev/pts/7'}); assert(!start.isError); session_id = start.structuredContent!.session_id as string; const status = async () => (await call('gdb_session_status',{session_id})).structuredContent!; assert.equal((await status()).inferior_tty_verified,true); assert(!(await call('gdb_console',{session_id,command:'show version'})).isError); assert.equal((await status()).inferior_tty_verified,true); console.log('show version: inferior_tty_verified=true'); assert(!(await call('gdb_console',{session_id,command:'show inferior-tty'})).isError); assert.equal((await status()).inferior_tty_verified,false); console.log('show inferior-tty: inferior_tty_verified=false'); assert(!(await call('gdb_console',{session_id,command:'set inferior-tty /dev/pts/7'})).isError); assert.equal((await status()).inferior_tty_verified,false); console.log('set inferior-tty to original value: inferior_tty_verified=false'); const close = await call('close_gdb_session',{session_id}); assert(close.isError); const error = JSON.parse(close.content.find((x:any)=>x.type==='text')!.text).error; assert.match(JSON.stringify(error),/explicit disposition/); console.log(JSON.stringify({close_error:error})); assert.equal((await status()).state,'ready'); assert(!(await call('gdb_console',{session_id,command:'kill'})).isError); assert(!(await call('close_gdb_session',{session_id})).isError); console.log('synthetic kill then same-ID close: success'); for (const command of ['show version','show inferior-tty','help inferior-tty']) console.log(JSON.stringify({command,may_change_output:commandMayChangeInferiorOutput(command)})); console.log('PASS: production MCP registration, manager and MI parser; synthetic provider only'); } finally { if(session_id){await manager.execute(session_id,'kill'); await manager.close(session_id);} await Promise.allSettled([client.close(),server.close()]); await manager.closeAll(); await rm(provider,{force:true}); } ``` Run from the checkout root: ```sh env -i HOME="$WORK/home" PATH="$PATH" REA_CHECKOUT="$PWD" REA_WORK="$WORK" node --import "$PWD/node_modules/tsx/dist/loader.mjs" "$WORK/probe.mts" ``` The check completed once with exit 0. It starts only a disposable Node MI peer and uses `platform: 'linux'` to exercise the Linux manager branch on the host described below. The fixture represents one live group; it does not execute an inferior or touch the fixture PID. ## Expected behavior A built-in read-only inspection of the inferior TTY should preserve its configured verification. The [GDB guide](https://github.com/morluto/rea/blob/3537e58c1ab29309f06eabf50bc52adba9817a0c/docs/reverse-engineering-tools.md#L31) describes permanent revocation for commands that can change the terminal or redirect a run. Plain `show inferior-tty` does neither. The [console contract](https://github.com/morluto/rea/blob/3537e58c1ab29309f06eabf50bc52adba9817a0c/src/contracts/gdbToolContracts.ts#L50) accepts GDB console commands, and the close contract documents automatic detach when the required live-group and verified-output conditions hold. ## Impact and scope The false revocation unnecessarily removes the verified-TTY prerequisite for automatic detach and requires an explicit inferior disposition before close when a live group remains. It persists for the session even after setting the original TTY again. This is bounded to commands whose text matches the classifier, in Linux persistent MCP sessions. Avoiding the inspection prevents this trigger; simulated disposition and same-ID close recovered successfully. No data loss or target termination was observed. Real-provider frequency and downstream client behavior are NOT_ENOUGH_INFO. ## REA version Current main source `3537e58c1ab29309f06eabf50bc52adba9817a0c`, package version 6.7.0. Relevant manager, registration, contract and guide files are identical to stable tag `rea-agents-6.7.0`; the published release runtime was not tested. ## Runtime and platform Node v26.12.0; Darwin 27.0.0; arm64. Node 26 satisfies package engines; the repository's pinned Node 24.18.0 was not exercised. Persistent native macOS GDB support is not claimed. The explicit Linux option and fake peer exercise REA's supported-branch state handling without establishing real Linux/GDB descriptor behavior. ## Target and artifact context Synthetic MI3 peer, selected terminal string `/dev/pts/7`, and one simulated live group with fixture PID 4242. No executable target, actual terminal, provider installation or remote service. ## Interface MCP ## Earliest failure stage Capture or observation ## Relevant output or evidence Observed through production registration, manager, MI parser and status/error projection: ```text show version: inferior_tty_verified=true show inferior-tty: inferior_tty_verified=false set inferior-tty to original value: inferior_tty_verified=false close: capability_unavailable / unavailable / retryable=true synthetic kill then same-ID close: success ``` The error reason was `Live GDB inferiors require an explicit disposition because no durable inferior TTY is verified.` Source-derived path: [registration forwards the accepted console command](https://github.com/morluto/rea/blob/3537e58c1ab29309f06eabf50bc52adba9817a0c/src/server/registerGdbTools.ts#L76); [execute clears verification](https://github.com/morluto/rea/blob/3537e58c1ab29309f06eabf50bc52adba9817a0c/src/gdb/GdbSessionManager.ts#L1085); [classifier matches any inferior-tty mention](https://github.com/morluto/rea/blob/3537e58c1ab29309f06eabf50bc52adba9817a0c/src/gdb/GdbSessionManager.ts#L2213); [status exposes the flag](https://github.com/morluto/rea/blob/3537e58c1ab29309f06eabf50bc52adba9817a0c/src/gdb/GdbSessionManager.ts#L1251); [live-group close refuses without it](https://github.com/morluto/rea/blob/3537e58c1ab29309f06eabf50bc52adba9817a0c/src/gdb/GdbSessionManager.ts#L1317). The only assignment of true is [startup readback verification](https://github.com/morluto/rea/blob/3537e58c1ab29309f06eabf50bc52adba9817a0c/src/gdb/GdbSessionManager.ts#L859). ## Typed outcome or recovery expected Successful read-only `gdb_console` should return its Evidence while retaining `inferior_tty_verified: true`. Other live-inferior and descriptor checks must still apply at close. After actual output-affecting commands, retaining ownership and requiring disposition remains appropriate. ## Analysis or suspected cause Source-derived: the classifier searches the whole command for `inferior-tty`, so the setting name alone causes revocation before the command runs. This covers both `show inferior-tty` and `help inferior-tty`, independently of setting or redirection syntax. The helper returned true for both in the probe; only show was exercised through MCP. ## Additional context Related [#4653](https://github.com/morluto/rea/issues/4653) concerns incorrect error classification when disposition is required, rather than this read-only trigger that unnecessarily removes verification. [#3656](https://github.com/morluto/rea/issues/3656) concerns provider integration scope. Neither covers this contract and trigger. No known-good release was established. Real GDB execution, live-target automatic detach, and published-package runtime coverage remain NOT_ENOUGH_INFO.
Author
Owner

@XinwangTao commented on GitHub (Oct 19, 2026):

Good find — a read-only inspection turning into a permanent state mutation is exactly the kind of surprise that's hard to debug later. The fact that show version keeps inferior_tty_verified: true while show inferior-tty clears it, and that no restoration path exists within a started session, makes the flag effectively lossy: once touched by an inspection the session can no longer close normally without explicit disposition. Agreed the read-only trigger should preserve configured verification — inspections shouldn't have side effects on session state.

<!-- gh-comment-id:6261248025 --> @XinwangTao commented on GitHub (Oct 19, 2026): Good find — a read-only inspection turning into a permanent state mutation is exactly the kind of surprise that's hard to debug later. The fact that show version keeps inferior_tty_verified: true while show inferior-tty clears it, and that no restoration path exists within a started session, makes the flag effectively lossy: once touched by an inspection the session can no longer close normally without explicit disposition. Agreed the read-only trigger should preserve configured verification — inspections shouldn't have side effects on session state.
Author
Owner

@akushonkamen commented on GitHub (Oct 19, 2026):

I'd like to take this one — the root cause is clear (the inferior-tty predicate in commandMayChangeInferiorOutput matches the read-only show inferior-tty query, and there's no path to restore inferiorTtyVerified after startup). Will follow up with a fix that keeps the fail-closed detach semantics, along with regression tests, shortly.

<!-- gh-comment-id:6267419755 --> @akushonkamen commented on GitHub (Oct 19, 2026): I'd like to take this one — the root cause is clear (the `inferior-tty` predicate in `commandMayChangeInferiorOutput` matches the read-only `show inferior-tty` query, and there's no path to restore `inferiorTtyVerified` after startup). Will follow up with a fix that keeps the fail-closed detach semantics, along with regression tests, shortly.
Author
Owner

@akushonkamen commented on GitHub (Oct 19, 2026):

Update: the fix is implemented and verified on the branch fix/5099-show-inferior-tty-verified (commit bede9d6a).

commandMayChangeInferiorOutput now exempts exactly the two read-only TTY query forms (show inferior-tty and MI -inferior-tty-show); every other command mentioning the TTY setting keeps revoking the verified-sink flag, so mutating commands still fail closed and detach still re-reads and compares the live TTY before -target-detach. Regression tests cover the query forms, composite commands, and the inspect-then-close detach path (red before the fix, green after; full GdbSessionManagerCoverage.test.ts 156/156 plus adjacent GDB suites).

Opening the PR itself is currently erroring out on my side (GitHub rejects the create-PR call for this fork with a permissions error while other writes succeed); I'll open it as soon as that clears.

<!-- gh-comment-id:6268486174 --> @akushonkamen commented on GitHub (Oct 19, 2026): Update: the fix is implemented and verified on the branch [`fix/5099-show-inferior-tty-verified`](https://github.com/akushonkamen/rea/tree/fix/5099-show-inferior-tty-verified) (commit bede9d6a). `commandMayChangeInferiorOutput` now exempts exactly the two read-only TTY query forms (`show inferior-tty` and MI `-inferior-tty-show`); every other command mentioning the TTY setting keeps revoking the verified-sink flag, so mutating commands still fail closed and detach still re-reads and compares the live TTY before `-target-detach`. Regression tests cover the query forms, composite commands, and the inspect-then-close detach path (red before the fix, green after; full `GdbSessionManagerCoverage.test.ts` 156/156 plus adjacent GDB suites). Opening the PR itself is currently erroring out on my side (GitHub rejects the create-PR call for this fork with a permissions error while other writes succeed); I'll open it as soon as that clears.
Author
Owner

@matbrgz commented on GitHub (Oct 19, 2026):

Cross-referencing with sibling GDB persistent session report #5098 ([Bug] debug-with-gdb rejects built-in p, s and d aliases before starting GDB). Both issues address state mutation and command validation boundaries in persistent GDB sessions (debug-with-gdb).

Consolidated under Cluster AG (GDB Persistent Debug Session & CLI Command Boundary) in tracker #4330.

<!-- gh-comment-id:6274588518 --> @matbrgz commented on GitHub (Oct 19, 2026): Cross-referencing with sibling GDB persistent session report #5098 (`[Bug] debug-with-gdb rejects built-in p, s and d aliases before starting GDB`). Both issues address state mutation and command validation boundaries in persistent GDB sessions (`debug-with-gdb`). Consolidated under **Cluster AG (GDB Persistent Debug Session & CLI Command Boundary)** in tracker #4330.
Author
Owner

@XinwangTao commented on GitHub (Oct 20, 2026):

The fix lands at the right boundary — exempting exactly the two read-only TTY query forms while every mutating TTY command keeps revoking the flag preserves the fail-closed detach semantics, and the inspect-then-close regression test covers precisely the case that bit us. Agree with matbrgz that #5098 and this share the same command-boundary theme; consolidating under Cluster AG in #4330 keeps the audit manageable. Hope the create-PR permission error clears so this can land.

<!-- gh-comment-id:6280965381 --> @XinwangTao commented on GitHub (Oct 20, 2026): The fix lands at the right boundary — exempting exactly the two read-only TTY query forms while every mutating TTY command keeps revoking the flag preserves the fail-closed detach semantics, and the inspect-then-close regression test covers precisely the case that bit us. Agree with matbrgz that #5098 and this share the same command-boundary theme; consolidating under Cluster AG in #4330 keeps the audit manageable. Hope the create-PR permission error clears so this can land.
Author
Owner

@akushonkamen commented on GitHub (Oct 20, 2026):

Thanks @XinwangTao for the review — glad the boundary matches what the issue needed, and thanks @matbrgz for the cross-reference to #5098; I'll take that (and the rest of Cluster AG) into account in the follow-up here.

One heads-up on timing: this account currently holds this repository's maximum number of open pull requests (#2150, #5247, #5250), so GitHub is rejecting new PR creation until one of them merges. The branch fix/5099-show-inferior-tty-verified (bede9d6a) is complete and validated (red→green plus adjacent GDB suites), and I'll open the PR here the moment a slot frees up.

<!-- gh-comment-id:6282782761 --> @akushonkamen commented on GitHub (Oct 20, 2026): Thanks @XinwangTao for the review — glad the boundary matches what the issue needed, and thanks @matbrgz for the cross-reference to #5098; I'll take that (and the rest of Cluster AG) into account in the follow-up here. One heads-up on timing: this account currently holds this repository's maximum number of open pull requests (#2150, #5247, #5250), so GitHub is rejecting new PR creation until one of them merges. The branch `fix/5099-show-inferior-tty-verified` (`bede9d6a`) is complete and validated (red→green plus adjacent GDB suites), and I'll open the PR here the moment a slot frees up.
Author
Owner

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

Checked the reported fix on main at d87e73f2db.

Exact show inferior-tty/help inferior-tty return false before conservative mutation detection; compound and mutating commands remain true. A production-source probe confirms show, set and compound controls. Session regression executes both inspections and checks verification stays true, then checks with inferior-tty revokes it and close does not detach.

Implementation: GdbSessionManager.ts.

The relevant regression checks in GdbSessionManagerCoverage.test.ts passed in the focused test run on this revision. This closure is based on the current source and those checks; provider fixtures do not establish a real-engine run. Closing as completed on main.

<!-- gh-comment-id:6380742301 --> @coygeek commented on GitHub (Oct 24, 2026): Checked the reported fix on `main` at d87e73f2db50be72d33a4b3c7199af35518b441c. Exact show inferior-tty/help inferior-tty return false before conservative mutation detection; compound and mutating commands remain true. A production-source probe confirms show, set and compound controls. Session regression executes both inspections and checks verification stays true, then checks with inferior-tty revokes it and close does not detach. Implementation: [GdbSessionManager.ts](https://github.com/morluto/rea/blob/d87e73f2db50be72d33a4b3c7199af35518b441c/src/gdb/GdbSessionManager.ts#L2379). The relevant regression checks in [GdbSessionManagerCoverage.test.ts](https://github.com/morluto/rea/blob/d87e73f2db50be72d33a4b3c7199af35518b441c/tests/boundary/providers/GdbSessionManagerCoverage.test.ts) passed in the focused test run on this revision. This closure is based on the current source and those checks; provider fixtures do not establish a real-engine run. Closing as completed on main.
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#3136
No description provided.