Skip to content

CompressedExecutor/ToolFilter/Arc<ShellExecutor>-style shadow-impls have the same ToolExecutor forwarding gap as #5900/#5938/#5931 #6012

Description

@bug-ops

Description

Same defect class as #5899/#5905/#5906 (fixed by #5930) and #5900/#5938/#5931 (fixed by #6011): a wrapper's impl ToolExecutor block omits an override for a cross-cutting method, so it silently falls through to the trait default instead of forwarding to the inner/wrapped executor.

Found by an adversarial critique pass during #6011's review (verdict: minor, non-blocking — confirmed dormant, not a live vulnerability, because TrustGateExecutor is unconditionally the outermost confirmation authority in production wiring today).

Three sibling wrappers in crates/zeph-tools/ still have gaps:

  1. CompressedExecutor — missing requires_confirmation override while it forwards its other cross-cutting siblings (is_tool_retryable, is_tool_speculatable, etc.). One-line fix, same shape as the #6011 PR's plain-delegate pattern.
  2. ToolFilter (wraps the ACP FileExecutor) — forwards none of the cross-cutting methods (requires_confirmation, is_tool_speculatable, is_tool_retryable, set_skill_env, set_effective_trust, checkpoint trio). Currently perf-only impact (no confirmation-gating or checkpoint-capable executor is wrapped by ToolFilter in production), but the same class of gap.
  3. Arc<ShellExecutor>-style shadow-impls — partial forwarding, the same shape as the Arc<ShellExecutor> checkpoint-forwarding bug fixed in checkpoint_undo/redo/list never reach ShellExecutor — Arc<ShellExecutor>'s own ToolExecutor impl doesn't forward them #5985/fix(tools): forward checkpoint methods through Arc<ShellExecutor> #5998, but for the requires_confirmation/is_tool_speculatable methods rather than checkpoints. Benign only because the leaf executor doesn't currently specialize these methods away from the trait default.

Expected Behavior

Each wrapper should forward every cross-cutting ToolExecutor method to its inner/wrapped executor, matching the pattern established by CompositeExecutor/AdversarialPolicyGateExecutor/PolicyGateExecutor/ScopedToolExecutor/ShadowProbeExecutor after #6011.

Suggested Fix

Add self.inner.<method>(...) (or equivalent) forwards for the missing methods in each of the three files, with regression tests mirroring the "spy/stub inner executor returns a distinguishable non-default value" pattern used in #5930 and #6011.

Impact / Current Exploitability

Dormant, not a live incident — same reasoning as #5900's original dormancy note: no leaf executor in the workspace currently sets is_tool_speculatable(tool_id) == true outside test code, and TrustGateExecutor is unconditionally wired as the outermost confirmation authority in production, so these gaps are not currently reachable with a live policy divergence. Worth closing before any future refactor composes a confirmation-gating executor as a leaf inside one of these three wrappers.

Related

Activity

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

Metadata

Metadata

Assignees

Labels

P3Research — medium-high complexitybugSomething isn't workingtech-debtTechnical debttoolsTool execution and MCP integration

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions