Description
PR #3150 added `invoke_skill` to `AdversarialPolicyConfig::default_exempt_tools()` and `vigil::default_exempt_tools()`, but did not add it to `UtilityScoringConfig::exempt_tools`. In live sessions, when the utility scorer is active, `invoke_skill` is still blocked by the utility gate with `Retrieve` or `Respond` actions.
The utility scorer's `exempt_tools` defaults to `Vec::new()` (see `zeph-tools/src/config.rs:241`). `invoke_skill` (and `load_skill`) are not in this list, so they receive normal utility scoring and are frequently gated.
Reproduction Steps
- `echo "use the /help skill to list available commands" | RUST_LOG=warn cargo run --features full -- --config .local/config/testing.toml`
- Observe agent output
Expected Behavior
`invoke_skill` is exempt from all policy gates (adversarial, vigil, and utility). The agent calls the skill directly without being blocked.
Actual Behavior
Zeph: [tool output: invoke_skill]
[skipped] Tool call to invoke_skill skipped — utility policy recommends retrieving additional context first.
Zeph: [tool output: invoke_skill]
[skipped] Tool call to invoke_skill skipped — utility policy recommends a direct response without further tool use.
The agent ultimately cannot execute the skill and falls back to a generic text response.
Root Cause
`apply_utility_config()` in `agent_setup.rs` reads `UtilityScoringConfig::exempt_tools` which defaults to `Vec::new()`. Neither `invoke_skill` nor `load_skill` are added there.
Fix: add both `invoke_skill` and `load_skill` to `UtilityScoringConfig::default()`'s `exempt_tools` field (parallel to the existing `AdversarialPolicyConfig::default_exempt_tools()` change in #3150).
Environment
- Version: v0.19.1 (de2a5cf)
- Config: .local/config/testing.toml
- Features: full
Logs / Evidence
# First attempt — utility gate returns Retrieve
[tool output: invoke_skill]
[skipped] Tool call to invoke_skill skipped — utility policy recommends retrieving additional context first.
# Second attempt (after memory_search retrieval) — utility gate returns Respond
[tool output: invoke_skill]
[skipped] Tool call to invoke_skill skipped — utility policy recommends a direct response without further tool use.
Description
PR #3150 added `invoke_skill` to `AdversarialPolicyConfig::default_exempt_tools()` and `vigil::default_exempt_tools()`, but did not add it to `UtilityScoringConfig::exempt_tools`. In live sessions, when the utility scorer is active, `invoke_skill` is still blocked by the utility gate with `Retrieve` or `Respond` actions.
The utility scorer's `exempt_tools` defaults to `Vec::new()` (see `zeph-tools/src/config.rs:241`). `invoke_skill` (and `load_skill`) are not in this list, so they receive normal utility scoring and are frequently gated.
Reproduction Steps
Expected Behavior
`invoke_skill` is exempt from all policy gates (adversarial, vigil, and utility). The agent calls the skill directly without being blocked.
Actual Behavior
The agent ultimately cannot execute the skill and falls back to a generic text response.
Root Cause
`apply_utility_config()` in `agent_setup.rs` reads `UtilityScoringConfig::exempt_tools` which defaults to `Vec::new()`. Neither `invoke_skill` nor `load_skill` are added there.
Fix: add both `invoke_skill` and `load_skill` to `UtilityScoringConfig::default()`'s `exempt_tools` field (parallel to the existing `AdversarialPolicyConfig::default_exempt_tools()` change in #3150).
Environment
Logs / Evidence