Skip to content

Global Code Integrity Report: 2026

Engine: The Janitor v6.12.7 Scope: 22 Tier-1 open-source repositories — live PRs per repo Date: March 2026

We audited 2,098 live PRs across 22 of the world's most critical repositories. Here is the state of open-source PR hygiene in 2026.


Headline Numbers

Metric Value
Repositories audited 22
Pull requests analyzed 2,098
Total Slop Score 33,660
PRs blocked (score ≥ 100) 13
PRs flagged with any violation 1,563 / 2,098 (74.5%)
Unlinked PRs (no issue reference) 1,549 / 2,098 (73.8%)
Structural clone groups detected 323
Unverified security bumps caught 8
Engine panics 0
OOM events 0

73.8% of all 2,098 PRs across 22 Tier-1 repositories were submitted with no linked issue. Zero panics. Zero OOM. Across the Linux package ecosystem, the Rust compiler, the Swift compiler, and 19 more.


What the Engine Ran

  • Tool: just run-gauntlet — gauntlet-runner Rust binary
  • Source: Live PRs fetched via gh pr diff <N> --repo <slug> — no local clone required
  • Filter: CONFLICTING PRs skipped; binary extensions stripped before bounce
  • Pipeline: janitor bounce v6.12.7 — structural clones (MinHash LSH), social forensics (CommentScanner), Unverified Security Bump detection, Agnostic IaC Shield, Universal Bot Shield

Full Per-Repo Results

Repo PRs Total Score Blocked (≥100) Unlinked Bots
NixOS/nixpkgs 100 980 0 49 48
ansible/ansible 100 1,660 2 75 0
apache/kafka 93 2,620 1 93 0
apple/swift 99 1,940 0 97 0
cloudflare/workers-sdk 94 1,460 2 63 18
denoland/deno 93 1,260 0 58 7
dotnet/aspnetcore 98 915 0 41 46
godotengine/godot 95 1,580 0 79 0
hashicorp/terraform 82 1,465 0 72 4
home-assistant/core 91 1,495 0 74 0
kubernetes/kubernetes 96 1,600 0 75 0
langchain-ai/langchain 94 765 0 38 6
laravel/framework 98 1,855 1 87 1
microsoft/vscode 97 1,540 0 77 10
neovim/neovim 100 1,420 0 71 5
pytorch/pytorch 98 2,100 0 91 1
rails/rails 100 1,810 1 80 0
redis/redis 86 1,680 1 79 0
rust-lang/rust 93 1,860 0 93 0
square/okhttp 94 780 0 39 45
tauri-apps/tauri 98 1,075 4 33 29
vercel/next.js 99 1,800 1 85 1
TOTAL 2,098 33,660 13 1,549 221

Forensic Spotlights

Spotlight 1: The 73.8% Unlinked Problem

Of 2,098 PRs sampled, 1,549 had no associated GitHub issue — no spec, no triage trail, no accountability chain. This is the default operating mode of large open-source projects in 2026.

The worst offenders by unlinked rate:

Repo Unlinked Rate
apache/kafka 93/93 100%
rust-lang/rust 93/93 100%
apple/swift 97/99 98%
ansible/ansible 75/100 75%
rails/rails 80/100 80%

100% of sampled Kafka PRs and 100% of sampled rust-lang/rust PRs were submitted with no linked issue. No ticket. No spec. No accountability.

The Janitor scores unlinked PRs +70 — not as a hard block, but as a mandatory signal that the PR needs a human to supply the context that the machine cannot.


Spotlight 2: apache/kafka — 142 Clone Groups, Score 730

PR #21680 by bbejeck — score 730, 142 structural clone groups detected, unlinked.

Violation: Structural Clone x142 | Unlinked PR
Score breakdown: 142 × 5 (clones) + 70 (unlinked) = 780

142 logic clone groups in a single PR — the highest clone density in the entire 2,098-PR corpus. This is the structural fingerprint of generated or templated Java code: identical exception handling patterns, identical field validation blocks, identical builder method bodies propagated across dozens of classes. The AstSimHasher (BLAKE3 structural hashing with alpha-normalization) catches all 142 pairs at merge time.


