Published · 10h agoProduct6 min read
GitHub's pull request counter treats a 64-package bump as one unit of demand
A search for every public pull request opened in the first eight months of 2026 returns 111 million results. On the first page, one carries a tag reading "ai generated" and three carry a dependencies label.
Not a builder's beat, but builders have a standing stake in it.See today for builders

What happened
- A GitHub search for pull requests created between 2026-01-01 and 2026-09-01 reports 111M results.
- One result on the first page is titled "Bumps the bun-patching group with 64 updates" and its body is a table of package upgrades listing astro 7.1.3 to 7.2.9 and wrangler 4.113.0 to 4.127.1, with the label dependencies and javascript.
- Another result bumps the flutter-employee-dependencies group in /front/mobile_apps/leopardo_employee with 3 updates: cached_network_image, firebase_core and firebase_messaging, labelled dart and dependencies.
- A result reads "Removes esbuild. It s no longer used after updating ancestor dependency vite. These dependencies need to be updated together." and updates vite from 5.4.21 to 8.2.2, labelled dependencies and javascript.
- The first listed result describes disconnecting each synchronous Google HTTP client test response in a finally block, and carries the tags "ai generated", "no release notes", "type: bug fix" and "inst: others".
Compiled by The Product DeskSomething wrong?How this is made
Why it matters
Search GitHub for every public pull request created between January 1 and September 1 of 2026 and the page returns 111M results [1]. One result on that first page is titled "Bumps the bun-patching group with 64 updates", and its body is a table of package upgrades that begins astro 7.1.3 to 7.2.9 and wrangler 4.113.0 to 4.127.1 [2]. Another reads "Removes esbuild. It s no longer used after updating ancestor dependency vite." and moves vite from 5.4.21 to 8.2.2 [4]. A third bumps three Flutter packages inside one mobile app directory [3].
The window is 243 days long [7]. Spread across it, 111 million pull requests average about 457,000 a day, or roughly 19,000 an hour [8][9].
The bun-patching entry counts as one of those 111 million and lands 64 version changes in the repository [10]. If a Q4 plan has a line reading "PRs opened against our SDK, up N percent", that line is counting objects of this shape.
Ten snippets out of 111 million
Of the ten result snippets on the page, three carry a dependencies label [11] and one carries a set of tags including "ai generated", "no release notes" and "type: bug fix" [5][12]. Others look like ordinary human work: one closes an issue and follows up on a Windows startup investigation in another, with labels ci:windows and size:extra-large [6].
Those ten snippets prove the categories exist and nothing else. The search page reports the total and shows individual results; GitHub does not publish the breakdown by author or by label [13]. Ten snippets cannot estimate a share of 111 million, and this record covers a single window, so nothing here measures whether the mix of human and machine authorship moved during the year. A tag is also a claim by whoever labelled the pull request. Counting "ai generated" tags gives a floor on machine-written PRs, never a share.
A rising PR count reads as adoption: more developers picked the thing up and stayed with it. On the evidence of one page, the count contains bug fixes written by people, dependency-group upgrades that fire on a schedule, and at least one PR the receiving project labelled as AI-written [5][6][11].
The provenance data is public, in a field GitHub can change
GH Archive records the public GitHub timeline and aggregates it into hourly archives of JSON events as reported by the GitHub API [14]. GitHub exposes 15 or more event types, including new commits, fork events, opening tickets, commenting and adding members to a project [15]. The whole archive is a public BigQuery dataset, updated every hour [16]. Google processes the first terabyte a month free, and the project's own advice is to restrict queries to relevant time ranges to keep the scanned volume down [17].
The catch sits in the schema. Because the payload differs per event type and, in GH Archive's words, "may be updated by GitHub at any point", it is stored as a serialised JSON string that you pick apart with functions like JSON_EXTRACT() [18]. Anything GitHub sends that the predefined schema does not cover arrives in a catch-all "other" column until and unless the schema is extended [19].
For a provenance filter, that is the failure mode to plan for. A JSON_EXTRACT against a renamed or relocated field returns null, the row keeps whatever default your CASE statement gives it, and the dashboard stays green while the classifier quietly stops classifying. The same event stream already powers products: Changelog Nightly ships a report each day at 10pm CT to unearth the hottest new repos on GitHub [20].
Depth is a different query
Code search covers 200 million public repositories, filters on language and filepath, and supports regular expressions [21]. In his newsletter, Hillel Wayne describes using it to find production uses of Python's graphlib with the query `/(from|import) graphlib/ language:python` [22], and then, he wrote, "After that I can sift through the results to separate real-life use cases from false positives and toy problems" [23].
Wayne's sentence is the honest job description for a provenance filter. A researcher writing a blog post does the sift by hand; a product team automates 80 percent of it and reviews the rest. Wayne also names the limits: "Just about the only things that don't seem work are group matching and lookarounds like (?!)" [24]. A regex hunting simplifiable Python returned, in his account, "like 300 code samples that could be simplified" [25]. Filters compose, including path scoping: `/(from|import) hypothesis/ composite language:python path:test_*.py` [26].
There is also a code search API. "You could feasibly run a query, dump a hundred matches into files, and then do more complicated filtering and munging before spitting out a courseload's worth of case studies", Wayne wrote [27].
A call site inside a test file is a different fact from a pull request event. Someone wrote an import and then wrote a test around it. That sits closer to usage depth than any count of objects created, and it is reachable with the same afternoon of work as the event query.
The editorial channel stops short of a forecast
The alternative most planning decks lean on is editorial. A testimonial published on pragmaticengineer.com says of the Pragmatic Engineer newsletter: "The level of in-depth information and knowledge sharing is out of this world" [28]. The person quoted says they have followed Hackernews, Hustle and platform-specific newsletters like Android weekly for almost ten years, and the excerpt does not name them [29].
Judgement of that kind is bot-proof. It also produces no denominator. The missing denominator is why the counted proxy ended up in the plan in the first place.
Two questions that decide whether you need the filter
Run each number in the Q4 plan through both:
Can I split this number by author class with a query I can run this week? The inputs are public: hourly archives, an hourly BigQuery dataset, a code search API [14][16][27].
Does this number fund something I cannot unwind before January? A hire, a price change, or a deprecation.
Split available, commitment attached: publish the split beside the total, and say which labels and title patterns you used to draw the line.
No split, commitment attached: the number is not ready to carry the decision. Substitute one you can attribute to a named actor, such as call sites and test-file imports found across the 200 million public repositories in code search [21].
Split available, nothing riding on it: do the split when it is cheap, then leave it alone.
No split, nothing riding on it: keep it on the dashboard and stop quoting it in reviews.
The classifier itself is unglamorous and mostly string work: match the "Bumps the ... group with N updates" title template, treat a dependencies label as a strong signal, keep an "ai generated" tag count as a floor, and hold every rule in one file you can diff when GitHub moves a field into "other" [2][5][11][19]. Bound the query to one month and it fits inside the free terabyte [17].
What to watch
- A published breakdown of the 111 million pull requests by author class, or by the dependencies and ai-generated labels, which would replace the ten-snippet sample with a rate.
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
A GitHub search for pull requests created between 2026-01-01 and 2026-09-01 reports 111M results.
ReportedView cited source - [2]
One result on the first page is titled "Bumps the bun-patching group with 64 updates" and its body is a table of package upgrades listing astro 7.1.3 to 7.2.9 and wrangler 4.113.0 to 4.127.1, with the label dependencies and javascript.
ReportedView cited source - [3]
Another result bumps the flutter-employee-dependencies group in /front/mobile_apps/leopardo_employee with 3 updates: cached_network_image, firebase_core and firebase_messaging, labelled dart and dependencies.
ReportedView cited source - [4]
A result reads "Removes esbuild. It s no longer used after updating ancestor dependency vite. These dependencies need to be updated together." and updates vite from 5.4.21 to 8.2.2, labelled dependencies and javascript.
ReportedView cited source - [5]
The first listed result describes disconnecting each synchronous Google HTTP client test response in a finally block, and carries the tags "ai generated", "no release notes", "type: bug fix" and "inst: others".
ReportedView cited source - [6]
Another result reads "Fixes #5935" and describes a follow-up to the Windows startup investigation in #5848, carrying labels ci:windows and size:extra-large.
ReportedView cited source - [13]
The search results page reports the result total and shows individual result snippets with their labels; it does not include a breakdown of the total by author or by label.
ReportedView cited source - [14]
GH Archive records the public GitHub timeline, archives it, and aggregates events into hourly archives containing JSON encoded events as reported by the GitHub API.
ReportedView cited source - [15]
GitHub provides 15+ event types, which range from new commits and fork events to opening new tickets, commenting, and adding members to a project.
ReportedView cited source - [16]
The entire GH Archive is available as a public dataset on Google BigQuery, automatically updated every hour.
ReportedView cited source - [17]
BigQuery gives 1 TB of data processed per month free of charge, and GH Archive advises restricting queries to relevant time ranges to minimize the amount of scanned data.
ReportedView cited source - [18]
GH Archive states the payload field "is different for each event type and may be updated by GitHub at any point, hence it is kept as a serialized JSON string value in BigQuery", to be read with JSON functions such as JSON_EXTRACT().
- [19]
The "other" field is a JSON string containing data provided by GitHub that does not match the predefined BigQuery schema; if GitHub adds a new field it shows up in "other" until and unless the schema is extended.
ReportedView cited source - [20]
Changelog Nightly, powered by GH Archive data, ships reports each day at 10pm CT and unearths the hottest new repos on GitHub.
ReportedView cited source - [21]
GitHub code search covers 200 million public repositories, can filter on language and filepath, and supports regular expressions.
ReportedView cited source - [22]
To find files that use Python's graphlib package, the newsletter's example query is /(from|import) graphlib/ language:python.
ReportedView cited source - [23]
"After that I can sift through the results to separate real-life use cases from false positives and toy problems."
- [24]
"Just about the only things that don't seem work are group matching and lookarounds like (?!)."
- [25]
A regex search for simplifiable Python quantifier patterns returned, in the author's words, "like 300 code samples that could be simplified".
ReportedView cited source - [26]
The newsletter gives a composed query using multiple filters: /(from|import) hypothesis/ composite language:python path:test_*.py
ReportedView cited source - [27]
"You could feasibly run a query, dump a hundred matches into files, and then do more complicated filtering and munging before spitting out a courseload's worth of case studies."
- [28]
A testimonial published on pragmaticengineer.com says of the Pragmatic Engineer newsletter: "The level of in-depth information and knowledge sharing is out of this world."
- [29]
The testimonial's author says they have been subscribed to Hackernews, Hustle and platform-specific newsletters like Android weekly for almost ten years; the excerpt does not name the author.
ReportedView cited source - [7]
The window 2026-01-01 to 2026-09-01 is 243 days long.
Derived - [8]
111 million pull requests over 243 days averages about 457,000 pull requests per day.
Derived - [9]
That daily average works out at roughly 19,000 pull requests per hour.
Derived - [10]
The bun-patching pull request is a single row in the 111 million result count while carrying 64 package version changes, a ratio of 64 version changes to 1 counted pull request.
Derived - [11]
Three of the ten result snippets shown on the search page carry a dependencies label.
Derived - [12]
One of the ten result snippets shown carries an "ai generated" tag.
Derived
Sources & coverage · 4 publishers
The reporting this story was synthesized from, earliest first. Every link goes to the original.
- gharchive.orgyesterdayGitHub archive
- pragmaticengineer.comyesterdayGergely Orosz
Cited in this coverage: testimonial carried on pragmaticengineer.com
- github.comyesterdayall public PRs
- buttondown.comyesterdayGitHub Search
Additional citations
- GH Archive documentation
- Hillel Wayne, writing in his Buttondown newsletter
- Hillel Wayne, on the GitHub code search API