#23413: Skills: gate remote eligibility expansion behind explicit opt-in
docs
gateway
commands
size: S
Cluster:
Bundled Skills Management
## Summary
Describe the problem and fix in 2–5 bullets:
- Problem: remote macOS node presence could automatically expand skills eligibility (including macOS-only skills) without explicit user opt-in.
- Why it matters: node pairing is an admin surface; automatic expansion broadens reachable capability unexpectedly.
- What changed: added `skills.allowRemoteEligibilityExpansion` (default `false`) and gated all remote-skill eligibility expansion behind this flag.
- What did NOT change (scope boundary): node pairing, node command permissions, and base local skill eligibility logic.
## Change Type (select all)
- [x] Bug fix
- [ ] Feature
- [ ] Refactor
- [x] Docs
- [x] Security hardening
- [ ] Chore/infra
## Scope (select all touched areas)
- [ ] Gateway / orchestration
- [x] Skills / tool execution
- [ ] Auth / tokens
- [ ] Memory / storage
- [ ] Integrations
- [x] API / contracts
- [ ] UI / DX
- [ ] CI/CD / infra
## Linked Issue/PR
- Closes #
- Related #
## User-visible / Behavior Changes
Remote-node skill eligibility expansion is now disabled by default and only enabled when `skills.allowRemoteEligibilityExpansion=true`.
## Security Impact (required)
- New permissions/capabilities? (`No`)
- Secrets/tokens handling changed? (`No`)
- New/changed network calls? (`No`)
- Command/tool execution surface changed? (`No`)
- Data access scope changed? (`No`)
- If any `Yes`, explain risk + mitigation:
## Repro + Verification
### Environment
- OS: macOS
- Runtime/container: Node 22 + pnpm
- Model/provider: N/A
- Integration/channel (if any): Skills + remote node eligibility
- Relevant config (redacted): `skills.allowRemoteEligibilityExpansion`
### Steps
1. Connect/register a remote macOS node with `system.run` capability and probed bins.
2. Observe skills eligibility with default config.
3. Set `skills.allowRemoteEligibilityExpansion=true` and re-check eligibility.
### Expected
- Default config: no remote eligibility expansion.
- Opt-in config: remote eligibility expansion applies.
### Actual
- Matches expected behavior.
## Evidence
Attach at least one:
- [x] Failing test/log before + passing after
- [ ] Trace/log snippets
- [ ] Screenshot/recording
- [ ] Perf numbers (if relevant)
## Human Verification (required)
What you personally verified (not just CI), and how:
- Verified scenarios: remote eligibility helper behavior (default off + opt-in on), schema parse acceptance/rejection, skill command and gateway skill status tests.
- Edge cases checked: disconnected-node cleanup still removes exposed bins; non-boolean config value rejected.
- What you did **not** verify: docker live-node end-to-end matrix.
## Compatibility / Migration
- Backward compatible? (`No`)
- Config/env changes? (`Yes`)
- Migration needed? (`Optional`)
- If yes, exact upgrade steps:
- If you rely on remote nodes to make macOS-only skills eligible, set `skills.allowRemoteEligibilityExpansion=true`.
## Failure Recovery (if this breaks)
- How to disable/revert this change quickly: revert this PR or set `skills.allowRemoteEligibilityExpansion=true` to restore prior behavior.
- Files/config to restore: `skills` section in `openclaw.json`.
- Known bad symptoms reviewers should watch for: expected macOS-only skills no longer appear without explicit opt-in.
## Risks and Mitigations
- Risk: existing setups that depended on implicit remote expansion lose that behavior after upgrade.
- Mitigation: clear docs + explicit opt-in flag and config schema support.
<!-- greptile_comment -->
<h3>Greptile Summary</h3>
This PR adds `skills.allowRemoteEligibilityExpansion` (default `false`) to gate remote macOS node skill eligibility expansion. Previously, pairing a macOS node would automatically make macOS-only skills eligible without explicit opt-in, which could unexpectedly broaden the attack surface. The change correctly places the security gate in `getRemoteSkillEligibility`, which is the sole function responsible for exposing remote node capabilities to the skill eligibility system. All call sites properly pass the config parameter, tests verify the gating behavior, and documentation clearly explains the breaking change and migration path.
<h3>Confidence Score: 5/5</h3>
- This PR is safe to merge with minimal risk - it's a focused security hardening change with comprehensive test coverage.
- The implementation is straightforward and well-tested. All call sites correctly pass the config parameter. The gate is positioned at exactly the right boundary (getRemoteSkillEligibility), preventing unintended skill eligibility expansion without disrupting bin probing or node management. Tests verify both default and opt-in behavior. Documentation clearly explains the breaking change and migration steps. No logic errors or security issues detected.
- No files require special attention
<sub>Last reviewed commit: dfe5560</sub>
<!-- greptile_other_comments_section -->
<!-- /greptile_comment -->
Most Similar PRs
#16244: feat(gateway): add session files API and external skill management
by wanquanY · 2026-02-14
76.1%
#8150: fix(skills): block dangerous environment variables from skill config
by yubrew · 2026-02-03
75.9%
#21839: fix(skills): allowBundled: [] now blocks all bundled skills
by hydro13 · 2026-02-20
75.2%
#23383: Skills: gate command-dispatch tool targets and args
by bmendonca3 · 2026-02-22
75.0%
#22525: [Bug]: Session snapshot not reloading skills after gateway restart ...
by zwffff · 2026-02-21
74.4%
#8075: fix(skills): add --ignore-scripts to all package managers
by yubrew · 2026-02-03
74.2%
#22198: fix(skills): treat empty allowBundled array as block-all
by haitao-sjsu · 2026-02-20
73.8%
#23079: fix(skills): fallback to npm for summarize skill on non-darwin systems
by charojo · 2026-02-22
73.5%
#17502: feat: normalize skill scanner reason codes and trust messaging
by ArthurzKV · 2026-02-15
72.6%
#9215: Fix: Inject skill env vars into subagent exec commands
by vishaltandale00 · 2026-02-05
72.5%