SlopGradeby Maxor Global LLC
Sign inStart the free 14-day trial
Deterministic dataflow · abstains when it can't proveThe detection engine behind SlopGrade Firewall

Proof,
not guesses.
Follow the data.

Proof is the only security signal that survives every re-run. Regex scanners guess from patterns; LLM reviewers guess from context, charge per PR and send your code out. heisen-slop follows each request value through your code with deterministic dataflow analysis, and when it can't prove a path it abstains and says so — instead of a generative guess. A block is a proven path from attacker input to a dangerous sink — never a pattern that happened to match.

6
languages
29
vulnerability classes
127
language × class detectors
23 ms
per file, on average
What it is

A dataflow engine, not a pattern scanner.

The engine reads your code the way an interpreter would: it tracks every value from where it enters — a request parameter, a form field, a CLI argument — to where it lands: a shell, a query, a template, a deserializer. It raises a finding only when it can prove the path, and clears code only when it can prove the value is a constant. Anything it cannot prove, it abstains on — no block, no false green.

Detection scope

29 classes across 6 languages — 127 detectors.

Each ✓ is a live dataflow detector that follows request input to a dangerous sink in that language. This is the deep-scan layer of the Firewall; the Firewall's 125-class catalog also includes pattern-level gates the GitHub Action runs on your runner.

Vulnerability class
Python
JS / TS
Go
Java
Ruby
PHP
Injection & code execution
SQL injectionCWE-89
Command injectionCWE-78
Argument injectionCWE-88
Code injection / evalCWE-94
NoSQL injectionCWE-943
Template injection (SSTI)CWE-1336
LDAP injectionCWE-90
XPath injectionCWE-643
Insecure deserializationCWE-502
XML external entities (XXE)CWE-611
JNDI injectionCWE-74
Prototype pollutionCWE-1321
Paths, redirects & output
Path traversalCWE-22
Zip slipCWE-22
SSRFCWE-918
Open redirectCWE-601
Cross-site scripting (XSS)CWE-79
ReDoSCWE-1333
Crypto, tokens & transport
Weak cryptographyCWE-327
TLS verification offCWE-295
Insecure transportCWE-319
JWT secret in codeCWE-321
JWT verification offCWE-347
Sessions & configuration
Insecure cookieCWE-614
CSRF protection offCWE-352
Permissive CORSCWE-942
World-writable permissionsCWE-732
Debug mode in productionCWE-489
Trust-boundary violationCWE-501
Detectors per language · 127
27
23
21
24
23
9

✓ = a live detector for that language. — = not covered in that language today. The hosted deep scan leaves trust-boundary out: on real applications it was mostly noise.

What it understands

It knows your framework, your database and your HTTP client.

A taint engine is only as good as the sources and sinks it knows. These are modelled today — anything else is followed as ordinary code, and an unknown call makes the engine abstain rather than guess.

Pythonast · cross-file: imports, 3 levelsDjango, Flask, FastAPI / Starlette, Tornado, aiohttp, DRF. SQLAlchemy text(), Django .raw(), pymongo / motor. requests, urllib, httpx. Jinja, Mako, Django templates.
JavaScript / TypeScripttree-sitter · cross-file: relative importsExpress, Koa, Hapi, Fastify, Next.js route params and 'use server' actions, GraphQL resolvers. knex, Sequelize, Prisma, pg, mysql, Mongo / Mongoose. axios, got, undici, node-fetch.
Gotree-sitter · cross-file: the packagenet/http, gin, echo, fiber. db.Query-style SQL calls and the Mongo driver. goja and gopher-lua (code injection), gob (deserialization), rs/cors and gin-contrib/cors.
Javatree-sitter · single classServlets, Spring @RequestParam and friends, JAX-RS. JDBC, JPA / Hibernate queries. RestTemplate, WebClient, OkHttp. Velocity, FreeMarker, Pebble. DocumentBuilderFactory (XXE), Spring Security CSRF, JNDI.
Rubytree-sitter · cross-file: require_relativeRails, Sinatra and Rack params / cookies. ActiveRecord where, find_by_sql. Nokogiri (XPath, XXE), ERB. Rails CSRF settings.
Not covered yetlabelled, never impliedC# / .NET dataflow (the Action's pattern gates do cover .NET), TypeScript path aliases like @/lib, and Java calls into another class.
Where it plugs in

One engine, reached through the tools you already run.

GitHub Actionevery pull requestOn a private repo it sends only a {file, line, kind} fingerprint by default. With deep-scan: "true" (heisen-slop, paid repos), and by default on a public repo, it also sends the files that hold a sink — at most 80 files / 2M characters, the PR's own files first. --print-payload shows the exact bytes first.
Pull-request checksadvisory by defaultFindings land as a check run and inline annotations. deep-scan-block: "true" lets proven findings fail the check; the GitHub App can make the check required through branch protection.
Code Scanning (SARIF)GitHub Security tabupload-sarif: "true" sends the results next to your other scanners. A private repo needs GitHub Advanced Security for the Security tab.
MCP serveryour AI assistantAsk for a repo's gate status, the latest CI verdict and the Firewall findings (repo_gate_status, ci_verdict, firewall_findings) with an API key.
Hosted enginein memory, then droppedThe source is forwarded, analysed in memory and dropped — never logged, never stored. Only the finding (file, line, class, one-line reason) is kept for your CI history.
Your infrastructureEnterpriseFor code that must never leave, the engine can run inside your network, built to work without internet access. Set up with you, not a public download.

