Ballast
Velocity + Durability
Faster didn't mean worse
2026 Velocity vs. Durability Study
We Measured Code Durability Against Commit Velocity in 70 Open-Source Projects, Before and After AI.
A Ballast Study, June 2026
Does shipping faster mean shipping worse?
To find out whether shipping code faster means the work stays landed or gets quietly reworked, we scored 70 well-known open-source repositories on code durability and commit velocity from 2020 to 2026, comparing 2020-2022, before AI coding tools were widely available, to 2023 and after.
Of the 20 repositories that accelerated since 2023, durability held or rose in 11 and dropped in 9. Speeding up did not, on balance, cost durability in this sample.
The remaining 50 repositories did not accelerate. Most are mature, feature-complete projects, where commit activity slows over time regardless of tooling.
A handful of projects saw large durability gains while accelerating, including react (+350), filament (+135), and serde (+119).
The link between acceleration and durability here is correlational, not causal: the data shows commit cadence and durability, not whether a project used AI tools.
The sample: 70 repos in a pre-registered, frozen set, spanning 5 language ecosystems at 14 repos each. Every score comes from git history alone, with no AI involved in the scoring.
Methodology
How we measured it
A 2005 Microsoft paper showed that relative code churn predicts post-release defect density. We use a kindred signal but aim it at a different target. Rather than predict defects, we score each project's durability at monthly checkpoints across its git history. Each checkpoint uses only the history available up to that moment, and we back-test the score against the rework that actually followed. The score is leakage-safe by construction, and what it captures is forward-looking: how well a project's work tends to stay landed instead of being torn up and redone.
The durability score
Durability is read entirely from a repository's git history and expressed on a 300-850 scale. It's a behavioral measure: how much newly written code overwrites code that was itself shipped recently (rework), and how concentrated or sprawling each change's footprint is (scope).
The score is deterministic: no AI is involved, so the same repository always produces the same number.
Velocity crossed with durability
For each repository we measured two things across the 2023 boundary, when AI coding tools started becoming widely available, and crossed them. A velocity inflection is commits per month since 2023 divided by the 2020-2022 baseline: 1.25x or higher counts as accelerated, 0.80x or lower as decelerated. A durability trajectory is the change in score: a rise of more than 15 points counts as up, within 15 points either way counts as held, and a drop of more than 15 points counts as down. Every label describes what we observe in the history, not why it happened.
Three outcomes follow from crossing these two measures. Q1 is success: velocity accelerated and durability held or rose. Q2 is caution: velocity accelerated but durability dropped. Q3 covers everything that didn't accelerate; most of the projects we examined fall here.
Caveats to read before citing this
Acceleration is the observable; AI usage is not. The engine reads git history, not tooling. It sees commit cadence and durability, never whether a contributor used an AI assistant. So "accelerated since 2023" is a measurement, and "AI made it accelerate" is an inference we deliberately don't make. The link is temporal and correlational.
There's also a maturation confound. Mature open-source projects naturally slow their commit cadence over time as a lifecycle effect, not an AI effect. That inflates the flat/decelerated bucket and makes our "accelerated" set conservative.
What it revealed
Faster didn't mean worse
Across the sample, 11 repositories accelerated and stayed durable, 9 accelerated but saw durability drop, and 50 did not accelerate, a bucket where the natural maturation of established projects confounds the reading.
The back-test
Does a low score predict anything?
Every repository in the sample was back-tested against the rework that actually followed. Each monthly checkpoint scores durability using only the history available up to that moment; we then measure the rework rate — the share of changed lines that overwrite recently shipped lines — over the following three months. Within each repository, we compare the months in its bottom durability-score quartile to the months in its top quartile. 68 of 70 repositories had back-testable history (kubernetes and grafana carry no back-test block in the frozen snapshot).
- 1.6× — a repository's bottom-quartile months carried, on average, that multiple of the forward rework of its top-quartile months (geometric mean 1.64× across the 68 back-tested repos; median 1.40×).
- 90% — the ratio exceeded 1, meaning the score was predictive, in 61 of 68 repositories.
Read the fine print before citing this: it is a within-repo, month-level comparison — each repository against its own history, never low-scoring repos against high-scoring ones. The outcome is rework, not defects. And like everything in this study, the relationship is correlational, not causal.
The highlights
The standouts
These are the highest and lowest durability changes in the frozen sample, as of June 2026. The findings, including each linked per-repo report, are frozen in time; we keep scoring these projects, and the current live score links track where they are now.
Q1: accelerated and durability held or rose
- serde-rs/serde: Rust, velocity 1.52x, durability rose from 727 to 846 (+119). The cleanest example of speed and durability rising together. Current live score →
- api-platform/core: PHP, velocity 1.57x, durability rose from 600 to 717 (+117), climbing over a hundred points while accelerating. Current live score →
- pydantic/pydantic: Python, velocity 2.63x, durability rose from 679 to 771 (+92) despite the largest velocity jump in this group. Current live score →
- junegunn/fzf: Go, velocity 2.21x, durability rose from 755 to 821 (+66), more than doubling its pace without losing ground. Current live score →
- BurntSushi/ripgrep: Rust, velocity 1.28x, durability held at 850, the ceiling of the scale, while accelerating. Current live score →
Q2: accelerated but durability dropped
- TanStack/query: JS/TS, velocity 1.6x, durability fell from 700 to 512 (-188), the steepest drop among accelerators in the sample. Current live score →
- fastapi/fastapi: Python, velocity 2.17x, durability fell from 841 to 782 (-59); churn rose nearly 5x alongside the speed-up. Current live score →
Notable Q3 projects that improved durability without accelerating
- jesseduffield/lazygit: Go, durability rose from 419 to 758 (+339), the strongest climb among projects that did not accelerate. Current live score →
- traefik/traefik: Go, durability rose from 504 to 722 (+218) over a sustained, multi-year recovery. Current live score →
Authors
Ed Grosvenor, artisan.build
We help companies scale AI across their teams by setting up the guardrails needed to control costs, security, and quality.
The full sample
Full Repository List
These are all 70 repos from the frozen list, as of June 2026, with their metrics, quadrant, and a link to their full per-repo report.
Score is the latest durability reading (300-850). Velocity is commits per month since 2023 divided by the 2020-2022 baseline. Durability delta is the change from the last pre-2023 month to the latest reading. Engine version 1.0.0.
JavaScript / TypeScript
| Repository | Score | Velocity | Durability Δ | Status |
|---|---|---|---|---|
| facebook/react Current live score → | 747 | ×1.71 | +350 | Q1 · Accelerated & durable |
| vercel/next.js Current live score → | 589 | ×1.65 | +21 | Q1 · Accelerated & durable |
| sveltejs/svelte Current live score → | 729 | ×2.71 | −45 | Q2 · Caution |
| TanStack/query Current live score → | 512 | ×1.6 | −188 | Q2 · Caution |
| colinhacks/zod Current live score → | 792 | ×0.75 | −4 | Q3 · Flat / decel |
| vuejs/core Current live score → | 775 | ×0.64 | −10 | Q3 · Flat / decel |
| prisma/prisma Current live score → | 751 | ×0.54 | +109 | Q3 · Flat / decel |
| excalidraw/excalidraw Current live score → | 743 | ×0.33 | +16 | Q3 · Flat / decel |
| vitejs/vite Current live score → | 731 | ×0.64 | +68 | Q3 · Flat / decel |
| t3-oss/create-t3-app Current live score → | 717 | ×0.17 | −53 | Q3 · Flat / decel |
| withastro/astro Current live score → | 602 | ×0.87 | −16 | Q3 · Flat / decel |
| nestjs/nest Current live score → | 500 | ×0.87 | −303 | Q3 · Flat / decel |
| remix-run/remix Current live score → | 432 | ×1.14 | −180 | Q3 · Flat / decel |
| trpc/trpc Current live score → | 400 | ×0.55 | −160 | Q3 · Flat / decel |
Python
| Repository | Score | Velocity | Durability Δ | Status |
|---|---|---|---|---|
| pydantic/pydantic Current live score → | 771 | ×2.63 | +92 | Q1 · Accelerated & durable |
| langchain-ai/langchain Current live score → | 760 | ×4.04 | +96 | Q1 · Accelerated & durable |
| apache/airflow Current live score → | 697 | ×1.65 | +10 | Q1 · Accelerated & durable |
| psf/requests Current live score → | 834 | ×1.35 | −16 | Q2 · Caution |
| fastapi/fastapi Current live score → | 782 | ×2.17 | −59 | Q2 · Caution |
| encode/httpx Current live score → | 850 | ×0.44 | +69 | Q3 · Flat / decel |
| pallets/flask Current live score → | 843 | ×0.51 | +96 | Q3 · Flat / decel |
| sqlalchemy/sqlalchemy Current live score → | 812 | ×0.62 | +18 | Q3 · Flat / decel |
| django/django Current live score → | 806 | ×0.82 | −6 | Q3 · Flat / decel |
| psf/black Current live score → | 800 | ×0.77 | −28 | Q3 · Flat / decel |
| python-poetry/poetry Current live score → | 798 | ×0.7 | −17 | Q3 · Flat / decel |
| pandas-dev/pandas Current live score → | 790 | ×0.63 | +40 | Q3 · Flat / decel |
| Textualize/rich Current live score → | 780 | ×0.2 | −43 | Q3 · Flat / decel |
| dbt-labs/dbt-core Current live score → | 618 | ×0.69 | −8 | Q3 · Flat / decel |
PHP
| Repository | Score | Velocity | Durability Δ | Status |
|---|---|---|---|---|
| filamentphp/filament Current live score → | 774 | ×1.44 | +135 | Q1 · Accelerated & durable |
| api-platform/core Current live score → | 717 | ×1.57 | +117 | Q1 · Accelerated & durable |
| barryvdh/laravel-debugbar Current live score → | 787 | ×3.52 | −60 | Q2 · Caution |
| nikic/PHP-Parser Current live score → | 850 | ×0.72 | +89 | Q3 · Flat / decel |
| Seldaek/monolog Current live score → | 848 | ×0.72 | +40 | Q3 · Flat / decel |
| thephpleague/flysystem Current live score → | 840 | ×0.26 | +95 | Q3 · Flat / decel |
| spatie/laravel-permission Current live score → | 817 | ×1.12 | −16 | Q3 · Flat / decel |
| statamic/cms Current live score → | 798 | ×1.07 | −35 | Q3 · Flat / decel |
| laravel/framework Current live score → | 783 | ×0.85 | −27 | Q3 · Flat / decel |
| sebastianbergmann/phpunit Current live score → | 767 | ×1.19 | +139 | Q3 · Flat / decel |
| guzzle/guzzle Current live score → | 752 | ×1.11 | −88 | Q3 · Flat / decel |
| composer/composer Current live score → | 751 | ×0.35 | −65 | Q3 · Flat / decel |
| livewire/livewire Current live score → | 699 | ×1.24 | +29 | Q3 · Flat / decel |
| symfony/symfony Current live score → | 680 | ×0.93 | −115 | Q3 · Flat / decel |
Go
| Repository | Score | Velocity | Durability Δ | Status |
|---|---|---|---|---|
| junegunn/fzf Current live score → | 821 | ×2.21 | +66 | Q1 · Accelerated & durable |
| charmbracelet/bubbletea Current live score → | 781 | ×1.37 | −30 | Q2 · Caution |
| prometheus/prometheus Current live score → | 744 | ×1.56 | −49 | Q2 · Caution |
| grafana/grafana Current live score → | 662 | ×1.6 | −28 | Q2 · Caution |
| spf13/cobra Current live score → | 850 | ×0.47 | +7 | Q3 · Flat / decel |
| labstack/echo Current live score → | 825 | ×0.69 | +3 | Q3 · Flat / decel |
| gohugoio/hugo Current live score → | 776 | ×1.12 | +8 | Q3 · Flat / decel |
| hashicorp/terraform Current live score → | 768 | ×0.82 | −20 | Q3 · Flat / decel |
| jesseduffield/lazygit Current live score → | 758 | ×1.16 | +339 | Q3 · Flat / decel |
| traefik/traefik Current live score → | 722 | ×1.1 | +218 | Q3 · Flat / decel |
| kubernetes/kubernetes Current live score → | 717 | ×0.91 | +10 | Q3 · Flat / decel |
| gin-gonic/gin Current live score → | 690 | ×0.98 | −157 | Q3 · Flat / decel |
| cli/cli Current live score → | 643 | ×0.79 | −80 | Q3 · Flat / decel |
| ent/ent Current live score → | 465 | ×0.18 | +17 | Q3 · Flat / decel |
Rust
| Repository | Score | Velocity | Durability Δ | Status |
|---|---|---|---|---|
| BurntSushi/ripgrep Current live score → | 850 | ×1.28 | +0 | Q1 · Accelerated & durable |
| serde-rs/serde Current live score → | 846 | ×1.52 | +119 | Q1 · Accelerated & durable |
| pola-rs/polars Current live score → | 712 | ×1.56 | +27 | Q1 · Accelerated & durable |
| bevyengine/bevy Current live score → | 669 | ×2.02 | −103 | Q2 · Caution |
| starship/starship Current live score → | 831 | ×0.83 | +58 | Q3 · Flat / decel |
| sharkdp/bat Current live score → | 823 | ×0.57 | +48 | Q3 · Flat / decel |
| ajeetdsouza/zoxide Current live score → | 779 | ×0.5 | −5 | Q3 · Flat / decel |
| alacritty/alacritty Current live score → | 757 | ×0.57 | −48 | Q3 · Flat / decel |
| tokio-rs/tokio Current live score → | 756 | ×0.72 | −15 | Q3 · Flat / decel |
| tokio-rs/axum Current live score → | 749 | ×0.46 | +31 | Q3 · Flat / decel |
| astral-sh/ruff Current live score → | 734 | ×1.21 | +106 | Q3 · Flat / decel |
| clap-rs/clap Current live score → | 729 | ×0.47 | +6 | Q3 · Flat / decel |
| denoland/deno Current live score → | 690 | ×1.2 | −29 | Q3 · Flat / decel |
| sharkdp/fd Current live score → | 685 | ×0.59 | −98 | Q3 · Flat / decel |
Changelog
What's changed, and why
-
· Published the aggregate back-test lift
The per-repo back-tests were in the frozen dataset from day one, but the study reported no aggregate figure. Now that the number is cited elsewhere (including our own landing page), it belongs here where it can be checked: across the 68 back-tested repos, bottom-durability-quartile months carried a geometric-mean 1.64× (median 1.40×) the forward 3-month rework of top-quartile months, and the ratio exceeded 1 in 61 of 68 repos. Derived from the frozen June-2026 blobs — an addition to the published copy, not a recomputation.
-
· Initial publication
First public release of the velocity-vs-durability study — all 70 pre-registered repositories scored on the 300–850 durability scale, with no dropouts. Each repo carries its full June-2026 state: the monthly durability trajectory, coverage & confidence, the predictive back-test, and the scored + diagnostic component breakdown. The dataset is frozen and citable as of this date.
Artisan Build, Inc., 1111B South Governors Avenue STE 28132, Dover, Delaware 19904, USA