Front page — July 9, 2026
The Peloton Dispatch July 9, 2026 No. 103
● 75°F and sunny—perfect summer kit weather. · summer kit

THE PELOTON

Stage 6: Del Toro Fires, the Tourmalet Cracks the GC Pack

↩ Developing story — first reported Jul 06 · previously Jul 07, Jul 08

— Tim Wellens was still leading the peloton up the Tourmalet when UAE Team Emirates-XRG's tactical hand became visible. Six riders at the front — Wellens, Grösschartner, McNulty, Vermeersch, Yates, Del Toro — more coverage than anyone else in the race.1 Visma-Lease a Bike was down to Kuss and Piganzoli. Decathlon had already lost Matthew Riccitello to the climb at 50km to go; Daan Hoole, Paul Seixas's designated road captain, had been at the back of the peloton being sick before the day's first real ascent.

Then Isaac del Toro accelerated off Yates's wheel with the upper Tourmalet still to come. Jonas Vingegaard could not answer. The Dane was grimacing in a way rarely photographed on him — going somewhere very deep. His DS was on the radio: "Come on Jonas, you have to keep fighting. Come on, come on."1 A separate message followed: "You have to trust in yourself, Jonas. You're really good."

The gap widened through the summit. Behind the leading duo, a chase group gradually formed around Evenepoel, Seixas, and Lipowitz — Evenepoel pushing them into cooperation on the descent. Vingegaard carried a 40-second lead over that group with 5km left in the stage. Yellow jersey Torstein Træen had been dropped from the main peloton long before the summit, riding carefully to try to preserve the near eight-minute lead he'd built over the GC contenders since Stage 4. He didn't make it down cleanly — Træen went to the tarmac on the Tourmalet descent, passed the roadside concussion check, and remounted, but the yellow jersey was in serious jeopardy.1

Cian Uijtdebroeks, who had struggled throughout the race's first week, abandoned on the Tourmalet.1 The stage produced one of the Tour's high-profile withdrawals before it was even finished.

Seixas reached the finish with Evenepoel's group — his first Tour de France high-mountain test complete, though not under ideal conditions. Decathlon DS Julien Jurdie had called Stage 6 "the key moment of this first week" before the start. "We know it will be a very difficult moment and probably the highlight of this first week of the Tour de France," Jurdie had told Cyclism'Actu. "We imagine there will be attacks or a very high pace set by Visma-Lease a Bike or UAE Team Emirates-XRG."2 UAE gave them exactly that, on a day when Seixas had no Hoole and lost Riccitello before the Tourmalet's upper slopes. "A successful Tour would be one where I can compete for the overall classification until the very end," Seixas told France TV after Stage 5.2 Thursday gave the first data point on what that competition looks like.


The Seixas transfer circus reached new volume in the team paddock this week, but Decathlon team manager Dominique Serieys is projecting calm. "We're confident," he told Cyclingnews at the team bus on Wednesday. "We're focused on helping Paul at the Tour de France and he has a contract for 2027. Everyone else can say what they want, we will do our thing." Visma's Richard Plugge went on the record with Dutch television NOS: "We have a current team leader in Jonas, but we have to look to the future." Serieys told journalists that formal negotiations won't restart until mid-August at the earliest. UAE Team Emirates-XRG have been linked to an informal arrangement with Seixas's camp, but neither party confirmed anything publicly. Seixas himself, appearing on Vélo Club, said he hears plenty that is "false" and is staying focused on racing. Decathlon deputy team manager Mathieu Charpentier told Le Parisien this week that retaining Seixas beyond 2027 is a "strategic priority" — the French president is reportedly prepared to use political influence to ensure Seixas continues riding for a French team.3

Baptiste Veistroffer's Strava account revealed the numbers from his 144km solo break on Stage 5. The 26-year-old averaged 44.1km/h over 162.97km, putting out 323W average power and 343W weighted average, with a 1,358W peak.4 The effort edged past Jonas Abrahamsen's 141km solo from Stage 8 of the 2024 Tour. "Given how fit I am, I might have to be a bit more selective because there's a chance to achieve something really good," Veistroffer told BikeRadar.4 The last rider to win a Tour stage from a solo break of over 100km was Christophe Agnolutto in 2000.4

On the Road Ahead
Calendar from Jul 8, 2026 — primary source blocked today
DateRaceCountry
Thu Jul 10–Sat Jul 26Tour de France, Stages 7–21 (ongoing)France
Sat Aug 1DSSK Donostia San SebastiánSpain
Mon Aug 3–Sun Aug 9Tour de PolognePoland
Sun Aug 16ADAC Cyclassics HamburgGermany
Sat Aug 22–Sun Sep 13La Vuelta a EspañaSpain
Show Results

WINNER: Tadej Pogačar (UAE Team Emirates-XRG) PODIUM: 1. Pogačar, 2. Vingegaard (+2:40), 3. Del Toro (+2:57), 4. Evenepoel (+2:57)

GC AFTER: Pogačar retakes yellow jersey from Træen (crashed on descent)

NOTABLE: Uijtdebroeks abandons on the Tourmalet; Pogačar's 23rd Tour stage win moves him to 5th all-time, 8 behind Cavendish's record

