P.K. SHARMA

Cyber security intelligence, AI governance, practitioner analysis

AI Security

GitHub was degraded for seven hours across five services. Its status page posted 37 updates and named a cause in none of them

The same page publishes an approximate 20% error rate in prose and five components in major outage through its API, at the same moment. Git Operations, the component that decides whether anyone can push, was named last, 101 minutes in.

By Parminder Kumar Sharma · · 8 min read

A row of small round indicator lamps set into a dark brushed metal control panel, most of them unlit and one glowing amber, macro close-up at a shallow angle with a cyan edge light running along the top of the panel.

What the status page has published, and what it has not

At 13:40:03 UTC on 17 August 2026, GitHub opened incident zkxwbgr0cnmx with one sentence: it was investigating reports of impacted performance for some services. Five minutes later it published the size of the problem.

We are seeing an approximate 20% error rate across numerous experiences including Pull Requests, Issues, and others.

By 14:04 that statement had grown a second figure, an approximate 50% error rate on archive downloads and raw repository content, and by 14:24 a third clause naming SAML and OIDC authentication, SCIM and Team Sync. Those three sentences have been repeated without material change ever since.

Nineteen updates had been posted by 15:21 UTC. Fourteen of them named a component. Five described the aggregate. None named a cause. The incident was still marked investigating two hours after it opened, which is the status it carried when this was first written at 15:38 UTC.

By 16:36 UTC the count had reached twenty-eight and the status had moved to monitoring. The incident closed at 21:15:46 UTC on 37 updates, seven hours and 36 minutes after it opened. No update in that sequence named a cause, and the two that came closest are quoted in full below.

That is not a complaint about the engineers, who are working the problem, and an incident page written during an incident is not a post-incident report. It is an observation about what the document is able to say while the thing it describes is still happening, which is the only time anybody actually reads it.

The scale was published at 13:45. The components arrived for another 96 minutes

Incident zkxwbgr0cnmx · 17 Aug 2026 UTC

API Requests

13:41

13:41

Actions

13:42

13:42

Webhooks

13:44

13:44

Issues

13:46

13:46

Pull Requests

13:58

13:58

Copilot

14:31

14:31

Pages

15:10

15:10

Git Operations

15:21

15:21

13:40

14:00

14:30

15:00

15:25

13:45, five minutes in

“We are seeing an approximate 20% error rate across numerous experiences including Pull Requests, Issues, and others.” The size of the event was known and stated here.

15:21, 101 minutes in

Git Operations is listed as degraded. It is the component that decides whether a developer can push, and it is the last one named.

Announcement times taken from the incident page for zkxwbgr0cnmx. Each bar starts when GitHub first named that component and runs to the right edge, because none had been cleared when this was drawn at 15:38 UTC on 17 August 2026. Red bars are components the status API reported as major_outage at that moment, amber as degraded_performance. The bars show when each component was published, not when it began failing, which GitHub has not stated.

The component list disagrees with the paragraph above it

GitHub publishes the same incident twice, in two formats, and they do not describe the same service.

The prose says roughly one request in five is failing. The machine-readable component list, read from GitHub's own API at 15:38 UTC, says five components are in major_outage, which in Atlassian Statuspage vocabulary is the most severe state below a full outage and sits two steps above degraded_performance.

Component states from /api/v2/components.json, read at 15:38 UTC on 17 August 2026

ComponentStatus value at 15:38 UTCFirst named on the incident page
API Requestsmajor_outage13:41 UTC
Issuesmajor_outage13:46 UTC
Pull Requestsmajor_outage13:58 UTC
Actionsmajor_outage13:42 UTC
Copilotmajor_outage14:31 UTC
Webhooksdegraded_performance13:44 UTC
Pagesdegraded_performance15:10 UTC
Git Operationsdegraded_performance15:21 UTC
PackagesoperationalNot named
CodespacesoperationalNot named
Status values are verbatim from the API. Announcement times are the first update on the incident page naming that component. GitHub has not stated when any component began failing, which is a different question from when it was published.

