Waymo shipped a flood fix. Then a robotaxi drove into a flood.
On May 21, an unoccupied Waymo robotaxi drove through a flooded street in Atlanta. It got stuck for about an hour.
One week earlier, Waymo had issued a software recall for exactly this problem.
The story in one sentence
Waymo shipped a flood-avoidance fix that relied on National Weather Service alerts as a proxy for water on the road - and when an Atlanta storm outpaced the NWS alert system, the car drove in anyway.
--> // making it invisible to querySelectorAll. // // `data-cfasync="false"` keeps this rescue script executable even when // Rocket Loader is active. It rescues module scripts via two strategies: // 1. Query the DOM for type$="-module" + src (covers case A) // 2. Regex-parse the raw HTML for commented-out script tags (covers case B) // Dynamically-created scripts bypass Rocket Loader entirely. (function () { if (window.__markdyRescue) return; window.__markdyRescue = true; var rescued = false; function rescueModuleScripts() { if (rescued) return; rescued = true; var srcs = []; // Strategy 1: Rocket Loader kept the tag in DOM but changed the type. // type="module" → type="{uuid}-module" (still has src attribute) document.querySelectorAll('script[type$="-module"][src]').forEach(function (s) { srcs.push(s.src); }); // Strategy 2: Rocket Loader COMMENTED OUT the script tag entirely: // // These are invisible to querySelectorAll, so we parse the raw HTML. // We handle both attribute orderings (type-first or src-first). var html = document.documentElement.innerHTML; var reSrcFirst = //g; var reTypeFirst = //g; var m; while ((m = reSrcFirst.exec(html)) !== null) { srcs.push(m[1]); } while ((m = reTypeFirst.exec(html)) !== null) { srcs.push(m[1]); } // Re-inject each found src as a real module script. // Deduplicate first, then inject. Dynamically-created scripts bypass // Rocket Loader entirely. Modules with the same URL are only executed // once by the browser (cached), so re-injecting already-running scripts // is safe. var seen = {}; srcs.forEach(function (src) { if (seen[src]) return; seen[src] = true; var fix = document.createElement('script'); fix.type = 'module'; fix.src = src; fix.setAttribute('data-cfasync', 'false'); document.head.appendChild(fix); }); } // Rescue when user clicks the placeholder (fallback if autoplay failed). document.addEventListener('click', function (e) { var t = e.target; if (t && typeof t.closest === 'function' && t.closest('.markdy-placeholder')) { rescueModuleScripts(); } }); // Rescue automatically after a short delay for autoplay. // Only fires if initAll() never ran (no data-markdy-init on any root). setTimeout(function () { if (document.querySelector('.markdy-root:not([data-markdy-init])')) { rescueModuleScripts(); } }, 1500); }());What the recall actually fixed
The recall didn’t make the car better at detecting water. It made the car better at checking the news.
Documents filed with the NHTSA described software placing “restrictions at times and in locations where there is an elevated risk of encountering a flooded, higher-speed roadway.” The mechanisms that trigger those restrictions include National Weather Service flash flood warnings, watches, and advisories.
When Atlanta’s May 21 storm hit, none of those had been issued yet. Waymo told TechCrunch: “The storm in Atlanta produced so much rainfall that flooding was happening before the National Weather Service had issued a flash flood warning, watch, or advisory.”
The car received clean inputs. The inputs were just the wrong inputs.
The pattern
Waymo also admitted, when the recall shipped, that a “final remedy” wasn’t finished yet. That is an unusual thing to admit in a recall filing - it’s essentially acknowledging you’re issuing a recall for a problem you haven’t solved.
This is the third time in recent memory that Waymo has shipped a fix for a known behavior and had the behavior continue:
School buses. Users filmed Waymo vehicles illegally passing stopped school buses. Waymo shipped a fix. Then NHTSA started asking why the fleet was still making illegal maneuvers around school buses - in Austin. Two active federal investigations are now open.
The Santa Monica crash. On January 23, a Waymo robotaxi hit a child near an elementary school. The car had braked to around six miles per hour before impact. The child suffered minor injuries. Separate investigations from both NHTSA and the NTSB are ongoing.
Flooding. Recall shipped. Car drove into flood anyway.
Three problems. Three investigations. Zero fully resolved.
--> // making it invisible to querySelectorAll. // // `data-cfasync="false"` keeps this rescue script executable even when // Rocket Loader is active. It rescues module scripts via two strategies: // 1. Query the DOM for type$="-module" + src (covers case A) // 2. Regex-parse the raw HTML for commented-out script tags (covers case B) // Dynamically-created scripts bypass Rocket Loader entirely. (function () { if (window.__markdyRescue) return; window.__markdyRescue = true; var rescued = false; function rescueModuleScripts() { if (rescued) return; rescued = true; var srcs = []; // Strategy 1: Rocket Loader kept the tag in DOM but changed the type. // type="module" → type="{uuid}-module" (still has src attribute) document.querySelectorAll('script[type$="-module"][src]').forEach(function (s) { srcs.push(s.src); }); // Strategy 2: Rocket Loader COMMENTED OUT the script tag entirely: // // These are invisible to querySelectorAll, so we parse the raw HTML. // We handle both attribute orderings (type-first or src-first). var html = document.documentElement.innerHTML; var reSrcFirst = //g; var reTypeFirst = //g; var m; while ((m = reSrcFirst.exec(html)) !== null) { srcs.push(m[1]); } while ((m = reTypeFirst.exec(html)) !== null) { srcs.push(m[1]); } // Re-inject each found src as a real module script. // Deduplicate first, then inject. Dynamically-created scripts bypass // Rocket Loader entirely. Modules with the same URL are only executed // once by the browser (cached), so re-injecting already-running scripts // is safe. var seen = {}; srcs.forEach(function (src) { if (seen[src]) return; seen[src] = true; var fix = document.createElement('script'); fix.type = 'module'; fix.src = src; fix.setAttribute('data-cfasync', 'false'); document.head.appendChild(fix); }); } // Rescue when user clicks the placeholder (fallback if autoplay failed). document.addEventListener('click', function (e) { var t = e.target; if (t && typeof t.closest === 'function' && t.closest('.markdy-placeholder')) { rescueModuleScripts(); } }); // Rescue automatically after a short delay for autoplay. // Only fires if initAll() never ran (no data-markdy-init on any root). setTimeout(function () { if (document.querySelector('.markdy-root:not([data-markdy-init])')) { rescueModuleScripts(); } }, 1500); }());Why this hit 312 upvotes
The upvoted comments aren’t surprised. They’re tired.
The core argument on HN centers on the same thing every Waymo safety thread circles back to: the gap between “the car is a sensor suite” and what the car actually perceives. Using government weather alerts as a flood signal is a reasonable engineering shortcut - until the storm moves faster than the alert system.
One commenter put it plainly: this is a decision about perception architecture. Waymo apparently chose to handle flood detection at the route-planning layer (check weather subscriptions) rather than the perception layer (read standing water directly from sensors). That’s defensible until Atlanta happens.
Several others noted that Waymo’s reliability record in Phoenix and San Francisco - stable weather, mapped roads - is genuinely impressive. Expansion into weather-variable cities is a different problem class. The car that navigates downtown SF in fog may not have the edge-case training needed for a Georgia thunderstorm that hits before the NWS can react.
Read this if / skip if
| Read the source if… | Skip if you… |
|---|---|
| You follow autonomous vehicle safety regulation closely | Already wrote off robotaxis after the school bus story |
| You want the NHTSA document trail on the recall and follow-ups | Only care about the cool self-driving technology side of things |
| You’re in Atlanta, San Antonio, Dallas, or Houston using Waymo | Need this translated into more than “the car drove into water” |
One observation
Waymo paused service in Dallas and Houston proactively - before any incident - because of forecasted severe weather. That’s the right call. It also reveals something: the company knows its vehicles cannot reliably assess storm conditions in real time. The proactive pause is the admission.
NHTSA is now on its second document request. The first one wasn’t sufficient. The question the second request is presumably trying to answer is the one Waymo’s own recall filing raised: if the final remedy wasn’t ready, what exactly did the recall fix?
Discussion on Hacker News · Source: techcrunch.com · Submitted by mattas
Hoang Yell
A software developer and technical storyteller. I read Hacker News every day and retell the best stories here — in English and Vietnamese — for curious people who don't have time to scroll.