Skip to content

Commit 0af443a

Browse files
feat(leaderboard): the production run page, graded cost axis, Output fix
Adds /the-production-run — the prediction, the tier rubric, an interactive two-year simulator, and tabbed runs — and brings the shipped tier algorithm in line with what that page claims. Product - Output was blind to most merged PRs. countAgentPrsByDay inner-joined terminal_agent_bindings, which sweepDefunct deletes once a workspace's terminals are gone, so merging a PR and then deleting the workspace erased it retroactively. That join is gone. This is why the board reads 99.6% Button pusher today. - Cost becomes a fifth graded axis: dollars per merged PR, the one axis where lower is better, graded as efficiency so it cannot reward spend. It needs no desktop release — both inputs are already published, so recomputeTier derives it server-side. - Depth floors move 5x to 2.5M/10M/40M. Measured against the live board, 7 of the top 10 already sat at depth tier 4, so the axis had stopped discriminating. - tierProgress switches from MIN to the mean across axes. Under MIN a single dead axis pinned every progress bar on the board at 0%. - Bumping the auto-publish storage key makes updated clients republish a full 30-day window once, so corrected Output data arrives in one pass rather than trickling in two days at a time. Marketing - PillTabs promoted to app/components and given an optional accent, so the leaderboard and the run page share one component. - The run page imports FLOORS and COST_CEILINGS from @superset/trpc rather than restating them; they previously existed in three places. - TierTube forecast pace 8 -> 7 months, matching the page. Tests - tier.test.ts covers costTier and the new floors; fixtures updated to the new calibration rather than relaxed. - constants.test.ts (25 tests) covers the simulator, every figure printed on the page, and that a run's published targets actually clear the tier they promise. Mutation-checked: breaking the Cost target or the depth head start fails them. Not included, deliberately: the PR size filter and its host migrations. The page states a 10-changed-line minimum that is not implemented yet. Claude-Session: https://claude.ai/code/session_015wHZeSUafJ58aKUsm7siNu
1 parent b884512 commit 0af443a

45 files changed