Both readings are published by GitHub, about one event, at one moment, on one page. A reader who takes the prose comes away thinking most things work. A reader who takes the component list comes away thinking five of the twelve tracked services are effectively down. The overall indicator on the same API call reads Partial System Outage with an impact of critical.

The gap is not dishonesty. It is that a percentage and a state are answers to different questions, and the page publishes both without saying which one to use.

A push succeeded while Git Operations was listed as degraded

Git Operations was named last, at 15:21, which is 101 minutes after the incident opened and 96 minutes after GitHub had already published the 20% figure. Seventeen minutes after that listing appeared, a real operation against a real repository returned normally.

Terminal
$ time git ls-remote --heads origin main
64b892dbb98cf77bc249633e0d724f8e0113f65b  refs/heads/main
git ls-remote --heads origin main  0.03s user 0.03s system 6% cpu 0.888 total

Run against github.com at 15:38 UTC on 17 August 2026, seventeen minutes after Git Operations was listed as degraded. The repository is this site.

One operation, at one moment, from one network. That proves nothing about the fleet, and it is not offered as a rebuttal. It is offered because it is the exact experience that makes a status page feel wrong to the person reading it: the page says degraded, the terminal says fine, and neither is lying.

A component status is a global aggregate. The question a developer has at 15:38 is not what proportion of the fleet is erroring. It is whether the push about to be run will land, and no aggregate can answer that. During a 20% error event, the honest answer to an individual is that four operations in five will work and the fifth will fail in a way that looks like nothing in particular.

The recovery message identifies a component and does not name it

At 16:36 UTC, two hours and fifty-six minutes after the incident opened, GitHub moved it from investigating to monitoring.

We identified the problematic component and have taken corrective actions. There are strong signs of recovery but we are still working to completely restore service, with error rates still remaining slightly elevated.

That is the twenty-eighth update and the first to assert that anybody knows what is wrong. It does not say which component, what was wrong with it, or what the corrective action was. In one respect it is the most useful thing on the page all afternoon, because strong signs of recovery is information that genuinely was not available at 15:38 and it changes what a reader should do next. In the other respect it withholds the causal layer completely, and the phrase doing the withholding is the problematic component.

The page has now named a component fourteen times and identified a cause once, in the abstract, without saying what it was. That sequence arrived after this piece was written rather than being selected to fit it, which is the only reason it is worth pointing at. A post-incident report may eventually say more. The status page, which is the document anybody actually read this afternoon, did not.

At 21:15:46 UTC it closed, on the thirty-seventh update, seven hours and 36 minutes after opening:

This incident has been resolved. Thank you for your patience and understanding as we addressed this issue. A detailed root cause analysis will be shared as soon as it is available.

So the count finishes where it started. Thirty-seven updates, a component named in most of them, a cause named in none, and the causal account deferred to a document with no publication date attached to it. The last twenty minutes before closure were spent on sporadic Copilot authentication failures, which is the most specific technical detail the page produced all day and arrived after everything else had recovered.

Fifteen incidents in seventeen days

This is not an unusual month made visible by one bad afternoon. GitHub's own incident history, read from /api/v2/incidents.json, lists fifteen separate incidents between 1 and 17 August 2026. Two carry an impact of critical: an Actions incident on 6 August that ran from 15:22 to 02:04 the following morning, and this one.

August 2026 on GitHub, from the published incident feed

  1. 1 Aug

    Month opens

    Two Copilot model incidents on the first day, both resolved inside 90 minutes.

  2. 6 Aug

    Actions, critical

    Opened 15:22 UTC, resolved 02:04 the next morning. Ten hours and 42 minutes.

  3. 10 to 13 Aug

    Seven incidents in four days

    GraphQL API, PAT creation, Copilot model access, Login and release assets, Pull Requests and Issues, Webhooks, Team Sync.

  4. 17 Aug

    This incident

    Opened 13:40 UTC, impact critical. Resolved 21:15 UTC after seven hours 36 minutes and 37 updates, with no cause named.

