Esc
↑↓ to move↵ to openEsc to close

DocsConcepts

The model

One global model from the first pull request, with a per-repository layer that earns its weight.

Accepted

Riffle does not wait for a repository to accumulate history before it can rank. One global model serves every repository from the first pull request, and each repository earns its own adjustment as outcomes arrive.

Two layers

LayerTrained onServesFits in
Global modelPublished datasets, self-mined history, opt-in shared outcomesEvery repository, from day oneA scheduled training run
Repository layerThat repository's own mature outcomesThat repository onlySeconds, on CPU, with dozens of labels

The global model is gradient-boosted. The repository layer is deliberately light, so it can be refitted often and cheaply.

How the repository layer earns its weight

Illustrative shape only. How layer_weight grows is still open.Diagram
Mermaid source
%% caption: Illustrative shape only. How layer_weight grows is still open.
xychart-beta
  x-axis "mature labels" [none, ·, ·, ·, ·, ·, ·, ·, many]
  y-axis "layer_weight" 0 --> 1
  line [0, 0.02, 0.07, 0.2, 0.45, 0.72, 0.88, 0.96, 0.99]
  • layer_weight starts at 0.0 and grows with the number of mature labels. There is no cutover and no threshold to argue about.
  • Each layer is checked against its own holdout. If it ranks worse than the global model alone, its weight drops to 0.0 automatically.
  • Path history is computed from git on install, so repository-specific signal exists before the first label matures.

Version pinning

A score records exactly what produced it. model_version covers the global model, the repository layer, the feature extractor and the compiled rules hash. A request never mixes a new model with an old feature extractor.

Training corpus

The first global model trains on 50 public repositories across five domains: 1,899,996 pull requests, open and closed, measured on 48 of them from each repository's Pull Requests tab between July and September 2026. rust-lang/rust and envoyproxy/envoy are not measured yet.

DomainRepositoriesPull requestsShare
ML, science, media and end-user software10505,27227%
Systems, languages and developer tools10437,11423%
Databases and data systems10425,94022%
Cloud, infrastructure and observability10272,17614%
Web and application frameworks10259,49414%
Total501,899,996

Forty repositories train the model; ten are held out entirely, to measure how it ranks repositories it has never seen. The target there is a ROC-AUC of 0.65 or better, following Kamei et al., 2016. Closed counts mix merged, rejected, auto-closed and bot pull requests; bot, backport and sync PRs are filtered before training.

The 50 repositories

Every repository in the first training corpus, by domain, with its measured pull request counts.

Systems, languages and developer tools

#RepositoryOpenClosedTotalNotes
1kubernetes/kubernetes94689,33390,279Stale PRs auto-closed after 90 days
2rust-lang/cargo828,3408,422Replaces golang/go (review on Gerrit)
3python/cpython2,71774,68777,404Many bot backport PRs
4rust-lang/rust———Not measured yet; rollup PRs bundle many PRs
5llvm/llvm-project10,033115,156125,189GitHub review only since September 2023
6rust-lang/rust-clippy2017,6557,856Replaces git/git (review on the mailing list)
7curl/curl5315,54415,597
8neovim/neovim29825,47625,774
9microsoft/vscode2,73164,40667,137Mostly internal-team PRs
10microsoft/TypeScript13019,32619,456
Subtotal437,114

Web and application frameworks

#RepositoryOpenClosedTotalNotes
11facebook/react48218,97719,459Now redirects to react/react
12nodejs/node58442,04442,628
13denoland/deno27118,22318,494
14django/django45321,08321,536Tickets in Trac, review on GitHub
15pallets/flask32,8462,849Small; low weight
16rails/rails1,12038,15539,275
17laravel/framework4435,89335,937Fast-close culture; low merge ratio
18spring-projects/spring-boot117,8407,851Manual merges; needs a merge heuristic
19electron/electron14230,81030,952Many bot backport PRs
20vercel/next.js2,48638,02740,513Large open backlog
Subtotal259,494

Databases and data systems

#RepositoryOpenClosedTotalNotes
21ClickHouse/ClickHouse1,44577,58679,031
22redis/redis6797,5268,205
23pingcap/tidb1,92645,12047,046Replaces mongodb/mongo (internal development)
24apache/airflow81045,72346,533Replaces apache/cassandra (review in Jira)
25elastic/elasticsearch1,241105,914107,155
26apache/kafka49822,60823,106
27apache/spark40956,51256,921Merged by script; needs a merge heuristic
28apache/flink36228,23428,596Merged by committers; needs a merge heuristic
29apache/druid11914,89115,010
30duckdb/duckdb33813,99914,337
Subtotal425,940

Cloud, infrastructure and observability

#RepositoryOpenClosedTotalNotes
31docker/compose455,5695,614Small
32moby/moby59428,00428,598
33hashicorp/terraform16716,30116,468BSL licence since 2023
34hashicorp/vault28024,98225,262Some synced enterprise PRs
35ansible/ansible34253,01753,3592020 collections split in history
36prometheus/prometheus37411,68512,059
37grafana/grafana63281,55582,187Many bot PRs
38open-telemetry/opentelemetry-collector7711,05611,133Short history (2019 on)
39istio/istio7137,42537,496
40envoyproxy/envoy———Not measured yet
Subtotal272,176

ML, science, media and end-user software

#RepositoryOpenClosedTotalNotes
41pytorch/pytorch3,514133,276136,790Largest; ghstack merges need a heuristic
42tensorflow/tensorflow1,96376,53178,494Mostly Copybara sync PRs; filter by author
43scikit-learn/scikit-learn58720,63121,218
44huggingface/transformers1,49726,43527,932
45jupyter/notebook482,5932,641Small; low weight
46obsproject/obs-studio3307,6938,023
47godotengine/godot5,30451,45956,763Large open backlog
48home-assistant/core1,063106,968108,031Many dependency-bump PRs
49nextcloud/server1,01239,24140,253Many bot and backport PRs
50bitcoin/bitcoin38824,73925,127Merged by maintainer script
Subtotal505,272

The next model: 100 repositories

RepositoriesPull requestsCommits (approx.)
Current 50501,899,996~3,482,259
New 50501,019,194~1,526,983
All 1001002,919,190~5,009,242

Pull requests are measured on 98 of the 100 repositories; rust-lang/rust and envoyproxy/envoy are still pending. Most commit counts are estimates, replaced after cloning. The plan also replaces the 40 / 10 split with 70 training, 15 validation and 15 final-test repositories. Every repository, its split, and the plan's estimates are on Dataset plan: 100 repositories.