Sources
  1. Tour de France Stage 6 Live: Tourmalet on the Menu cyclingnews.com Jul 9, 2026
  2. Teenage Tour de France Star Seixas Heads Into the Unknown on First High Mountain Stage cyclingnews.com Jul 8, 2026
  3. Decathlon CMA CGM Shrug Off Rival Bids to Sign Tour de France Super Talent Paul Seixas cyclingnews.com Jul 8, 2026
  4. Baptiste Veistroffer Shares the Stats Behind His 144km Tour de France Solo Break bikeradar.com Jul 9, 2026
  5. Vingegaard Braces for Pogačar and Isaac del Toro Double Attack velo.outsideonline.com Jul 8, 2026

↑ Back to top

THE LAB

TypeScript 7.0 Ships in Go — Slack Gets 40% of Its Merge Queue Back

↩ Developing story — first reported Jul 06 · previously Jul 08

Slack's engineers had stopped using local type-checking. The TypeScript language server took long enough loading their codebase that local development was effectively unusable — they routed type-checking through CI instead, a run that took about seven and a half minutes. Yesterday, Microsoft shipped TypeScript 7.0, a native port of the compiler in Go, and Slack's CI check is now 1.25 minutes.1 They also recovered 40 percent of their merge queue wait time. Local type-checking is feasible again.

The performance numbers hold across real-world codebases. The VS Code project: 125.7 seconds with TypeScript 6, 10.6 seconds with TypeScript 7 — 11.9×. Sentry: 139.8 seconds to 15.7 seconds. In the editor, the time from launching VS Code to the first diagnostic in the VS Code codebase drops from 17.5 seconds to 1.3 seconds — 13×. Canva's engineers go from 58 seconds to first error in the editor to 4.8 seconds. Microsoft's News Services team reports 400 hours a month saved in CI builds.

The speedup has two sources: native code and real parallelism. TypeScript 7 ships with a --checkers flag (default: 4 parallel type-check workers) and a --builders flag for parallelizing project-reference builds in monorepos. Pushing --checkers to 8 extends the VS Code speedup from 11.9× to 16.7×. The --watch mode is rebuilt on a Go port of Parcel's C++ file-watcher library. TypeScript 7 also uses less aggregate memory: 18 percent less on VS Code's build, 26 percent less on Bluesky's.

The caveat matters for a portion of the ecosystem. TypeScript 7.0 ships without a stable programmatic API. Tools that embed TypeScript directly — Volar (used by Vue, MDX, Astro, and Svelte) and Angular's template type-checker — must remain on TypeScript 6 for now. The team ships a @typescript/typescript6 compatibility package with a tsc6 binary to allow both versions side-by-side in the same project. API parity is targeted for TypeScript 7.1. CLI and standalone tsc are unblocked today; framework-embedded tooling waits.

The port is described by the team as faithful: same logic and structure as the original TypeScript implementation, translated to Go rather than reconceived. The objective was consistency with TypeScript 6 type-checking results, not behavioral change. Language-server command failures dropped over 80 percent and server crashes over 60 percent compared to TypeScript 6.0, attributed to the new architecture and the fuzz-testing infrastructure built during the port.1


The stability case for the Bun Rust rewrite fits in one table: running 2,000 in-process Bun.build() calls on v1.3.14, memory climbs continuously to 6,745 MB. The same workload on v1.4.0 canary — the first version of Bun written in Rust — levels off at 609 MB. That is the payoff Jarred Sumner's post published yesterday documents in detail.

The disclosure is in the first paragraph: Bun was acquired by Anthropic in December 2025, and Sumner used a pre-release version of Claude Fable 5 to run the port. The logistics: 535,496 lines of Zig, eleven days (May 3 through merge on May 14), approximately 50 dynamic workflows running up to 64 Claude Code sessions in parallel across four git worktrees, $165,000 in API tokens at list pricing, 6,502 commits.2

The engineering motivation was a specific class of bugs. A selection from v1.3.14's patch notes is instructive: heap-use-after-free in node:zlib when calling .reset() during an async write; double-free in the CSS parser; use-after-free in UDPSocket.sendMany(); race condition in MessageEvent's GC marker thread. Sumner's argument is that Zig's explicit ownership model, without automatic Drop semantics, requires per-call-site discipline the team was failing to sustain. Rust's borrow checker converts those failures into compile errors.

The most technically interesting detail in the post is the review architecture. Each implementing Claude is paired with two separate Claude instances that receive only the diff — no access to the implementer's reasoning — and are instructed to assume the code is wrong. Three documented bugs from the post show why this mattered. First: a missing Box::leak() before an async uv_close call, leaving libuv holding a pointer to freed memory after the Box dropped at the end of the match arm — use-after-free followed by double-free when the close callback fires. Second: trunc() instead of floor() in a file-timestamp conversion, generating negative nanoseconds in a timespec for pre-1970 mtimes. Third: unwrap_or() instead of unwrap_or_else() in a CSS color-mix parser, causing an eager panic on the fallback argument even when the fallback was never needed. All three compiled cleanly.

The rewrite introduced 19 known regressions, each subsequently fixed. The most illustrative: Zig's assert() is a function whose argument runs at every build; Rust's debug_assert!() is a macro that vanishes entirely in release builds. Code that called assert(insert_stale(...)) in Zig — where insert_stale had a necessary side effect of registering a file in the hot-reload graph — became debug_assert!(insert_stale(...)?...) in Rust, silently skipping the registration in release builds and breaking HMR for React projects with HTML routes. Debug builds worked fine.

