mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #8208] [Design] Make missing-function recovery aware of selected Ghidra projects #6484
Open
opened 2026-11-01 21:11:32 +00:00 by bsakaguchi
·
8 comments
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#6484
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 @morluto on GitHub (Oct 30, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/8208
Before submitting
Decision needed
When a valid function selector is absent from a caller-selected existing Ghidra project, can REA give an agent a scoped recovery path that preserves the project's unknown analysis completeness and the caller's project choice?
Context and evidence
On macOS arm64/Ghidra 12.1.4, I imported a self-owned Mach-O into a new project with
analyzeHeadless -noanalysisand saved it. In a real REA MCP session selecting that project and the matching original binary:binary_sessionandlist_proceduresexplicitly stated that the copied project is opened without auto-analysis and that its original analysis completeness and settings are unknown. The inventory contained onlyentry.procedure_pseudo_code({"procedure":"_evaluate"})returnedinvalid_request; the detailed issue saidUnknown Ghidra procedure name or address: _evaluate, but generic remediation told the caller to read the input schema or refresh the tool catalog. The supplied selector was syntactically valid.list_proceduresincluded_evaluateand pseudocode succeeded. That fresh import is a comparison, not a safe automatic replacement for the selected project: a project may contain valuable caller annotations or other analysis.The deliberately unanalysed project is known to the experimenter; REA correctly does not claim that arbitrary existing projects are incomplete. The target was not executed or changed. This is one project/target case and not a measurement of agent failure.
Selected-project recovery control
On PR #8470 head
3dc41af77, Ghidra 12.1.4/JDK 21 and macOS arm64, I selected a disposable project containing an intentional prior program-memory edit. In both compact and full stdio MCP profiles,procedure_assemblyat an unlisted address reported the missing entry, stated that the selected project's analysis completeness is unknown, and described fresh import as an explicit separate process that would omit its annotations. In the same session after the refusal,read_bytesat the edited function returned40058052c0035fd6andprocedure_pseudo_codereturned0x2a; the admitted original file contains00008052c0035fd6at the corresponding offset. This confirms the session continued to serve the selected project's edited state in this fixture, rather than silently replacing it with a fresh import. Every target and original project file hash was unchanged after both sessions. The fixture was not executed. This does not establish behavior for other project histories or prove the memory edit was an annotation.Expected interaction with targets
Read selected local files and a copied analysis project; launch the selected static provider. Do not write or reanalyze the original project.
Boundary details (optional)
A missing selector may arise from a typo, alias, unsupported name, incomplete analysis, or genuine absence. Do not diagnose the reason without evidence or treat an unknown project history as absent/completed. Do not silently replace the user's selected project with a fresh import or discard its edits.
Options and tradeoffs
Consider a conditional recovery hint to list currently discovered procedures and inspect the selected session's analysis-history limitation; separately explain that a fresh import requires an explicit user choice/reconfiguration. Compare that with a more precise typed not-found result. Preserve exact selector, target/project identity, existing project read-only behavior, and normal invalid-input validation.
Verification available so far
I have a prototype or observed results.
Success criteria and open questions
Exercise analysed, deliberately unanalysed, annotated, genuinely missing and ambiguous-name projects; verify the errors and recovery do not claim completeness or change provider/project selection. Cover CLI/MCP and session preservation.
References
Related: #8165 and #8169. REA
d48e472faplus unrelated Kuna 1.986 baseline changes in #8187.@gensokyo-dev @kaoru0822-kitauji @N0zoM1z0
@morluto commented on GitHub (Oct 30, 2026):
A control with a fully analyzed, explicitly selected project program shows that a missing selector does not imply incomplete project analysis. One owned Ghidra project contained two root programs imported from byte-identical Mach-O files; direct headless scripts gave their same function different names,
selected_alphaandselected_beta. In a real REA/Ghidra MCP session selectingprogram_beta,procedure_pseudo_code({procedure:"selected_beta"})succeeded. Asking forselected_alphareturnedinvalid_requestwithUnknown Ghidra procedure name or addressin details and generic schema-refresh remediation. The selected beta program was valid and analyzed; the other name belonged to a different program in the same project.This reinforces a narrow recovery hint to inspect the current selected project's observed inventory and binding, rather than diagnosing incomplete analysis or searching/switching to another program automatically. No GUI or target execution was involved. Missing project-program selection itself is distinct and tracked by #8216.
@morluto commented on GitHub (Oct 31, 2026):
Looping in @gensokyo-dev @kaoru0822-kitauji @N0zoM1z0 for visibility on the Ghidra, Kuna, and REA tool-design investigation.
@morluto commented on GitHub (Oct 31, 2026):
Existing search-summary recovery
At REA
b43c329df779708e43ae297f498a844e45d9c923, real stdio MCPsearch_procedures({pattern:"evaluate",detail:"summary"})on the same source-owned Mach-O returned one retained row after fresh Ghidra 12.1.4 analysis, but zero in the deliberately-noanalysisselected project. Both summaries reporteddiscovery_coverage: "unknown"; the selected project's page was exhausted within its zero-row retained view, and explicitly warned that missing matches do not establish absence outside the observation. Kuna 1.986 likewise reported unknown discovery, and returned the knownglobal_countdata label as a procedure candidate (#8168).The CLI
rea search <target> evaluate --kind procedures --provider ghidra --format json --full-outputon the selected project returned the same empty complete Evidence as MCP, including the prior-analysis-unknown limitation. The CLI search command does not advertise a summary option, but passing that complete Evidence inline torea inspect-analysis-viewwithview:{kind:"summary"}successfully produced the same zero rows and structureddiscovery_coverage: "unknown"without reopening the target. This is an existing, explicit two-step route, not an autonomous-agent selection test or evidence that a missing function is absent.The target and ten selected-project file hashes were unchanged; the binary was not executed. This control may help scope recovery improvements without discarding the selected project or duplicating the existing inventory view. Related count-scope discussion: #8287.
@morluto commented on GitHub (Oct 31, 2026):
Additional real MCP workflow comparison on the same unexecuted arm64 Mach-O used in the earlier selected-project test (Ghidra 12.1.4):
trace_feature({query:"evaluate"})on a fresh import returned the_evaluateprocedure at0x100000430and a source reference at0x1000004b0; the caller-selected project imported with-noanalysisreturned two string matches but no matching procedure or procedure reference. Both returnedtruncated:falseandresidual_unknowns:[]. The selected project's Evidence did explicitly state that the original analysis completeness and settings are unknown; this is not a claim thattruncatedpromises complete provider discovery.This demonstrates that the recovery/discovery question also affects a composed agent task, not just direct function search. Target and all 10 recorded original project files had unchanged hashes. The Ghidra results are observed inventories, not proof of all possible functions or references.
For maintainer visibility: @gensokyo-dev @kaoru0822-kitauji @N0zoM1z0
@morluto commented on GitHub (Oct 31, 2026):
Ambiguous-name recovery control in a fresh Ghidra session
The issue asks for ambiguous-name coverage. In a separate fresh-import, real Ghidra 12.1.4 session on REA
b43c329df779708e43ae297f498a844e45d9c923, an arm64 Mach-O withaudit_over(int)andaudit_over(long)produced two distinctaudit_overprocedure entries. MCPfind_xrefs_to_name({name:"audit_over"})correctly refused to select either and preserved both candidate addresses indetails.issues. Its headline nevertheless saidAnalysis input is invalid, and remediation and machine-readable recovery directed the caller to inspect the input schema.The real CLI
rea xrefs <fixture> audit_over --provider ghidra --format jsonlikewise exited 1 with schema-repair remediation. Its nested issue gave the actionable reason: the name was ambiguous at0x1000003f8and0x100000408, and the caller should select an exact address. The same CLI command with0x1000003f8succeeded; MCP xrefs for each exact address found its respective call site. The target was not executed and its SHA-256 remained unchanged. This is an ambiguity-recovery control, not a claim about an existing project's analysis completeness or observed agent behavior.Source-derived: the shared xref resolver constructs an
AnalysisInputErrorwith the useful explanation in an issue, while the default input-error presentation supplies schema-repair guidance when no specific remediation is present. This parallels, but is a different cause of, the unbacked-address recovery in #8244. A scoped improvement should retain actual schema-validation guidance while offering selection of an observed candidate for ambiguity; it must not infer a unique answer or replace a selected project.@morluto commented on GitHub (Oct 31, 2026):
Existing comparison workflow: selected project versus fresh analysis
On REA
a989c0ewith real Ghidra 12.1.4, I collected separatelist_proceduresEvidence for the same source-owned Mach-O under a fresh import (three entries) and a caller-selected-noanalysisproject (one entry). I exported each bundle, imported both in a fresh target-free MCP server, and ranmatch_native_functionsin both directions.The matcher paired the shared
entryby exact symbol and reported the other two functions only on the fresh side. Crucially it labeled the scopeprovider-observed-inputs, marked source coveragepartialand both inventory-completeness valuesunknown, and included the selected-project/no-auto-analysis limitation. Reversing inputs reversed the unmatched side. A fresh-versus-itself control matched all three and usedcomplete-within-inputswhile still marking both inventory completeness values unknown. These results correctly describe the supplied observations; the unmatched rows do not establish added/removed artifact functions.The offline CLI
match-native-functions, given both Evidence bundles via the documented--source_bundleoptions, returned the same normalized result as MCP. This supports reusing the existing comparison and Evidence boundaries when evaluating recovery, while keeping the caller's selected project and incomplete analysis explicit. The fixture target and all original selected-project regular-file hashes remained unchanged during collection; the target was not executed. One project and provider version do not establish general comparison correctness.@morluto commented on GitHub (Nov 1, 2026):
Missing-name control across fresh and selected projects
On clean main
6e9ee97a, real Ghidra 12.1.4 and SDK 2.3.1 MCP on macOS arm64, I requested an invented, syntactically valid procedure name withprocedure_addressagainst both a fresh import and the deliberately unanalyzed selected project. Both compact and full profiles returnedinvalid_requestwith the unknown-name detail andinspect_input_contractrecovery. The operation remained advertised available;list_proceduressucceeded afterward in each session.For this fixture the fresh inventory contained three procedures, and the selected-project inventory contained one and retained the unknown original analysis-history limitation. The invented name was absent in both inventories; this does not prove absence from arbitrary target code. The fresh case shows that schema-directed recovery is also misleading for a valid missing selector outside selected projects, while the selected-project caveat remains distinct. Original target and project hashes were unchanged, and successful calls were validated against the fetched SDK schemas. No broader name-resolution or host claim.
@morluto commented on GitHub (Nov 1, 2026):
Opened draft #8470 for the missing-selector recovery. The Ghidra bridge now distinguishes a procedure lookup miss from other
not_foundresponses, and the shared CLI/MCP projection reports the exact selector, current-inventory search and the fact that an absent entry does not prove artifact absence. Only a selected existing project receives the additional option to explicitly start a fresh import, with a warning that its annotations will not carry over. It never changes the selected project automatically.Real Ghidra 12.1.4 on macOS arm64: a deliberately unanalyzed selected project and a separate fresh import exercised full/compact stdio MCP and the actual CLI. The selected project remained usable after refusal; the same target's fresh CLI procedure search found
_evaluate. Both target and original project hashes remained unchanged. Additional controls covered multiple procedure operations, a missing analysis address, the numeric file-offset fallback, and an ambiguous overload followed by an exact address. A follow-up also improves ambiguity recovery, as described below. The PR includes scope and test limitations; human author-readiness remains unchecked.Follow-up: a valid explicit
file-offset:0x430(and bare numeric0x430) mapped to an address in the selected project that had no function. The first PR version still gave schema advice there. The updated PR now preserves the mapped address and gives the same lookup recovery; both forms passed real Ghidra controls. The real-Ghidra verifier's new bridge checks for a missing name and a mapped initialized-data offset completed, but the overall host verifier later failed at the existing #8172 MCP 1,024-element input limit; it did not pass as a whole.The same public workflow also showed a distinct valid-offset case:
file-offset:0xdeadbeefhad no loaded source mapping, but its specific Ghidra explanation was hidden behind schema advice. The PR now preserves that outcome separately and recommends inspecting load-image mappings. Both explicit and bare-offset forms passed real Ghidra stdio MCP in fresh and selected sessions, both schema profiles; the CLI--file-offsetpath also returned the mapping guidance. This does not settle the selector-design question in #8178 or change project selection.Follow-up: real Ghidra reproduced generic schema-repair advice for an overloaded name and for a file offset mapped to two loaded addresses. The PR now preserves both candidate lists, distinguishes these two producer outcomes, and asks the caller to choose an explicit address. Both candidates succeeded in real full/compact MCP sessions and both outcomes were exercised through the CLI; the targets and selected project were unchanged. This is a controlled fixture on one host, not an autonomous-agent or broad project study.