mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #5335] [Bug] Failed start_gdb_session retains a cleanup session that reports ready and accepts gdb_console commands #3243
Closed
opened 2026-10-31 00:38:15 +00:00 by bsakaguchi
·
1 comment
No Branch/Tag specified
main
codex/procedure-reference-stacked
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/kuna-independent-retry
codex/byte-search-overlay-coverage
codex/open-failure-target-receipt
codex/kuna-xref-evidence
codex/ghidra-ambiguous-procedure-recovery
codex/function-source-bundle
codex/trace-function-integration-prototype
codex/snapshot-source-closure
codex/recorded-evidence-array-pages
codex/evidence-recovery-redesign
codex/trace-feature-address-scope
codex/call-discovery-scope
codex/ghidra-literal-candidate-evidence
codex/decompile-directory-independent-retry
codex/retry-provenance-base
codex/value-flow-capability-experiment
codex/ghidra-containing-instruction
cursor/readme-discord-button-ef9f
dependabot/github_actions/actions/setup-node-7.1.0
dependabot/github_actions/actions/upload-artifact-7.0.2
dependabot/npm_and_yarn/npm-minor-and-patch-d8d97ce6df
codex/kuna-1989
fix/8559-native-ui-fixture-ownership
fix/8555-go-verifier-mcp-ownership
codex/provider-capability-recovery
fix/8642-rizin-target-stdin
codex/ghidra-memory-effect-scope
codex/ghidra-annotation-entry-selector
codex/ghidra-readonly-recovery
codex/ghidra-regex-verifier-recovery
codex/evidence-discovery-view-guidance
fix/8545-bulk-append-overflow
fix/8428-navigation-refusal-alternatives
codex/address-context-recovery
codex/matching-member-limitations
codex/unknown-scope-contract
codex/evidence-view-guidance
feat/8373-native-trace-views
codex/ghidra-snapshot-verifier-binding
codex/elf-export-visibility
codex/evidence-view-recovery
codex/native-reference-cli-help
codex/provider-candidate-observation-scope
codex/kuna-session-verification
codex/ghidra-switch-lifetime-guidance
codex/pseudocode-paging-discovery
codex/clarify-evidence-view-support
codex/kuna-xrefs-selector-recovery
codex/context-capacity-recovery
codex/evidence-closure-large-links
codex/same-function-evidence-identity
codex/ghidra-verifier-inspected-jdk
codex/audit-guided-workflows
codex/crash-prompt-retained-dossiers
codex/analysis-view-error-recovery
codex/kuna-verifier-target-selection
codex/ghidra-selected-project-call-coverage
codex/docs-native-analysis-scope
codex/ghidra-java-socket-boundary
codex/ghidra-retained-snapshot-verifier
codex/ghidra-search-inventory-facts
fix/8284-zero-argument-parameter-bindings
fix/8198-ui-action-handler-offset
fix/8257-elf-entry-label-identity
fix/8304-deferred-output-schema-projection
fix/8277-call-path-computed-target-uncertainty
fix/pr-8089-conflicts
fix/ci-static-duplicate-export
dependabot/npm_and_yarn/lint-staged-17.6.0
dependabot/github_actions/actions/download-artifact-8.0.2
dependabot/npm_and_yarn/write-file-atomic-8.0.0
dependabot/npm_and_yarn/canonicalize-5.1.0
dependabot/github_actions/actions/cache/restore-6.1.0
dependabot/npm_and_yarn/toon-format/toon-4.4.0
dependabot/github_actions/actions/deploy-pages-5.0.1
codex/review-fixes-pr-2403
codex/review-fixes-pr-2400
codex/process-terminal-width
codex/test-brittleness-cleanup
verify/7167-browser-connect-macos
fix/7167-browser-connect
feat/native-matching-allowance-setting
feat/browser-scenario-dry-run
test/managed-caller-parameters-20261024
codex/parser-fortythird-boundaries
fix/6926-pinvoke-platform-decorations-20261023
fix/6889-har-body-encoding-20261023
fix/6888-sqlite-schema-budget-20261023
fix/dependency-security-gates-6708
cursor/evidence-overwrite-rebase-b4ac
feat/4057-verify-native-exports
fix/windows-acl-observer-overhead-20261022
cursor/erlang-beam-restack-4476
cursor/pe-certificate-review-bf32
fix/6116-javascript-application-fs-errors
fix/6061-unmapped-runtime-script-unknown
feat/browser-scenario-summary
fix/pe-certificates
codex/verify-3407
cursor/rebase-5699
cursor/rebase-5352
cursor/rebase-5600
cursor/fix-cli-schema-omission-10a8
codex/audit-hopper-shutdown-reasons-20261021
fix/demangle-swift-omitted-record
fix/nib-boolean-value-types
cursor/cancellation-partial-observation-a5ac
fix/ib-object-limit-reasons
fix/electron-fuse-limit-advice
fix/kuna-doctor-dangling-cache
fix/fixed-budget-refusal-advice
fix/js-ipc-listener-dedup
fix/js-return-member-provenance
fix/dmg-integrity-retry-advice
fix/ida-doctor-readiness
fix/kuna-version-probe-output-drain
fix/legacy-swift-runtime-name-matching
fix/dylib-lazy-load-commands
fix/browser-scenario-startup-cancel
fix/swift-nested-punycode-classification
fix/compare-unselected-scopes
fix/objc-method-budget-coverage
fix/dmg-mounted-root-observations
audit/ci-tests-20261019-round2
release/6.7.0
fix/wabt-cleanup-retry-resolution
fix/electron-fuse-elf-pe-architecture
fix/native-plist-descriptor-ownership
fix/kuna-caller-cleanup-ownership
experiment/atomic-codemode-20261016
review/first-contributor-3776
fix/call-resolution-full-read-cycles
fix/member-mutation-selection-repeat
experiment/atomic-re-tools-20261015
perf/member-mutation-lazy-origins
perf/static-network-mutation-index
fix/hopper-startup-lifecycle
audit/3050-windows-proof-20261015
feat/windows-window-capture-2183
audit/3049-windows-proof-20261015
audit/3735-macos-fixtures-20261015
fix/batch-decompile-null-pseudocode
fix/kuna-inventory-honors-jobs
experiment/browser-codemode-tool-design-20261015
fix/hopper-clean-runtime-argv
codex/review-2049-27f1b367
review-fixes/pr-2787-routing
fix/3360-scoped-this-emitters
fix/3367-replaced-global-effects
fix/3838-compact-any-value-items
test/hopper-download-probe-20261015
codex/windows-runtime-creation-red-green-20261015
codex/windows-readonly-root-red-green-20261015
codex/windows-root-share-red-green-20261015
codex/exp-1685-win-mcp-startup
codex/bug-sweep-20261015
investigate/2190-windows-package-phases
investigate/3543-macos-cli-deadline
perf/3281-reverse-tools-feedback-quality
fix/3406-hopper-doctor-fixture
fix/3341-wrapper-require-test-context
fix/3301-owned-uninstall-fixtures
fix/3164-compiler-input-ownership
fix/pcap-cleanup-stdout-newline-20261014
perf/interface-builder-summary
codex/review-fixes-pr-1977
fix/ghidra-effective-jvm-platform
fix/docs-turkish-rust-link-20261013
fix/main-maintenance-ci-20261010
fix/recover-binary-session-process-effects
codex/review-fixes-pr-2457
codex/ci-required-cancellation-gate
fix/main-format-baseline-20261013
fix/setup-preserve-entry-fields
cursor/restore-main-checks-1ffc
fix/ghidra-bridge-hashmap-import
codex/shared-ci-jadx-json-default-20261013
codex/shared-ci-ghidra-test-groups-20261013
codex/shared-ci-java-fixture-format-20261013
codex/fix-intrinsic-invocation-boundaries
test/release-preflight-reusable-jobs
test/js-parameter-provenance-expectation
fix/linux-hopper-verification-current
test/2419-ghidra-elf-probe-size
followup/pr-1544-native-ida
codex/fold-pr-2230-contribution
docs/readme-responsible-use
fix/issue-2064
fix/issue-2050
fix/issue-2053
fix/issue-1968
fix/issue-1945
experiment/codemode-bridge-20261011
fix/tool-effects-negative-wording-1904-20261012
fix/1842-electron-interop-provenance
feat/recover-javascript-multi-input
refactor/website-i18n-prep
fix/nativeaot-pe-virtual-extent
fix/browser-verifier-ci-hang
fix/pe-resources-input-selection
docs/beginner-friendly-guides
docs/beginner-setup-guide
fix/javascript-analysis-worker-1563
fix/1649-ghidra-duplicate-names
fix/javascript-export-keys-integration-1369
test/maintenance-boundary-contracts-20261011
review/javascript-export-keys-1369
review/process-live-progress-1483
test/javascript-1495-growth-ratio
fix/ci-escape-timing
docs/normalized-terminal-geometry-1450
release/6.3.0
archive/release-6.3.0-pr1381
release/6.2.0
fix/electron-preload-dynamic-override
fix/javascript-self-referential-bundler-edges
release/6.1.0
cursor/grok-client-cherry-pick-0b56
feat/signature-posture
feat/dyld-shared-cache
feat/artifact-integrity-policy
feat/pkg-inventory
release/6.0.0
chore/sync-release-5.0.0
release/5.0.0
cursor/cloud-agent-node-787e
fix/javascript-xhr-open-endpoints
review/pr-711-realpath-fallback-wording
cleanup/replay-confinement
codex/test-suite-performance
codex/issue-foundations
codex/address-open-issues-2026-07-20
agent/javascript-vite-rollup-esbuild-adapters
agent/process-cleanup
agent/triage-integration
agent/unknown-commands-registry
feat/mcp-identity-metadata
morlvps/issue_cleanup
codex/installer-redesign
morl/roadmap-investigation-core
morl/roadmap-investigation-docs
release-please--branches--main--components--rea
rea-agents-6.8.0
rea-agents-6.7.0
rea-agents-6.6.0
experiment/atomic-codemode-wait-runtime-20261016
rea-agents-6.5.0
rea-agents-6.4.0
rea-agents-6.3.0
rea-agents-6.2.0
rea-agents-6.1.0
rea-agents-6.0.0
rea-agents-5.0.0
rea-agents-4.1.0
rea-agents-4.0.1
rea-agents-4.0.0
rea-agents-3.2.1
rea-agents-3.2.0
rea-agents-3.1.0
rea-agents-3.0.0
rea-agents-2.7.0
rea-agents-2.6.0
rea-agents-2.5.1
rea-agents-2.5.0
rea-agents-2.4.0
rea-agents-2.3.0
rea-agents-2.2.0
rea-agents-2.1.0
rea-agents-2.0.0
rea-agents-1.7.0
rea-agents-1.6.0
rea-agents-1.5.0
rea-agents-1.4.0
rea-agents-1.3.0
rea-agents-1.2.0
rea-agents-1.1.0
rea-agents-1.0.0
rea-agents-0.5.0
rea-agents-0.4.0
rea-agents-0.3.0
rea-0.2.1
rea-0.2.0
Labels
Clear labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
Mirrored from GitHub Pull Request
question
roadmap
triage
No labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
question
roadmap
triage
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
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#3243
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @coygeek on GitHub (Oct 20, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/5335
Before submitting
Area
Process capture or runtime observation
Observed behavior
When
start_gdb_sessionfails a mandatory startup check after GDB's first prompt, and the owned debugger process cannot yet be confirmed stopped, the tool returnscleanup_incompleteand retains the session ID inerror.details.resources. For that retained ID,gdb_session_statusreportsstate: "ready", andgdb_consoleacceptsshow versionand returns a complete MI result. The start error's ownerror.details.partial_observationEvidence records "No usable debugger session became ready during GDB startup."Two startup checks reproduce it: GDB rejecting the required
-gdb-set auto-load off, and aninferior_ttyreadback that does not match the requested terminal. A startup-command timeout under the same cleanup condition is handled correctly: status reportsclosedandgdb_consolereturnsinvalid_request.This was observed through the production MCP registration (
registerGdbTools,GdbSessionManager, MI parser, error projection) with a synthetic MI peer, not a real GDB. The peer is a small Node script that prints valid MI prompt and result records. The cleanup failure is injected: the probe'sstopProcesshook returns{status: "incomplete"}for the first stop attempt (the first two in the timeout control) and then delegates to the realstopOwnedDebuggerProcess. The probe omits the optional evidence recorder and binary-session admission arguments thatcreateServerpasses toregisterGdbTools; the start, status and console code paths it exercises are otherwise the production ones. No GDB, inferior, executable target or terminal was used.Reproduction
From a fresh clone at the revision under REA version, run
npm ci && npm run build:cached. Create a disposable workspace:Save this as
$WORK/probe.mts:Run it from the checkout root:
The probe runs five cases sequentially and asserts the observed behavior, so
PASSmeans the defect reproduced:autoload-reject: the peer answers-gdb-set auto-load offwith^error; the first stop attempt is reported incomplete.tty-mismatch: the caller requestsinferior_tty: "/dev/pts/7"and the peer reports/dev/pts/8; the first stop attempt is reported incomplete. These are fixture strings; no terminal is opened.timeout(control): the peer never answers the auto-load command; both internal stop attempts are reported incomplete.success(control): normal startup.confirmed-stop(control): the auto-load command is rejected and cleanup is not faked.Each case closes its retained session with the same ID and stops its peer. Delete
$WORKafterward. The probe passed in each of three runs (one per revision listed under REA version).Expected behavior
docs/reverse-engineering-tools.mdsays MCP startup disables auto-loading and that REA configures an optionalinferior_tty"before the session becomes ready and checks the exact value with GDB/MI". Thestart_gdb_sessioncontract insrc/contracts/gdbToolContracts.ts(lines 31-37) says the same.docs/tool-design.mdkeeps provider readiness separate from retained resource ownership and says to "derive readiness from the current startup's completion".When either startup check fails and cleanup cannot yet be confirmed, the retained ID should work as a cleanup handle only: status should report
closed(or otherwise unavailable),gdb_consoleshould reject ordinary commands without sending them to GDB, andclose_gdb_sessionshould still be able to retry cleanup with the same ID. The startup-command timeout path already behaves this way. A successful start must still reportreadyand accept commands.Impact and scope
A caller gets a failed start alongside a session that reports ready and accepts arbitrary console commands, even though auto-loading was not disabled, or the requested inferior TTY was not confirmed. Commands then run in a GDB whose required configuration did not complete.
The trigger needs two conditions together: a startup check failure after the prompt, and an owned-process stop that cannot be confirmed. Production cleanup can return incomplete when exit cannot be confirmed after direct termination attempts (
src/process/ownedDebuggerSession.ts). How often that happens with a real GDB was not measured, and neither were downstream target effects.Workaround: treat the ID returned by a failed start only as a cleanup handle, and retry
close_gdb_sessionwith it. Same-ID close removed the retained session in both failing cases.No security boundary crossing, target execution or data loss was observed. GDB sessions are Linux-only; the probe selects the Linux code path explicitly.
REA version
Source
main5fa4defcbc0e55ef1ec84c888b918abe945303fe. Also reproduced atmain833136507dd79d959340b09862a53af344e4f1b3and at therea-agents-6.7.0tag source (27dc42d10249f0410904a75c0997842eb03b931c). The published npm package was not executed.Runtime and platform
Node v24.22.0 (current
mainand 6.7.0 tag runs) and v26.12.0 (earliermainrun); macOS 27.0.1 arm64, usingGdbSessionManager's explicitplatform: "linux"option with a synthetic MI peer. The pinned Node 24.18.0 was not used.Target and artifact context
Not applicable. No target executable or inferior; the GDB provider is a synthetic Node MI peer.
Interface
MCP
Earliest failure stage
Cleanup, cancellation, or lifecycle
Relevant output or evidence
Probe output on current
main(Node v24.22.0), with the longconsole_resultobjects shortened to their MI record:In the MCP result, the failed start carries
error.code: "cleanup_incomplete",error.details.execution_failure: "capability_unavailable", and the retained ID inerror.details.resources. Same-ID close succeeded for every retained session once cleanup was allowed. The 6.7.0 tag run printed the same results.Typed outcome or recovery expected
start_gdb_sessionshould still returncleanup_incompletewith the startup failure, partial observation and retained resource ID. For that ID,gdb_session_statusshould reportstate: "closed", andgdb_consoleshould return an error (as the timeout control'sinvalid_requestdoes) without sending the command.close_gdb_sessionwith the same ID should retry cleanup and remove the session once the process stop is confirmed.Analysis or suspected cause
Source-derived, at the current
mainrevision:GdbSessionManager.tsline 811 setssession.ready = trueright after the first prompt, before the auto-load and inferior-TTY checks run.#sessionswhen stop is incomplete but leavesreadyset. It also does not add the failure tosession.cleanupFailures, the set thatretryCleanupFailures(the cleanup-retry hookregisterGdbToolspasses forgdb_console) walks.status(lines 1239-1245) and thegdb_consoleguard (lines 1064-1080) treat a session as usable when it isready, not exited, and has no protocol error, so they admit it.The timeout control reports
closedbecause a command timeout setssession.protocolError(line 1884). An MI^errorresult or a mismatched TTY readback completes the command normally, soprotocolErrorstays unset, andreadyis never reset after line 811.Additional context
Related but different: #5099 (TTY verification revoked after a successful start), #4653 (close-precondition classification for an initialized session), and the lifecycle audit #4227. Open PR #1961 changes GDB console, interrupt and cleanup ownership, but its current diff leaves the post-prompt readiness assignment and this retention branch unchanged. Cancellation during startup was not tested.
@coygeek commented on GitHub (Oct 20, 2026):
Duplicate of #5331, which was filed a few minutes earlier for the same defect. This report adds a startup-timeout control (status reports
closedandgdb_consolereturnsinvalid_request), which shows thatreadyis never reset after the readiness assignment and that onlyprotocolErrorkeeps the timeout path closed.