Aggregate results: binary size drops roughly 20 percent on Linux and Windows (from 88 MB to 70 MB on Linux, 94 MB to 76 MB on Windows); Bun.serve HTTP throughput gains 4.8 percent; the parser stack is smaller, making deeply nested structures that previously crashed the process now throw cleanly. Bun v1.4.0 is in canary. Claude Code v2.1.181, released June 17, already runs on the Rust port — startup on Linux improved 10 percent, which Sumner notes "barely anyone noticed."2


Andrew Kelley, Zig's creator, published a reaction today. He is not displeased by the outcome: the Zig Software Foundation considers the Bun relationship to have been a "net liability" and is relieved it's over. His substantive objections concern the blog post's framing rather than the engineering outcome. He disputes that Bun was fuzzing its Zig code before the rewrite — "during our calls the whole Bun team told us that they were not fuzzing anything. This appears to be an outright fabrication."3 He argues the performance gains from LTO and comptime cleanup had nothing to do with the language change and could have been done in Zig all along. And he identifies what he sees as the post's central evasion: "The argument for shipping all the million lines of unreviewed code is that the test suite is good enough to catch everything. Then why are you saying you have so many annoying bugs in the Zig code?"


As this paper reported yesterday, the EU Parliament fast-tracked a vote to restore Chat Control 1.0 before the summer recess, a procedural move opponents called an unfair maneuver. The plenary vote happened today. Chat Control 1.0 is now authorized — not because it won a majority of votes cast, but because the motion to kill it fell short of the required threshold.

More MEPs voted against restoration than for it: 314 opposed, 276 in favor, 17 abstentions. Blocking required an absolute majority of 361. The motion to reject failed. Mass scanning of private messages on unencrypted platforms is authorized until 2028 or until a permanent regulation is reached. Affected services include Instagram, Discord, Snapchat, Skype, and Xbox direct messages, as well as Gmail and iCloud email. End-to-end encrypted services — WhatsApp, Signal — remain exempt; a symbolic exemption for encrypted communications was adopted separately, with no practical effect since providers don't scan those messages regardless.4

Patrick Breyer, the former MEP who has led civil liberties opposition to the measure, called the outcome "a farce" that "damages democracy." His structural argument: each interim extension removes the political pressure on EU member governments to negotiate a different framework. As long as they can renew voluntary, unsuspected scanning authorization on an indefinite basis, there is no incentive to engage with the Parliament's proposal for targeted, judicially authorized detection orders. EU Commission figures cited in Breyer's statement suggest the mass-scanning approach has limited utility anyway: private-chat scanning accounted for only 36 percent of abuse reports in 2024, the German BKA found 48 percent of incoming alerts not criminally relevant, and the Commission admits no evidence that the approach has increased criminal convictions or rescued children.4 Permanent Chat Control 2.0 negotiations resume in September.

Trending today: list dominated by Claude Code skill files, AI job-search automations, MCP wrappers, and curated agent lists — no technical novelty cleared the bar.

Sources
  1. Announcing TypeScript 7.0 devblogs.microsoft.com Jul 8, 2026
  2. Rewriting Bun in Rust bun.com Jul 8, 2026
  3. My Thoughts on the Bun Rust Rewrite andrewkelley.me Jul 9, 2026
  4. EU Parliament Greenlights Chat Control 1.0 — Breyer: "Our Children Lose Out" patrick-breyer.de Jul 9, 2026

↑ Back to top

THE WORLD

Chelan Hills Fire 50% Contained; Seattle Targets Renter Junk Fees


Federal Way joins WA's data center moratorium wave. The city council unanimously passed a 12-month hold on data centers larger than 1 megawatt or 4,000 sq ft, citing power demand, water consumption, noise, and emissions. It joins Seattle and Burien; city staff have until a September 1 public hearing to draft updated municipal code. Issaquah Reporter

Seattle moves to ban renter junk fees. Mayor Katie Wilson's proposed legislation would prohibit pet, appliance, mail, and package fees and require all rental costs to be disclosed upfront in listings — with violations potentially headed to court. Landlords are objecting to implementation ambiguity; if the council passes it, the ordinance takes effect July 2027. KIRO 7

Issaquah housing: council split on pace. A vote to relax upper-floor stepback and balcony requirements — constraints that had been limiting building design — passed, but drew two dissenting votes from members who wanted more aggressive reform, not less. The Urbanist


ON THE TRAIL

WEEKEND PICKS — Sat–Sun Jul 12–13

Weather window is solid across the pass. The I-90 corridor runs mostly sunny both days with precip in low single digits. Teanaway is outright dry.

---

Pick 1: Annette Lake — Snoqualmie Region › Snoqualmie Pass | ~45 min from Issaquah

Trip stats (mileage/elevation) not provided in the source trip report — verify on the WTA trail page before you go.

Weather: Sat Jul 12 — high 66°F, mostly sunny, 3% precip. Sun Jul 13 — high 70°F, sunny, 1% precip. (I-90 West / Snoqualmie Pass.)

Conditions (Jul 8): Zero snow on trail. All streams "low and easy to cross" but still flowing — no fords. No bug spray required that day, though the reporter notes conditions can shift; bring some. Wildflowers going out (beargrass, orchids); backcountry toilet at the lake; pit toilet and trash cans at the trailhead. Clears all six criteria. Popular trail — start early.

WTA trip report (Jul 8)

---

Pick 2: Lake Ingalls high camps — Snoqualmie Region › Salmon La Sac / Teanaway | ~100 min from Issaquah

