Stop ../ from escaping your files directory.
When user input is joined into a file path with no normalization, a name like ../../etc/passwd escapes the intended directory. AI writes this in any "serve/download a file" feature. SlopGrade blocks it in CI, before merge.
User input joined straight into a file path.
There is no resolve-and-check that the final path stays inside the base directory, so ../ segments walk out. Resolving and verifying the prefix fixes it — the gate blocks the un-checked join.
What the AI shipped
What leaves your runner
Path, line, class. The file content never leaves. Audit it with --print-payload.
Detect → adapt → verify. Nothing else leaves.
In your runner, on the diff
The open-source client walks the pull request and flags the pattern locally — intra-function dataflow, no code leaves the machine.
Server verdict + gate
The structural fingerprint is classified server-side. A hard hit blocks the check on a paid private repo; public repos are gated free; the paywall fails open.
Posted inline, fix verified locally
The finding is posted on its exact line. Where a fix exists it is generated AND verified in your runner — only offered once a re-scan proves the issue is gone.
What makes a path join safe?
Resolving the path and asserting it still starts with the intended base directory (or using a fixed map of allowed names). The gate recognizes that check and passes it; the bare join is flagged.
Does it cover uploads too?
The write side (zip-slip, unrestricted upload paths) is covered by adjacent gate classes in the full firewall; this page's class is the read/serve traversal. See the full catalog for the rest.