mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #3057] [Bug] Setup writes the skill through a symlinked skill directory that uninstall and update skip #1070
Closed
opened 2026-10-15 18:30:49 +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#1070
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 14, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/3057
Before submitting
Area
Setup, packaging, or upgrade
Observed behavior
When a client's
reverse-engineer-anythingskill directory is a symbolic link to a directory elsewhere (for example a skill manager or dotfiles repository linking~/.claude/skills/reverse-engineer-anythingto a shared copy),rea setupwith the skill enabled follows the link and writes REA's skill bundle into the link target, replacing itsSKILL.mdand creatingSKILL.md.rea.backupandreferences/there, and doctor then reports the skillaligned.rea uninstallretains the same directory because it is a symbolic link and leaves every written file in the link target, and, from source (not run),rea updatedoes not select a symlinked skill directory for maintenance. REA's skill lifecycle thus disagrees about the same directory: setup and doctor follow the link, while uninstall and update decline it, so setup modifies a location that REA's own removal and maintenance paths will not manage.Observed with both builds; outputs below are from 6.4.0 unless noted.
"status":"planned"with aninstall_skill:claude_codeaction targeting<HOME>/.claude/skills/reverse-engineer-anything("operation":"install", detail "Install or update the REA skill in Claude Code's personal skill directory."), with no mention of the link.--skill=false --yesreturned"status":"ready"and leftmanaged/reaunchanged.--yesreturned"status":"ready"and"appliedActions":["installed_skill"], and its doctor block reported the skill"state":"aligned"(installed_version"37",installed_tool_count170;main: "41" and 206). The link itself was kept, butmanaged/reanow held REA's packagedSKILL.md, aSKILL.md.rea.backupwhose SHA-256 matched the originalSKILL.md, and sixreferences/*.mdfiles.uninstall --jsonreturned"status":"complete"with the skill item"status":"retained"and a combined per-destination detail includingClaude Code skill: retained (Skill directory is a symbolic link.)(mainincludesclaude_code (<HOME>/.claude/skills/reverse-engineer-anything): retained (Skill directory is a symbolic link.)). All eight files remained inmanaged/rea..claude/skills/reverse-engineer-anything,managed/reastayed unchanged, and uninstall's skill detail includedClaude Code skill: removed (REA-managed skill files were removed; other files were preserved.).Reproduction
Run with the 6.4.0 package (replace
npx -y rea-agents@6.4.0withnode <checkout>/scripts/rea.mjsfor themainbuild):Control: repeat with
mkdir .claude/skills/reverse-engineer-anythingand a copy of the sameSKILL.mdin place of theln -sline.Expected behavior
Taken together, these passages in
docs/installation.mdonmaindescribe one set of REA-owned skill destinations across setup, uninstall and update: Skill destinations (line 114) says "Setup leaves existing skill copies in other locations untouched."; Diagnose, update, and remove (line 162) saysrea uninstall"removes only REA-owned agent registrations and skill files", and lines 170-176 say a symbolic-link purge path "is retained and reported rather than followed"; and the update maintenance plan (lines 197-198) "selects only existing REA registrations and an already installed REA skill". Uninstall applies the symbolic-link rule to skill directories ("Skill directory is a symbolic link."), and the closed morluto/rea#1816 applied it to a symlinked~/.rearoot. For the same symlinked skill directory, setup, doctor, uninstall and update should therefore agree: either setup declines the link (leaving the target untouched and reporting why), or REA treats the link target as its managed destination throughout, so uninstall removes the REA-managed files setup wrote there and update maintains them. Today setup writes and doctor reportsaligned, while uninstall and update (from source) decline the directory.REA already follows user-owned symbolic links for client configuration files on purpose (
src/application/ClientConfigPath.ts, used by both setup and uninstall), so either direction may fit the project's design; the defect is that the skill paths disagree with each other, not a requirement to pick one direction.Impact and scope
SKILL.mdfrom that run survives asSKILL.md.rea.backup, so the change is recoverable by hand.--skill=falseleft the link target unchanged in the reproduction (observed) while still configuring the client registration; installing the skill by another route afterwards is a user choice that was not tested here.REA version
6.4.0 (npm
latest) andmainate049ef70f7Runtime and platform
Node.js 26.10.0, npm 12.2.0, macOS 27.0 arm64; each run used a fresh temporary
HOMEwithCLAUDE_CONFIG_DIRand the other client home variables unset.Target and artifact context
Not applicable (setup and uninstall of the bundled skill).
Interface
Package or setup
Earliest failure stage
Setup or provider admission
Relevant output or evidence
docs/installation.mdSkill destinations ("Setup leaves existing skill copies in other locations untouched.") and Diagnose, update, and remove (uninstall removes only REA-owned skill files; symbolic-link paths are retained rather than followed), and the update maintenance plan (lines 197-198: it "selects only existing REA registrations and an already installed REA skill"), with the matching paragraphs at lines 354, 847, 860 and 426-427 of the 6.4.0 tag;src/application/ClientConfigPath.ts(resolveClientConfigTransactionPath, the user-owned configuration symlink precedent);src/application/Uninstall.ts:683-684onmain(symlinked skill directory retained);src/application/SetupSkill.ts:208-210onmain(existingSkillDestinationsskips a symlinked root;src/application/UpdateMaintenance.ts:73-83uses it to choose the skill destinationsrea updatemaintains). The 6.4.0 source has the same root check.installCanonicalSkill(src/application/SetupSkill.ts:339-405onmain) creates directories, backs up and writes each managed file under the destination root without checking whether the root is a symbolic link; thesymlinks: "reject"option on skill file reads applies to the file itself, not to a linked parent directory.The
rea updatebehavior is static: it is cited from source and was not run, because it requires an npm or Bun global installation. The reproduction covers the Claude Code destination; the install path is shared by every skill destination, but other destinations were not run. Setup also replaces a non-REASKILL.mdin a regular skill directory (see the control), which is a separate ownership question; this report concerns only following the link.Typed outcome or recovery expected
Failing now: after the setup
--yesstep,managed/reacontains REA'sSKILL.md,SKILL.md.rea.backupand sixreferences/*.mdfiles, doctor reports the skillaligned, and uninstall reports the Claude Code skillretained (Skill directory is a symbolic link.)and leaves all of them. Restored, by either consistent outcome for the same symlinked directory: setup leavesmanaged/reabyte-identical and reports the Claude Code skill destination as skipped or refused with a reason; or setup's write is matched by uninstall removing the REA-managed files it wrote inmanaged/rea(preserving the user's other files) and by update selecting that destination. Control: with a regular~/.claude/skills/reverse-engineer-anythingdirectory, setup still installs the skill and uninstall still removes REA's managed files.@akushonkamen commented on GitHub (Oct 14, 2026):
Claiming this for a fix.
Scope I am taking — the documented direction (skill symbolic-link paths are retained and reported rather than followed, docs/installation.md "Diagnose, update, and remove", matching
rea uninstall's existing rule and the closed #1816 precedent for the~/.rearoot):rea setupstops writing through a symbolic-link skill destination root:canonicalSkillNeedsInstallandinstallCanonicalSkill(src/application/SetupSkill.ts) treat a linked root as user-managed and skip it, so the link target stays byte-identical and noinstall_skillaction is planned or applied.rea doctorstops comparing through the link:readInstalledSkillIdentityignores symbolic-link roots, and doctor reports a new skill state for an all-links selection with a reason and remediation (replace the link with a real directory), instead ofalignedafter a setup that no longer writes, or a misleadingmissing/"run rea setup" loop.Out of scope, so nobody duplicates: uninstall and update behavior (both already decline linked roots; unchanged), the alternative direction of managing files inside the link target (that would reverse the documented retention policy and needs a maintainer call), any change to client configuration file symlink following (
ClientConfigPath.ts), and the separate ownership question of setup replacing a non-REASKILL.mdin a regular directory.Regression tests will synthesize a linked Claude Code skill destination per the report's reproduction; the setup/uninstall/doctor lifecycle stays covered by the existing regular-directory tests. PR to follow on top of current main.
@jpdefo commented on GitHub (Oct 14, 2026):
I independently reproduced this on current main
b3c5672with the real CLI on native Windows while the claim above was being posted. I have a locally tested candidate, but will hold off opening a competing PR.Evidence and review notes that may help:
--skill=falseleaves the linked target unchanged.installCanonicalSkillis too late for a combined setup: client registration is configured first. Planning/dry-run should disclose the outcome before client or Hopper changes, and the installer should retain its own check.Our local candidate exercised the compiled setup/uninstall CLI and native filesystem, plus workflow cases for selecting a linked Claude root, an unaffected Codex root, or CLI-only setup. The candidate's focused checks passed (85 tests, one POSIX-only skip), as did
npm run checkandnpm run docs:check. These results apply to our local candidate, not to your forthcoming implementation. Two existing Windows path-separator assertions inSetup.planning.test.tsalso failed identically on the unchanged baseline.@akushonkamen commented on GitHub (Oct 14, 2026):
Opened PR #3109: setup and doctor now follow the documented retention rule uninstall already applied — linked skill roots are partitioned out (lstat), all-links selections plan no install and stay byte-identical, mixed selections write only managed roots, and doctor reports a new
unmanagedskill state naming the link with a replace-the-link remediation instead of arun rea setuploop. Five new symlink regressions fail on pre-fix code (5 failed | 10 passed) and pass after (15/15); the related 15-file setup/doctor/update subset passes 197 tests. Note: PR #3108 also targets this issue with a refusal-framed variant, opened after the claim here — left for maintainer arbitration.