Trip stats (mileage/elevation) not provided in the source trip report — verify on the WTA trail page before you go.

Weather: Sat Jul 12 — high 74°F, sunny, 0% precip. Sun Jul 13 — high 77°F, sunny, 0% precip. (I-90 East / Teanaway.)

Conditions (Jul 8): No bugs — "probably due to the wind and cooler temps." Wildflowers at peak ("many, many wildflowers... at peak now"). Stream water in the meadow near the camps. A couple of minor stream crossings on the way to the lake; none flagged as problematic fords. Camp at the high camps below Ingalls Pass — the Jul 8 reporter noted camping at the lake itself is reportedly not permitted. Trail clear; cairns mark the boulder section near the lake.

Crowds: Parking lot was 80% full by 8:30am on a Wednesday. Expect a packed lot on a summer Saturday. Plan to be rolling from Issaquah by 6am or be prepared to park on the road.

Clears all six criteria with an early start. Minor stream crossings are not ford-level; bugs absent Jul 8 due to wind; lot crowding is manageable if you start early.

WTA trip report (Jul 8)

---

REGIONAL SNAPSHOT

Sources
  1. A Look at the Damage from the Deadly Chelan Hills Wildfire as Families Prepare to Rebuild kiro7.com Jul 9, 2026
  2. Evacuations Reduced to Be Ready in Vantage kiro7.com Jul 9, 2026
  3. Federal Way Passes 1-Year Moratorium on Data Centers issaquahreporter.com Jul 8, 2026
  4. Seattle Looking to Eliminate Hidden and Junk Fees for Renters kiro7.com Jul 9, 2026
  5. Issaquah Councilmembers Push for Bolder Options as Housing Reforms Ramp Up theurbanist.org Jul 8, 2026
  6. WTA Trip Report — Annette Lake, Jul 8 wta.org
  7. WTA Trip Report — Lake Ingalls, Jul 8 wta.org
  8. WTA Trip Report — Pratt/Olallie Lakes, Jul 8 wta.org
  9. WTA Trip Report — Cascade Pass, Jul 8 wta.org
  10. WTA Trip Report — Staircase Rapids, Jul 8 wta.org
  11. WTA Trip Reports — Jul 7–8, 2026 wta.org

↑ Back to top

THE LONG READ

Estonia's Government Had a Bug: This Is the Postmortem

The error was simple enough that it barely registered as a mistake at the time. In December, Estonia's parliament — the Riigikogu — passed amendments to the country's Gambling Tax Act intended to lower the tax rate on remote gambling. The wording, as enacted, applied the change only to "skill games." Online casinos, the actual target, were not covered. For an entire calendar year, they operated outside the tax net entirely.

The person who caught it wasn't a legislator or a ministry auditor. It was a legal counsel working for a gambling operator. The gap cost the Estonian government €24 million — roughly $27.4 million — in a single year, out of a gambling industry worth around €300 million annually.1

It was the kind of error that, once spotted, makes everyone feel slightly sick. The whole edifice of deliberation — committee review, readings, votes — and no one noticed that two phrases in a single clause failed to align. Luukas Ilves, Estonia's former undersecretary for digital transformation, tried something after the story went public: he fed the legislation to Claude and Gemini. Both systems immediately flagged the inconsistency.1

Within hours, Ilves had a prototype running. He called it Apsakaleidja — Estonian for "Fuckup Finder." It pulls draft bills directly from the Riigikogu's website and scans them for broken cross-references, contradictory wording, arithmetic errors, and impossible dates, then categorizes each finding by severity. Of the 112 bills currently listed on the tool, 102 are rated high risk.1 He demonstrated it on national television. The host's reaction, by all accounts, was amazement.

What happened next is the more interesting story. The mistake embarrassed the government. It also, apparently, clarified something for it. Prime Minister Kristen Michal told Wired: "The situation demonstrated that AI can be an incredibly useful assistant."1 He suggested in January that tools like the Fuckup Finder could be used to proactively scan draft legislation before it ever reaches a vote. He launched the Eesti.ai program, with a stated goal of doubling national productivity by 2035. In April, parliament received a bill giving state and local government the right to use AI systems to automate administrative processes. In June, Michal said the quiet part out loud at an Eesti.ai meeting: Estonia intends to become "the first country in the world to create official digital identities for AI agents."1

The move is less surprising than it sounds when you consider that 99 percent of Estonian public services are already online — a digital infrastructure that Wired itself was covering a decade ago.1 Estonia has been running government-as-software longer than most countries have seriously attempted it. The question the gambling tax error raised is the same question that haunts any sufficiently complex codebase: when a system reaches a certain scale, does human review actually catch the bugs? The honest answer, in Tallinn in December, was no.

The counterargument is straightforward. Catherine Flick, who researches technology ethics at the University of Staffordshire, puts it plainly: "Why are humans not doing this review process as part of the legislation drafting procedure?"1 She's not wrong that the Fuckup Finder is treating a symptom. Legislation that requires AI assistance to catch its own errors may be legislation that's grown too complex to govern itself — and adding AI to the review layer doesn't resolve that underlying problem, it papers over it.

Both things are true. The error should have been caught by humans and wasn't. And if a language model running for a few seconds can flag what months of parliamentary process missed, the practical case for using it is hard to dismiss. The interesting question Estonia is now stress-testing isn't whether AI belongs in the legislative process — it's whether government, treated as a software system, can be made to fail more gracefully.

