Telstra’s Time Sync Outage, DoorDash’s 1.5M RPS Cache, Stateless MCP, GitHub and PyPI Supply Chain Delays, and Why the Quietest Infrastructure Often Has the Biggest Blast Radius
Try reloading the player or open this episode directly on YouTube.
This episode discusses Telstra's significant outage caused by a timing device malfunction and explores DoorDash's innovative caching strategies for high request volumes.
Now Playing
Telstra’s Time Sync Outage, DoorDash’s 1.5M RPS Cache, Stateless MCP, GitHub and PyPI Supply Chain Delays, and Why the Quietest Infrastructure Often Has the Biggest Blast Radius
Ship It Weekly
0:0016:57
Chapters
Jump to a section in this episode.
Speed & share
Transcript
DoorDash turned a cache into a reliability layer
handling more than one and a half million requests per
second. MCP is removing protocol-level sessions
so servers can scale more like ordinary HTTP
services. And GitHub and PyPI are deliberately
slowing package automation, because sometimes
waiting is the safer default. This week is about
the quiet systems underneath the system: time,
cache behavior, state, and dependency policy.
Most people never notice them when they work.
But when the assumptions around them are wrong,
they can decide how the whole platform behaves.
I’m Brian Teller from Teller’s Tech, and this
is Ship It Weekly. Welcome back to Ship It Weekly,
the show about the DevOps, SRE, cloud, platform,
and security stories that matter when you are
the person keeping the thing running at 3 a.m.
For the weekly story list and source links, check
out OnCallBrief.com. For show notes and past
episodes, head over to ShipItWeekly.fm. This
week: Telstra’s time synchronization outage,
DoorDash’s transparent Envoy and Valkey cache,
the stateless MCP specification release candidate,
Time synchronization. Cache policy. Protocol state. Dependency automation.
None of those usually gets much attention when everything is working. They sit underneath the visible system, carrying assumptions that other services depend on without constantly questioning them.
The timestamp is probably right.
The cached response is probably safe.
The next request will probably reach the same place.
The newest package is probably the one we should install.
Most of the time, those assumptions hold. Then one of them stops holding, and something that looked like a small implementation detail suddenly decides how the entire platform behaves.
Telstra’s outage is the clearest example.
A network timing device restarted with the wrong date and began distributing time from 2006. The device was online. It was responding. It looked authoritative.
It was also wrong by almost twenty years.
That distinction matters because a lot of monitoring is still built around availability. Is the device reachable? Is the process running? Did the service return a response?
Those are useful questions, but they are not enough when the thing being returned can be wrong in a way that damages every system trusting it.
A healthy connection to a bad source is not health.
Accurate time sits underneath authentication, certificates, distributed databases, logs, telecom infrastructure, and incident reconstruction. If systems disagree about time, they may reject valid credentials, trust expired credentials, misorder events, or produce logs that are almost impossible to reason about.
The failure was not that the network had no time source. The failure was that it trusted an impossible answer.
That is a different kind of reliability problem.
Sometimes the safest response to a dependency is not to retry it. Sometimes the safest response is to reject what it told you.
A timestamp jumping backward almost twenty years should trigger suspicion before propagation. There should be limits on how much a trusted clock can move. There should be independent sources that do not all inherit the same design flaw. There should be holdover behavior for the moment when the authoritative source is available but obviously wrong.
And after maintenance, validation has to test the service the hardware provides, not just whether the hardware powered back on.
A green light on the chassis is not a correct timestamp.
This is what makes old infrastructure dangerous in a very specific way. It can work for so long that the absence of failure starts being treated as evidence that the design is understood.
But sometimes it only means the hidden condition has not been exercised lately.
Documentation drifts. Updates get postponed. The people who knew why something worked move on. Then a routine restart becomes the moment when an old assumption finally becomes active.
DoorDash’s Entity Cache story comes at the same theme from the opposite direction.
Instead of one quiet dependency creating an outage, DoorDash deliberately built a quiet layer to prevent upstream failures from spreading.
At first glance, this looks like a performance story. Envoy intercepts requests. Valkey stores responses. Cache hits reduce database work and network calls. DoorDash gets lower latency and fewer requests reaching backend services.
That is useful, but it is not the most interesting part.
The more interesting part is that DoorDash gave the cache explicit reliability behavior.
A soft expiration says when the data should normally refresh. A hard expiration says how stale it may become before the platform must stop serving it. If the upstream service is unavailable, the cache may continue serving acceptable stale data rather than turning one dependency failure into a wider outage.
That sounds simple until you ask what “acceptable” means.
A slightly old menu description may be fine. An old permission decision may not be. A stale inventory count may create overselling. A stale account balance may create something much worse.
The cache cannot decide that for you.
Someone has to define the business and operational meaning of stale data. Someone has to own the time limits. Someone has to decide whether availability or freshness wins when the upstream is failing.
That is why a cache is not automatically resilience.
A cache without clear policy can make an incident harder to see. It can continue returning successful responses while the data becomes increasingly wrong. It can hide a failing dependency until the hard expiration arrives and everything fails at once.
DoorDash’s design becomes a reliability layer because it includes correctness checks, event-driven invalidation, divergence measurement, fallback behavior, early refresh, and stampede protection.
The cache has a failure mode.
The upstream has a failure mode.
And the platform has a policy for moving between them.
That is the important part.
Resilience is not the presence of a cache. Resilience is knowing what the cache is allowed to do while everything around it is unhealthy.
The MCP story is also about making a hidden assumption explicit.
Earlier versions of the protocol carried session behavior that created operational coupling. A later request might need to reach the same server instance or rely on shared session state.
That works easily in a local demo. It becomes more interesting once the service is running behind a load balancer, replacing instances, scaling horizontally, and handling retries.
The new release candidate removes that protocol-level session requirement. Requests can land on any healthy server, which makes MCP infrastructure behave more like ordinary HTTP services.
That is a good change because boring systems are usually easier to operate.
But stateless protocol does not mean stateless application.
The state still exists somewhere.
A browser tool may need a browser identifier. A long-running operation may need a task handle. An agent may need context that survives across requests. The improvement is that the state becomes explicit instead of hiding inside connection behavior or load-balancer affinity.
That gives operators something they can see, route, trace, expire, and debug.
And that matters because MCP is moving quickly from experimentation into platform infrastructure.
Once agents depend on an MCP server, it needs the same things every other production service needs: authentication, rate limits, tracing, deployment compatibility, retries, idempotency, capacity planning, and ownership.
Removing one hidden protocol dependency makes the system easier to scale.
It does not remove the responsibility to understand where state now lives.
The GitHub and PyPI changes are another version of making assumptions visible.
Dependency automation has traditionally optimized for speed.
A new version appears. A bot opens a pull request. Tests pass. The update merges.
That workflow assumes the newest release is probably the best release and that faster adoption is generally safer.
But package-supply-chain incidents have shown the weakness in that assumption.
The first few hours after a release are often when the ecosystem knows the least about it. The artifact exists, but maintainers, researchers, and downstream users have not had much time to discover whether it is malicious, compromised, or simply broken.
Dependabot’s new default cooldown gives that ecosystem a little time to produce a signal before routine updates begin moving automatically.
PyPI’s change protects a different boundary. An old, trusted release can no longer receive new files after 14 days. That closes a path where a compromised publishing token could add a malicious wheel to a version users already considered stable.
Both controls add friction.
And that is okay.
Engineering culture often treats friction as something that should always be removed. Faster builds. Faster deploys. Faster updates. Fewer approvals. Less waiting.
Usually that is directionally correct.
But some delays exist because the system needs time to learn something.
A canary period gives production time to reveal behavior. A package cooldown gives the ecosystem time to reveal compromise. A maintenance window gives operators time to validate the change. A review step gives someone time to question an assumption.
The goal is not zero friction.
The goal is useful friction in the places where uncertainty is still high.
Routine dependency updates and emergency security fixes do not need to use the same lane. A security update can move quickly with focused review. A routine version bump can wait long enough for the ecosystem to discover that something is wrong.
Automation should remove mechanical work.
It should not remove every opportunity for judgment.
The lightning-round stories reinforce the same theme.
ECS Action Logs expose what the orchestrator was doing around a deployment instead of leaving teams to infer it from container behavior.
Network Load Balancer listener rules make IPv4 and IPv6 routing decisions more explicit instead of forcing teams into separate ingress stacks or hidden translation.
Managed Prometheus can now store an enormous number of active series, but capacity does not answer whether the metrics are useful. The platform can retain a billion badly labeled time series. Someone still has to decide whether they should exist.
And PixelSmash is a reminder that quiet dependencies do not always appear in the place you expect to patch them. FFmpeg may be buried inside a media service, thumbnail generator, desktop application, upload pipeline, or container image. Updating the operating-system package may leave the vulnerable bundled copies untouched.
In each case, the visible system tells only part of the story.
The container ran, but what did the orchestrator do?
The load balancer accepted traffic, but where did each protocol go?
The metrics were stored, but did they create understanding?
The system package was patched, but which embedded copies remain?
That leads into the human closer about negative time to detection.
Most reliability metrics are designed around failure after impact begins.
How long did detection take?
How long did recovery take?
How many customers were affected?
Those are important measurements. But they leave out one of the most valuable outcomes in operations: the incident that someone stopped before impact.
An engineer sees a strange signal and pauses the rollout.
Someone notices a clock jump and rejects the source.
A cache serves stale data intentionally while the upstream recovers.
A dependency update waits long enough for the ecosystem to identify a poisoned release.
When those controls work, the result often looks like nothing happened.
There may be no incident record. No recovery time. No dramatic postmortem. The operator who intervened can even look overly cautious because the failure they predicted never became visible.
That creates a strange problem.
Successful prevention can erase the evidence that prevention was necessary.
We are good at celebrating the person who recovers the system quickly. We are less consistent about recognizing the person who quietly stopped the outage from beginning.
But those are both reliability outcomes.
One reduces the impact.
The other prevents the impact from existing.
The common thread through this episode is not that hidden systems are bad. We need them.
We need trusted clocks.
We need caches.
We need protocols.
We need package automation.
We need orchestrators, metrics platforms, load balancers, and media libraries.
The problem begins when their assumptions remain invisible.
What happens when the clock is available but wrong?
What happens when the cache is healthy but stale?
What happens when the protocol is stateless but the application is not?
What happens when automation moves faster than the ecosystem can evaluate the release?
What happens when the dependency exists inside an application nobody remembered to inventory?
Quiet systems are powerful because so much of the platform depends on them without constantly checking their work.
That is also what makes them dangerous.
Good operations makes those assumptions visible.
Good reliability defines what happens when they stop being true.
And good judgment recognizes the shape of failure early enough that recovery is never required.
The systems nobody notices are often the systems making the real decisions.
And the best reliability work is often the reason nothing happened.
📝 Notes
Show Notes
This week on Ship It Weekly: Telstra’s mobile network jumped back to 2006 after a timing device restarted with the wrong date, disrupting calls, data sessions, and hundreds of emergency calls.
DoorDash explains how Entity Cache, built with Envoy and Valkey, handles more than 1.5 million requests per second and uses stale-data policies, invalidation, and fallback behavior as a reliability layer.
The latest MCP release candidate removes protocol-level sessions, making servers easier to scale behind ordinary load balancers while leaving teams responsible for authentication, tracing, retries, rate limits, and application state.
GitHub and PyPI are also adding friction to package automation. Dependabot now delays routine updates by three days, while PyPI blocks new files from releases older than 14 days.
This episode is about quiet systems.
Time synchronization. Cache policy. Protocol state. Dependency automation.
None of those usually gets much attention when everything is working. They sit underneath the visible system, carrying assumptions that other services depend on without constantly questioning them.
The timestamp is probably right.
The cached response is probably safe.
The next request will probably reach the same place.
The newest package is probably the one we should install.
Most of the time, those assumptions hold. Then one of them stops holding, and something that looked like a small implementation detail suddenly decides how the entire platform behaves.
Telstra’s outage is the clearest example.
A network timing device restarted with the wrong date and began distributing time from 2006. The device was online. It was responding. It looked authoritative.
It was also wrong by almost twenty years.
That distinction matters because a lot of monitoring is still built around availability. Is the device reachable? Is the process running? Did the service return a response?
Those are useful questions, but they are not enough when the thing being returned can be wrong in a way that damages every system trusting it.
A healthy connection to a bad source is not health.
Accurate time sits underneath authentication, certificates, distributed databases, logs, telecom infrastructure, and incident reconstruction. If systems disagree about time, they may reject valid credentials, trust expired credentials, misorder events, or produce logs that are almost impossible to reason about.
The failure was not that the network had no time source. The failure was that it trusted an impossible answer.
That is a different kind of reliability problem.
Sometimes the safest response to a dependency is not to retry it. Sometimes the safest response is to reject what it told you.
A timestamp jumping backward almost twenty years should trigger suspicion before propagation. There should be limits on how much a trusted clock can move. There should be independent sources that do not all inherit the same design flaw. There should be holdover behavior for the moment when the authoritative source is available but obviously wrong.
And after maintenance, validation has to test the service the hardware provides, not just whether the hardware powered back on.
A green light on the chassis is not a correct timestamp.
This is what makes old infrastructure dangerous in a very specific way. It can work for so long that the absence of failure starts being treated as evidence that the design is understood.
But sometimes it only means the hidden condition has not been exercised lately.
Documentation drifts. Updates get postponed. The people who knew why something worked move on. Then a routine restart becomes the moment when an old assumption finally becomes active.
DoorDash’s Entity Cache story comes at the same theme from the opposite direction.
Instead of one quiet dependency creating an outage, DoorDash deliberately built a quiet layer to prevent upstream failures from spreading.
At first glance, this looks like a performance story. Envoy intercepts requests. Valkey stores responses. Cache hits reduce database work and network calls. DoorDash gets lower latency and fewer requests reaching backend services.
That is useful, but it is not the most interesting part.
The more interesting part is that DoorDash gave the cache explicit reliability behavior.
A soft expiration says when the data should normally refresh. A hard expiration says how stale it may become before the platform must stop serving it. If the upstream service is unavailable, the cache may continue serving acceptable stale data rather than turning one dependency failure into a wider outage.
That sounds simple until you ask what “acceptable” means.
A slightly old menu description may be fine. An old permission decision may not be. A stale inventory count may create overselling. A stale account balance may create something much worse.
The cache cannot decide that for you.
Someone has to define the business and operational meaning of stale data. Someone has to own the time limits. Someone has to decide whether availability or freshness wins when the upstream is failing.
That is why a cache is not automatically resilience.
A cache without clear policy can make an incident harder to see. It can continue returning successful responses while the data becomes increasingly wrong. It can hide a failing dependency until the hard expiration arrives and everything fails at once.
DoorDash’s design becomes a reliability layer because it includes correctness checks, event-driven invalidation, divergence measurement, fallback behavior, early refresh, and stampede protection.
The cache has a failure mode.
The upstream has a failure mode.
And the platform has a policy for moving between them.
That is the important part.
Resilience is not the presence of a cache. Resilience is knowing what the cache is allowed to do while everything around it is unhealthy.
The MCP story is also about making a hidden assumption explicit.
Earlier versions of the protocol carried session behavior that created operational coupling. A later request might need to reach the same server instance or rely on shared session state.
That works easily in a local demo. It becomes more interesting once the service is running behind a load balancer, replacing instances, scaling horizontally, and handling retries.
The new release candidate removes that protocol-level session requirement. Requests can land on any healthy server, which makes MCP infrastructure behave more like ordinary HTTP services.
That is a good change because boring systems are usually easier to operate.
But stateless protocol does not mean stateless application.
The state still exists somewhere.
A browser tool may need a browser identifier. A long-running operation may need a task handle. An agent may need context that survives across requests. The improvement is that the state becomes explicit instead of hiding inside connection behavior or load-balancer affinity.
That gives operators something they can see, route, trace, expire, and debug.
And that matters because MCP is moving quickly from experimentation into platform infrastructure.
Once agents depend on an MCP server, it needs the same things every other production service needs: authentication, rate limits, tracing, deployment compatibility, retries, idempotency, capacity planning, and ownership.
Removing one hidden protocol dependency makes the system easier to scale.
It does not remove the responsibility to understand where state now lives.
The GitHub and PyPI changes are another version of making assumptions visible.
Dependency automation has traditionally optimized for speed.
A new version appears. A bot opens a pull request. Tests pass. The update merges.
That workflow assumes the newest release is probably the best release and that faster adoption is generally safer.
But package-supply-chain incidents have shown the weakness in that assumption.
The first few hours after a release are often when the ecosystem knows the least about it. The artifact exists, but maintainers, researchers, and downstream users have not had much time to discover whether it is malicious, compromised, or simply broken.
Dependabot’s new default cooldown gives that ecosystem a little time to produce a signal before routine updates begin moving automatically.
PyPI’s change protects a different boundary. An old, trusted release can no longer receive new files after 14 days. That closes a path where a compromised publishing token could add a malicious wheel to a version users already considered stable.
Both controls add friction.
And that is okay.
Engineering culture often treats friction as something that should always be removed. Faster builds. Faster deploys. Faster updates. Fewer approvals. Less waiting.
Usually that is directionally correct.
But some delays exist because the system needs time to learn something.
A canary period gives production time to reveal behavior. A package cooldown gives the ecosystem time to reveal compromise. A maintenance window gives operators time to validate the change. A review step gives someone time to question an assumption.
The goal is not zero friction.
The goal is useful friction in the places where uncertainty is still high.
Routine dependency updates and emergency security fixes do not need to use the same lane. A security update can move quickly with focused review. A routine version bump can wait long enough for the ecosystem to discover that something is wrong.
Automation should remove mechanical work.
It should not remove every opportunity for judgment.
The lightning-round stories reinforce the same theme.
ECS Action Logs expose what the orchestrator was doing around a deployment instead of leaving teams to infer it from container behavior.
Network Load Balancer listener rules make IPv4 and IPv6 routing decisions more explicit instead of forcing teams into separate ingress stacks or hidden translation.
Managed Prometheus can now store an enormous number of active series, but capacity does not answer whether the metrics are useful. The platform can retain a billion badly labeled time series. Someone still has to decide whether they should exist.
And PixelSmash is a reminder that quiet dependencies do not always appear in the place you expect to patch them. FFmpeg may be buried inside a media service, thumbnail generator, desktop application, upload pipeline, or container image. Updating the operating-system package may leave the vulnerable bundled copies untouched.
In each case, the visible system tells only part of the story.
The container ran, but what did the orchestrator do?
The load balancer accepted traffic, but where did each protocol go?
The metrics were stored, but did they create understanding?
The system package was patched, but which embedded copies remain?
That leads into the human closer about negative time to detection.
Most reliability metrics are designed around failure after impact begins.
How long did detection take?
How long did recovery take?
How many customers were affected?
Those are important measurements. But they leave out one of the most valuable outcomes in operations: the incident that someone stopped before impact.
An engineer sees a strange signal and pauses the rollout.
Someone notices a clock jump and rejects the source.
A cache serves stale data intentionally while the upstream recovers.
A dependency update waits long enough for the ecosystem to identify a poisoned release.
When those controls work, the result often looks like nothing happened.
There may be no incident record. No recovery time. No dramatic postmortem. The operator who intervened can even look overly cautious because the failure they predicted never became visible.
That creates a strange problem.
Successful prevention can erase the evidence that prevention was necessary.
We are good at celebrating the person who recovers the system quickly. We are less consistent about recognizing the person who quietly stopped the outage from beginning.
But those are both reliability outcomes.
One reduces the impact.
The other prevents the impact from existing.
The common thread through this episode is not that hidden systems are bad. We need them.
We need trusted clocks.
We need caches.
We need protocols.
We need package automation.
We need orchestrators, metrics platforms, load balancers, and media libraries.
The problem begins when their assumptions remain invisible.
What happens when the clock is available but wrong?
What happens when the cache is healthy but stale?
What happens when the protocol is stateless but the application is not?
What happens when automation moves faster than the ecosystem can evaluate the release?
What happens when the dependency exists inside an application nobody remembered to inventory?
Quiet systems are powerful because so much of the platform depends on them without constantly checking their work.
That is also what makes them dangerous.
Good operations makes those assumptions visible.
Good reliability defines what happens when they stop being true.
And good judgment recognizes the shape of failure early enough that recovery is never required.
The systems nobody notices are often the systems making the real decisions.
And the best reliability work is often the reason nothing happened.