CUSTOMER CASE STUDY · ANONYMIZEDENTERPRISE AI PLATFORM · KUBERNETES ON AWS

57 hours without Dalton. Minutes with it.

A routine upgrade left an enterprise platform team’s storage service one restart from a full outage. For roughly 57 hours, three teams passed evidence across three tools and got no closer to a cause. Then they connected Dalton to the failing cluster - it was already integrated with another one, so this was a small config change. Minutes later the team had the root cause and a fix to review. They shipped it and closed the incident.

Incident clockJun 14 → Jun 16 · 2026
~57 hrsThree teams · three tools · no cause
MinutesRoot cause · evidence · fix PR
Industry
Enterprise AI / cloud platform
Environment
Kubernetes on AWS · object storage, managed Postgres
Classification
Public · all identifiers removed · June 2026
● 01   THE PROBLEMHOURS 0–57

A routine upgrade, wedged for 57 hours.

The customer runs a large Kubernetes estate on AWS. One of their services is a user-facing storage layer that holds customer data, and it was in the middle of a routine version upgrade.

The upgrade included a one-time data migration, and the migration stalled partway through. The new version will not serve traffic until that migration is marked complete, so the new pods crash-looped, and the old version would not start against a schema that had already moved on. That left a single un-upgraded pod holding up all of production.

57 hours of back and forth

The evidence that could explain the stall was all there. It just sat in three places: the live cluster state with the platform team, the logs with operations, and the code with engineering. No one could see all three at once, so the incident moved through tickets, threads, screenshots, and calls. Each theory took hours to check and led nowhere. A logging bug made it worse: every failed copy came through as <nil>, so the logs said nothing useful.

This went on for roughly 57 hours. Each handoff cost time, and none of them put all the evidence in one place.

Split three waysHours 0–57
Live cluster stateplatform team
Logsoperations
Source codeengineering
No one could see all three
What was at stake

For those 57 hours, a single pod restart stood between the service and a full outage, and every dashboard still read half-healthy.

● 02   WHAT CHANGEDHOUR 57 · A CONFIG CHANGE, NOT A PROJECT

57 hours in, they connected Dalton.

Dalton was already integrated with another cluster in the customer’s estate. The one that was failing had never been connected - so for 57 hours, Dalton could not see it.

The integration already existed for the other cluster, so connecting the failing one was a configuration change, not a project. From there, Dalton read the same three streams the team had been passing around by hand: the logs, the live cluster state, and the source code.

Minutes later, Dalton found what 57 hours of back and forth had not: the migrator copied each object with a single S3 call, and that call fails for anything over 5 GiB. The migration could not finish, no matter how many times it retried. Dalton backed the claim with evidence anyone on the team could check, and it killed the two theories the team was still chasing. It also laid out the real blast radius, which the dashboards did not show.

Then it proposed a fix, a multipart copy path for large objects, and opened it as a pull request. The engineers did not have to find the fix or write it. They read the diff, approved it, and re-ran the migration to completion.

Read togetherOne surface · hour 57
Live cluster stateplatform team
Logsoperations
Source codeengineering
One chain of causes
The finding

Every object was copied with a single server-side CopyObject call. S3 rejects that call for any source over 5 GiB, and the migrator had no size check and no multipart fallback - so the copy failed permanently, every pass.

S3Copier.CopyObject → InvalidRequest
source > 5,368,709,120 bytes (5 GiB)

Nothing about the incident changed between hour one and hour 57. The same logs, cluster state, and code were there the whole time, split across three teams. What changed on day three is that Dalton read them together.

“The insights that took us hours to find and pass between teams, Dalton located and correlated in minutes. It worked the failure with us, inside our normal workflow.”- Platform Engineering Lead · Enterprise AI Platform
● 03   EXHIBITREDACTED · ANALYSIS UNCHANGED

The investigation.

These screenshots come straight from Dalton’s investigation surface. We redacted the sensitive fields and left the analysis unchanged. Dalton anchored the case to when the failure began, not to when it got access.

Figure 01The case overviewDalton · investigation surfaceScroll to read →
Dalton case overview showing a CRITICAL CrashLoopBackOff investigation during a v7.1.0 rollout, marked resolved, with tabs for what happened, why, evidence, impact and fix, and a one-paragraph summary of the stalled data migration.
Severity, status, and a one-read summary. The case is anchored to when the failure began - Jun 14 - not to when Dalton was connected.
Figure 02Root cause, confidence, and what was ruled outDalton · written diagnosisScroll to read →
Dalton's written diagnosis naming the S3 CopyObject 5 GiB limit as the root cause, a why-we're-confident list with three of four criteria verified against Kubernetes and GitHub sources, and two ruled-out alternative theories.
The diagnosis in prose, the verified criteria behind it - proof, not a score - and the two theories the team was still chasing, eliminated.
● 04   EXHIBITEVERY CLAIM LINKED TO A LINE

