Polyglot codebase intelligence
One binary. Six languages.
Six analyses.
Your repo has a Rails app, a Spring service, a Go module, and a pile of TypeScript. Each one has its own linter, its own report shape, and its own quality bar. Stratify parses all of them into one model and runs the same six analyses on every line. One gate. One report. No servers, no accounts.
Add the gate to CI
- uses: stratify-dev/stratify@v0.6.0
with:
fail-on: warning
Or run it locally
brew install stratify-dev/tap/stratify
How it flows
Six languages compress into one model. Six analyses read only the model, so each one is written once and works everywhere. One stream of findings fans out to every surface.
What a run looks like
$ stratify check .
warn Unused.java:2 unused function `neverCalled`
info App.java:6 possibly unused function `helper`
2 finding(s).
Stratify says unused when it proved the call graph, and possibly unused when it could not. It never hides a real finding behind a guess.
Then judge what proof left over
Every hedged finding is a question the call graph could not settle: a framework hook, a test helper, a symbol reached through reflection. stratify-judge pipes the report through a model, asks five specific questions per finding, and moves the confidence. No finding is ever deleted.
$ stratify check . --format json | stratify-judge --root .
info src/lib.rs:6 possibly unused function `helper`
jev-latest: reached by a framework (0.91)
73 findings, 9 shown, 64 hidden. Re-run with --show-dismissed to see them.
Measured on Stratify's own repository: all 15 possibly unused findings are false positives. The judgment dismisses all 15 and strengthens none.
-
Hosted or entirely local
One flag picks the endpoint.
--backend jevasks TypeSafe's hosted model.--backend layaasks Convai's Laya on127.0.0.1, Apache-2.0, where no source leaves the machine. -
Every verdict is auditable
A dismissed finding stays in the report. It drops below the display threshold and keeps its full judgment, every raw probability included, in the JSON.
-
It will not overrule the engine
A finding the engine hedged is never promoted to certain, whatever the model answers. The thresholds are yours, and the answers cache in git so CI reruns without calling anything.
Why teams run it
-
Six languages, one engine
Every language parses into the same intermediate representation. Each analysis is written once and works everywhere, so a polyglot repo gets one consistent report instead of six dialects of "warning".
-
It tells you how sure it is
Every finding carries a confidence level. Act on the warnings, triage the rest. No more muting a whole rule because it cried wolf twice.
-
It meets you where you work
The same analysis drives the CLI, the CI gate, SARIF annotations, your editor, your coding agent, and your dashboards. One engine, six front doors.
The six analyses
They all run in a single pass. Read the details.
Dead code
Functions and methods nothing reaches, resolved across files.
Duplication
Copy-pasted and renamed blocks, across files and across languages.
Complexity
Functions with high cyclomatic complexity, ranked by severity.
Churn hotspots
Complex code changing often. The riskiest spots in the repo.
Dependency cycles
Circular imports between files and packages.
Layer boundaries
Imports breaking the architecture rules you wrote down.
Coverage today
| Language | Dead code | Duplication | Complexity | Hotspots | Cycles | Boundaries |
|---|---|---|---|---|---|---|
| Java | Yes | Yes | Yes | Yes | Yes | Yes |
| Ruby | Yes | Yes | Yes | Yes | Yes | Yes |
| TypeScript | Yes | Yes | Yes | Yes | Yes | Yes |
| Python | Yes | Yes | Yes | Yes | Yes | Yes |
| Go | Yes | Yes | Yes | Yes | Yes | Yes |
| Rust | Yes | Yes | Yes | Yes | Pending | Pending |
Six front doors
CLI
stratify check .CI gate
- uses: stratify-dev/stratify@v0.6.0SARIF
stratify check . --format sarifMCP
stratify mcpLSP
stratify lspOpenTelemetry
OTEL_EXPORTER_OTLP_ENDPOINT=...
Scan your repo now
brew install stratify-dev/tap/stratify
stratify check .