Sources
  1. The $28 Million Mistake That Inspired Estonia's AI "Fuckup Finder" wired.com Jul 9, 2026

↑ Back to top

FROM THE ARCHIVE

Carried Over the Spit: July 9, 1958

Lead illustration

Black-and-white pen-and-ink editorial illustration. A wooden Alaskan trolling boat rides the breaking crest of an enormous wave inside a narrow bay at night, hull silhouetted against churning white foam, radio antenna bent hard to one side, loose logs tumbling in the surge alongside. The wave face sweeps diagonally across the frame from lower-left to upper-right, its surface broken into dense cross-hatched turbulence. Sheared spruce stumps and root masses emerge from the boiling trough below. Steep forested bay walls rise on both sides, converging toward a pale shattered glacier face at the far end of the inlet. The boat sits twenty meters above the tree line—scale conveyed by geometry, not figures. Heavy linework in the wave trough, bold silhouette on the hull, generous white sky above the crest. No text. No human figures visible.

Bill Swanson was asleep on the Badger, a trolling boat anchored just inside Lituya Bay's mouth, when the mountains started moving.

At 10:15 p.m. on July 9, 1958, a magnitude-7.5 earthquake on Alaska's Fairweather Fault displaced the ground more than six meters horizontally and a meter vertically. At the head of the T-shaped bay, the shaking sheared 30 million cubic meters of rock — more than 80 trillion kilograms — off a cliff face nearly 1,000 meters high and dropped it straight into the inlet below. The impact displaced the water instantaneously. A wave swept through the main channel at 180 kilometers per hour.1

Swanson told the Alaska Sportsman afterward that he could see Lituya Glacier, normally hidden behind the bay's bend. It had "risen several hundred feet" and was "jumping and shaking like crazy."1 Then the wave hit the Badger and drove the boat over the low spit separating the bay from the open ocean, carrying it 24 meters above the surrounding treetops before the crest broke and the hull hit bottom and began to sink. Several logs came through with it; one smashed into the pilothouse and broke Swanson's ribs. He and his wife Vivian made it out in a skiff and were picked up by another boat looking for survivors.

Howard Ulrich, anchored two kilometers into the bay on the Erdie with his eight-year-old son, heard the earthquake as an explosion. He tried to pay out anchor chain to ride the wave, but it snapped. Convinced they were dead, he sent a radio distress call to his wife. The Erdie survived anyway — apparently carried up the southern shore and washed back in by the backwash. Smaller waves continued to roil the bay for half an hour afterward.

The Sunmore, anchored near the Badger, did not survive. Orville and Mickey Wagner went down with it. Of the six people in Lituya Bay that night, two died.

Aerial photographs taken after the wave showed a continuous trimline — a swath of bare rock and soil above which all vegetation had been stripped — reaching 524 meters up the hillside. Trees hundreds of meters tall, nearly two meters in diameter, had been sheared off at their bases. Barnacles ripped from rocks. A mining camp, a cabin, and the lighthouse at the bay's mouth: all gone. The wave's run-up at 524 meters remains the highest ever recorded.1

The precise mechanism took decades to work out. The 1960 USGS report by geologist Don Miller concluded the landslide, not the ground motion itself, generated the wave1 — but later modeling found the rock alone shouldn't have been enough. In 1999, oceanographer George Pararas-Carayannis proposed the explanation that finally held: a slide dropping from nearly 1,000 meters along a nearly vertical slope strikes the water not as a cascade of sequential impacts but as a single instantaneous mass. It hits like an asteroid.1 The displaced water has nowhere to go but up — and in the narrow, T-shaped geometry of Lituya Bay, with its walls of steep forested slope and a mouth just 10 meters deep, up is precisely where it went.

Earth Magazine's account of that night, drawing on the 1960 USGS report and subsequent modeling, describes the bay's shape as the amplifying mechanism: it is nearly a closed system. What would have been a large wave over open ocean became, inside Lituya Bay, the largest wave anyone has ever measured.

Sources
  1. Benchmarks: July 9, 1958: Megatsunami Drowns Lituya Bay, Alaska earthmagazine.org Jul 6, 2016

↑ Back to top

THE FUNNIES

Seven Minutes, Then a Wave

After Peanuts — on TypeScript 7.0 completing a Slack type-check in one minute twenty-five seconds, down from seven and a half, and what that means for the developer who quietly stopped running it locally. After The Far Side — on the two fishing boats carried hundreds of feet above the Lituya Bay treeline on this day in 1958.

Hand-drawn parody comic strip
AI-rendered parody comic strip

↑ Back to top

ALSO NOTED

Also Noted

↑ Back to top

THE QUESTION

The Better Reviewer Problem

After Estonia's parliament approved a gambling tax amendment that slipped through every committee reading without anyone catching a two-phrase mismatch, the harder question isn't whether AI should scan draft legislation — it's whether adding a better reviewer is the right response to a system that has outgrown its capacity to review itself.1

That question surfaces twice more in today's paper, in a completely different domain. As THE LAB reports, TypeScript's JavaScript implementation grew large enough that type-checking became a local development bottleneck; Microsoft's answer was a native port to Go.2 Bun's Zig codebase accumulated memory safety failures — heap-use-after-free, double-free, use-after-free — faster than the team could chase them down; the answer was Rust.3 Both moves follow the same logic Estonia reached for: the existing process is insufficient, so introduce a stricter external layer to catch what the existing process misses. Andrew Kelley's challenge to the Bun team is the sharpest articulation of the counterargument: the bugs were process failures, not language failures. You could have fuzzed in Zig. You could have reviewed more carefully. You chose to rewrite instead.4 The critics of Estonia's Fuckup Finder make an identical point — the legislative drafting process failed, and a scanning tool treats the symptom rather than the cause.1