GitHub only for now: GitLab and Bitbucket are not supported by the Firewall.

How it works

Prove → abstain → decide. Nothing is ever guessed.

01 · PROVE

Deterministic taint analysis

The engine interprets each file abstractly and tracks taint from every source to every sink. A proven path is a BLOCK (p = 0.94); a value proven constant is CLEAN (p = 0.02). $0, auditable, and identical on every run.

02 · ABSTAIN

Abstains on the ambiguous band

When a dangerous sink meets a request source but no path can be proven, the engine abstains: it returns no verdict for that case. It never turns the case into a block, and it never counts it as clean.

03 · DECIDE

A verdict you can audit

The evidence carries the sink and the flow — never your source code. On SlopGrade Firewall the deep scan is opt-in on private repos and advisory by default; blocking on its findings is a separate switch. Only Python can return a proven CLEAN today; the other languages block or abstain.

Why it wins

The axis the incumbents can't follow.

vs. regex scanners

pattern → noise

A regex fires on text that looks dangerous. The engine fires on data that provably flows to a sink — so a safe parameterized query with the same keywords stays clean.

vs. LLM reviewers

non-deterministic · per-call cost · egress

An LLM can answer differently on re-run, costs money per PR, and sends your code to a third party. A proven path here is deterministic and makes no model call. When no path can be proven, the engine abstains instead of guessing, and the hosted deep scan never stores a line of your code.

vs. cloud SaaS

your code leaves your infra

Cloud-hosted scanners copy your repo out. On a private repo the default Firewall run sends only a structural fingerprint. The deep scan is analysed in memory and dropped. Running the engine in your infrastructure can be set up under an Enterprise agreement, on request.

Measured, not asserted

Every number here comes from a run — including the weak ones.

0 false blocksacross 2,479 labelled cases the engine decided (OWASP Benchmark Python, Semgrep rule tests)
23 msper file on average, 1.6 s worst case, over 60,008 real files — 0 model calls
3 of 32Python verdicts wrong on held-out CodeQL tests (all were blocks; 12 of 12 cleans right). JS: 106 of 112 blocks right
~2%of real-CVE files (GitHub advisories) get a verdict — recall on real vulnerabilities is the frontier

Read the first number with the last one: the engine is precise when it decides, and it often abstains. On real CVE code (GitHub advisories, held-out split), blocks are right at least 3 times in 4 (25 of 32, a floor: every block on the fixed file counts as wrong); on 52,089 ordinary open-source pull requests it blocked 245, 46 of them for a real flaw — that is why the deep scan is advisory by default and blocking is a separate opt-in. The CI gate's library rule pack is graded the same way: a whole-repo review of 240 of its MEDIUM lines found about 1 in 4 true (25.0 %, 18.0–32.9), not the 32.5 % that snippet labels gave. Only the disagreements got a second reading and nothing was executed, so the pack stays advisory and never blocks.

Roadmap

What we are building next.

Real-CVE recallA library mode for published packages already lists candidates (notices, never blocking). Turning more of them into proven findings is the main lever.
Deeper cross-fileTypeScript path aliases, Java calls across classes, Go across packages.
More languagesA C# dataflow engine on the same core.
Questions

Straight answers.

Does it follow data across files?

Yes in Python (imports, 3 levels), JavaScript/TypeScript (relative imports), Ruby (require_relative) and Go (the package). Not yet for TypeScript path aliases or Java calls into another class.

Does my code leave my infrastructure?

Not by default: the Firewall run sends a structural fingerprint — file paths, {file, line, kind} and the table and column names the cross-tenant check needs, never file contents. The deep scan is opt-in on private repos (paid) and on by default on public repos (heisen-slop) — it sends at most 80 files that a local detector flagged or that hold a dangerous call to the engine, which analyses them in memory and drops them. When no path can be proven, the engine abstains.

How is this different from Snyk, Semgrep or CodeQL?

Semgrep and Snyk Code lead with pattern rules; CodeQL does dataflow but needs query authoring and ships no tenant-isolation gate. The engine blocks only a proven path and abstains when it cannot prove one. The trade-off is recall: on Semgrep's own rule tests, Semgrep finds more.

Do you support GitLab or Bitbucket?

Not for the Firewall yet — it is GitHub only (Action, checks, OIDC).

Put proof in your pipeline.

Add the deep scan (heisen-slop) to your pull requests — free on public repos, opt-in on private repos, deterministic, advisory by default.

Regulated or air-gapped? Talk to us about running the engine in your infrastructure →