Summary
- Cloudflare says a database access-control change deployed at 11:05 UTC changed the output of a ClickHouse metadata query that did not filter by database name.
- The changed query returned duplicate column metadata while explicit grants were being rolled through the database cluster. A Bot Management feature file built from that output doubled in size.
- Software consuming the file imposed a size limit. Cloudflare's postmortem shows an error path using
unwrap(), which produced a panic and HTTP 5xx failures in the core proxy path. - The file was generated every five minutes. Because only some database nodes had the changed permissions at a given time, successive generations could alternate between valid and invalid files. That produced intermittent recovery and initially resembled a large attack.
- Cloudflare's postmortem introduction says failures began at 11:20 UTC, while its detailed timeline records first customer HTTP errors at 11:28. Both representations should remain visible.
- Core CDN and security services, Workers KV, Access, Turnstile, dashboard login and parts of email-security behavior were affected in different ways. The evidence does not support saying every service or customer was fully unavailable.
- OpenAI reported web access errors during the overlapping period, while its mobile applications, APIs and backend services remained healthy. That distinction shows how one dependency can fail selectively across product surfaces.
- Cloudflare's immediate actions included treating generated configuration as untrusted input, adding kill switches and reviewing module failure behavior. Its later Code Orange program addressed controlled configuration rollout, interface contracts and break-glass dependencies.
- A separate Cloudflare outage on 5 December involved another global configuration path. It had a different trigger but strengthened the case that configuration deployment deserved controls comparable to software release.
- Accountability follows control over query scope, artifact validation, distribution speed, fallback behavior, interface isolation, observability, rollback, customer communication and proof that announced repairs operate in production.
A permissions change became authority over global traffic
The first important distinction is between where a change originated and where its effects were allowed to travel. Cloudflare's postmortem places the initiating action in a database permissions deployment. That deployment did not directly rewrite packet-processing logic. It changed what a metadata query could see.
The query was used in the generation of a Bot Management feature file. Cloudflare explains that the query did not filter metadata by database name. As explicit grants were deployed, ClickHouse returned column information from underlying tables in a way that introduced duplicate rows. The generator accepted those rows. The resulting feature file was approximately twice its expected size.
An engineer considering only the permissions change could reasonably classify it as a database-control operation. An engineer considering only the feature file could classify it as an internal configuration update. The outage shows why those labels were incomplete. The file was consumed by software across Cloudflare's network, and its contents affected a module operating in the core proxy path. Once distributed, the artifact had the practical power to alter whether customer traffic succeeded.
That is executable operational authority even if the artifact was not a conventional binary. The distinction between "code" and "configuration" is useful for ownership and tooling, but it does not determine risk. Risk follows what an input can cause. A file that can change globally deployed behavior, exhaust a parser limit, select a security action or crash a component should be governed according to that authority.
This framing does not mean every configuration update needs the same ceremony as a major software release. It means the control should be proportionate to blast radius, reversibility and failure behavior. A regional preference with a bounded default does not present the same risk as an artifact distributed worldwide to a module on a traffic path. The November incident demonstrates what happens when a high-authority configuration moves through a path that does not sufficiently constrain malformed or unexpected output.
The responsible unit is therefore not the individual database command. It is the chain. The database team controlled access semantics. The query owner controlled scope and assumptions. The generator owner controlled schema, cardinality and size validation. The distribution system controlled rollout speed and reach. The consuming module controlled error handling. Product teams controlled interface dependencies. Incident teams controlled diagnosis, bypass and recovery. Executive and reliability leadership controlled which of those systems received release-grade investment before the event.
Accountability becomes clearer when it follows those control surfaces. It becomes less accurate when it is compressed into "human error" or assigned only to the person who approved the permissions change.
Reconstructing the direct causal chain
Cloudflare's account supports a six-part sequence.
First, a change to database access control began at 11:05 UTC. Cloudflare was moving toward explicit permissions for database access. That change altered the metadata visible to a query used by the Bot Management feature-file generator.
Second, the query did not include the database name as a filter. In the changed permissions state, metadata from underlying tables appeared in the result set. Duplicate column rows were returned. The important point is not merely that the database produced more rows. The downstream generator relied on an implicit assumption about the uniqueness and size of those rows.
Third, the generator incorporated the duplicate rows into the feature file. A robust contract at this boundary could have checked that expected keys were unique, the schema was valid, cardinality remained within a learned or declared range, and the finished artifact stayed below an operational maximum. Cloudflare's postmortem shows that the unexpected output instead became a distributable file.
Fourth, the file propagated through Cloudflare's network. Distribution converted a local data-quality error into a global operational event. The speed and reach of that distribution were not incidental. They determined the blast radius before engineers had enough evidence to identify the source.
Fifth, software consuming the file enforced a size limit. A limit is usually a protective control. In this case, the handling of the exceeded limit was decisive. Cloudflare's example identifies a Rust error path that called unwrap(). Rather than retaining a known-good file, rejecting only the new artifact or degrading the affected classification function, the consumer panicked.
Sixth, the failure occurred in a path shared by core traffic and dependent services. HTTP 5xx responses appeared across Cloudflare's network. Products that depended on the core proxy or on services behind it experienced their own failure modes.
The sequence separates three concepts that incident summaries often merge. The triggering event was the database access-control deployment. The direct failure mechanism was an oversized generated feature file causing a panic in its consumer. The root control failure was the absence of effective barriers between changed query semantics, artifact generation, global distribution and unsafe consumption.
Contributing conditions included the query's incomplete scope, the lack of sufficient input validation, the file's global rollout path, the consumer's failure semantics and the product dependencies attached to the affected path. Detection and diagnosis were complicated by alternating good and bad artifacts. Recovery required more than reverting a database permission: engineers needed to stop new file propagation and restore a known-good configuration while managing dependent services.
This decomposition matters because each category implies a different repair. Reverting the initiating change can end one event. Fixing the query can prevent the same duplicate-row mechanism. Adding schema and size validation can stop a wider class of malformed artifacts. Staged deployment can limit exposure. Safe fallback can prevent a rejected artifact from taking down unrelated traffic. Better dependency isolation can keep one product module from becoming a shared failure point.
An organisation that records only "permissions change caused outage" may repair the trigger and leave the system vulnerable to a different oversized or malformed artifact. An organisation that records only "file too large" may increase a limit while preserving unsafe global propagation. The value of a causal chain is that it prevents a narrow fix from being mistaken for a durable one.
Why the symptoms oscillated
The feature file was generated every five minutes. Cloudflare says the access-control change did not reach every ClickHouse node at the same instant. During that transition, a generation job could receive output from a node with the new grants or from one that had not yet changed.
That meant the input was not consistently bad. One generation could produce the enlarged feature file. The next could produce a valid file. Network behavior could therefore appear to recover and then fail again as successive artifacts propagated.
This matters for both engineering and accountability. Intermittent symptoms can point responders toward demand spikes, attacks, network instability or an external dependency. Cloudflare says its teams initially suspected a hyper-scale distributed denial-of-service attack. That was a working diagnosis, not evidence that an attack occurred. The company ultimately identified an internal configuration chain.
The initial suspicion was understandable given the scale and pattern, but the delay also reveals an observability question. Could responders quickly see which version and hash of the feature file each location had loaded? Could they correlate changes in file cardinality and size with HTTP error rates? Did the generator expose which database node supplied each result? Could an operational view distinguish a traffic surge from a core proxy panic?
Observability is often assessed by asking whether an alert fired. Cloudflare's detailed timeline records automated detection quickly after customer errors. The harder test is whether the evidence pointed to the failing control. An alert that says error rates are high can establish urgency without reducing the search space. A high-authority configuration system needs provenance, distribution and activation telemetry sufficient to answer what changed, where it changed, which version is active and whether behavior differs by version.
Oscillation also weakens simple rollback assumptions. If valid and invalid files alternate, a momentary improvement can be mistaken for successful remediation. Recovery should be tied to a known artifact, stopped generation, controlled distribution and sustained metrics, not only to a temporary fall in errors.
The incident therefore offers a general lesson for partially deployed control changes. Mixed-state systems can create non-monotonic evidence. A responsible rollout design assumes that old and new states will coexist and tests whether queries, generators and consumers remain correct during that period. If coexistence changes semantics, the rollout plan must constrain sequencing or add compatibility logic.
The timeline and the evidence gaps inside it
Cloudflare's postmortem presents two opening times. Its introductory account says the network began experiencing significant failures at 11:20 UTC. The detailed timeline records the database access-control deployment at 11:05 and the first customer HTTP errors at 11:28. These statements do not need to be forced into a false single timestamp. They may reflect different telemetry or levels of aggregation. A careful reconstruction preserves both.
At 11:31, according to the detailed timeline, automated testing detected the problem. Manual investigation began at 11:32. An incident call was created at 11:35. This sequence indicates that detection and formal coordination followed quickly once customer errors appeared.
The difficult period came after detection. Intermittent recovery and the apparent scale led responders toward an attack hypothesis. Meanwhile, the bad artifact continued to affect services. The difference between detecting failure and identifying the causal configuration is a central measure of response capability.
At approximately 13:05, Cloudflare implemented bypasses for Workers KV and Access. Those actions show that product-specific mitigation was possible even before the global root cause had been fully removed. The bypasses also reveal dependency boundaries: restoring one gateway or authentication path could reduce impact without repairing every affected component.
Work then focused on returning Bot Management to a last-known-good feature file. At 14:24, Cloudflare stopped generation and propagation of new files and completed testing of the replacement. Main impact was resolved at 14:30. Cloudflare continued downstream recovery and reported all services resolved at 17:06.
There are several accountable intervals in this timeline.
The first is from 11:05 to the first observed failures. That is the propagation interval in which pre-deployment validation or staged exposure could have prevented a global event.
The second is from the first failures to automated detection. That interval appears short, although the different 11:20 and 11:28 representations prevent false precision.
The third is from detection to a correct causal diagnosis. The public record describes the mistaken attack hypothesis and the alternating artifacts, but it does not expose every internal decision or investigative branch. That uncertainty should remain visible.
The fourth is from diagnosis to global containment. Stopping file generation and restoring a known-good artifact were the decisive actions. Product bypasses reduced harm earlier.
The fifth is from main recovery at 14:30 to full resolution at 17:06. This tail matters because a global platform is not recovered merely when the primary error rate falls. Queues, authentication sessions, dependent products and customer systems may continue to recover at different speeds.
The timeline does not establish financial losses, contractual penalties or a universal number of affected customers. Cloudflare's status and postmortem evidence establish service behavior and response milestones. Any claim about damages would require separate customer, contract or regulatory evidence.
One incident produced several different product failures
Broad language can obscure how dependency design shaped the impact. Cloudflare's postmortem distinguishes among products rather than saying that every service stopped in the same way.
Core CDN and security services returned HTTP 5xx errors. This was the most direct expression of the proxy-path failure. A malformed security-related input did not remain confined to bot classification. It affected the handling of ordinary traffic.
Workers KV experienced elevated errors because a gateway used the core proxy. The underlying storage concept and the gateway's dependency are different layers. A customer seeing a KV error would not necessarily know that the initiating problem was a Bot Management feature file.
Cloudflare Access experienced widespread authentication failures for users who did not already have active sessions. This distinction matters. Existing sessions and new authentication paths can have different dependencies. A statement that "Access failed" is less informative than identifying which user state and interface failed.
Turnstile failed to load. Because Turnstile can sit inside a login or form flow, its failure can make another service appear unavailable even if that service's backend remains healthy. This is one mechanism by which a shared security dependency creates a larger perceived blast radius.
The Cloudflare dashboard was mostly operational, but many users could not log in. Its login flow depended on Turnstile, and some internal functions relied on Workers KV. The management surface therefore became harder to use at the moment customers needed status and control. That is not only a convenience issue. Access to administrative and diagnostic functions can affect a customer's ability to route around an incident.
Email delivery continued, according to Cloudflare, but the temporary loss of an IP reputation source reduced parts of email-security detection. This is a degraded-control state rather than complete service absence. It raises a different decision: whether continuing delivery with reduced detection is safer than blocking mail or failing the product.
These distinctions show why interface contracts belong in incident governance. Each dependency should specify what happens when an upstream input is unavailable, invalid or stale. The choice may be to retain a known-good value, use a neutral default, deny a risky action, bypass a nonessential classification step or fail the request. There is no universal answer. There must be a deliberate answer.
The product map also helps allocate responsibility. The team that owned the feature file controlled its validity. The core proxy team controlled consumption behavior. Product teams controlled whether their services depended synchronously on the affected path and whether they had bypasses. Platform leadership controlled standards for shared dependencies. Customers controlled some of their own alternate paths, but they could not redesign Cloudflare's internal coupling during the event.
OpenAI shows a selective customer-side boundary
OpenAI's status record provides a primary customer-side view during the overlapping period. OpenAI reported that some users encountered HTTP 403 or 504 errors when accessing its browser-based consumer service, platform.openai.com, Sora.com and openai.com. It attributed the problem to a faulty configuration rollout by an upstream third-party networking provider.
The same record says OpenAI's mobile consumer and Sora applications, API traffic and backend services remained healthy. Recovery began after the provider rolled back the change. OpenAI described the affected period as approximately 3:30 AM to 6:40 AM Pacific time.
This evidence is useful because it prevents two opposite errors. The first would be to treat the Cloudflare event as invisible to downstream customers. OpenAI documented a real web-access impact. The second would be to say that all of OpenAI failed. Its own status record draws an explicit boundary around unaffected applications, APIs and backend services.
The difference likely reflects product paths and dependency choices, but the public evidence does not disclose OpenAI's private network design, contract terms or cost. The record supports saying that web access depended on the affected upstream path while other surfaces did not experience the same failure. It does not support inventing a redundancy architecture or alleging breach of a service-level agreement.
Selective impact is itself a risk signal. A company may believe it has provider diversity because some workloads use different paths, yet users can still perceive a major outage if the public web entry point fails. Conversely, unaffected APIs may allow business customers to continue operating even when browser access is degraded. Dependency assessment should measure critical user journeys, not only count vendors.
OpenAI's experience also illustrates why customer communication should identify surfaces. "We are affected by an upstream provider" is less actionable than specifying web, mobile, API and backend states. A customer deciding whether to switch channels needs that granularity.
Trigger, root cause and contributing conditions
Assigning responsibility requires a vocabulary more precise than "cause."
The triggering event was the deployment of changed database permissions. Without that change at that time, the query would not have produced the same duplicate metadata through this mechanism.
The direct technical cause was the creation and distribution of an oversized Bot Management feature file followed by unsafe handling in the consumer. The doubled file exceeded a limit, and the error path produced a panic.
The root control problem was the ability of an internally generated artifact to cross a global operational boundary without sufficient validation and safe failure behavior. The query, generator, distributor and consumer collectively lacked a barrier capable of stopping the unexpected state before it affected core traffic.
Contributing conditions included the query's missing database-name filter, mixed database states during rollout, frequent file generation, rapid global propagation, the consumer's use of unwrap() on the error path, and dependencies that attached other products to the affected proxy behavior.
The detection problem was not the absence of an alarm. Automated tests detected errors. The more important limitation was causal visibility. Alternating files and attack-like symptoms complicated identification.
The response problem was the time required to move from a broad incident signal to control of the configuration path. Product bypasses at 13:05 reduced some impact, while the definitive containment came when new feature-file generation and propagation stopped and a known-good file was restored.
The recovery problem extended beyond the core proxy. Cloudflare reported main impact resolved at 14:30 but all systems resolved at 17:06. Downstream services needed time to return to normal.
These categories prevent accountability from stopping at the person who changed permissions. That person may have controlled the trigger. They did not necessarily own the query's assumptions, the feature-file schema, the distribution architecture, the panic behavior or the organisation's release standard for configuration.
They also prevent the opposite mistake of treating "the system" as responsible in a way that makes no team accountable. Each control had an owner or should have had one. The investigation should identify who could change the query, who approved the artifact contract, who set rollout policy, who reviewed the consumer error path and who could require a safer design.
Configuration should be governed by consequence
Software organisations often maintain mature binary-release controls while allowing configuration to move through a faster channel. The distinction can be rational. Configuration is frequently used to avoid rebuilding software, respond to threats and change behavior quickly.
Speed becomes dangerous when configuration has broad authority but receives weak validation. The November event shows three properties that should raise the control level.
The first is reach. The feature file was distributed widely across Cloudflare's network.
The second is coupling. The consuming module operated in a path whose failure affected core traffic and dependent products.
The third is fragility. An unexpected increase in file size did not produce a bounded rejection. It produced a panic.
A governance model based on consequence would classify such an artifact as a high-risk release entity. That classification could require a typed schema, uniqueness constraints, cardinality thresholds, maximum-size checks, representative consumer tests, canary deployment, rate-limited propagation, automatic rollback and a last-known-good fallback.
The controls must cover transitions, not only stable states. A database permission rollout can temporarily expose mixed metadata. A schema migration can make old and new readers coexist. A generator can observe partial deployment. Tests that evaluate only the final intended state miss precisely the condition that created the oscillating feature files.
The configuration pipeline should also record provenance. An operator responding to a global event should be able to answer which source query produced an artifact, which database node answered it, which code version generated it, which validations passed, what its size and cardinality were, where it was deployed and which consumers activated it.
This does not imply a slow manual committee for every change. Automation can provide stronger control and remain fast. Schema validation, diff risk scoring, canaries, automatic rollback and signed provenance can make a configuration pipeline both safer and more responsive than a largely invisible global push.
The accountability test is whether the organisation invested in controls proportionate to the authority it gave the artifact. Calling the entity "configuration" is not a defence if it can stop global traffic.
Fail-open and fail-closed are interface decisions
Cloudflare's follow-up analysis gives unusual visibility into a failure-semantics question. If the Bot Management feature file was invalid, the system could have retained a validated prior file or used a neutral classification. If the Bot Management module failed, unrelated traffic could have continued rather than receiving an error from the core proxy path.
That sounds like an argument for fail-open behavior, but the principle needs limits. Security and identity systems sometimes protect resources where allowing access under uncertainty would create unacceptable harm. A failed authorization check may need to deny a request. An unavailable bot score may be able to default to a neutral value. An unavailable optional reputation signal may justify degraded inspection with explicit monitoring. The correct choice depends on the interface and threat model.
The control failure occurs when the behavior is accidental. A panic is not a documented risk decision. It converts an input error into the runtime's default failure outcome. That outcome may be far broader than the product owner intended.
Each high-risk interface should therefore define:
- which inputs are mandatory and which are advisory;
- whether a stale known-good value is acceptable;
- the maximum age of a retained value;
- whether a neutral default increases security or availability risk;
- which requests should be denied under uncertainty;
- how degraded mode is surfaced to operators and customers;
- when a kill switch can disable the dependent feature;
- who has authority to enter and exit that mode; and
- how the chosen behavior is tested.
For Bot Management, the public repair discussion suggests that a neutral classification or retained defaults could have prevented the invalid file from stopping unrelated traffic. That is a concrete lesson from this module. It should not be generalized into a claim that all Cloudflare security functions should fail open.
Good failure semantics also limit hidden degradation. If a system continues without a security signal, operators should know that detection quality has changed. Cloudflare's email-security example illustrates this issue: delivery continued while an IP reputation source was temporarily unavailable. Continuing service can be reasonable, but it creates an accountable obligation to measure and communicate the reduced control.
Blast radius is designed at interfaces
The incident moved through several interfaces: database to query, query to generator, generator to file, file to distributor, distributor to consumer, consumer to core proxy, and proxy to products. Each interface was an opportunity to reduce blast radius.
At the database boundary, the query could have explicitly constrained database identity and validated uniqueness.
At the generator boundary, the system could have rejected duplicate keys, unexpected cardinality or excessive size.
At the distribution boundary, a canary could have exposed the panic in a small population before global propagation.
At the consumer boundary, the module could have rejected the new file while retaining a known-good version.
At the proxy boundary, module failure could have been isolated from ordinary traffic where the security model allowed it.
At the product boundary, Access, Workers KV, Turnstile and management functions could have documented and tested bypass or alternate paths.
The existence of multiple possible barriers is important. Reliable systems should not depend on one perfect team. The database team may fail to predict a query interaction. The generator should still detect abnormal output. The generator may miss it. The canary should still show a consumer failure. The canary may fail. The consumer should still degrade safely.
This defence-in-depth model differs from adding more review to the initiating change. Review is useful, but reviewers cannot anticipate every interaction in a complex global platform. Strong architecture assumes that a defect will pass one boundary and limits what it can do next.
Boards should ask for evidence at these interfaces, not only a statement that an incident action list is complete. Useful evidence includes rejection tests for malformed files, deployment metrics showing canary duration and expansion criteria, automatic rollback exercises, kill-switch drills, and demonstrations that core traffic continues when optional modules fail.
Detection was quick, diagnosis was harder
Cloudflare's timeline indicates that automated testing detected the problem within minutes of the first customer errors in the detailed table. This is a positive control. It means the organisation was not dependent solely on customer tickets.
Yet the incident remained severe because knowing that traffic is failing is not the same as knowing why. The initial DDoS hypothesis and alternating symptoms extended the path to containment.
A stronger diagnostic system would connect change events to service behavior. That includes database access-control deployments, feature-file size and hash changes, distribution status, consumer activation and panic signatures. Correlation does not need to assume every recent change is guilty. It should make change provenance visible enough to test quickly.
The file's five-minute generation cycle could have supplied a natural diagnostic key. If error rates changed with artifact generations, responders could compare good and bad file hashes and work backward to their source queries. Whether Cloudflare had some of this visibility is not fully established by the public record. The point is that a global configuration platform should make such analysis routine.
Diagnostic access must also survive the incident. Cloudflare's later Code Orange discussion includes break-glass access and circular dependencies. A reliability team cannot depend exclusively on the failing platform for authentication, dashboards, deployment control or status communication. Independent paths are expensive, but their value is greatest during a platform-wide event.
The accountability measure for detection should therefore include time to causal isolation, not only time to first alert. An organisation can report excellent alert latency while still lacking the evidence needed to stop propagation.
Immediate fixes and the later Code Orange program
Cloudflare's initial postmortem listed several remediation directions. It said internally generated configuration should be treated like untrusted input. It described work on global kill switches, protection against diagnostic output exhausting resources and review of error handling in core proxy modules.
These actions address different failure classes. Input validation targets malformed or unexpected artifacts. Kill switches provide containment when a feature becomes dangerous. Resource controls prevent troubleshooting data from creating a second failure. Error-handling review searches for other paths where one module can crash broader traffic.
The later "fail small" and Code Orange program broadened the scope. Cloudflare contrasted mature software-binary deployment controls with configuration systems that could change worldwide behavior rapidly. It committed to applying controlled rollout principles to network configuration, reviewing failure modes and interface contracts, and improving break-glass procedures and circular dependencies.
The distinction between immediate and structural repair matters. A patch to the ClickHouse query and a larger file limit could prevent the exact recurrence while leaving other configuration systems exposed. A program that classifies high-authority configuration, stages deployment and tests failure behavior can reduce a wider class of events.
Promises are not proof. A public roadmap establishes management recognition and a stated direction. Evidence of repair requires measurable implementation. For example:
- What percentage of globally effective configuration types now use staged rollout?
- What is the maximum exposure before an automatic stop?
- Which artifact schemas enforce uniqueness, cardinality and size?
- How often have canaries rejected a bad configuration?
- Can each core module be disabled or degraded without restarting the proxy?
- When were last-known-good restoration and kill switches last exercised?
- Which operational tools have independent authentication and network paths?
- What open exceptions remain, who owns them and when do they expire?
The November postmortem and the later program together create an accountability baseline. Cloudflare can be evaluated not only on whether it apologized or published a detailed explanation, but on whether the named control classes became observable practice.
The 5 December outage is comparison evidence, not the same event
On 5 December 2025, Cloudflare experienced another outage tied to a global configuration system. Cloudflare says the change occurred while responding to a React Server Components vulnerability. It propagated in a way that caused errors for a subset representing about 28 percent of HTTP traffic for approximately 25 minutes.
The technical trigger was different from the November ClickHouse and Bot Management chain. The events should not be merged into one root cause. December does, however, strengthen a governance question identified in the Code Orange work: configuration could alter global behavior faster than existing controls could detect and contain a defect.
When two incidents share a control weakness but not a trigger, the repair standard should include both specificity and generality. The organisation must fix each direct mechanism. It must also identify the shared class, such as high-speed global configuration without adequate staged exposure.
The short December duration compared with the November recovery does not make the event irrelevant. It provides an early test of whether the repair program had reached all relevant configuration paths and whether emergency security changes received the same release discipline as ordinary configuration.
The public record alone cannot show which November actions had been completed by 5 December or whether a completed control failed. That would require internal implementation and exception data. The sequence nevertheless gives boards and customers a precise question: which configuration classes were inside the new control boundary by that date, which remained outside it and why?
The September dashboard outage shows the value of separation
Cloudflare's 12 September 2025 dashboard and API incident offers a useful negative comparison. A React useEffect dependency problem generated repeated calls to the Tenant Service while a service deployment was underway. The Tenant Service became overloaded, and authorization-dependent APIs failed.
Cloudflare says the data plane remained separate. Ordinary traffic delivery was not affected in the same way. Users experienced dashboard and API problems, but the failure did not acquire the November incident's core traffic blast radius.
The comparison does not imply that a management-plane outage is minor. Customers may need the dashboard and APIs to respond to threats or route around failures. It shows that architectural separation can constrain consequences even when the control plane has a serious defect.
November crossed a different boundary. A generated security feature file reached software in the core proxy path, and its failure affected traffic itself. The two events therefore illustrate the practical meaning of interface placement. A defect's severity depends not only on the code that failed but on what that code is permitted to stop.
This is why dependency diagrams should include failure authority. A component may be logically described as "Bot Management" while physically operating inside a shared proxy. A dashboard login may depend on Turnstile and Workers KV. Product names do not reveal the full coupling. Operators need tested maps showing which failure can block which user journey.
Customer accountability remains real but asymmetric
Cloudflare customers did not control the ClickHouse query, feature-file generator, global distributor or proxy panic. Primary responsibility for those controls belongs with Cloudflare.
Customers still control how their own services depend on Cloudflare. They can map critical user journeys, separate web and API paths where justified, maintain alternate status and administrative access, decide whether origin access is possible during a provider event, test DNS or traffic failover, and communicate degraded modes.
Those options are not equally practical for every customer. Multi-provider architecture can be expensive and can introduce its own complexity. Security policies may intentionally prevent direct origin access. Stateful sessions, certificates, routing and application behavior may make failover slower than procurement language suggests.
Accountability does not require pretending every customer could eliminate the dependency. It requires that decision-makers know which functions depend on the provider, what alternatives actually work, how long a switch would take and which risks a workaround creates.
OpenAI's differing web and API impact shows why this analysis should be specific. A business using an unaffected API path might continue serving its own users while employees relying on a browser interface encounter errors. Another customer may have all traffic on one path. Provider concentration is not measured by a logo count. It is measured by the paths through which critical work must pass.
Contracts and service credits can allocate some financial consequences, but the public sources reviewed here do not establish particular terms or payouts. A customer should not treat a credit as a resilience control. The operational question remains whether service can continue or recover within its own tolerance.
Communication should expose boundaries and uncertainty
Cloudflare's detailed postmortem is valuable because it identifies the initiating change, query behavior, generated artifact, consumer failure and product-specific effects. That level of detail allows customers to update their dependency and risk models.
Communication still requires careful reading. The difference between 11:20 in the narrative and 11:28 in the detailed timeline should be preserved rather than silently harmonized. The initial attack hypothesis should not be repeated as an actual attack. Product degradation should not be turned into universal unavailability.
Status communication during an event should answer four practical questions:
- Which product surfaces are failing?
- Which surfaces remain healthy?
- What workarounds are safe and available?
- What evidence supports the estimated recovery state?
Customers also need an independent way to receive that information. If the same identity, dashboard or network path used to manage a service is affected, a status page alone may not provide enough operational access. Break-glass paths must be secured, limited and tested, but they must not share every dependency with the system they are meant to recover.
After the event, communication should separate confirmed fact, inference and open question. Cloudflare confirmed the internal configuration chain. It announced repair work. The public record does not, by itself, prove every repair has been implemented across every configuration system. That is the point at which customers and boards should ask for follow-up metrics rather than infer completion from publication.
What evidence would demonstrate durable repair
A durable repair record should be more concrete than a list of completed tickets.
For query and data contracts, Cloudflare should be able to show that generators use explicit database and table identity, reject duplicate keys, validate schema versions and enforce expected cardinality. Tests should include mixed permission states and partial rollouts.
For artifact validation, evidence should include maximum-size checks before distribution, consumer compatibility tests and rejection behavior. A rejected artifact should not replace a known-good one merely because it was produced by an internal system.
For deployment, evidence should show staged exposure. A configuration should move through a small representative population, remain there long enough for meaningful signals and expand only when defined conditions pass. The system should stop or roll back automatically when error rates, panics or artifact anomalies exceed thresholds.
For failure semantics, each core module should have an explicit policy. Tests should demonstrate what happens when inputs are missing, stale, malformed or too large. A safe default should be justified against both security and availability risk.
For dependency isolation, Cloudflare should map which products depend on the core proxy, Workers KV, Turnstile, Access and shared identity paths. Bypasses should be tested before an incident, not invented while customers are failing.
For observability, responders should be able to trace an active artifact to its source query, generator version, validation results, hash, size, rollout cohort and activation time. They should be able to compare a failing cohort with a healthy one quickly.
For incident access, independent authentication, deployment and communication paths should be exercised. Break-glass controls should be available to named responders, protected against abuse and observable after use.
For customer accountability, product documentation should identify meaningful dependency and fallback behavior without disclosing sensitive internal detail. Customers need to know which services may degrade together and what alternate interfaces remain available.
For governance, exceptions should be visible. If a high-authority configuration cannot yet use staged rollout, leadership should know the reason, compensating controls, owner and deadline. Hidden exceptions are where declared programs lose operational force.
The strongest metric is not whether another identical oversized Bot Management file has appeared. It is whether the organisation can show that malformed high-authority configuration is rejected, contained and recoverable across the wider platform.
A board-level accountability checklist
Boards and senior operators do not need to approve individual feature files. They do need evidence that the organisation has governed the authority those files possess.
The first question is inventory: which configuration systems can change global traffic, authentication, security classification, routing or management access?
The second is ownership: who owns the source data, generator, distribution path, consumer and failure policy for each system?
The third is contract strength: are schema, uniqueness, cardinality, size and compatibility constraints machine-enforced?
The fourth is transition safety: do tests cover mixed versions, partial permissions changes, stale inputs and rollback states?
The fifth is staged exposure: can a defective artifact reach the whole network before its effect is measured?
The sixth is fallback: what known-good or neutral state is retained, and when is denial safer than degraded service?
The seventh is isolation: can an optional security or analytics module fail without stopping unrelated traffic?
The eighth is observability: can responders tie errors to the exact artifact and source change in minutes?
The ninth is control access: do responders retain independent status, authentication and rollback paths during a platform incident?
The tenth is customer evidence: are affected and unaffected surfaces communicated precisely enough for customers to act?
The eleventh is repair verification: which Code Orange commitments are implemented, what production metrics demonstrate them and which exceptions remain?
The twelfth is learning across incidents: did the December configuration outage reveal an uncovered class, an incomplete rollout or a failure in a new control?
These questions allocate responsibility without pretending that complex systems can be made defect-free. The objective is to prevent one defect from acquiring unlimited authority.
Accountability follows the power to prevent, contain and recover
Cloudflare's November outage is significant because the causal chain is both technical and organisational. A permissions change altered metadata. Metadata altered a generated file. The file moved globally. A consumer panic converted one module's invalid input into a shared traffic failure. Product dependencies widened the impact. Alternating artifacts complicated diagnosis. Recovery depended on stopping propagation and restoring a known-good state.
No single label captures that chain. It was not an attack. It was more than a bad database command. It was not solved merely by increasing a file limit. It was a failure to govern configuration according to its operational authority.
Cloudflare controlled the internal systems that created and distributed the artifact. Its accountability includes query design, validation, rollout, fallback, isolation, diagnosis, recovery and proof of repair. Customers controlled their own dependency maps and continuity choices, but their control was narrower and downstream.
The most useful outcome is not a promise that this exact incident will never recur. It is evidence that future unexpected inputs will fail smaller. That requires multiple barriers: explicit data contracts, staged distribution, safe consumer behavior, independent recovery access and visible exceptions.
Configuration can be changed faster than software because speed is valuable. Once configuration can also stop global traffic, speed without containment becomes a governance decision. The 18 November failure made that decision visible.
Sources
- https://blog.cloudflare.com/18-november-2025-outage/
- https://blog.cloudflare.com/fail-small-resilience-plan/
- https://blog.cloudflare.com/5-december-2025-outage/
- https://blog.cloudflare.com/deep-dive-into-cloudflares-sept-12-dashboard-and-api-outage/
- https://blog.cloudflare.com/q4-2025-internet-disruption-summary/
- https://status.openai.com/incidents/01KABE2437NJYKBFHT22SD3H92/write-up
- https://status.openai.com/incidents/01KABE2437NJYKBFHT22SD3H92
- https://developers.cloudflare.com/bots/get-started/bot-management/
- https://developers.cloudflare.com/bots/reference/bot-management-variables/
- https://developers.cloudflare.com/kv/concepts/how-kv-works/
- https://developers.cloudflare.com/turnstile/
- https://developers.cloudflare.com/cloudflare-one/access-controls/
- https://developers.cloudflare.com/ruleset-engine/about/
- https://developers.cloudflare.com/workers/versions-and-deployments/
- https://developers.cloudflare.com/workers/versions-and-deployments/gradual-deployments/
- https://developers.cloudflare.com/workers/versions-and-deployments/version-overrides/
- https://developers.cloudflare.com/workers/versions-and-deployments/rollbacks/
- https://developers.cloudflare.com/workers/observability/