The counterargument is pragmatic, not philosophical. At a certain scale, "fix the process" has no practical implementation path. A compiler written in JavaScript cannot check a five-million-line TypeScript monorepo in time for a developer to use it locally; that is not a process problem, it is a physics problem. Memory safety bugs in a language without automatic drop semantics require per-call-site discipline that grows harder to sustain as the codebase and team both grow. And a parliament running hundreds of amendments through committee simultaneously cannot audit every cross-reference at the speed modern legislatures operate. The AI auditor, the Rust borrow checker, and the Go port all do the same thing: they raise the floor on what complexity can be caught, without reducing the complexity itself.

That is the question worth carrying. Every institution under complexity pressure eventually reaches for a better reviewer — a new tool, a stricter language, an automated scan — because the alternative is admitting the system has grown too complex to be safely governed by anyone. The floor-raise is real; the Bun numbers and the TypeScript benchmarks and the Estonian prototype all show measurable gains. But the floor is not the ceiling, and the underlying question — whether the system should be this complex in the first place — almost never gets asked, because no one is in a position to answer it.

Sources
  1. The $28 Million Mistake That Inspired Estonia's AI "Fuckup Finder" wired.com Jul 9, 2026
  2. Announcing TypeScript 7.0 devblogs.microsoft.com Jul 8, 2026
  3. Rewriting Bun in Rust bun.com Jul 8, 2026
  4. My Thoughts on the Bun Rust Rewrite andrewkelley.me Jul 9, 2026

↑ Back to top

Investigator Report

Investigator report — 2026/07/09

Verdict

A strong edition on a genuinely news-heavy day: Pogačar cracks the GC pack on the Tourmalet, TypeScript 7.0 ships in Go, Bun gets rewritten in Rust with AI, and the Lituya Bay megatsunami gets a quietly excellent archive treatment. The edition has real shape. Three problems hold it back: THE QUESTION opens on the same Estonia story as THE LONG READ, violating an explicit collision rule; the ON THE TRAIL weekend picks punt mileage and elevation data to the reader instead of estimating it; and a scout EISDIR error caused a 3.5-hour pipeline stall that sent the researcher into production without web search results, though the run recovered cleanly.


Frontpage

The deployed PNG reads clearly as a newspaper front page. Masthead and issue number are correct. The daily strip is legible. The lead headline — "Stage 6: Del Toro Fires, the Tourmalet Cracks the GC Pack" — fills the full width at 64px with appropriate drama. The Lituya Bay illustration is the visual highlight: a dramatic diagonal wave, strong boat silhouette, hatched turbulence in the trough. It earns its placement.

Row 2 has a layout imbalance: THE QUESTION column gets a 40px h2 while THE LAB column gets 26px, even though THE LAB has the higher priority (85 vs. 75). This is a CSS choice by the art director that visually elevates THE QUESTION above its section rank. Not a defect, but it reads oddly when LAB's headline is smaller than the section ranked below it.

THE WORLD and ALSO NOTED sit correctly in the right stack, with THE WORLD showing headline only per its frontpage_display: "headline_only" rule. The ALSO NOTED bullet list clips the last 2–3 items at the bottom edge — expected behavior under overflow: hidden, and the most important bullets are visible.

The full-article index.html section ordering (PELOTON → LAB → WORLD → LONG READ → ARCHIVE → FUNNIES → ALSO NOTED → QUESTION) matches the section_tiers configuration. No duplicate content or broken structure detected.


Priority ranking

SectionPriorityLengthImageNotes
THE PELOTON93761 wordsMajor GC shake-up, first Pyrenees stage
THE LAB851,365 wordsFour stories: TS7, Bun Rust, Kelley, Chat Control
THE QUESTION75434 wordsCross-domain bridge, but collides with LONG READ
THE LONG READ70628 wordsEstonia AI; single source
THE WORLD55881 wordsAll WA state; no global coverage today
FROM THE ARCHIVE40569 wordsyesAt cap; on-date event
ALSO NOTED109 bullets
THE FUNNIES8descriptionTwo strips, not one

The PELOTON at 93 is defensible — this is the first Alpine GC test of the 2026 Tour, Pogačar takes yellow, Vingegaard goes 2:40 down. THE LAB at 85 is plausible given three genuinely significant stories, though Chat Control arguably belongs elsewhere. THE LONG READ at 70 is generous for a single-source treatment of a piece whose central argument is completed in three paragraphs; 60–65 would be more accurate. FROM THE ARCHIVE at 40 is correct and earned. The art director respected the ordering: PELOTON leads the page, LAB and QUESTION and LONG READ fill Row 2 in descending priority.


Editorial reading