Spotlight 3: Unverified Security Bumps — 8 Caught

Pattern: A PR claims to fix a security vulnerability in its body (CVE reference, 'RCE', 'XSS', 'memory leak', 'vulnerability'), but the diff contains only lockfile or config changes — no source code modification.

A real security fix requires modifying source code. A PR that claims to address a CVE while only touching .lock, .yaml, or .toml files is either a dependency bump with a mislabelled body, or an adversarial submission designed to appear high-priority.

8 such PRs were caught across 5 repositories:

PR Repo Author Score Claim Changed
#21680 kafka bbejeck 730 (clone-dominated)
#56865 rails byroot 190 (clone-dominated)
#59131 laravel Smoggert 120 'vulnerability' lock files
#91053 next.js i5d6 120 'RCE' lock files
#14747 redis LiorKogan 120 'vulnerability' lock files
#12789 workers-sdk workers-devprod 120 'XSS' lock files
#14950 tauri app/renovate 100 'vulnerability' lock files
#14902 tauri app/renovate 100 'vulnerability' lock files
#14891 tauri app/renovate 100 'vulnerability' lock files
#14890 tauri app/dependabot 100 'memory leak' lock files
#12805 workers-sdk app/dependabot 100 'memory leak' lock files

The bot-authored security bumps (app/renovate, app/dependabot) score 100 because they include security-language in their auto-generated PR bodies while changing only lockfiles. With the Universal Bot Shield active, these are correctly attributed as bot behaviour in the audit report — they still receive full structural analysis, since all bot code is reviewed.


Spotlight 4: ansible/ansible — Structural Clone Storm

PR #86600 and PR #86597 by haosenwang1018 — both score 100, both containing 16 structural clone groups, both unlinked.

Two PRs, same author, same day, same structural fingerprint. The AstSimHasher would flag these as near-duplicate submissions even before the clone-group counting begins.


Spotlight 5: NixOS/nixpkgs — IaC Shield in Production

100 PRs. 48 bot PRs (r-ryantm, nixpkgs-ci automation). 0 blocked. 0 false positives.

The Agnostic IaC Shield bypass (.nix, .lock, .toml exempt from ByteLatticeAnalyzer) eliminates the entropy false-positive that previously scored nix sha256 hashes as anomalous binary blobs. The 48 automation PRs score exactly 70 (unlinked-only signal) — pure automation hygiene reporting, no noise.


Spotlight 6: tauri-apps/tauri — Highest Block Rate

4 blocked PRs out of 98 — the highest block rate in the corpus (4.1%). All 4 are bot-authored security bumps. 29 of the 98 PRs are bot-authored (renovate, dependabot). The engine reviews every bot PR with full structural analysis — no exemptions.


Score Distribution

Band Count %
Blocked (≥ 100) 13 0.6%
Warned (70–99) 4 0.2%
Minor violation (1–69) 1,546 73.7%
Clean (score = 0) 535 25.5%

The "Minor" band (1–69) is almost entirely composed of unlinked PRs scoring exactly 20 (unlinked penalty applied on a per-repo policy basis). 25.5% of PRs across 22 Tier-1 repositories scored zero — genuine clean submissions.


Methodology

Tool: just run-gauntlet — gauntlet-runner Rust binary (tools/gauntlet-runner/) Source: Live PRs fetched via gh pr diff <N> --repo <slug> (no local clone required) Filter: CONFLICTING PRs skipped before diff fetch; binary extensions stripped before bounce Engine: janitor bounce v6.12.7 — Structural clones (MinHash LSH, 64 hashes × 8 bands), Social forensics (CommentScanner, issue-link compliance), Unverified Security Bump detection, Agnostic IaC Shield (null byte + windowed entropy > 7.0 bits/byte), Universal Bot Shield (4-layer) Scale: 82–100 PRs × 22 repos = 2,098 total. Bounce-only mode (no pre-scan registry).

All PR numbers, scores, author handles, and violation reasons are sourced directly from gauntlet_export.csv — no data was fabricated or estimated.


See what The Janitor finds in your repo.

janitor bounce . --repo . --base main --head HEAD

Full Gauntlet Results → · Godot 5k PR Deep-Dive → · Pricing