Skip to content

fix(skills,tools): exempt invoke_skill from policy gates and fix plugin hot-reload#3150

Merged
bug-ops merged 3 commits intomainfrom
3133-invoke-skill-plugin-hotreload
Apr 17, 2026
Merged

fix(skills,tools): exempt invoke_skill from policy gates and fix plugin hot-reload#3150
bug-ops merged 3 commits intomainfrom
3133-invoke-skill-plugin-hotreload

Conversation

@bug-ops
Copy link
Copy Markdown
Owner

@bug-ops bug-ops commented Apr 17, 2026

Summary

Changes

  • crates/zeph-tools/src/config.rs — add invoke_skill to adversarial exempt list + test
  • crates/zeph-config/src/vigil.rs — add invoke_skill to VIGIL exempt list + test
  • crates/zeph-config/src/agent.rs — add invoke_skill to tool-filter always-on list
  • src/bootstrap/mod.rs — split skill_paths() into skill_paths_for_registry() + skill_paths_for_watcher(); watcher path includes plugins root
  • crates/zeph-core/src/agent/builder.rs — add with_plugin_dirs_supplier() builder method
  • crates/zeph-core/src/agent/mod.rsreload_skills() calls supplier before rebuilding registry
  • crates/zeph-core/src/agent/state/mod.rs — store supplier in SkillStateBundle
  • src/runner.rs, src/daemon.rs, src/acp.rs — updated call sites to use skill_paths_for_registry()

Test plan

  • cargo nextest run --workspace --features full --lib --bins — 8608/8608 passed
  • cargo +nightly fmt --check — clean
  • cargo clippy --workspace --lib --bins -- -D warnings — clean
  • Adversarial policy enabled: invoke_skill no longer blocked
  • /plugins add <path> while agent running: skills available within debounce window without restart

Closes #3133
Closes #3134

@github-actions github-actions Bot added documentation Improvements or additions to documentation rust Rust code changes core zeph-core crate bug Something isn't working size/M Medium PR (51-200 lines) labels Apr 17, 2026
@bug-ops bug-ops enabled auto-merge (squash) April 17, 2026 21:34
@bug-ops bug-ops force-pushed the 3133-invoke-skill-plugin-hotreload branch from 5a60094 to af3cd21 Compare April 17, 2026 21:34
bug-ops added 2 commits April 17, 2026 23:40
…in hot-reload

#3133: add invoke_skill to AdversarialPolicyConfig::default_exempt_tools(),
vigil::default_exempt_tools(), and default_tool_filter_always_on(). Both
load_skill and invoke_skill are pure local registry reads with no external
side effects; treating them differently caused invoke_skill to be denied by
the adversarial policy LLM on every call.

#3134: watch the plugins root directory recursively instead of fixed per-plugin
dirs captured at startup. Split skill_paths() into skill_paths_for_registry()
(per-plugin dirs, feeds registry) and skill_paths_for_watcher() (config +
managed + plugins root, feeds SkillWatcher). Add plugin_dirs_supplier closure
that re-invokes PluginManager::collect_skill_dirs() on each reload so newly
installed plugin skills are picked up without restart.

Closes #3133
Closes #3134
@bug-ops bug-ops force-pushed the 3133-invoke-skill-plugin-hotreload branch from af3cd21 to 14d46f1 Compare April 17, 2026 21:42
@bug-ops bug-ops merged commit ed72ff3 into main Apr 17, 2026
32 checks passed
@bug-ops bug-ops deleted the 3133-invoke-skill-plugin-hotreload branch April 17, 2026 21:55
bug-ops added a commit that referenced this pull request Apr 18, 2026
UtilityScoringConfig::default() populated exempt_tools with an empty
Vec, so the utility scorer blocked invoke_skill calls even though
AdversarialPolicyConfig and vigil already exempted them (#3150).
Add invoke_skill and load_skill to the default exempt list and cover
the invariant with a regression test.

Closes #3163
bug-ops added a commit that referenced this pull request Apr 18, 2026
UtilityScoringConfig::default() populated exempt_tools with an empty
Vec, so the utility scorer blocked invoke_skill calls even though
AdversarialPolicyConfig and vigil already exempted them (#3150).
Add invoke_skill and load_skill to the default exempt list and cover
the invariant with a regression test.

Closes #3163
bug-ops added a commit that referenced this pull request Apr 18, 2026
UtilityScoringConfig::default() populated exempt_tools with an empty
Vec, so the utility scorer blocked invoke_skill calls even though
AdversarialPolicyConfig and vigil already exempted them (#3150).
Add invoke_skill and load_skill to the default exempt list and cover
the invariant with a regression test.

Closes #3163
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working core zeph-core crate documentation Improvements or additions to documentation rust Rust code changes size/M Medium PR (51-200 lines)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

plugin skills not hot-reloaded after runtime install via /plugins add invoke_skill blocked by adversarial policy gate — missing from exempt_tools

1 participant