Evidence anyone on the team can check.

The signals behind this verdict sat in three separate systems - the same three the team had spent 57 hours passing between each other. Dalton pulls them into a single chain of causes, with each claim linked to the exact log or code line behind it, so anyone on the team can check every step.

Figure 03The exact log and code linesDalton · evidence chainScroll to read →
Dalton's evidence list: eight linked findings from Kubernetes and GitHub, each with the exact log line or source line highlighted in place - the crash-loop gate, the down-migration guard, the empty marker table, the migrator job hook, and the single-call S3 CopyObject.
Eight signals from two systems, each with the line highlighted in place - so the proof does not require digging through raw logs or code.
● 05   RESULTS~57 HRS → MINUTES · SAME INCIDENT

What the team got back.

One incident, measured both ways: roughly 57 hours as a manual cross-team investigation, then minutes once Dalton was connected. The before and after come from the same incident, not from an industry benchmark.

Root cause in minutes, on hour 57.

The problem was no easier on day three than on day one. The difference was that the logs, the cluster state, and the code were finally read together.

From suggestion to a shipped fix.

The missing multipart copy path arrived as a pull request with the evidence behind it. Engineers reviewed a diff instead of writing one. The rest was a supervised migration re-run.

The back and forth ended.

Platform, operations, and engineering stopped passing tickets and threads once the evidence sat in one place. Most of the team went back to building the product.

The real severity showed up.

The dashboards said half-healthy. Dalton said one restart from a full outage, which is the number the team needed to triage on.

Connecting Dalton was cheap.

It was already integrated with another cluster, so adding the failing one was a configuration change. It paid for itself on the same incident, within the hour.

One place for the whole incident.

The team discussed, investigated, and fixed the incident on the same surface, and their knowledge of the system combined with what Dalton found.

● 06   ROITHIS INCIDENT · NOT AN INDUSTRY AVERAGE

What this incident cost, with and without Dalton.

ROI tables usually lean on industry averages. This one uses the incident itself: ~57 hours before Dalton was connected, minutes after.

One incident, both ways. Every figure below was observed on this incident.
Cost driverWithout DaltonHours 0–57 · observedWith DaltonAfter connection · observed
Time to see and confirm the problemWithout Dalton~57 hours. Evidence sat in three teams and three tools, failed copies logged as <nil>, and each theory took hours to check and led nowhere.With DaltonMinutes. Dalton read the logs, cluster state, and source code together, showed the stall’s real severity, and ruled out the remaining theories.
Fix effortWithout DaltonNever started. After 57 hours there was still no confirmed cause to write a fix against.With DaltonReview and ship. Dalton proposed the fix as a pull request; the team read the diff, approved it, and shipped it.
People pulled inWithout DaltonThree teams plus management. Platform, ops, and engineering, plus the managers coordinating them, for the duration.With DaltonOn-call plus a reviewer. Management involvement drops to status checks.
Exposure windowWithout Dalton~57 hours spent one pod restart from a full outage of a customer-data service, invisible on dashboards.With DaltonBounded within the hour. Dalton identified and sized the failure; after that it was the migration re-running.
Customer-facing costWithout Dalton57 hours of SLA burn. Error budget drains, converts to credits once thresholds slip, and customers see degradation before it is explained.With DaltonContained and explainable. Exposure bounded; the customer hears a confirmed cause and a plan, not “still investigating”.
● 07   THE COST MODELTHIS INCIDENT’S HOURS · YOUR RATES

Run the same arithmetic on your own numbers.

Incident costThree terms
incident cost = engineer-hours (investigation + fix) × loaded hourly cost
              + exposure hours × P(outage) × cost of one hour down
              + customer-facing cost: SLA slips, credits, reputation
Term 1

Engineer-hours

Before Dalton: three engineers at roughly 50% engagement across the ~57-hour window comes to about 85 engineer-hours of investigation. Those hours were spent, not modelled. After connecting Dalton: review of the proposed pull request and a supervised re-run, 2–4 engineer-hours. Net: 80+ engineer-hours returned on one incident.

Term 2

Exposure

Usually the largest term. At your hourly outage cost, even a low restart probability over 57 hours costs more than the engineering time - and for those 57 hours a single pod restart was the only thing between the service and a full outage.

Term 3

Customer-facing cost

This one comes from your SLA terms. Reputation has no line item, which is why it is the easiest cost to undercount.

The engineer-hours come from this incident. Loaded hourly cost, outage cost per hour, and SLA terms are yours. A Dalton POC runs on real incidents in your environment - and this one shows you can connect Dalton in the middle of one.

Run Dalton on your next incident.

A 15-minute walkthrough in your stack - then a POC on real incidents.

Book a demo