{"id":5615,"date":"2026-09-22T06:02:59","date_gmt":"2026-09-22T06:02:59","guid":{"rendered":"https:\/\/falcoxai.com\/main\/ci-bottleneck-ai-coding-linear\/"},"modified":"2026-09-22T06:02:59","modified_gmt":"2026-09-22T06:02:59","slug":"ci-bottleneck-ai-coding-linear","status":"publish","type":"post","link":"https:\/\/falcoxai.com\/main\/ci-bottleneck-ai-coding-linear\/","title":{"rendered":"CI Bottleneck: How AI Coding Broke Linear&#8217;s Pipeline"},"content":{"rendered":"<p>Linear&#8217;s test suites nearly quadrupled in a single year. Not because the team hired an army of engineers, but because AI agents started shipping code faster than the pipeline could verify it. Earlier this year, CTO Tuomas assigned engineer Mufeez Amjad an issue titled &#8220;CI costs are high,&#8221; with a second request attached: make it faster too. That is what happens when you accelerate production without touching verification. The constraint moves. It does not disappear.<\/p>\n<p>If you are putting AI into any process that ends in a check, an approval, or a sign-off, you are heading for the same wall. Linear&#8217;s fix cut PR wait time from over six minutes to just above five and halved runner time per test, all while the workload grew. Below, what they actually changed, and how the same logic applies to quality and operations work that has nothing to do with code.<\/p>\n<h2>Agents Ship Code in Minutes. Validation Still Takes the Same Six<\/h2>\n<p>Linear published the numbers on September 21, 2026. Pull request wait time sat above six minutes before the rework, and every runner minute spent waiting was billed. Agents write faster. The gate did not move.<\/p>\n<blockquote><p>Agents have made it exponentially faster to ship code, but validating those changes hasn&#8217;t quite kept up at the same rate.<\/p><\/blockquote>\n<p>That sentence describes a structural problem, not a tooling complaint. Every PR still passes through the same pipeline, so accelerating the upstream step just deepens the queue at the check. Costs climb and feedback slows at the same time, which is the signature of a CI bottleneck.<\/p>\n<p>Read it as a preview. Any process where AI raises output volume but the quality gate stays fixed produces the same result: a faster front end feeding a constrained verifier.<\/p>\n<figure class=\"wp-post-image\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/falcoxai.com\/main\/wp-content\/uploads\/2026\/09\/ci-bottleneck-how-ai-coding-b-inline-1.jpg\" alt=\"Linear issue ticket titled CI costs are high assigned to engineer Mufeez Amjad, highlighting the CI bottleneck\" width=\"1200\" height=\"675\" loading=\"lazy\" \/><\/figure>\n<h2>The Numbers Linear Put on the Board<\/h2>\n<p>Runner time per test came down by roughly half. Wait time dropped from over six minutes to just over five. On their own, those two figures look modest. Set against the workload they were absorbing, they are the interesting part.<\/p>\n<h3>Why throughput growth, not absolute speed, is the real result<\/h3>\n<p>The test suites almost quadrupled over the same period. A pipeline handling four times the validation work while getting faster and cheaper per unit is not a minor tuning exercise. It is a capacity rebuild.<\/p>\n<p>This is the metric operations leaders should be watching in their own AI programmes. Absolute cycle time tells you very little once volume is climbing. What matters is whether your verification step can absorb more work per hour without adding headcount, licences, or compute. Linear ran that experiment in public and the answer was yes, but only after deliberate re-engineering.<\/p>\n<h3>The sharding trade-off: buying wait time with machine time<\/h3>\n<p>Linear&#8217;s own chart makes the tension visible. Machine time per test spiked when they added test shards, because splitting a suite across parallel runners shortens the wait and costs more machine time. Faster for the developer, more expensive on the invoice. The same spike appeared again during checkout stalling issues.<\/p>\n<p>Most teams optimise one of these and quietly inflate the other. Cut wait time with parallelism and your compute bill climbs. Cut compute by consolidating jobs and your engineers and agents sit idle longer. Neither is a win if you only instrumented one side.<\/p>\n<p>Track both before you change anything. Wait time is the cost paid by people and agents standing still. Runner time is the cash cost. Linear&#8217;s four-part rework, covering infrastructure, gating jobs, repeated setup, and execution efficiency, only registered as progress because they had both numbers indexed from the first week of January.<\/p>\n<p>Any process where AI accelerates production and a check sits at the end deserves the same pair of meters: how long the queue is, and what the queue costs.<\/p>\n<h2>Four Levers Linear Pulled, Ranked by Effort Versus Payoff<\/h2>\n<p>Linear grouped the rework into four categories: upgraded infrastructure and tooling, optimising the jobs that gate other work, reducing repeated setup, and making test execution more efficient. Listed that way it reads like a tidy engineering plan. The ordering matters more than the list, because the first category delivered the largest returns for the least design work.<\/p>\n<h3>Buy speed first: hardware and toolchain swaps that need no redesign<\/h3>\n<p>Moving workloads off GitHub Actions onto third-party runners with faster CPUs, higher-performance storage and better cache infrastructure made jobs 34% faster on average. Comparing the two days either side of the switch, some workloads dropped 52%. The pipeline itself was untouched. Same jobs, same order, better machines.<\/p>\n<p>Then the toolchain. Switching to <code>tsgo<\/code>, the native TypeScript compiler, cut the weekly median of the <code>tsc<\/code> check by 73%. That single swap was big enough to move the bottleneck off typechecking entirely. Two decisions, both essentially procurement, both bigger than most clever optimisations would have been.<\/p>\n<p>The operations parallel is direct. Before you redesign a verification workflow, check whether the constraint is running on old equipment or outdated software. Buying capacity is faster than engineering it, and it tells you where the real constraint sits.<\/p>\n<h3>Then remove dependencies: how dropping type information unlocked the next two wins<\/h3>\n<p>Linting was the harder problem. A handful of custom lint rules needed TypeScript type information, so every lint run had to build the full type graph before evaluating them. That made linting one of the most memory-intensive jobs in the pipeline, for the sake of a few rules.<\/p>\n<p>The team rewrote those rules to use static analysis over the abstract syntax tree, identifying function-like constructs and guard patterns without type information. ESLint dropped TypeScript. API lint time fell 68%, full-repository lint time 55%, and memory usage dropped substantially.<\/p>\n<p>The second payoff came later. Rules that operate purely on syntax port easily, so the subsequent move to Oxlint was straightforward and cut runner-minutes again. Removing a dependency did not just make one step faster. It made the next change cheap.<\/p>\n<figure class=\"wp-post-image\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/falcoxai.com\/main\/wp-content\/uploads\/2026\/09\/ci-bottleneck-how-ai-coding-b-inline-2.jpg\" alt=\"Four-quadrant chart ranking CI bottleneck fixes by engineering effort against speed payoff\" width=\"1200\" height=\"675\" loading=\"lazy\" \/><\/figure>\n<h2>The Same Bottleneck Is Forming in Quality and Operations Functions<\/h2>\n<p>Swap &#8220;pull request&#8221; for &#8220;deviation report&#8221; and the story is identical. AI drafts the CAPA write-up, the supplier assessment, the inspection summary. A human still has to read it, question it, and sign it. The review queue becomes your pipeline, and it has the same failure mode: production speeds up, verification does not, and the backlog shows up as delayed batch release or an audit finding.<\/p>\n<h3>Mapping your validation queue before you scale AI output<\/h3>\n<p>Before you add AI to a documentation-heavy process, find every point where its output enters an approval chain. Deviation closure, change control, supplier qualification, complaint handling. Each one has a named approver and a finite number of hours in their week.<\/p>\n<p>Then measure two things separately, because they move in opposite directions. Queue wait time tells you how long an item sits before anyone touches it. Reviewer hours tell you how much actual human attention it consumes. Linear tracked exactly this split, optimising &#8220;how long a PR waits on CI and how much runner time it consumes.&#8221; Collapse the two into one average and you will fix the wrong thing.<\/p>\n<h3>Risk-tiered review as the operational version of path-based gating<\/h3>\n<p>Linear&#8217;s sharpest move was zooming out from individual checks to the small jobs sitting in front of everything else. Every run starts by checking which paths a PR touched and whether those tests already passed for the same inputs. Same-input work does not get re-run. That is deduplication, and quality functions almost never do it.<\/p>\n<p>The operational version is risk-tiered routing. A low-risk deviation against a well-characterised process does not need the same depth of review as a first-time supplier nonconformance. Build the tier logic into the intake step, not the review step, and gate item by item rather than releasing work in weekly batches. Batch gating is what turns a five-minute review into a four-day wait, and no amount of extra reviewer headcount fixes it.<\/p>\n<div class=\"wp-cta-block\">\n<p><strong>Ready to find AI opportunities in your business?<\/strong><br \/>\nBook a <a href=\"https:\/\/falcoxai.com\">Free AI Opportunity Audit<\/a>. It is a 30-minute call where we map the highest-value automations in your operation.<\/p>\n<\/div>\n<h2>Plan Validation Capacity as a Line Item, Not an Afterthought<\/h2>\n<p>Most AI budgets fund generation. Licences, integrations, prompt engineering, change management for the people producing output. Almost none of them fund the review capacity that output will consume. Through the rest of 2026, the organisations showing real returns will be the ones that priced both sides at the same time.<\/p>\n<p>The benchmark to aim for is capacity growth without proportional cost growth. Linear&#8217;s team absorbed a fourfold rise in test volume and came out faster and cheaper per unit, which only happened because someone was given the problem as an explicit assignment with a budget attached. Nobody stumbles into that. It was scoped, measured, and worked on deliberately.<\/p>\n<h3>The capacity question to ask before your next AI deployment<\/h3>\n<p>Ask it plainly: if this tool triples the volume of documents, reports, or claims reaching my reviewers, what happens to cycle time and cost per approved item? If you cannot answer with a number, you are not ready to deploy. That is not caution, it is arithmetic.<\/p>\n<p>Three actions make the answer available. Instrument wait time and cost per validated item before the rollout, not after, because you need the baseline to prove anything later. Spend the easy money first on infrastructure and tooling, since hardware and software swaps deliver returns without touching how people work. Then set a standing review of which gates are actually blocking downstream work, because the binding constraint moves as soon as you fix the last one.<\/p>\n<p>That third point is the one teams skip. Linear found that modernising the TypeScript compiler cut their <code>tsc<\/code> check enough to &#8220;move the bottleneck off of typechecking entirely.&#8221; The constraint relocated. In a quality function it might shift from document review to supplier data, or from inspection to final sign-off, and unless somebody is looking quarterly, you will keep optimising something that stopped mattering months ago. FalcoX AI runs this mapping with quality and operations teams as part of AI readiness work, before the generation tools go live rather than after the queue forms.<\/p>\n<p class=\"wp-source-attribution\"><em>Source: <a href=\"https:\/\/linear.app\/now\/ci-bottleneck-reworked\" target=\"_blank\" rel=\"noopener noreferrer\">linear.app<\/a><\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Linear&#8217;s test suites nearly quadrupled in a single year. Not because the team hired an army of engineers, but because AI agents started shipping code faster than the pipeline could verify it. Earlier this year, CTO Tuomas assigned engineer Mufeez Amjad an issue titled &#8220;CI costs are high,&#8221; with a sec<\/p>\n","protected":false},"author":1,"featured_media":5612,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1701],"tags":[1721,743,1817,493,1563,1818,1819],"class_list":["post-5615","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-news-7","tag-ai-coding-agents","tag-ai-operations","tag-ci-cd","tag-developer-productivity","tag-linear","tag-pipeline-optimization","tag-validation-bottleneck"],"_links":{"self":[{"href":"https:\/\/falcoxai.com\/main\/wp-json\/wp\/v2\/posts\/5615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/falcoxai.com\/main\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/falcoxai.com\/main\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/falcoxai.com\/main\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/falcoxai.com\/main\/wp-json\/wp\/v2\/comments?post=5615"}],"version-history":[{"count":0,"href":"https:\/\/falcoxai.com\/main\/wp-json\/wp\/v2\/posts\/5615\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/falcoxai.com\/main\/wp-json\/wp\/v2\/media\/5612"}],"wp:attachment":[{"href":"https:\/\/falcoxai.com\/main\/wp-json\/wp\/v2\/media?parent=5615"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/falcoxai.com\/main\/wp-json\/wp\/v2\/categories?post=5615"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/falcoxai.com\/main\/wp-json\/wp\/v2\/tags?post=5615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}