Counts and timestamps from /api/v2/incidents.json, read at 15:38 UTC on 17 August 2026. Only incidents GitHub itself opened are counted, so anything that never reached the status page is absent by construction.

Fifteen incidents in seventeen days is roughly one every twenty-seven hours. Most were minor and most closed quickly. The point of counting them is that the status page is where a customer is expected to form a view of reliability, and a page that reports each incident in isolation is a poor instrument for that. Nothing on it aggregates.

The third instrumentation story this week

Read on its own this is an outage, and outages are not interesting. Read against the two briefings published on this site earlier today, it is the same defect in a third form.

What each organisation publishes

  • Anthropic: a risk report disclosing that biological classifiers did not block vendor traffic for eleven months
  • OpenAI: a Preparedness Framework naming the committee, the leadership sign-off and the board
  • GitHub: a status page naming twelve components and their current state

What it cannot tell you

  • That the same flag governed the logging, so the failure and success looked identical from outside
  • Who now produces the evidence those bodies rule on, because the document never named that function
  • Why any of it is failing, or whether the next operation you run will be one of the 20%

In all three, the published artefact describes the visible surface and omits the mechanism underneath it. Anthropic's classifier gap was invisible because the control and its telemetry shared a switch. OpenAI's framework survived the dissolution of a team because it never named the team. GitHub's status page reports that Pull Requests are in major_outage and has said nothing in two hours about what is producing that.

This is the weaker of the three cases and it should be said plainly. GitHub is in the middle of a live incident and owes nobody a root cause at ninety minutes. The other two are settled documents describing steady states. What connects them is narrower: each publishes component health and withholds, by design rather than by accident, the causal layer a reader would need to act on.

What the open window required, kept as written

This section was written at 15:38 UTC with the incident open and is left unchanged, because the point of it was what could be decided without a cause and that is the situation it describes.

Take this with you

Written while the incident was open, and kept as the record

  • Assume queued work is not lost but is not running either. Actions is in major_outage, so scheduled workflows may be delayed or skipped rather than failed, and a skipped cron leaves no artefact to notice later.
  • Treat webhook delivery as unreliable rather than absent. Partial delivery during a degraded window is the case that corrupts state, because the receiver sees some events and infers the rest never happened.
  • Do not retry authentication loops. SAML, OIDC, SCIM and Team Sync are named in the incident, and repeated failures during an identity incident are the fastest route to a lockout that outlives the outage.
  • Check the component API rather than the page if you are automating anything against it. /api/v2/components.json carries the state values the prose does not.
  • Write down what you observed and when. The post-incident report will describe the fleet, and your own timestamps are the only record of what your estate actually experienced.

The position

A status page is not a monitoring tool and was never built to be one. It is a communications surface, and the thing it is best at is publishing states that are cheap to compute and hard to dispute. major_outage is a defensible word. "Roughly one in five of your requests will fail for reasons we have not identified, and we do not know for how long" is the true sentence, and no status page has ever printed it.

The practical consequence is that during an incident the reader is doing the causal work themselves, from a component list, in the middle of the disruption the list is describing. That is the wrong time and the wrong instrument, and it is why the first thing most teams do in an outage is check somewhere other than the status page.

Sources

  1. PrimaryIncident with GitHub.com, incident zkxwbgr0cnmxGitHubaccessed 2026-08-17
  2. PrimaryGitHub Status component API, current component statesGitHubaccessed 2026-08-17
  3. PrimaryGitHub Status incident API, published incident historyGitHubaccessed 2026-08-17

Share this briefing

Know someone who owns this problem? Send it to them.

Related briefings

The briefing, in your inbox

Practitioner analysis of cyber and AI security news. No vendor noise.

One email per briefing. Unsubscribe any time.