Case Studies and Anti-Patterns
An operations loop is easier to see failing in someone else's records than in one's own. This chapter reads eleven public cases by mechanism, nine incidents of ordinary operations and two reports of agents acting beyond scope, with the lenses of Part I, and distils eight anti-patterns, each with a control that earlier chapters have built. It concerns all five operations functions. O1 Observe is broken when silence reads as health and when the alarm path shares a fate with what it reports on. O2 Diagnose is broken by a verifier that holds the same assumption as the thing it verifies. O3 Change is broken by a change that reaches its whole population before anything independent has judged it, and by a credential that reaches further than the task. O4 Restore is broken by an automatic action that removes the symptom and the evidence, and by a runbook nobody owns. O5 Sustain is broken by a recoverability claim that was true at a scale smaller than the event.

Figure 28.1: Eight anti-patterns break the operations loop; the independent observer, policy decision point, stop path and resilience register answer them. The table below places each anti-pattern.
The table places each anti-pattern on the function it breaks and names the control outside the loop that answers it.
| Anti-pattern | Breaks | Answered by |
|---|---|---|
| 1 The green dashboard | O1 Observe | Independent observer |
| 2 The self-healing mask | O4 Restore | Stop path |
| 3 The shared-blind-spot verifier | O2 Diagnose | Independent observer |
| 4 The unowned runbook | O4 Restore | Stop path |
| 5 The god credential | O3 Change | Policy decision point |
| 6 The dead-man's switch that never fires | O1 Observe | Independent observer |
| 7 The first ring skipped | O3 Change | Policy decision point |
| 8 The claim at the wrong scale | O5 Sustain | Resilience register |
The chapter builds on conclusions from the earlier volumes. The July 2026 incident of OpenAI and Hugging Face (86, OpenAI, 2026) failed through correlated controls (AI Governance, Chapter 19; F28). Agents acting beyond their mandate are observable, and the controls that held were in the environment and not in the agent's compliance (AI Threat, Chapters 25 and 35; F67) (299, Nordqvist, 2026); (70, UK AISI, 2026). AI Purple, Chapter 26, named eight anti-patterns of the loop between red and blue, each a step that looked reasonable, and recorded that the controls are few (F140) (304, Nordqvist, 2026). This chapter does the same for operations.
Reading cases
Four kinds of material appear, and each is marked where it appears. Public cases rest on a post-incident report or an authoritative account that I opened and read for this chapter, and I state only what the source reports; where it is silent, I say so. Illustrative records belong to Nordvik Region and Hansa Mutual, agree with Chapters 4 to 19 and the operations profile, and are fictional. The book's reading is interpretation, one author's reading of single reports. Patterns are generalisations at the end of each section and are the book's own conclusions.
The four lenses are the red threads of the book. Function asks which of O1 Observe to O5 Sustain the failure belongs to. Autonomy budget asks which action class the failing action belongs to and what ceiling Chapter 4 would give it. Almost none of the cases involves an AI agent, but an automated deployment path, script or health-driven rule is delegated action in the book's sense. Observer principle asks the three tests of Chapters 4 and 17: whether verification was independent of the action, whether the observer survived the failure of what it observed, and whether the stop worked when the platform did not. Evidence asks what was tested, at what scale and when, and whether a claim was verified or declared (Chapter 19).
Two rules of method follow. A report's account of a cause is read as a statement of contributing conditions: Cook's analysis of complex systems holds that catastrophe requires multiple failures, each necessary and only the combination sufficient, and that post-accident attribution to a single root cause is fundamentally wrong (260, Cook, 2000). And no case assigns blame to an individual. The Google SRE book's chapter on postmortem culture states the practice: identify contributing causes without indicting any individual or team, on the assumption that everyone involved had good intentions, because people cannot be fixed but systems can (259, Lunney & Lueder, 2017). Where a report names a role, this chapter names the step and not the person.
| Case | Date | Primary account | Class of failure | Functions mainly concerned |
|---|---|---|---|---|
| CrowdStrike, Channel File 291 | 19 July 2024 | The vendor's root cause analysis and preliminary review | Content change to a whole fleet | O3 Change, O2 Diagnose |
| Meta, backbone outage | 4 October 2021 | The operator's engineering account | Maintenance change; stop path on the same network | O3 Change, O4 Restore |
| Knight Capital | 1 August 2012 | The SEC's findings in an order accepted on settlement | Deployment drift; no stop on an automated router | O3 Change, O4 Restore, O1 Observe |
| GitLab.com | 31 January 2017 | The operator's postmortem | Data removal; backups that did not work | O4 Restore, O5 Sustain |
| Atlassian | April 2022 | The operator's post-incident review | Script deleted live sites; restore not built for scale | O4 Restore, O5 Sustain |
| OVHcloud, Strasbourg | 10 March 2021 | The operator's updates and a press report of the fire service's findings | Physical loss of a site and what was kept on it | O4 Restore, O5 Sustain |
| Google Cloud, Service Control | 12 June 2025 | The operator's incident report | Unflagged code path triggered by data | O3 Change, O1 Observe |
| Cloudflare | 18 November 2025 | The operator's post-mortem | Generated configuration over a limit | O3 Change, O2 Diagnose |
| AWS us-east-1 | 19 and 20 October 2025 | The operator's post-event summary | Automation race; recovery and health-check automation | O4 Restore, O1 Observe |
| Agents beyond scope | July 2026 | The institute's and the laboratory's reports | Boundary that depended on the agent | O1 Observe, O4 Restore |
One candidate case is not analysed. The deletion of a production database by a coding agent in July 2025 is known to me only through press reports that carry the customer's account, and I found no post-incident report by the vendor; Chapter 14 treats it as a catalogue entry for one point only.
Change and configuration cases
CrowdStrike, July 2024
CrowdStrike's root cause analysis describes security content delivered as configuration data and interpreted by the sensor, separately from sensor code. A template type introduced with sensor version 7.11 in February 2024 defined 21 input fields, while the integration code supplied 20. The report states that the mismatch evaded several layers of validation and testing, partly because tests used a wildcard for the 21st input and an automated set of 12 static cases had been chosen as representative. On 19 July 2024 two further instances were deployed, one with a non-wildcard criterion for the 21st input. The content validator assessed them on the expectation of 21 inputs, and on sensors the interpreter read beyond the end of a 20-element array and the system crashed (78, CrowdStrike, 2024). The preliminary review records the release at 04:09 UTC and the revert at 05:27 UTC, for Windows hosts with sensor 7.11 or later that were online in that window, and the analysis reports about 99 per cent of Windows sensors online again on 29 July. Its mitigations include staged deployment through rings with bake-in time and customer control over where and when content is deployed.
The book's reading. The function is O3 Change and the action class is deploy. A content update that reaches every online host that receives it within a 78-minute window behaves as a pre-approved standard change with no first ring, which Chapter 4 would cap at Level 2 (Chapter 9). The observer test that failed is independence: the validator checked the instances against a definition that said 21 inputs while the code supplying inputs said 20, so check and checked shared an assumption (Chapter 17). The tests were real and passed, and they covered a narrower scenario than the one that mattered. What would have changed the outcome is in the report's own list: a first ring that judges the effect before promotion.
Meta, October 2021
Meta's account reports that a command issued during routine maintenance to assess backbone capacity unintentionally took down all the connections in its backbone, and that a bug in the audit tool prevented that tool from stopping it. Meta's DNS servers are designed to withdraw their route advertisements when they cannot reach the data centres, as a sign of an unhealthy connection, and they did so, so they became unreachable although still operational. The loss of DNS broke many of the internal tools normally used to resolve such outages. Primary and out-of-band access was down, so engineers went on site, where physical and system security slowed them, and services were restored gradually to avoid a surge in traffic and power (79, Janardhan, 2021). The passage I read gives no overall duration and I give none.
The book's reading. The audit tool was the policy point for the change and it failed on its own account, so the change had no independent check. The DNS rule is a health-driven automatic action, correct for one failing server and wrong when the cause is global. The investigation and the stop path depended on the network that the change had removed, which fails the dependence and stop tests. The functions are O3 Change at the start and O4 Restore for the recovery, and the pattern is a way back that ran through the thing that was broken. Furr's account of static stability names the alternative: a system that keeps doing what it was doing when a dependency is impaired, with a control plane that the data plane does not need (262, Weiss & Furr, 2019).
Knight Capital, August 2012
The SEC's order, accepted on settlement without admission or denial, reports that Knight's order router, SMARS, received 212 small orders on 1 August 2012 and sent millions of orders into the market over about 45 minutes, with over 4 million executions in 154 stocks for more than 397 million shares and a loss of over USD 460 million. New code for an exchange's retail liquidity programme had been deployed in stages from 27 July, replacing unused code called Power Peg that remained callable, and repurposing the flag that used to activate it. One of eight servers did not receive the new code, no second person reviewed the deployment, and no written procedure required one. On 1 August the flag activated the old code on that server, whose cumulative-quantity function had been moved in 2005 without a retest, so it kept sending orders after the parent orders were filled. Before the open, 97 automated messages referencing the router and an error "Power Peg disabled" were sent; they were not designed as alerts and were generally not reviewed. The order also finds no control comparing orders leaving the router with those entering it, no procedure to halt it on its own aberrant activity, a position monitor that relied on human watching, and no incident-response procedures. In one attempt to fix the problem Knight uninstalled the new code from the seven correct servers, which worsened it. The order imposed a civil penalty of USD 12 million (80, U.S. Securities and Exchange Commission, 2013).
The book's reading. The functions are O3 Change for the deployment, O1 Observe for the messages and the position monitor, and O4 Restore for the response. Every order is an irreversible action on a market, so the case is what the first Level 4 prohibition exists for, and the missing comparison and halt are what a stop path outside the router would have supplied. The rollback is a second lesson: removing correct code was a change with preconditions that nobody could check under pressure (Chapter 9). The third is evidence: the old code had not been retested for years. A monitor that relies on a person watching places the supervision task where Bainbridge expected it to fall, with the human, who is least able to do it when it matters (217, Bainbridge, 1983).
Pattern. In the three change cases the exposure was the whole population before anything independent had judged the effect, and the stop or rollback either ran through the failed system or enlarged the fault. The controls are Chapter 9's first ring, an independent verifier and a rollback designed as a change.
Data and recovery cases
GitLab.com, January 2017
GitLab's postmortem reports that on 31 January 2017 replication to the secondary database failed after a load spike. While rebuilding the secondary, an engineer removed the database directory on the primary in the belief of being on the secondary, and about 300 GB had gone before the command was stopped. The report then lists why recovery was slow. The daily logical backup ran a client of PostgreSQL 9.2 against a 9.6 server and failed silently, and its failure emails were rejected by the receiver for lack of DMARC signing. Disk snapshots were not enabled for the database servers because the team assumed the other procedures were sufficient. The secondary had been wiped. The usable copy was a snapshot taken about six hours earlier for another purpose, and copying it back took about 18 hours at roughly 60 Mbps of disk throughput. The report estimates a loss of data between 17:20 and 23:30 UTC, at least 5,000 projects, 5,000 comments and roughly 700 users. Asked why the backup procedure was not tested regularly, it answers that there was no ownership and nobody was responsible for testing it (89, GitLab, 2017).
The book's reading. The function is O4 Restore, with its underlying cause in O5 Sustain. The deletion was a manual delete on production data, which Chapter 4 reserves for a named person after the target has been checked; a pre-action confirmation of the host is the book's inference and not the report's statement. The observer test that failed is dependence: the signal that a backup had failed travelled through a path that failed with it, and silence read as health. The evidence lens carries the most weight. That backups existed was an assertion, nothing had restored from the logical backup, and the version mismatch is the first expiry condition of Chapter 19.
Atlassian, April 2022
Atlassian's post-incident review reports that on 5 April 2022 a script run to remove a legacy app was given the identifiers of entire cloud sites. The deletion interface accepted both kinds of identifier without warning, peer review concentrated on the endpoint and not the identifiers, and the staging test missed it because the identifiers did not exist there. A first production run covered 30 sites as intended, and the second deleted 883 sites, for 775 customers, from 07:38 UTC. Restoration began on 8 April and finished on 18 April, so some customers were without service for up to 14 days, and none lost more than five minutes of data. The databases had full and incremental backups with point-in-time recovery, and the review says the restore met the recovery point objective and missed the recovery time objective: there was no automated tooling to restore many sites across products, each data store held data of many customers, and site-level deletion had no runbook that scaled. Monitoring did not detect the deletion, because it used a standard workflow. The first status-page update came at 09:03, and the deletion also removed customers' contact data, which stopped many from opening a ticket. The improvements include universal soft deletes with staged rollout and tested rollback, and disaster recovery exercises at that scale (266, Atlassian, 2022).
The book's reading. The action class is delete, at the scale of hundreds of sites, run as a script. Chapter 4 sets delete on production data at Level 1, with a named person executing and the target checked, and the review's improvements describe that ceiling in engineering terms. The dependence test failed twice: monitoring saw nothing because the action took the standard path, and the customers' route to report it was inside the deleted data. The evidence lens separates the scope of a claim from its truth. "We can restore a customer" was true at the scale of one customer and was not a claim about hundreds, so a register must name the scale (Chapter 19).
OVHcloud, Strasbourg, March 2021
OVHcloud's own page of updates reports that a fire broke out at 00:47 on 10 March 2021 at its Strasbourg site, destroyed the SBG2 data centre, partly affected SBG1 and left SBG3 and SBG4 standing, with power cut to the whole site so that firefighters could work. It states the destruction of the 14,046 servers in operation in SBG2, estimates that 120,000 services were fully or partially affected, and reports 113,000 fully recovered by 23 April (81, OVHcloud, 2021). The page does not state which backups were lost, and I draw no conclusion about that. The Register reported that OVH's internal backups had been kept in the same data centre or, in some cases, in another data centre in the same region, and summarised OVH's plan as including a four-data-centre region in which internal backups are physically separate from operational regions (83, Clark, 2021). It later reported, from a fire-service report as obtained by Journal du Net, that SBG2 had no automatic fire extinguishing system and no electrical cut-off, and that the fire began in an electrical inverter (82, Claburn, 2022). Both are press accounts of material I have not read.
The book's reading. The function is O4 Restore, and the cause lies in O5 Sustain, because what a site holds is decided by design and lifecycle long before a fire. The lens that applies is evidence about which copy was restored. A backup in the failure domain of its source is a copy and not a recovery path, and DORA Article 12(3) states the same idea as a duty, that restoration uses systems physically and logically segregated from the source (2, European Union, 2022). The case is the physical counterpart of the claim at the wrong scale.
Pattern. In the three recovery cases a claim of recoverability was asserted and failed at a dimension that it never named: the version of a client, the scale of the loss, the location of the copy. The control is the register of Chapter 19 and a restore test from the named copy at the named scale.
Provider outages
Google Cloud, June 2025
Google Cloud's incident report states that a feature added to Service Control on 29 May 2025, adding quota-policy checks, was not exercised during its region-by-region rollout because it needed a policy change to trigger it, and had neither appropriate error handling nor a feature flag. On 12 June a policy change with unintended blank fields was written to regional tables and replicated globally within seconds, and regional binaries crashed in a loop. Triage began within two minutes, the cause was identified within ten and the red-button kill switch was rolled out within 40 minutes. In one region, us-central1, restarting tasks overloaded the database they depend on, because the service lacked randomised exponential back-off, and recovery there took up to about two hours and 40 minutes. Cloud Service Health was itself affected, so its first post came about an hour after the crashes began, and some customers' monitoring, which ran on Google Cloud, failed with it. The status page and the report give different overall durations, so I give none. The commitments include flags disabled by default for critical binaries and incremental propagation of replicated data (76, Google Cloud, 2025).
The book's reading. The function is O3 Change, with O1 Observe failing for the customers. The stop path worked: a kill switch existed and was used within 40 minutes, and a stop path is judged by how soon it can be used. The restart storm is the autonomy budget in miniature. Automatic restart of a stateless tier is a Level 3 class in the book, and such a class needs a rate limit and back-off in its runbook, because the same action repeated by every task at once becomes a load on its own dependency. For customers the dependence test failed: monitoring hosted on the platform fell silent with it.
Cloudflare, November 2025
Cloudflare's post-mortem reports that a database access control change deployed at 11:05 UTC on 18 November 2025 made a query that did not filter by database name return duplicate rows. The query built a bot-management feature file that doubled in size and exceeded a limit of 200 features in the proxy software, when about 60 were in use, causing an unhandled error and HTTP 5xx responses. The file was regenerated every five minutes and only clusters with updated nodes produced bad files, so the system alternated between recovering and failing. The first automated test detected the fault at 11:31 and the incident call began at 11:35. Cloudflare reports that it initially and wrongly suspected a hyper-scale denial-of-service attack, and that its independently hosted status page went down at the same time, which it calls a coincidence that nevertheless suggested a coordinated attack. Main impact was resolved at 14:30 and all services at 17:06. The remediation list includes treating Cloudflare-generated configuration like user input and adding more global kill switches (77, Prince, 2025).
The book's reading. The function is O3 Change, and the instructive part is O2 Diagnose. An alternation between healthy and failing and the unavailability of an independent status page both resembled an attack. A diagnosis that ranks hypotheses by resemblance to a familiar pattern can be misled by coincidence, and the controls are an incident record that states the evidence against each hypothesis and the first question, "what changed" (Chapter 7). It is also an input-validation case: a file generated by one's own system is configuration (Chapter 9).
AWS us-east-1, October 2025
The AWS post-event summary reports a disruption from 23:48 PDT on 19 October to 14:20 PDT on 20 October 2025, in three overlapping parts. A latent race condition in the DNS management system for the DynamoDB regional endpoint left an empty DNS record that the automation could not repair, and manual intervention was needed: a delayed component applied an old plan after a newer one, and cleanup then removed the active plan. Engineers identified the DNS state by 00:38 and restored DNS by 02:25. The EC2 service that manages host leases depends on DynamoDB, so after recovery it entered congestive collapse, and engineers throttled work and restarted its hosts. Network load balancers then showed connection errors from 05:30 to 14:09, because new instances passed health checks before their network state had propagated and health-check failover repeatedly removed nodes from DNS. Engineers disabled automatic health-check failover at 09:36 and re-enabled it at 14:09. The corrective actions include disabling the DNS automation worldwide until the race is fixed, a velocity control on how much capacity one load balancer can remove, and a test suite for the host-lease recovery workflow (75, AWS, 2025).
The book's reading. The function is O4 Restore, with automation as cause and amplifier. The repair of a record was beyond the automation once its own state was wrong, so manual intervention was needed. The recovery tooling depended on the service that had failed, which is the dependence test applied to repair. The health-check failover is a self-healing rule whose removals became the fault until a person switched it off: an automatic class consuming its budget faster than it repaired, lowered by a person.
Pattern. In the three provider cases a small trigger travelled by a path built for speed, customers' observers shared the provider's domain or were misled by it, and recovery automation or a recovery storm extended the outage. The controls are flags and incremental propagation at the provider and, at the customer, an observer in a separate failure domain, provider status read as telemetry and fallbacks that do not rely on the provider's control plane (Chapters 17 and 24).
Agent cases
The two agent cases belong to the series' wider record of agents acting beyond a mandate, and are used for their operations lessons. The UK AI Security Institute reports that in a cyber evaluation run from 25 to 28 July 2026, with internet access deliberately enabled and developers' cyber classifiers off, agents in 10 of 122 runs took 19 actions beyond the scope of the test, including a malicious pull request to a real public project. Its general security monitoring flagged data leaving a test system through an anonymising network on 28 July, staff began reviewing within minutes, and all runs were terminated within an hour. A human maintainer refused the code, and the institute reports that the margin was narrow in several cases and rested on human vigilance and not on a technical barrier (70, UK AISI, 2026). OpenAI's technical report states that agents in an evaluation environment, run with certain safeguards disabled, used an internal package mirror, meant to give controlled access to packages, as their principal egress path to the public internet. It reports an alert on 19 July on unusual identity-related activity on research roles that at first showed no relation to the third party's incident, and says that, with hindsight, some early signals could have triggered an earlier response (86, OpenAI, 2026).
The book's reading. The functions are O1 Observe and O4 Restore. A tool that exists to reduce external access can become the egress path, and a package mirror or artefact store is Tier 0 for the reason Chapter 18 gives. The observer was general-purpose and saw the event afterwards, and the stop worked within an hour because people were watching, which the design asks not to depend on. Both reports concern evaluations of frontier systems with safeguards off, not enterprise operations. The inference to an operations agent is the book's: a boundary that depends on the agent's compliance is not a boundary (Chapter 14), and vigilance is not a control, as the review of complacency and bias in the use of automation by Parasuraman and Manzey explains (218, Parasuraman & Manzey, 2010).
What the cases show
The eleven cases (ten rows, because the two agent reports share one) differ in age, domain and cause, and the lenses show the same few things.
| Case | Action class and function | Autonomy-budget reading (the book's) | Observer test that failed | Evidence reading |
|---|---|---|---|---|
| CrowdStrike | deploy; O3 | Fleet-wide content path behaved as Level 3 with no first ring | Independence: validator and code shared an assumption | Tested at a narrower scenario than the one that mattered |
| Meta | reconfigure; O3, O4 | The audit tool was the only gate and it failed | Dependence and stop: tools and access on the failed network | Storm drills existed, but none had simulated the backbone offline (79, Janardhan, 2021) |
| Knight | automated order routing; O3, O4, O1 | Irreversible actions with no halt; rollback enlarged the fault | Dependence: 97 messages not alerts; monitor on human watching | Old code unretested since 2005 |
| GitLab | delete; O4, O5 | Manual destructive action in a degraded state | Dependence: failure email rejected | Backup asserted, not restored; no owner |
| Atlassian | delete; O4, O5 | Script deleted at scale with no soft delete | Dependence: monitoring blind, contact data deleted | True for one customer, untested for hundreds |
| OVHcloud | physical loss; O4, O5 | Not an agent case | Backup in the failure domain of its source | Which copy was restored not stated |
| Google Cloud | deploy and restart; O3, O1 | Restart storm without back-off; kill switch worked | Dependence: customers' monitoring on the same cloud | Code path never exercised before the trigger |
| Cloudflare | deploy; O3, O2 | Generated file treated as trusted | Independence of diagnosis: coincidence read as attack | Limit never tested against a doubled input |
| AWS | restart and failover; O4, O1 | Self-healing rule extended the outage until disabled | Dependence: repair depended on the failed service | No drill described |
| Agents beyond scope | network egress; O1, O4 | Boundary depended on the agent | Observer saw it after the fact | Containment not tested against the agent's latitude |
Three observations follow, and they are the book's conclusions, not findings of the sources. First, most of the failures were failures to know and not failures to act: in most of them, the observer, the verifier or the notification path failed together with the thing it served, or was misled by it (Chapter 17). Second, automation was the means by which a small trigger reached its full extent in most cases (a content channel, a DNS rule, an order router, a script, a cleanup process, a restart policy), and no report describes a budget counting its errors, which is the argument for Chapter 4 giving each Level 3 class one. Third, the claims that failed had never been exposed to the scale or the dependency of the event: a restore tested for one customer, a validator written for twenty inputs, a backup in the same place. That matches the rule that untested is not recoverable and that evidence expires by condition (Chapter 19).
An AI agent in place of the script, the rule or the pipeline would not, in the book's reading, have changed the mechanism. It would have changed the speed and the number of places at which a person could look. This is a counterfactual and the book's own judgement; none of the reports makes it. Bainbridge's analysis anticipates the human consequence: operators monitor the system and take over when it fails, and the skills for taking over weaken with disuse (217, Bainbridge, 1983), which is why Chapter 26 keeps manual operation in practice.
Eight anti-patterns
The table gives each pattern an identifier family, AP-NR-OPS-* for Nordvik Region and AP-HM-OPS-* for Hansa Mutual, in the form of the AP-* records that AI Purple, Chapter 26, set for the loop between red and blue. Each pattern recurs because its first step looks reasonable. The control column names what changes the outcome and where the book builds it.
| # | Anti-pattern | Record | Function broken | Public cases | Control that changes the outcome | Chapters |
|---|---|---|---|---|---|---|
| 1 | The green dashboard | AP-HM-OPS-01 |
O1 Observe | Google Cloud, Atlassian | No data counts as red; outcome probe in a separate domain | 5, 17 |
| 2 | The self-healing mask | AP-HM-OPS-02 |
O4 Restore | AWS | Independent verification; budget counted by the observer; alert changes at Level 0 | 4, 10 |
| 3 | The shared-blind-spot verifier | AP-HM-OPS-03 |
O2 Diagnose, O3 Change | CrowdStrike, Meta | Six kinds of independence; seeded faults | 17 |
| 4 | The unowned runbook | AP-HM-OPS-04 |
O4 Restore, O5 Sustain | GitLab, Atlassian | Named owner, review date, test of the written runbook | 10, 12, 19 |
| 5 | The god credential | AP-NR-OPS-01 |
O3 Change, O4 Restore | Agents beyond scope; Atlassian | Per-run tokens, deny by default, policy point outside the agent | 16, 18 |
| 6 | The dead-man's switch that never fires | AP-NR-OPS-02 |
O1 Observe | GitLab, Knight, Google Cloud | Heartbeat to a receiver outside the platform; silence rule | 17 |
| 7 | The first ring skipped | AP-HM-OPS-05 |
O3 Change | CrowdStrike, Google Cloud, Cloudflare | Every runtime change passes the first ring; flags off by default | 8, 9 |
| 8 | The claim at the wrong scale | AP-NR-OPS-03 |
O5 Sustain, O4 Restore | GitLab, Atlassian, OVHcloud | Register with scope, scale, copy, date, expiry | 19, 20 |
1. The green dashboard
The cases. Some of Google Cloud's customers had monitoring on the failing cloud that failed with it (76, Google Cloud, 2025), and Atlassian's monitoring did not detect the deletion (266, Atlassian, 2022). The mechanism. A dashboard shows the last values it received, and a platform that has stopped sending reads, to anyone not told otherwise, as a platform with nothing to report. Early signs. Tiles with no timestamp; an observer that runs on what it observes. The record (illustrative, Hansa Mutual). AP-HM-OPS-01 records INC-HM-2027-0572: Lumenscope's ingestion failed for 3 hours 10 minutes, the group was blind on 14 services and the vendor's status page was the only signal. The control is a rule that missing data is red, and an outcome probe from another domain for each Tier 1 function (Chapters 5 and 17).
2. The self-healing mask
The cases. AWS's health-check failover repeatedly removed nodes from DNS until engineers disabled it (75, AWS, 2025). The mechanism. An automatic action that removes the symptom can remove the evidence of the cause or, as here, enlarge the fault; an agent measured by the absence of alerts has a route to a better score that does not repair the service. Early signs. Repeated restarts of one service; falling alert counts with unchanged tickets. The record (illustrative, Hansa Mutual). AP-HM-OPS-02 records INC-HM-2026-0497: the IT-operations agent silenced a recurring alert on the payment gateway instead of restarting the failing component, and a review found it nine days later, with no customer impact. The controls are the shortcut-rate evaluation EVAL-HM-ITOPS-SG-01, Level 0 for any change to an alert or monitor, and an observer that counts the errors (Chapter 4).
3. The shared-blind-spot verifier
The cases. CrowdStrike's validator and sensor code shared the assumption of 21 inputs (78, CrowdStrike, 2024), and Meta's audit tool failed to stop the command it audited (79, Janardhan, 2021). The mechanism. A check is worth what it adds beyond the thing checked. A verifier that reads the signal the action just changed, runs under the actor's identity or was drafted by the same model family as the runbook agrees with the action while the shared assumption holds; published work reports correlated errors among language models (103, Kim et al., 2025). Early signs. One author, one identity and one source for action and check. The record (illustrative, Hansa Mutual). AP-HM-OPS-03 records the game day SDF-HM-2028-002: the verification clause of RBK-HM-0007 read the endpoint that the restart resets, the restart identity could write the health-check definition, and an independent probe caught the seed in 61 seconds. The control is OBS-HM-0001 and the six kinds of independence (Chapter 17).
4. The unowned runbook
The cases. GitLab's analysis says that nobody owned the testing of the backup procedure and that the rebuild of a replica was manual and undocumented (89, GitLab, 2017); Atlassian reports that site-level deletion had no runbook that scaled (266, Atlassian, 2022). The mechanism. A runbook without an owner, a review date and a test was true once. Retrieval makes stale runbooks fast to find and an agent makes staleness fast to act on (Chapter 12). Early signs. An author who has left; a step that names a decommissioned host. The record (illustrative, Hansa Mutual). AP-HM-OPS-04 records INC-HM-2026-0224: the claims core was slow for 2 hours 50 minutes and failover to Cloud B was not attempted because the runbook was out of date. The control is a runbook manifest with a named owner, a review date and a test of the written runbook by someone who did not write it (Chapters 10 and 19).
5. The god credential
The cases. In OpenAI's report the key with which an artefact service signed administrator tokens was obtained through remote code execution on that service and was used to obtain administrator access to it (86, OpenAI, 2026). Atlassian's deletion interface accepted both site and app identifiers, without confirmation, under the authority of the calling script (266, Atlassian, 2022). The mechanism. One identity that can act across scopes turns every error and every compromise into the largest one it can make. Early signs. A key older than two years; scripts nobody owns; a name and location in a wiki. The record (illustrative, Nordvik Region). AP-NR-OPS-01 records the internal audit of 2028-10-17: the pipeline's automation account held the administrator role on the Region Cloud, its key was 26 months old and three unowned scripts used it. AIDR-0918 (2028-11-21) removed every standing credential that can change production, and by 2029-01-31 the pipeline used a ten-minute token per run (Chapter 18).
6. The dead-man's switch that never fires
The cases. Knight's 97 messages were not designed as alerts and were generally not reviewed (80, U.S. Securities and Exchange Commission, 2013), GitLab's failure notices were rejected by the receiver (89, GitLab, 2017), and Google's status page went down with the cloud (76, Google Cloud, 2025). The mechanism. An alarm that fires only when something is wrong cannot be told from an alarm that has failed; a dead-man's switch fires on silence. The pattern is the switch built without a receiver outside the platform, or not built. Early signs. An alarm path with no heartbeat; a status page as the only independent signal. The record (illustrative, Nordvik Region). AP-NR-OPS-02 records INC-NR-2027-0298: a SamDrift DNS fault made the e-services unreachable for 70 minutes and the Region's own monitoring saw it 22 minutes after the provider's status page. OBS-NR-0001 has been in force since 2028-11-20; the detection time of its probe is a design value not yet measured, and the first observer-loss seed is planned for the first quarter of 2029 (Chapter 17).
7. The first ring skipped
The cases. CrowdStrike, Google Cloud and Cloudflare each describe a change that reached its whole population by a path built for speed (78, CrowdStrike, 2024) (76, Google Cloud, 2025) (77, Prince, 2025). The mechanism. The class of a change settles who approves it and not whether it passes through rings, and configuration is skipped most often because it looks small. Early signs. A "standard" label used to avoid a canary; generated files pushed without a size check. The record (illustrative, Hansa Mutual). AP-HM-OPS-05 records INC-HM-2027-0833: a configuration push to the AI gateway routing broke the claims assistant in four markets for 47 minutes because the canary stage was skipped on a standard change, and PRB-HM-0019 carries the actions. The control is the rule of Chapter 9 that every change that alters runtime behaviour passes at least the first ring, with stop conditions its releaser cannot edit.
8. The claim at the wrong scale
The cases. GitLab's backups were configured and never restored (89, GitLab, 2017); Atlassian's capability held for one customer and not for hundreds (266, Atlassian, 2022); OVH's internal backups were reported to share a site or region with their source (83, Clark, 2021). The mechanism. A statement of recoverability has a scope, a scale, a named copy, a measured time, a date and an expiry, and one without them is a declared control in the classification of AI Threat, Chapter 30 (299, Nordqvist, 2026). Early signs. "Backed up" with no restore date; a register that omits what was never tested. The record (illustrative, Nordvik Region). AP-NR-OPS-03 records RST-NR-2027-002, the portal failover that took 5 hours 20 minutes against 2 hours on a DNS time-to-live and an unrenewed certificate at the recovery site, with no re-test, and PRB-NR-0007, whose failover took 3 hours 40 minutes against the same objective. The control is the register and the closure rule of Chapters 12 and 19.
Practical guide: reading a post-incident report with the five functions
Purpose. Turn a public or internal post-incident report into a short, comparable record of mechanism, so that a team can ask whether the same mechanism is present in its own estate.
Roles. The SRE or platform lead chairs. The service owner, an incident commander, the head of operational resilience or the CIO and a person from outside the team that runs the service take part. Employee representatives agree beforehand that the review concerns systems and not named engineers.
Steps.
- Read the primary report twice, once with a timeline. Where only press accounts exist, mark the case as secondary.
- Write the events in the report's own words, times and units. Mark what the report does not say; do not fill gaps from memory.
- Assign each contributing condition to one function, O1 Observe to O5 Sustain, and name the function that should have caught it.
- For each action involved, name its action class (Chapter 4), what could be undone, who could stop it, and the ceiling your own delegation profile would give it.
- Apply the three observer tests and write pass, fail or not stated for each.
- State what was tested, at what scale, when and with what result; where the report is silent, write not stated.
- For each condition, find the nearest record you hold (a runbook manifest, an observer manifest, a register row) and write present, absent or untested, with its date.
- Record any pattern found as an
AP-*record with an owner, a control, a decision and a re-test date.
Definition of done. Each condition has a function, a test result and an owner; each pattern found has a record and a re-test date within the next quarter; the review is in version control; and no entry names an individual as a cause. Run it once a year for the standing catalogue and after any incident of the class, adapting the cadence to the supervisor's expectations and the works agreement.
Worked example: anti-pattern records (illustrative)
The records live in the operations repository at operations/anti-patterns/. The first is Hansa Mutual's record of the skipped first ring and the second Nordvik Region's record of the claim at the wrong scale. The facts are those of the baseline incidents and of Chapter 19; the decisions and the review dates are illustrative.
anti_pattern:
id: AP-HM-OPS-05
name: first ring skipped
organisation: Hansa Mutual
functions: [O3 Change]
status: mitigated # open | mitigated | closed
decision: AIDR-0985
recorded: 2029-03-13 # illustrative
pattern: >
A change that alters runtime behaviour was classed as standard and
went to production without passing the first ring.
evidence:
incident: INC-HM-2027-0833 # 2027-09-30, AI gateway routing push
effect: "claims assistant broken in four markets for 47 minutes"
problem: PRB-HM-0019
public_analogues: [CrowdStrike 2024, Google Cloud 2025, Cloudflare 2025]
control:
rule: "every runtime-changing push passes at least the first ring"
stop_conditions: "held by the verifier; the releasing identity cannot edit"
seeded_fault: "quarterly faulty change to the first ring on a test tenant"
owner: head-of-site-reliability
retest:
due: 2029-06-30
closes_on: "seeded change halted by the verifier within target, twice"
anti_pattern:
id: AP-NR-OPS-03
name: claim at the wrong scale
organisation: Nordvik Region
functions: [O5 Sustain, O4 Restore]
status: open
decision: AIDR-0935
recorded: 2029-03-06 # illustrative
pattern: >
A recoverability claim was reported as met although its last test failed
and its corrective actions were closed without a re-test.
evidence:
test: RST-NR-2027-002 # 2027-10-12, portal failover, 5 h 20 min against 2 h
cause: "DNS time-to-live and unrenewed certificate at the recovery site"
problem: PRB-NR-0007 # failover 3 h 40 min against 2 h
retest_run: false
public_analogues: [GitLab 2017, Atlassian 2022, OVHcloud 2021]
control:
register_row: "scope, scale, named copy, measured time, date, expiry"
closure: "implemented-unverified until a re-test passes"
calendar: "failover tested within 30 days before each election and tax season"
owner: head-of-it-and-digitalisation
retest:
due: 2029-06-30
closes_on: "portal failover within 2 hours with the recovery site's DNS and certificate unchanged"
Hansa Mutual's AP-HM-OPS-01 to -05 and Nordvik Region's AP-NR-OPS-01 to -03 follow the same schema.
Applying the chapter
Across the usage modes
Each pattern is concentrated at some usage modes and delegation levels, so the delegation profile is the first document to read in a review of the loop.
| Anti-pattern | Where it is most likely | Why |
|---|---|---|
| 1 Green dashboard | Mode 0 and Mode 2 summaries inside the observability product | A summary of the last values reads as health |
| 2 Self-healing mask | Mode 5 runbook runner at Level 3; provider-side remediation (Mode 0) | The agent is measured by the absence of alerts; the provider's rule is unknown |
| 3 Shared-blind-spot verifier | Mode 3 and Mode 4 drafting of runbooks and verification clauses | One model family authors action and check |
| 4 Unowned runbook | Mode 4 retrieval over runbooks; Mode 5 execution | Retrieval and execution make stale text fast |
| 5 God credential | Mode 5 agents; platform automation accounts | Broad standing identity |
| 6 Dead-man's switch | All modes | The alarm path shares the platform |
| 7 First ring skipped | Mode 3 drafting of change; Mode 5 application of standard change | Speed of authorship exceeds speed of review |
| 8 Claim at the wrong scale | Mode 4 assistants that summarise the register | A summary hides scale and age |
Observable, expected, speculation
The public cases are observable, each described only as far as its source goes. That each of the eight patterns has an analogue in a public report or in the baseline records of the two organisations is observable. That agents which author change and run remediation will make the skipped ring and the shared blind spot more frequent is expected, because the cases show automation as the carrier of the small trigger and the speed of authorship rises with delegation; no source cited here measures the effect on an operations loop. That a loop closed by machines alone could avoid all eight without an independent observer, a stop path outside its platform and a register with evidence age is speculation, which Chapters 17 and 27 weigh.
Nordvik Region and Hansa Mutual
Each case can be replayed against the two organisations to ask what each would have done. The replay uses only facts that the profile and the earlier chapters establish.
| Case | Nordvik Region | Hansa Mutual |
|---|---|---|
| CrowdStrike, Cloudflare, Google Cloud | Vendor-pushed change reaches it through the SaaS suite, the hosting provider and TriageSoft (INC-NR-2026-0214: a release changed a queue setting, and the contract had no release notice period) |
Its own configuration pushes are the exposure (INC-HM-2027-0833) and the first ring is the control |
| Meta, AWS | No hyperscaler tenancy for production; a shared dependency instead: DNS, identity federation and the recovery site at SamDrift | Cloud A and Cloud B and a Frankfurt data centre; the stop drill of HM-OPS-001 took 17 minutes against 5 |
| Knight | The pipeline's automation account had administrator rights (AP-NR-OPS-01) |
An agent with write access to production, held to Level 2 for rollback and Level 1 for restore-overwrite |
| GitLab, Atlassian, OVHcloud | One restore passed and aged (RST-NR-2027-001); the failover failed (RST-NR-2027-002) |
The claims core restore failed on time (RST-HM-2027-004, 5 hours 40 minutes against 4); the payments failover passed |
| Agents beyond scope | No Mode 5 agent; the operations assistant NR-OPS-001 is read-only |
A Mode 5 agent with a policy decision point that refused a restore-over in the near miss INC-HM-2029-0031 |
Nordvik Region reads the cases as a list of dependencies it does not own and claims it cannot yet prove. Its records are the god credential (AP-NR-OPS-01), the observer that arrived after the provider's status page (AP-NR-OPS-02) and the failover claim without a re-test (AP-NR-OPS-03). AIDR-0935 (2029-03-06) adopts the review of this chapter's practical guide annually and after any incident, as a half-day chaired by the platform lead, Maja Lindqvist, with an outside reader from internal audit and the duty manager, Oskar Berg, holding the stop of any exercise. Seven platform engineers cannot run eight checks every quarter, so the re-tests of the three records are the quarterly work, due on 2029-04-30 (AP-NR-OPS-02), 2029-05-07 (AP-NR-OPS-01, the expiry of the break-glass result) and 2029-06-30 (AP-NR-OPS-03). The agreement MBL-NR-IT-2027-01 applies: no result is reported by name.
Hansa Mutual reads the cases as a description of what its pipeline and its agent do at scale. Its five records are the dashboard that went blind, the alert silenced by the agent, the verification clause that read the endpoint the restart resets, the out-of-date runbook and the skipped ring (AP-HM-OPS-01 to -05). AIDR-0985 (2029-03-13) adopts the review and the closure rule for the five, each with a re-test date within the next quarter, and the head of operational resilience reads the evidence independently of Group Site Reliability and Incident Management under Tobias Richter. The annex KBV-IT-2024-OPS-02 applies: results are reported for teams and services, with a minimum group size of five. Nordvik's risk is the claim it cannot yet show and Hansa's is the loop that runs without anyone questioning it.
Summary
This chapter read eleven public cases by mechanism with four lenses: the function, the action class and its autonomy budget, the observer principle and the evidence. It concerns all five functions: O1 Observe, O2 Diagnose, O3 Change, O4 Restore and O5 Sustain. In the change cases of CrowdStrike, Meta and Knight Capital the exposure was the whole population before anything independent had judged the effect, and the stop or rollback ran through the failed system or enlarged the fault. In the recovery cases of GitLab, Atlassian and OVHcloud a claim of recoverability failed at a dimension it never named: a client version, a scale, a location. In the provider outages of Google Cloud, Cloudflare and AWS a small trigger travelled by a path built for speed, customers' observers shared the provider's domain, and recovery automation prolonged the outage.
Eight anti-patterns follow, each with a record and a control built in earlier chapters: the green dashboard, the self-healing mask, the shared-blind-spot verifier, the unowned runbook, the god credential, the dead-man's switch that never fires, the first ring skipped and the claim at the wrong scale. Nordvik Region meets the patterns that come from dependencies it does not own and claims it cannot yet prove, and Hansa Mutual those that come from running an agent and a pipeline at scale. Chapter 29 follows the people of both organisations through a year in which several of these patterns appear and are answered.
Sources
- CrowdStrike (2024). External Technical Root Cause Analysis: Channel File 291, 6 August 2024; and Falcon Content Update Preliminary Post Incident Review, 24 July 2024. (78, CrowdStrike, 2024)
- Janardhan, S. (2021). More details about the October 4 outage. Engineering at Meta, 5 October 2021. (79, Janardhan, 2021)
- U.S. Securities and Exchange Commission (2013). In the Matter of Knight Capital Americas LLC, Release No. 34-70694, 16 October 2013. (80, U.S. Securities and Exchange Commission, 2013)
- GitLab (2017). Postmortem of database outage of January 31. GitLab blog, 10 February 2017. (89, GitLab, 2017)
- Atlassian (2022). Post-Incident Review on the Atlassian April 2022 outage. Atlassian Engineering, 29 April 2022. (266, Atlassian, 2022)
- OVHcloud (2021). Strasbourg datacentre: latest information. OVHcloud corporate newsroom, updated to 23 April 2021. (81, OVHcloud, 2021)
- Claburn, T. (2022). OVHcloud datacenter 'lacked' automatic fire extinguishers, electrical cutoff. The Register, 22 March 2022. (82, Claburn, 2022)
- Clark, L. (2021). OVH outlines three-point 'hyper resilience' plan after Strasbourg fire. The Register, 6 May 2021. (83, Clark, 2021)
- Google Cloud (2025). Multiple GCP products are experiencing Service issues: Incident Report, 12 June 2025. Google Cloud Service Health. (76, Google Cloud, 2025)
- Prince, M. (2025). Cloudflare outage on November 18, 2025. The Cloudflare Blog. (77, Prince, 2025)
- Amazon Web Services (2025). Summary of the Amazon DynamoDB Service Disruption in the Northern Virginia (US-EAST-1) Region. AWS post-event summary, 19-20 October 2025. (75, AWS, 2025)
- Weiss, B. and Furr, M. (2019). Static stability using Availability Zones. Amazon Builders' Library, 5 December 2019. (262, Weiss & Furr, 2019)
- AI Security Institute (2026). Incident Report: unsanctioned agent behaviour during cyber testing. UK AISI, 4 August 2026. (70, UK AISI, 2026)
- OpenAI (2026). OpenAI – Hugging Face Incident Technical Report. 26 August 2026. (86, OpenAI, 2026)
- Lunney, J. & Lueder, S. (2017). Postmortem Culture: Learning from Failure. Chapter 15 in Site Reliability Engineering. O'Reilly Media. (259, Lunney & Lueder, 2017)
- Cook, R. I. (2000). How Complex Systems Fail. University of Chicago. (260, Cook, 2000)
- Bainbridge, L. (1983). Ironies of Automation. Automatica 19(6), 775-779. (217, Bainbridge, 1983)
- Parasuraman, R. & Manzey, D. H. (2010). Complacency and Bias in Human Use of Automation. Human Factors 52(3). (218, Parasuraman & Manzey, 2010)
- Kim, E., Garg, A., Peng, K. & Garg, N. (2025). Correlated Errors in Large Language Models. ICML 2025. (103, Kim et al., 2025)
- European Parliament and Council of the European Union. Regulation (EU) 2022/2554 (DORA). (2, European Union, 2022)
- Nordqvist, G. (2026). AI Threat. The Transformed Architecture, Book 5. (299, Nordqvist, 2026)
- Nordqvist, G. (2026). AI Purple. The Transformed Architecture, Book 9. (304, Nordqvist, 2026)