Finding 1 — THE QUESTION opens on THE LONG READ's story (collision rule violated). The QUESTION's lede opens: "After Estonia's parliament approved a gambling tax amendment that slipped through every committee reading without anyone catching a two-phrase mismatch…" This is the same subject, same frame, and same primary Wired source (wired.com/story/the-28-million-dollar-mistake...) as THE LONG READ. The config is unambiguous: "THE QUESTION may not share primary sources with THE LONG READ on the same day, and may not re-state THE LONG READ's central statistic." Citation 1 in THE QUESTION and the sole citation in THE LONG READ are identical. The cross-domain bridge the writer constructed (Estonia → TypeScript → Bun as three instances of "adding a better reviewer") is genuinely good structural thinking — it would have been the edition's best piece if it had entered through the TypeScript or Bun angle and brought Estonia in as a third data point in paragraph 2. Instead it re-narrates THE LONG READ's lede and calls it a bridge.

Finding 2 — ON THE TRAIL mileage/elevation punted to reader. Both weekend picks carry: "Trip stats (mileage/elevation) not provided in the source trip report — verify on the WTA trail page before you go." The config's subsection spec is explicit: "Source mileage and elevation from the WTA trip report or the trail's WTA hike page cited in the report — if neither states one or both numbers, give a '≈' estimate and say '(estimate)'." The writer is supposed to visit the WTA trail page and report numbers, or produce estimates. Telling the reader to go verify it themselves is the exact task the section is meant to do. Annette Lake (7.4 mi / ~1,400 ft round trip) and Lake Ingalls (~9 mi / ~2,600 ft to the lake) are well-documented trails; the WTA pages have the data. The picks are otherwise well-written and the weather quotes are correctly formatted.

Finding 3 — THE LAB is overloaded, and Chat Control is the wrong fit. At 1,365 words THE LAB is carrying TypeScript 7.0, the Bun Rust rewrite, Andrew Kelley's reaction, and EU Chat Control — four distinct stories in one section. The first three form a coherent technical argument. Chat Control is EU legislative surveillance policy, sourced from a politician's website (patrick-breyer.de). The LAB section focus says "Tech, games, and engineering — filtered hard for depth and substance." Three paragraphs of vote tallies and MEP quotes sit awkwardly after eight paragraphs of borrow checker semantics. Chat Control would have been a solid ALSO NOTED bullet (or even a short WORLD item given its EU policy character) and would have freed 350 words in THE LAB for the TypeScript and Bun analysis, which are both excellent and deserved more space.

Finding 4 — THE LONG READ is single-source. All five citations in the Estonia piece point to one Wired URL. This is a section defined by depth. Luukas Ilves posted about the Apsakaleidja prototype publicly; the Estonian parliament's website has the bill text; Estonian-language outlets covered the gambling tax gap. The Wired piece is well-reported and the writer's summary of it is competent, but five citations to the same article undersells a section that is supposed to be exceptional. The writer ran in 63 seconds ($0.05) — the fastest and cheapest writer in the run — which correlates with grabbing the first fetched source and stopping.

Finding 5 — THE WORLD has no world-level coverage, but does not say so. The section covers: Chelan Hills fire (Douglas County, WA), Vantage evacuation (Kittitas County, WA), Federal Way data-center moratorium, Seattle renter fees, and Issaquah housing. This is entirely Washington state. The Iran thread was dropped (no new facts — defensible). But the section's config says "Major world news AND local Seattle / Eastside news" and the slug is "THE WORLD." On a quiet global day, the section should acknowledge the absence ("No major world developments today worth the space") rather than silently omitting the block. As written, a reader skimming the slug expects at least one item from outside the state. The Chelan Hills wildfire and Vantage evacuation are regional emergencies that matter to the reader; they are not the same as global news.


Pipeline observations

Scout EISDIR failure → 3.5-hour pipeline stall. The first scout (agent-a9c43f16237d8539c, ran 12:09–12:11) completed all 45 web searches successfully. It then tried to verify the output directory existed using the Read tool on the path /home/user/peloton-dispatch/2026/07/09, received EISDIR: illegal operation on a directory, failed to recover, and halted without writing search_results.md. The orchestrator did not detect this — the parent session waited 3.5 hours (12:09 to 15:46) assuming the agent was still running. At 15:46 the orchestrator gave up and launched both the researcher and a second scout simultaneously. The second scout (agent-a5c7e13af09bf2322, 15:47–15:52) ran correctly and wrote 82 URLs. But the researcher (agent-aee501459e632440b, started 15:46:47) had already begun and produced its brief from feeds.md alone. The edition recovered: the second scout's URLs were available to the sweep and ALSO NOTED writers downstream. But the researcher's full brief was built without the web-search layer, meaning niche stories in the search results (Chloe Dygert update, Cannondale factory closure, the SharePoint RCE CISA KEV) were not assessed by the researcher for inclusion. The root cause is the scout using Read on a directory — it should use ls or Bash to check directory existence. This failure pattern has also occurred before (the scout sometimes tries to verify output paths with the wrong tool).

Fact-checker caught and corrected an attribution error in THE PELOTON. The writer said Del Toro "accelerated off McNulty's wheel." The fact-checker (agent-a35a5e82e5269b0c6) read the live blog timestamps (14:13 McNulty dropped, 14:14 Del Toro attacks) and corrected it to "Yates's wheel." The section shipped clean on this point. This is the fact-checker functioning correctly.

Fetch results: all 29 fetches succeeded. No unrecovered failures. The procyclingstats.com calendar fell back to the Jul 8 cached copy (logged in fetch_results.json as cached_from: 2026/07/08), which is the intended behavior. Two thin fetches worth noting: pages/world/vantage-evacuation.md is 511 bytes (placeholder with evacuation status, no detail); pages/world/issaquah-housing-reforms.md is 309 bytes (contains only the author bio, no article content). The WORLD writer compensated for both by drawing on RSS feed snippets, which did contain the key details (the feeds.md entry for the Issaquah housing story includes "upper-level stepbacks and outdoor balconies approved… two dissenting votes"). No hallucination detected.