Lines changed: 11134 additions & 36 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/desktop/src/renderer/lib/persisted-keys/persisted-key-registry.test-data.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ export const PERSISTED_KEY_REGISTRY: ReadonlyArray<
148148
],
149149
[
150150
"src/renderer/routes/_authenticated/components/LeaderboardAutoPublish/hooks/useLeaderboardAutoPublish/autoPublishState.ts",
151-
["leaderboard-auto-publish-v1"],
151+
["leaderboard-auto-publish-v2"],
152152
],
153153
["src/renderer/lib/leaderboard/askedState.ts", ["leaderboard-asked-v1"]],
154154
[

apps/desktop/src/renderer/routes/_authenticated/components/LeaderboardAutoPublish/hooks/useLeaderboardAutoPublish/autoPublishState.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { AutoPublishState } from "./autoPublishSchedule";
22
import { INITIAL_AUTO_PUBLISH_STATE } from "./autoPublishSchedule";
33

4-
const STORAGE_KEY = "leaderboard-auto-publish-v1";
4+
const STORAGE_KEY = "leaderboard-auto-publish-v2";
55

66
export function readAutoPublishState(handle: string): AutoPublishState {
77
try {
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
---
2+
title: "The Production Run"
3+
description: "Our prediction for when the software factory actually arrives, the four tiers on the way there, and the first production run — starting in September."
4+
author: harshith
5+
date: 2026-08-27
6+
category: Company
7+
relatedSlugs:
8+
- roadmap-to-100-agents
9+
- agent-orchestration-not-another-agent
10+
---
11+
12+
A factory doesn't prove itself with a prototype. Anyone can build one good car by hand. The thing that separates a workshop from a factory is the production run: the same output, repeatedly, at a rate, without heroics.
13+
14+
We've spent two years arguing that software is heading that way. We wrote down what the levels look like in [Factory 2026](/factory-2026) and what our own path to 100 parallel agents looks like in [our 2026 roadmap](/blog/roadmap-to-100-agents). What we never did was put a number on ourselves and let it be checked.
15+
16+
So: **by August 2028, we expect the factory to be running on our leaderboard — more than one in five developers at the top tier, and the median developer at the tier below it.** Ten or more agent workstreams at once, ten agent-written PRs merging every week, for a fifth of the board. Today that number is zero.
17+
18+
This post is that prediction, the instrument we're measuring it with, and the first run — which starts in September and asks for something much smaller than ten agents.
19+
20+
---
21+
22+
# What a production run is
23+
24+
A production run is a fixed window where we all push one number and see what actually moves.
25+
26+
Not a demo. Not a launch week. Everyone on the board works the same way for a month, we measure the same things, and at the end we know whether the thing we claim about software development is true for us — before we claim it about anyone else.
27+
28+
Predictions that can't be checked are marketing. This one has a date, a metric, and a public scoreboard. If we're wrong, the [leaderboard](/leaderboard) will say so in front of everybody, which is the point.
29+
30+
# What we measure
31+
32+
Six variables come off your machine. Five are recorded per day, one is measured across the trailing 30.
33+
34+
| Variable | Grain | What it is |
35+
| --- | --- | --- |
36+
| `tokens` | per day | All tokens across every session |
37+
| `sessions` | per day | Distinct sessions with activity |
38+
| `parallelSessions` | per day | Median distinct sessions active in the same 15-minute bucket |
39+
| `agentPrsMerged` | per day | PRs merged whose workspace had an agent session on it |
40+
| `activeDays` | window | Days in the trailing 30 with any activity |
41+
| `usd` | per day | API-equivalent cost of those tokens |
42+
43+
Five of them get graded, as five axes:
44+
45+
**Width**`parallelSessions`. How many agents you actually run at once. Concurrency is counted by bucketing usage entries in time and counting distinct sessions per bucket, so it needs no session end time. Session ends aren't reliably observable, and nothing here depends on them.
46+
47+
**Depth**`tokens / sessions`, never tokens on their own. A supervised back-and-forth burns a fraction of what a session that runs a whole task alone does. Because it's a ratio, spending more inside one session raises Depth but not Width, and opening more sessions raises Width but dilutes Depth. You have to change how you work to move either one.
48+
49+
**Output**`agentPrsMerged`. Whether the work lands, and only PRs with real changes count — a merge under ten changed lines doesn't. Hard to reach by accident; possible to fake on purpose, which is what the flag button is for.
50+
51+
**Sustain**`activeDays`. Whether it's your normal mode or a good week.
52+
53+
**Cost**`usd / agentPrsMerged`. Dollars per merged PR, and the only axis where lower is better. Graded as efficiency, never as spend: burn twice the tokens to land the same change and you move down, not up.
54+
55+
The tier is the **minimum** across all five, not an average. Ten parallel sessions that never merge anything leaves Output at the bottom, so you're at the bottom. You can't buy your way past an axis by overperforming on another one, because each axis measures something you had to *give up* — watching, reviewing, scheduling, holding state — and you can't compensate for still doing a thing by doing more of something else.
56+
57+
Cost is graded on dollars per merged PR rather than on spend, because spend is about to get trivially easy — grading it would grade the calendar. Efficiency doesn't: closing the gap from $15 a change to $3.50 takes fewer wasted sessions, not a bigger budget.
58+
59+
None of your work leaves your machine. Not your prompts, not your file paths, not repo or branch names, not PR titles or numbers. The payload is five numbers a day, plus whatever handle you choose to publish under.
60+
61+
> **A note on this being wrong.** These thresholds are calibration guesses. The parallelism numbers are quoted from Factory 2026, but the token and PR floors are our best estimates and they will move as we see real data. The Output axis is the weakest of them today: PR sync is GitHub-only, it sees work inside Superset workspaces and nothing outside them, and a merge observed while the app is closed can go unrecorded. We'd rather ship an instrument that undercounts and fix it in public than wait for a perfect one. Expect this to change. We'll say so when it does.
62+
63+
# The four tiers
64+
65+
Factory 2026 grades *teams*. Two of its five top-level gates are team properties no individual can clear, so nobody is ever assigned an F-level personally. These four are the individual projection of that ladder.
66+
67+
There's one idea underneath all of them: **each tier moves the unit of your attention up one level.** Line, task, queue, direction.
68+
69+
## Tier 1 — Button pusher
70+
71+
*One session at a time, shallow. The unit of your attention is the line.*
72+
73+
You're in the loop for every step. The agent writes, you read every line before it merges, and your throughput is bounded by your reading speed — which means the agent isn't saving you the expensive part.
74+
75+
**Gates:** one session running, active 8 of 30 days, ≤ $15 per merged PR. No Depth or Output floor, deliberately. At this tier there's nothing to measure but presence, because you *are* the process.
76+
77+
**How you know you're here:** close the laptop and nothing continues.
78+
79+
## Tier 2 — Operator
80+
81+
*A couple running at once, sessions going deeper than a chat, and something merges each week. The unit of your attention is the task.*
82+
83+
This is the real break, and it's psychological before it's technical. Starting a second session is admitting you can't watch both. You stop reading keystrokes and start reading outcomes.
84+
85+
**Gates:** 2 parallel sessions, 2.5M tokens per session, 1 merged agent PR a week, active 10 of 30 days, ≤ $9 per merged PR.
86+
87+
**How you know you're here:** you've been surprised — well or badly — by a diff you didn't watch get written.
88+
89+
**When we expect it to be the board's median tier: mid 2027.**
90+
91+
## Tier 3 — Plant Manager
92+
93+
*Three or more in parallel through a workday, sessions doing real work, and the work lands. The unit of your attention is the queue.*
94+
95+
Three streams through a workday means you're scheduling rather than executing. Your day becomes deciding what runs next and judging what came back. This is where serious teams are.
96+
97+
**Gates:** 3 parallel sessions, 10M tokens per session, 3 merged agent PRs a week, active 15 of 30 days, ≤ $7 per merged PR.
98+
99+
**How you know you're here:** you run out of well-specified work before you run out of agent capacity. Your constraint is no longer typing or reviewing — it's deciding what should be built.
100+
101+
**When we expect it to be the board's median tier: mid 2028.**
102+
103+
## Tier 4 — Henry Ford
104+
105+
*Ten or more at once, every session a substantial run, ten agent PRs a week merging, nearly every day. The unit of your attention is the decision.*
106+
107+
Ten concurrent streams is past what a person can hold in working memory. So reaching this tier means you stopped holding it, and something else tracks state: agents reviewing agents, overnight runs, a queue that survives you closing the laptop.
108+
109+
**Gates:** 10 parallel sessions, 40M tokens per session, 10 merged agent PRs a week, active 20 of 30 days, ≤ $3.50 per merged PR.
110+
111+
**How you know you're here:** work completes while you sleep and is mergeable in the morning. You find out what shipped by reading, not by watching.
112+
113+
**When we expect it to be the board's median tier: 2029. Getting one in five there by August 2028 is the claim in this post.**
114+
115+
# The shape of the growth
116+
117+
The rungs span 1 to 10 parallel sessions. That's 10x. Put the top at August 2028 and the growth rate falls out of the ladder itself:
118+
119+
```
120+
10x over 24 months = 2^3.32 = a doubling every ~7 months
121+
```
122+
123+
Depth's 16x wants a doubling every 6 months, Output's 10x wants 7. We ramp all three at seven and let Depth arrive last. This is not evidence the rate is right — it is the rate the ladder implies once you fix the top rung to a date. The span is the input, not a finding.
124+
125+
That rate is not aggressive. If you read [AI 2027](https://ai-2027.com), the scenario it lays out compresses far harder than a 7-month doubling: an AI R&D progress multiplier going 1.5x to 4x, 10x, 25x and 50x inside about twenty months, with milestones bunching rather than spreading — though those are algorithmic-progress figures inside a frontier lab, and the same scenario puts total progress at roughly half that. Our ladder assumes something much slower than that and still lands at the factory in 2028.
126+
127+
The other thing that scenario gets right, and that we can already see on our own board, is that **the frontier arrives long before the median.** One developer on the leaderboard is running a median of 15 concurrent sessions today. Top-tier parallelism, this week, while the median developer is at one. The distance between those two people is the whole story of the next two years.
128+
129+
The bottom drains steadily; the top tier stays near zero for a year and a half before it moves. This table is our judgement, not output from the doubling above — nothing derives a population from one developer's path:
130+
131+
| | Button pusher | Operator | Plant Manager | Henry Ford |
132+
| --- | --- | --- | --- | --- |
133+
| **Aug 2026 — measured** | **99.6%** | **0.4%** | **0%** | **0%** |
134+
| Aug 2026 — where we want to be | 70% | 25% | 5% | 0% |
135+
| Feb 2027 | 58% | 30% | 11% | 1% |
136+
| Aug 2027 | 44% | 34% | 19% | 3% |
137+
| Feb 2028 | 27% | 33% | 31% | 9% |
138+
| Aug 2028 | 13% | 25% | 40% | 22% |
139+
140+
That first row is real. One person out of roughly 260 on the board today is above the bottom tier, and we're publishing it rather than quietly recalibrating until the chart looks better.
141+
142+
Some of that gap is the instrument. Output is conjunctive with the other three axes, and Output is the axis that currently can't see most people's merged PRs — so developers who are genuinely running four or five agents in parallel are reading as Button pushers because the sync never observed their work landing. Fixing that measurement is on us and it's the first thing we're doing. Some of the gap is real, though, and no amount of instrument work will move it. Telling those two apart is most of what September is for.
143+
144+
One rule holds this together: **the floors never move to chase that curve.** If we lowered thresholds to make the distribution look healthy, a 2028 Henry Ford would mean exactly what a 2026 Henry Ford meant, and there'd be no progress to show — just a ranking. The numbers stay put. The distribution moves because people change.
145+
146+
Which is also what makes the prediction falsifiable. If eighteen months from now the observed doubling time is twenty months instead of seven, we were wrong, and the same scoreboard that made the claim will be the thing that disproves it.
147+
148+
# The first run: September
149+
150+
The table above says Operator becomes the board's median tier sometime in mid 2027. We're going to try to get there in a month.
151+
152+
**The September production run has one goal: everybody on the board reaches Operator.**
153+
154+
That's it. Not Henry Ford. Not ten agents. For thirty days, five small numbers:
155+
156+
- **Two agents at once.** Not ten. Two, often enough that it's your median rather than your best afternoon.
157+
- **2.5M tokens per session.** Give a session a whole task instead of a question.
158+
- **One merged agent PR a week.** Four in the month. The work has to land.
159+
- **Ten active days.** A third of the month.
160+
- **Under $9 per merged PR.** Falls out of the rest if you are not burning sessions on rework.
161+
162+
Clear all five inside the window and you get three things: a dated, numbered Run 01 badge that stays on your profile and beside your name on the board, a factory tee, and one more thing we are not naming until October. Later runs mint their own badge, so this one only ever comes from September 2026.
163+
164+
We picked a tiny goal on purpose. Operator is the smallest tier by the numbers and the hardest one by everything else, because it's the only rung where you give up something you're currently good at. Going from two agents to three is logistics. Going from one to two is deciding you're no longer going to watch. Every tier above it is a variation on that same move — you can't get to ten streams without first getting comfortable not watching two.
165+
166+
There's a version of this that's just a leaderboard with badges on it, and that version is worthless. The reason to run it as a fixed month with one shared target is that we find out something we don't currently know: whether the bottleneck to running more agents is the tooling, which is our problem to fix, or the habit, which is yours. We think it's mostly ours. September is how we find out.
167+
168+
The board is [public](/leaderboard). Opt in from the desktop app, and your tier and progress show up alongside everyone else's. If you'd rather compete without a name attached, you can publish privately and still see where you land.
169+
170+
We'll post the results in early October — the real distribution, what moved, what didn't, and which of the numbers in this post turned out to be wrong.

apps/marketing/src/app/leaderboard/components/LeaderboardBoard/components/PillTabs/PillTabs.tsx renamed to apps/marketing/src/app/components/PillTabs/PillTabs.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import type { ReactNode } from "react";
44

55
interface PillTabsProps<T extends string> {
6+
accent?: string;
67
label: string;
78
value: T | null;
89
options: ReadonlyArray<{ id: T; label: string }>;
@@ -11,6 +12,7 @@ interface PillTabsProps<T extends string> {
1112
}
1213

1314
export function PillTabs<T extends string>({
15+
accent,
1416
label,
1517
value,
1618
options,
@@ -34,9 +36,20 @@ export function PillTabs<T extends string>({
3436
onClick={() => onChange(option.id)}
3537
className={`px-4 py-1.5 text-xs font-mono uppercase tracking-wider border rounded-[2px] transition-colors ${
3638
active
37-
? "border-brand text-brand bg-brand/5"
39+
? accent
40+
? ""
41+
: "border-brand text-brand bg-brand/5"
3842
: "border-border text-muted-foreground hover:text-foreground"
3943
}`}
44+
style={
45+
active && accent
46+
? {
47+
borderColor: `rgba(${accent},0.5)`,
48+
color: `rgb(${accent})`,
49+
background: `rgba(${accent},0.06)`,
50+
}
51+
: undefined
52+
}
4053
>
4154
{option.label}
4255
</button>

apps/marketing/src/app/leaderboard/components/LeaderboardBoard/components/PillTabs/index.ts renamed to apps/marketing/src/app/components/PillTabs/index.ts

File renamed without changes.

apps/marketing/src/app/components/TierTube/TierTube.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const ZONES = TIER_RGB.map((rgb, index) => ({ tier: index + 1, rgb }));
66
const railLeft = (position: number) =>
77
position <= 0 ? 0 : ((position - 0.5) / ZONES.length) * 100;
88

9-
const MONTHS_PER_TIER = 8;
9+
const MONTHS_PER_TIER = 7;
1010

1111
function forecastLabel(tier: number, position: number): string | null {
1212
if (position <= 0) return null;

apps/marketing/src/app/leaderboard/components/LeaderboardBoard/components/MetricTabs/MetricTabs.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"use client";
22

3+
import { PillTabs } from "@/app/components/PillTabs";
34
import type { LeaderboardMetric } from "@/app/utils/fetchLeaderboard";
4-
import { PillTabs } from "../PillTabs";
55

66
const METRICS: Array<{ id: LeaderboardMetric; label: string }> = [
77
{ id: "tokens", label: "Tokens" },

apps/marketing/src/app/leaderboard/components/LeaderboardBoard/components/RangeTabs/RangeTabs.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import { Calendar } from "@superset/ui/calendar";
55
import { Popover, PopoverContent, PopoverTrigger } from "@superset/ui/popover";
66
import { CalendarIcon } from "lucide-react";
77
import type { DateRange } from "react-day-picker";
8+
import { PillTabs } from "@/app/components/PillTabs";
89
import type { LeaderboardPeriod } from "@/app/utils/fetchLeaderboard";
910
import { formatRangeLabel } from "@/app/utils/formatRangeLabel";
10-
import { PillTabs } from "../PillTabs";
1111

1212
const PRESETS: Array<{ id: LeaderboardPeriod; label: string }> = [
1313
{ id: "all", label: "All" },

apps/marketing/src/app/leaderboard/page.tsx

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { Metadata } from "next";
33
import { Silkscreen } from "next/font/google";
44
import Link from "next/link";
55
import { FactoryBackdrop } from "@/app/components/FactoryBackdrop";
6+
import { tierRgb } from "@/app/components/TierBadge";
67
import { fetchStandings, fetchStats } from "@/app/utils/fetchLeaderboard";
78
import { LeaderboardBoard } from "./components/LeaderboardBoard";
89

@@ -64,8 +65,56 @@ export default async function LeaderboardPage() {
6465
>
6566
See all stats →
6667
</Link>
67-
</header>
6868

69+
<div className="mt-6">
70+
<style>{`
71+
.run-callout {
72+
position: relative;
73+
border: 1px solid rgba(var(--run-glow), 0.22);
74+
background: rgba(var(--run-glow), 0.04);
75+
}
76+
.run-trail {
77+
position: absolute;
78+
inset: 0;
79+
width: 100%;
80+
height: 100%;
81+
pointer-events: none;
82+
overflow: visible;
83+
}
84+
.run-trail rect {
85+
fill: none;
86+
stroke: rgb(var(--run-glow));
87+
stroke-width: 1.5;
88+
stroke-linecap: round;
89+
stroke-dasharray: 5 95;
90+
filter: drop-shadow(0 0 4px rgba(var(--run-glow), 0.9));
91+
animation: run-trail 4s linear infinite;
92+
}
93+
@keyframes run-trail {
94+
from { stroke-dashoffset: 0; }
95+
to { stroke-dashoffset: -100; }
96+
}
97+
@media (prefers-reduced-motion: reduce) {
98+
.run-trail rect { animation: none; stroke-dasharray: none; stroke-opacity: 0.5; }
99+
}
100+
`}</style>
101+
<Link
102+
href="/the-production-run?run=1"
103+
style={{ "--run-glow": tierRgb(2) } as React.CSSProperties}
104+
className="run-callout group inline-flex items-center gap-2 px-3 py-1.5 font-mono text-[0.6rem] uppercase tracking-[0.14em]"
105+
>
106+
<svg className="run-trail" aria-hidden="true">
107+
<title>Run 01 starting soon</title>
108+
<rect x="0" y="0" width="100%" height="100%" pathLength={100} />
109+
</svg>
110+
<span style={{ color: `rgb(${tierRgb(2)})` }}>Run 01</span>
111+
<span className="text-muted-foreground">
112+
starts 1 Sep · everybody to Operator
113+
</span>
114+
<span style={{ color: `rgba(${tierRgb(2)},0.8)` }}></span>
115+
</Link>
116+
</div>
117+
</header>
69118
<div className="mt-10 md:mt-12">
70119
<LeaderboardBoard
71120
initialStandings={standings}

apps/marketing/src/app/sitemap.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ export default function sitemap(): MetadataRoute.Sitemap {
102102
changeFrequency: "monthly",
103103
priority: 0.8,
104104
},
105+
{
106+
url: `${baseUrl}/the-production-run`,
107+
lastModified: new Date(),
108+
changeFrequency: "monthly",
109+
priority: 0.8,
110+
},
105111
{
106112
url: `${baseUrl}/leaderboard`,
107113
lastModified: new Date(),

0 commit comments

Comments
 (0)