Banked: 2026-07-14, cycle300/301 (aws/language-servers GhostApproval siblings).
A project retrofits a path-containment / approval guard to fix a symlink/boundary CVE, but the guard is called PER-TOOL rather than in one central choke point. So the fix lands on the tools named in the CVE PoC (fsWrite/fsReplace) and MISSES sibling tools that mutate or read files through a different code path:
- grepSearch (cycle301): its requiresAcceptance() checks the RAW path via the string-only isInWorkspace (symlink-blind), NOT the realpath-laundering requiresPathAcceptance the fix hardened. An in-workspace symlink -> outside reads as "inside" -> no prompt -> ripgrep follows the symlinked root arg -> READ-leak of ~/.aws/credentials, ~/.ssh, /etc. (Read-side analog of the write CVE.)
- lspApplyWorkspaceEdit (cycle300): a whole mutating tool with NO validate/requiresAcceptance/requiresPathAcceptance, not even classified as a write tool, so it falls through the controller's approval switch = no prompt. Even the vendor's OWN in-flight hardening PR (#2759 "no silent edits") omitted it.
grep -rn requiresPathAcceptance vs the full tool registry (toolServer.ts registrations) = the set-difference.requiresPathAcceptance (realpath-laundered, safe) vs raw isInWorkspace (string-only, symlink-blind). Any caller using the weaker one directly inherits the bypass. Grep both; flag every direct isInWorkspace/raw-path caller.rg PAT ws/link reads through link/). So "search this path" tools are a symlink read-leak sink.CanWrite/write-tool tag) = it silently skips write-approval logic keyed on that tag.Sibling of cycle240 (RemoveAll skips the guard other methods call), cycle298-6 (mechanism-divergent partial port), cycle299 (canonicalize-existing-only / dangling symlink). Unifying rule: a fix covers the named path and misses a sibling path/tool/state - enumerate them all.