mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #4976] [Bug] Repeated REA-owned JSON members still block uninstall after #4957, and the refusal skips preflight #3078
Closed
opened 2026-10-31 00:36:03 +00:00 by bsakaguchi
·
3 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#3078
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 @NikeGunn on GitHub (Oct 18, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/4976
Before submitting
Area
Setup, packaging, or upgrade
Observed behavior
On current main
b83b9caf(after #4957), three repeated-member cases from #4952 still fail:reamembers cannot be uninstalled. #4952 lists "repeated identical ownedreamembers" uninstall as a target failure.rea uninstallstill exits 1 withConfiguration repeats the member at ["mcpServers","rea"] ... would activate an earlier duplicate, although every repeat is REA-owned and nothing foreign would become active. The same happens for OpenCode V2mcp.servers.rearepeats and minified or JSONC layouts.claude_code: removed,cursor: failed.mcp.serverstable, setup replaces a single V1mcp.rea(owned or not) with the native entry. Two V1mcp.reamembers make setup fail withfailed/shadowed_member, exit 1.Reproduction
Built CLI, isolated
HOME,CLAUDE_CONFIG_DIR, andXDG_CONFIG_HOMEfor each call. Owned launcher:{"command": "npx", "args": ["-y", "rea-agents@6.6.0", "mcp"]}(classified, not executed).~/.claude.json={"mcpServers": {"rea": OWNED, "peer": {"command": "/usr/bin/true"}, "rea": OWNED}}, thenrea uninstall --json→ exit 1, file unchanged.~/.claude.json={"mcpServers": {"rea": OWNED}}and~/.cursor/mcp.json={"mcpServers": {"rea": {"command": "/usr/bin/false"}, "rea": OWNED}}, thenrea uninstall --json→ exit 1, and REA is already removed from~/.claude.json.~/.config/opencode/opencode.json={"mcp": {"servers": {"peer": {...}}, "rea": FOREIGN, "rea": FOREIGN}}, thenrea setup --client opencode --skill=false --yes --json→ exit 1failed/shadowed_member. With onereaV1 member the same command returnsconfigured.Expected behavior
reain the table the client reads when REA owns each one, so no repeat becomes active.Impact and scope
Deterministic for these layouts; external frequency NOT_ENOUGH_INFO. No destructive change was observed: a refused edit is written before backup and nothing foreign is removed. Case 2 is a partial uninstall that the output reports.
REA version
main
b83b9caf(6.6.0 + #4957)Runtime and platform
Linux x64 (WSL2 Ubuntu), Node 24.18.0, npm 11.16.0.
Interface
CLI
Earliest failure stage
Uninstall ownership decision (
clientRegistrationRemoval) and the JSON text-edit boundary (editJsonMember).Analysis or suspected cause
parseClientConfigurationkeeps the last repeated member and drops the earlier ones, so the ownership rule inclientRegistrationRemovalcannot see what removal would reveal. #4957 therefore made the serializer refuse every repeated deletion without regard to ownership, and that refusal is only reached during removal, after preflight. Proposed fix: have the document owner report the earlier repeats from the source text, extend the shared ownership decision to cover them, and give the serializer explicit authority to remove every repeat once that decision admits it. I have a branch with tests and will open a PR.@XinwangTao commented on GitHub (Oct 18, 2026):
Agreed with the proposed fix shape — the root cause is that parseClientConfiguration collapses duplicates before ownership can be judged, so the serializer ends up refusing with no ownership context, after preflight. Extending the shared ownership decision to cover earlier repeats is the right move. One ordering point worth locking in: the ownership decision must complete before any client removal starts, so case 2's partial-uninstall state (claude_code: removed, cursor: failed) becomes impossible rather than merely reported. Also worth pinning down backup semantics — if the shared decision precedes the first edit, the existing backup flow should fire before that first edit, not after. For case 3, applying the existing V1-replacement rule to every repeat is consistent; just make sure the refusal message distinguishes a foreign repeat from an owned one, so users can tell an ownership conflict apart from a bug.
@NikeGunn commented on GitHub (Oct 18, 2026):
Thanks for reviewing. All three points are covered in #4977 (head
4cd22d4):1. The decision finishes before any removal starts.
runUninstallrunsinspectClientfor every client first (L144-L147), andremoveAllstarts only when nothing is blocked (L150-L160). The repeated-member check is part ofclientRegistrationRemoval, the ownership decision that preflight and removal share (L288, L458). For an unchanged configuration, case 2's partial state can therefore no longer happen; it isn't just reported. The acceptance test uninstall refuses an unowned repeat before changing any client puts Claude Code first in iteration order and asserts it stays unchanged with no backup. One deliberate limit:removeClientre-reads each file and re-runs the same decision (L581), so a file edited after preflight is still refused rather than overwritten. That keeps REA's existing documented contract for failures during removal, and makes no claim of atomicity across files.2. Backup timing. For each client the order is: decision, serialization (L602), backup (L625), then the single write (L645). The backup is taken right before the only edit, and a refused or unserializable edit takes none. Tests assert that the backup equals the original after a successful removal (L181) and that no backup exists after each refusal (L232, L294).
3. Owned and foreign repeats are told apart. REA-owned repeats are not refused at all; they are removed together. Only an ownership conflict is refused, and each kind has its own message:
For case 3, setup now applies its existing V1-replacement rule to every repeat, so it no longer refuses there. The serializer still defaults to the fail-closed
shadowed_memberrefusal from #4957 for any edit made without that authority.@morluto commented on GitHub (Oct 18, 2026):
Fixed on main in 22ddd8201.
The semantic JSON parse kept only the effective member, so preflight missed earlier registrations that deletion could expose. The document owner now reads those facts from the effective JSONC syntax tree. Uninstall uses one typed ownership decision during both preflight and reread, including foreign OpenCode V1 fallbacks. One deletion planner removes admitted members and separators; edit authority is limited to exact paths. Inactive repeated parents, unrelated entries, comments and original backups remain intact. Setup grants replacement authority only for the superseded OpenCode V1 path.
Adapted the proposal in #4977 at
4cd22d4ec2f6ec9e6c8ebf98bf97e1d9d7f8ac23, with contributor credit retained, then replaced handwritten JSON-string interpretation and broad edit permission. The PR itself was not merged or qualified as a whole.Validation: final 86 focused cases and 9 setup acceptance cases passed, as did 104 additional filesystem consumer cases, full static/architecture checks, docs and test discovery. Compiled CLI controls verify owned-repeat removal, refusal before earlier-client edits/backups, foreign V1 fallback refusal and unchanged source bytes. A broader 186-case run had one OMP timeout; the isolated 9-case rerun passed, but the timeout cause remains unverified. Real developer-client execution was not tested. CI continues separately in the background.
Cost check: 20 completed compiled CLI workflows, comparing equivalent successful uninstalls with identical full reports and backups. Four alternating warm repetitions per variant/task followed separately recorded first-process runs. Full-response
cl100kestimate stayed 1,053 tokens. For 8 KiB / 256 KiB configurations, baseline→candidate medians were elapsed 0.385→0.385 / 0.412→0.401 seconds, CPU 0.586→0.576 / 0.622→0.600 seconds, sampled process-family memory 352.5→345.8 / 356.4→350.0 MB. These controlled measurements do not establish a general speedup; model context, real clients, faults and other hosts remain unmeasured.