No log-pipeline-alerts.md present. No pipeline alerts to surface.

Funnies section shipped two comic strips. The comic agent's task description reads "Draw today's TWO parody comic strips." The section spec in newspaper.yaml says "A short single-image parody comic." The dispatcher is asking for two strips but the config configures one. The section-funnies.md describes both strips; the funnies-openai.png exists. This is a dispatcher/config inconsistency.


Trace highlights

The 3.5-hour scout stall is invisible in the trace but dominates wall clock. The scout ran 131 seconds per the trace summary, which counts only the agent's active time. The 3.5-hour wait does not appear in any agent's wall-clock measurement. The overall dispatch took roughly 5 hours (12:08 to 17:01 per commit timestamps) — of which approximately 3.5 hours was the orchestrator waiting for a scout that had already finished.

Researcher at $1.24 from feeds.md alone. The researcher consumed 2.4M cache-read tokens and took 1017 seconds ($1.24) — the most expensive subagent. It produced a solid brief from the 948-line feeds.md, but the 82 search-result URLs from the second scout were unavailable. Some of those URLs (thread stories for Dygert, Cannondale) did not make it to the research brief and were not surfaced to the writers.

THE LONG READ writer: 63 seconds, $0.05. The fastest and cheapest writer. Against a section spec that calls for "exceptional" longform, this run time suggests it read the first usable source, found a good Wired piece, and stopped. Three candidate sources were in the brief (dropped lists two others as "not fetched"). The writer could have pushed the researcher or fallen back to the Estonian parliament's public bill portal, but the pace of the run suggests it did not.

Art Director at 1,616 seconds, 32K output tokens. The art director spent 27 minutes generating frontpage.html, which is the last step before commit. 32,018 output tokens for a 470-line HTML file is high — the art director appears to generate the full stylesheet inline on each run. Templating the CSS and having the art director fill only structural decisions and content blocks could cut this to under 5K output tokens and under 5 minutes, potentially taking 20+ minutes off the critical path on every run.

Trace summary

Dispatch 2026-07-09 (model: claude-sonnet-4-6)

AgentDurInputOutputCache ReadCache 5mCache 1hCost
Scout131s2764200342243587310$ 0.27
Researcher1017s1077110524157951309880$ 1.24
Scout286s384254166099534220$ 0.26
THE WORLD486s734741371560330$ 0.61
THE PELOTON335s841122440498070$ 0.22
THE LAB395s2737411386971262970$ 0.52
THE LONG READ63s6263937088350$ 0.05
FROM THE ARCHIVE137s62757374225850$ 0.10
FC: THE LONG READ147s73382861329400$ 0.15
Meta-Writer71s62547196219790$ 0.10
FC: FROM THE ARCHIVE179s73493050265260$ 0.13
Illustrator49s2331372000$ 0.06
FC: THE PELOTON526s737111673912850$ 0.38
FC: THE LAB421s733170934745870$ 0.33
FC: THE WORLD426s843183507701870$ 0.32
THE QUESTION207s73598969341800$ 0.16
FC: THE QUESTION301s842193381689390$ 0.32
ALSO NOTED342s953255344729320$ 0.35
Draw today's TWO parody comic strips for554s10295306402856020$ 0.42
FC: ALSO NOTED545s1166297180616610$ 0.32
Funnies (OpenAI)175s2957024000$ 0.28
Art Director1616s113201811957963590$ 0.85
Update story threads for today's edition402s5177220993000$ 0.37
Orchestrator1863153382654920179923$ 4.03
TOTAL1126475991131813211443175179923$11.83

Suggestions for next edition

1. THE QUESTION writer: enter through the non-LONG READ angle. When the cross-domain bridge involves the same primary source as THE LONG READ, the entry point must come from a different section's material. Today's correct opening is something like: "After Microsoft rewrote TypeScript in Go and Bun rewrote itself in Rust for the same reason Estonia built an AI to scan its own legislation, the pattern is worth naming..." — Estonia arrives in paragraph 2 as the third case, not the opening frame.

2. ON THE TRAIL writer: go to the WTA trail page. The config has always said to source mileage and elevation from the WTA trail page if the trip report doesn't have it. Annette Lake and Lake Ingalls are popular, well-documented trails. "Verify on the WTA trail page" should never appear in the published article — it belongs in the writer's research notes, not in the reader's output.

3. Fix the scout's directory-check tool. The EISDIR error pattern (scout uses Read on a directory path to check existence) has been seen before and has now cost one run its full web-search layer plus 3.5 hours of wall clock. The scout should verify the output directory with Bash ls or a Python os.path.isdir check, not the Read tool. A one-line fix in the scout agent prompt eliminates the entire failure mode.

4. Cap the LAB section at three stories and push policy items downstream. Chat Control is important but it is legislative surveillance policy, not the lab beat. When THE LAB is already carrying two major technical stories (TypeScript 7.0, Bun Rust rewrite with independent reaction), a third technical story from the same session should go to ALSO NOTED rather than extending the section to 1,365 words. The reader running a timer before work does not benefit from a wall of text in the section they came for.