43 pull request fields disappeared from the public firehose in October 2025. Most of the research they supported is still possible - but not the way anyone was doing it.
Fields removed
from 48 down to 5
Have an author
after 9 Oct 2025
17 hourly snapshots spanning December 2024 to September 2026 | GitHub Archive hourly files (data.gharchive.org) | measured 2 September 2026
A large amount of published research about how software teams work rests on one dataset: GitHub Archive, the public record of GitHub's event firehose. It is the source behind most "we analyzed N million pull requests" studies, including our own.
That dataset stopped carrying pull request detail in October 2025. The pull_request object in a PullRequestEvent went from 48 fields to 5, losing author, timestamps, line counts, review counts and merge state. We measured the change directly across 17 hourly snapshots spanning December 2024 to September 2026.
The obvious conclusion is that PR research on this dataset is finished. That turns out to be wrong, and the more useful half of this piece is why: most of what those fields supported can still be derived from the event around the pull request, at the cost of more work. Skip to what still works if that is what you came for.
This was announced, not hidden. GitHub published the change in a changelog post on 8 August 2025, with a brownout on 8 September 2025 and rollout on 7 October 2025. They removed fields that were "slow to generate and require costly database calls" in exchange for events appearing almost immediately instead of up to eight hours late. This study is not a discovery of the change. It is a measurement of what the change cost anyone doing research on this data.
Holding time of day constant at 15:00 UTC, the last hour we sampled with a full payload is 8 October 2025. Every sample from 9 October onward carries five fields. The transition is binary: there is no partial or gradual degradation between the two.
| Sampled hour | Events | PR events | PR fields | With author |
|---|---|---|---|---|
| 4 Dec 2024 | 262,583 | 19,584 | 48 | 100% |
| 7 Oct 2025 | 167,925 | 13,205 | 48 | 100% |
| 8 Oct 2025 | 169,770 | 13,904 | 48 | 100% |
| 9 Oct 2025 | 1,247 | 234 | 5 | 0% |
| 16 Oct 2025 | 146,626 | 8,189 | 5 | 0% |
| 2 Dec 2025 | 151,462 | 6,345 | 5 | 0% |
| 3 Mar 2026 | 159,571 | 4,793 | 5 | 0% |
| 25 Aug 2026 | 66,239 | 367 | 5 | 0% |
| 26 Aug 2026 | 84,693 | 289 | 5 | 0% |
The 9 October 2025 file is unusually small, and a handful of hours in that week are partial or missing entirely. That disruption is separate from the schema change: the field count never recovers once the archive resumes normal volume on 16 October.
baseheadidnumberurlIdentifiers and refs. Enough to know a pull request happened, nothing about it.
_linksactive_lock_reasonadditionsassigneeassigneesauthor_associationauto_mergebodychanged_filesclosed_atcommentscomments_urlcommitscommits_urlcreated_atdeletionsdiff_urldrafthtml_urlissue_urllabelslockedmaintainer_can_modifymerge_commit_shamergeablemergeable_statemergedmerged_atmerged_bymilestonenode_idpatch_urlrebaseablerequested_reviewersrequested_teamsreview_comment_urlreview_commentsreview_comments_urlstatestatuses_urltitleupdated_atuser"You can still see that a pull request happened. You cannot see who opened it, when it merged, how big it was, or whether anyone reviewed it."
The obvious conclusion from the field list is that PR research on this dataset is finished. That is what we assumed too, and measuring the post-cliff files properly shows it is wrong. Most of what the removed fields supported is still derivable, because the information moved from inside the pull_request object to the event around it.
Three things survive that make the difference. Every event still carries a top-level actor with a login, so authorship is available even though pull_request.user is not. Every event still carries a top-level created_at, so actions are timestamped even though merged_at is not. And PullRequestReviewEvent was left almost untouched: it still returns a full review object with state, body and submission time.
GitHub also added something back. Before the change, the action values on a PullRequestEvent were opened, closed, reopened - telling a merge from a plain close meant reading the now-deleted pull_request.merged field. Today the observed values include merged as a distinct action: opened, merged, closed, reopened, labeled, unlabeled, assigned. Merge detection is actually more direct than it used to be.
"The data did not disappear. It stopped being handed to you in one piece."
| Metric | Status | How |
|---|---|---|
| Bot vs human activity | Still direct | Event-level actor.login is still present on every event, and bot logins still carry the [bot] suffix. |
| Review outcomes and rubber-stamping | Still direct | PullRequestReviewEvent still carries a full review object with state (approved, changes_requested, commented, dismissed), body and submitted_at. |
| Issue lead time and triage | Still direct | IssuesEvent and IssueCommentEvent payloads were not trimmed. The issue object still has ~32 fields including created_at, closed_at, labels and assignees. |
| Merge day and hour of week | Still direct | The event envelope keeps created_at, and merged is now its own action value, so a merge is timestamped without needing merged_at. |
| Cycle time / time to merge | Reconstructable | Join the opened event to the merged event for the same pull_request.id across the archive timeline and subtract the two envelope timestamps. |
| Self-merge rate | Reconstructable | Compare actor.login on the opened event against actor.login on the merged event for the same pull_request.id. |
| Review coverage (PRs with zero review) | Reconstructable | Count distinct pull_request.id values that received a PullRequestReviewEvent against those that were opened. |
| First-time contributor analysis | Reconstructable | author_association is gone, so first contribution has to be approximated from an actor login first appearing against a repository in the archive. |
| PR size distribution | Lost | additions, deletions and changed_files have no event-level equivalent. This is the one genuinely unrecoverable class, and it underpins most PR-size research. |
| PR title, body and draft state | Lost | No event-level substitute. Labels are partially inferable from labeled and unlabeled actions, but the PR object itself is gone. |
The cost is real but specific. Reconstructable metrics need you to hold state across the timeline rather than read one row: to get cycle time you now join an opened event to a merged event for the same pull_request.id, which means processing a continuous span of the archive rather than sampling a month. That is more work, and it means late merges fall outside whatever window you process.
Pull request size is the one genuine casualty. There is no event-level substitute for additions, deletions or changed_files, which is precisely the data behind the size-versus-review-quality findings that this kind of research is best known for - including our own. Those cannot be refreshed from this source at any price.
Public GitHub data has been the default evidence base for claims about how software gets built. Benchmarks about review coverage, PR size, merge timing and contributor onboarding are routinely sourced from it, by vendors and academics alike. Those analyses did not all die on 9 October 2025, but the ones that were a single query over a month's table now either need rewriting against the event stream or cannot be done at all.
The practical consequence is a silent break in comparability. A study that reads pull_request fields will return far fewer usable rows after the cutoff rather than failing loudly, so a naive year-over-year series can keep producing numbers that are not measuring the same thing. Anyone publishing a PR-size benchmark for a period after October 2025 is drawing on a different source, and it is reasonable to ask which.
"The dangerous part is not that queries fail. It is that they still return rows."
Our 3.4 million PR study and its 2025 follow-up both rest on this dataset, so both are bounded by the same cutoff. The 2025 edition drew on early-October data, which places it directly against the boundary. We are stating that plainly rather than quietly publishing a 2026 edition that could not use the same method.
No BigQuery account is needed. GitHub Archive publishes one gzipped JSON file per hour, one event per line, and they are public. Download any two hours either side of the boundary and compare:
# One hour from before the change, and one from after
curl -O https://data.gharchive.org/2025-10-08-15.json.gz
curl -O https://data.gharchive.org/2026-08-25-15.json.gz
# Count the fields on the first PullRequestEvent in each
python3 - <<'EOF'
import gzip, json, sys
for path in ("2025-10-08-15.json.gz", "2026-08-25-15.json.gz"):
with gzip.open(path, "rt", errors="replace") as f:
for line in f:
e = json.loads(line)
if e.get("type") != "PullRequestEvent":
continue
pr = e["payload"].get("pull_request") or {}
print(path, "->", len(pr), "fields:", sorted(pr)[:8], "...")
break
EOFWe sampled 9 hours at 15:00 UTC to hold time of day constant, plus additional hours on the boundary dates and two extra hours in August 2026 to check that a single file was not misleading us. Counts are of every line in each file, not a sub-sample.
The data still exists, it is just no longer in the firehose. GitHub's REST and GraphQL APIs return the full pull request object per repository, which is how any tool that reports on your delivery data gets it today. The trade is that you query repository by repository with authentication and rate limits, rather than reading one global stream.
So there are two routes now rather than one. Stay on the archive and rebuild the metrics from event sequences, accepting that PR size is gone and that you must process a continuous span rather than sample a month. Or select a sample of repositories and pull their full pull request history from the API, which restores every field including size but makes your result a sample rather than a census. Neither is as convenient as one query over a month's table, and the second is the only one that recovers PR size.
For measuring your own organization none of this changes anything, because per-repository API access was always the route there.
CodePulse reads pull request history directly from the GitHub API for the repositories you connect, so the metrics in this study - cycle time, review coverage, PR size, merge patterns - are unaffected for your own team, whatever happens to the public firehose.
Analyze your own GitHub data