You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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:
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.
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.
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.
Description
Same defect class as #5899/#5905/#5906 (fixed by #5930) and #5900/#5938/#5931 (fixed by #6011): a wrapper's
impl ToolExecutorblock 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
TrustGateExecutoris unconditionally the outermost confirmation authority in production wiring today).Three sibling wrappers in
crates/zeph-tools/still have gaps:CompressedExecutor— missingrequires_confirmationoverride while it forwards its other cross-cutting siblings (is_tool_retryable,is_tool_speculatable, etc.). One-line fix, same shape as the#6011PR's plain-delegate pattern.ToolFilter(wraps the ACPFileExecutor) — 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 byToolFilterin production), but the same class of gap.Arc<ShellExecutor>-style shadow-impls — partial forwarding, the same shape as theArc<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 therequires_confirmation/is_tool_speculatablemethods 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
ToolExecutormethod to its inner/wrapped executor, matching the pattern established byCompositeExecutor/AdversarialPolicyGateExecutor/PolicyGateExecutor/ScopedToolExecutor/ShadowProbeExecutorafter #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) == trueoutside test code, andTrustGateExecutoris 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