September 21, 2026— Washington, D.C.—The Commercial Space Federation (CSF) is pleased to welcome ORBITInsure and Renaissance Strategic Advisors (RSA) as its newest members. ORBITInsure joins CSF as a Space Supply […]
Some people are suggesting this, including Ezra Klein.
I do not understand how it is supposed to work. Put aside the issue of foregone innovations, let us say I seek to access an AI from overseas. Am I allowed to visit their website? So many sites have AI behind them, including Chinese open source AI. Do all of those sites get banned? And how? Firewall imposed on Americans? And we cannot put the good open source models on our hard drives? How enforced? Does the government have to read the creation logs of the model (how can they?), and then decide whether I can use that model or not?
What if Anthropic licenses its IP to an independent subsidiary in the Cayman Islands and they keep on using code to improve the AI? Or maybe only foreign nations are allowed to have the best models and the really fast rates of improvement? How are multinationals supposed to operate across borders? (Presumably you cannot just use the RSI of your foreign affiliate, but then the whole MNC is crippled and eventually rendered uncompetitive?) How are we to keep “AI sovereignty” for Americans?
Does this whole thing mean that regular companies can use AI to write code, but the main labs cannot? Solve for the equilibrium there. Or the whole code writing function goes away for everybody?
I do not find this to be a workable idea. I think it is “people wanting to do something that sounds reasonable and less scary,” without thinking through the practical details. I have made a related point before, but one does best with AI policy when you start with the stuff that otherwise you might put into your last two or three paragraphs of an essay (“It remains to be seen how…but we are all human beings and surely we should not give up hope…”). Even if you believe in a deal with China, and I do not, we (and others) now know competitors can catch up more quickly than we had thought, at least if they think they have a chance of winning. They might even buy some space compute from Elon.
C’mon people, I know for many of you this is a difficult take to swallow, because it feels like “we don’t care enough” if we do not take some dramatic steps. Nonetheless the reality is that, a long time ago, we made a whole series of decisions that imply…we have no other choice than to just see this one through and get it more or less right. The longer we deny that truth, the harder it will be for all of us.
Images from NASA’s EPIC (Earth Polychromatic Imaging Camera) aboard the NOAA mission DSCOVR (Deep Space Climate Observatory) show Earth on the December and June solstices and the March and September equinoxes, illustrating how the tilt of Earth’s axis shifts the continent’s apparent positions through the year.
NASA Earth Observatory/Michala Garrison
Most kids learn in elementary school that the seasons are caused by Earth rotating on a tilted axis during its yearly orbit around the Sun. The substantial tilt, about 23.5 degrees, is thought to be the result of an ancient planetary body, Theia, smashing into Earth about 4.5 billion years ago, in the same cataclysmic collision that formed the Moon.
To visualize why Earth has seasons, imagine the planet as a spinning top tilted to one side. Around the June solstice, the Northern Hemisphere leans toward the Sun, bringing more direct sunlight and longer days. Around the December solstice, the Southern Hemisphere does the same. That’s why June ushers in summer and warm weather in the Northern Hemisphere, while December does so in the Southern Hemisphere.
The March and September equinoxes serve as the midpoints between these two seasonal extremes. On those days, the terminator—the boundary between the sunlit and dark sides of Earth—runs directly through both poles. As a result, the Northern and Southern Hemispheres receive almost the same amount of sunlight, and day and night are nearly equal in length.
What do the seasons look like from about one million miles away? That’s the view provided by NASA’s EPIC (Earth Polychromatic Imaging Camera) aboard the NOAA mission DSCOVR (Deep Space Climate Observatory). By maintaining an orbit that puts the spacecraft between the Sun and Earth roughly 1.6 million kilometers (1 million miles) from Earth, the camera has a nearly continuous view of the sunlit hemisphere. As Earth spins during the course of a day, EPIC captures a full-disk image of the planet’s sunlit face every few hours.
The four images above, taken at roughly the same time of day, show how EPIC’s view of the Western Hemisphere changes over the year, from the December solstice (upper left) to the March equinox (upper right), June solstice (lower left), and September equinox (lower right). The most striking difference is between the two solstices. In December, South America lies near the center of the disk and much of Antarctica is visible, while North America is partially out of view. In June, Earth’s tilt means the situation is reversed: the Northern Hemisphere and North America are more centered, Arctic sea ice comes into view, South America is offset, and Antarctica is completely out of view.
There are other notable differences among the four images. Earth looks slightly smaller during the March and September equinoxes, for instance. That’s because DSCOVR was tens of thousands of miles farther away from Earth on those dates than on the solstices. On December 21, 2023, DSCOVR was 1,447,327 kilometers (899,327 miles) from Earth compared with 1,561,901 kilometers (970,520 miles) on September 22, 2024.
The slight difference in Earth’s apparent size has nothing to do with Earth’s tilt. Instead, it occurs because DSCOVR follows a looping, three-dimensional path called a Lissajous orbit to keep the spacecraft near Lagrange point 1, where the combined gravitational pull of the Sun and Earth and the centrifugal pull of the satellite balance out, making it easier for engineers to maintain the spacecraft’s position without using much fuel. DSCOVR’s distance from Earth swings between its maximum and minimum roughly every three months, and the timing drifts throughout the year because of lunar influences and orbital maneuvers. In 2024, the orbit happened to put the spacecraft slightly farther from Earth at both equinoxes, but that is not always the case.
There’s one other notable way the images differ. Because of DSCOVR’s Lissajous orbit, the angle between the Sun, Earth, and satellite varies between 2 and 12 degrees, explained Alexander Marshak, the deputy project scientist for the DSCOVR mission. Earth appears as a fully illuminated disk at smaller angles and less rounded at larger angles, like a “bite” has been taken out, similar to a gibbous phase of the Moon. For this set of images, the September 22 image has a slightly lower angle (8.1°) than the December 21 image (10.3°), making it appear slightly rounder and fuller. The angle between the Sun, Earth, and satellite in the other two images is between 9° and 10°.
“You can see the subtle influence of the changing orbital geometry in these images,” Marshak said. “But the most obvious changes—the apparent location of the continents—are due to Earth’s tilt.”
EPIC’s vantage point offers a perspective that makes it easier to understand and visualize why Earth has seasons, but after more than a decade in space, the mission has also opened up new approaches to understanding and observing how daily and seasonal cycles play out on a planetary scale. It has collected more than a decade of diurnal and seasonal data on many key features on Earth, including vegetation, clouds, ice, snow, UV radiation, ocean color, and aerosols.
NASA Earth Observatory image by Michala Garrison, using data from DSCOVR EPIC.Story by Adam Voiland.
Downloads
December 21, 2023 March 19, 2024 June 20, 2024 September 22, 2024
Last week TypeSafe AI unveiled Jev, their first example of a new category of model that they are calling "System One models" (I'm with Maggie Appleton, I think "decision models" is a better name for these). Jev is an interesting variant on the usual LLM format: it still accepts text inputs, but instead of text output it returns floating point numbers corresponding to categories, yes/no questions, ratings, and associated confidence scores.
TypeSafe describe Jev like this:
Think of Jev as a frontier-intelligence function call: unstructured state in, typed probabilistic decisions out.
It's also very fast, and really cheap. Regular LLMs are priced in terms of input and output tokens, with output generally charged at significantly higher rates. Jev charges only for input - output is free - and the input price of their first model is $0.042 per million tokens - cheaper even than OpenAI's GPT-5 Nano ($0.05/million).
Jev lets you ask questions about text or semi-structured data. You compose a "state" object containing a string, array of strings, or set of name-value pairs - this might describe an article, or a customer, or any other kind of record. You then send that to their API with one or more questions, and get a reply back for each.
You can ask three kinds of questions:
Yes/No questions, which Jev calls "Noul" questions - their CEO confirmed on Hacker News that this is short for Bernoulli, from the Bernoulli distribution. You pose a statement and get back a floating point number between 0 and 1 for how confident the model is that the statement is true.
Choice questions, where the model picks one from a set of provided options - actually a confidence score plus a probability distribution across all of the options.
Score questions, where you provide sequence of numeric levels with descriptions and it provides a floating point score somewhere along that range.
The Jev API can accept a single document ("state") and as many questions as you can cram into the context window. Questions are evaluated in parallel, so sending many questions should take a similar time to sending just one.
I think the decision model framing is useful for understanding where to use Jev. It's great for anything that can be expressed as a classification task - think spam detection, suggesting labels, prioritization and ranking.
I've also been experimenting with it for search reranking, where you fetch 100 likely matches using an inexpensive algorithm like BM25, then have Jev score those 100 candidates for relevance against the original query.
Black boxes are back in fashion
Something I've found a little uncomfortable about Jev is how it very much represents a regression even further towards black box machine learning systems.
LLMs are black boxes already - you can ask them to justify their decisions, but you can't guarantee that what they say is useful or accurate.
Jev doesn't even give you that: put in all the text you want, the only thing you're going to get back is a floating point number. If Jev marks something as spam, which content signals tipped it off?
This also means that concerns about bias should be front and center. I really hope nobody uses Jev to rank job applicants - that floating point number could conceal all manner of unseen bias baked into the models, and experimentally picking that bias apart is going to be a tricky business.
(I tried one experiment where I had Jev score every city in the San Francisco Bay Area on a yes/no answer to whether they were a "Good city?" - it rated Cupertino top and East Palo Alto bottom. Huh.)
In practice, this all means that evals and structured experiments are even more important than they are for regular LLM projects. Thankfully, Jev is so cheap that running hundreds or even thousands of experimental prompts through it costs just a few cents.
Unconventional uses for Jev
It's been really fun watching the wider community come up with potential use-cases for Jev over the past few days. Here are some creative ones that caught my eye:
jevchat by Kyle Pena turns Jev into a (terrible) chat model. "At every step it asks Jev one question: Given the user's question and the reply written so far, which symbol comes next?". ericpruitt on Hacker News: "It's the digital equivalent of Morty speaking with the death crystal".
jev-leftpad by Fatih Kadir Akın implements left-pad with the prompt "How many spaces are needed before value to reach targetLength?" and a choice query allowing options from "0 spaces are needed" to "10 spaces are needed".
There's also been a flurry of projects attempting to create a model like Jev using on top of open weight models. Kev is one interesting example, using Qwen 3.5 to produce 0.8B, 4B, and 9B models. Here's the accompanying Hacker News thread, where someone linked to a JevBench benchmark that has already cropped up to compare "Jev-class decision models".
Given Jev was released just under a week ago, the amount of activity around it is extremely impressive.
After a two year preview, Cloudflare's support for running Python code in their server-side Workers platform is now stable: "Python is now a first-class, fully supported language on the Cloudflare Developer Platform".
A neat thing about this is how it works. Cloudflare are running Python compiled to WebAssembly via Pyodide in their V8-based workerd runtime.
This comes with some limitations, documented here - most notably both multiprocessing and threading are non-functional in the WebAssembly VM.
One particularly interesting detail of this is the local development environment story - their pywrangler development tool (confusingly packaged as workers-py on PyPI) runs a full local simulation of their stack, including executing code with Pyodide in WebAssembly in V8 in a 123MB workerd binary, which for me ended up in node_modules/@cloudflare/workerd-darwin-arm64/bin/workerd.
Python Workers represent a significant investment in the wider Python ecosystem by Cloudflare. The release announcement is credited to Gyeongjae Choi, Dominik Picheta, and Hood Chatham - Gyeongjae and Hood are both Pyodide core maintainers.
This article entirely misses the value that MCP brings today.
Sure, there's almost no reason to use MCPs if you are running a full-blown terminal agent (Claude Code, Codex, Meta Muse, OpenClaw etc) with unfettered internet access - just let it call APIs directly.
If you want to operate something that's less YOLO than that, you'll find yourself wanting:
Control over exactly which external services it can access
A way to handle authentication that doesn't allow the agent to directly access API keys
A sensible UI to allow users to connect and authenticate further services
Strong audit logging for what's going on
MCP makes all of that so much easier to provide.
Thinking MCP is obsolete because full coding agents don't need it misses out on all of the other things we might want to build.
Up very betimes by break of day, and got my wife up, whom the thought of this day’s long journey do discourage; and after eating something, and changing of a piece of gold to pay the reckoning, we mounted, and through Baldwicke, where a fayre is kept to-day, and a great one for cheese and other such commodities, and so to Hatfield, it being most curious weather from the time we set out to our getting home, and here we dined, and my wife being very weary, and believing that it would be hard to get her home to-night, and a great charge to keep her longer abroad, I took the opportunity of an empty coach that was to go to London, and left her to come in it to London, for half-a-crown, and so I and the boy home as fast as we could drive, and it was even night before we got home. So that I account it very good fortune that we took this course, being myself very weary, much more would my wife have been. At home found all very well and my house in good order. To see Sir W. Pen, who is pretty well, and Sir J. Minnes, who is a little lame on one foot, and the rest gone to Chatham, viz.: Sir G. Carteret and Sir W. Batten, who has in my absence inveighed against my contract the other day for Warren’smasts, in which he is a knave, and I shall find matter of tryumph, but it vexes me a little. So home, and by and by comes my wife by coach well home, and having got a good fowl ready for supper against her coming, we eat heartily, and so with great content and ease to our own bed, there nothing appearing so to our content as to be at our own home, after being abroad awhile.
A little over a week ago Donald Trump, who has made many unreasonable demands on Volodymyr Zelenskyy, the Ukrainian president, added a new one:
Mr. Zelensky has to do one thing. He has to stop knocking out diesel fuel in Russia. Let him go after targets but not diesel fuel, because he’s causing a shortage of diesel fuel.
Even for a New Yorker, the chutzpah was striking. For those not familiar with the term, chutzpah is when you murder your mother and father, then plead for leniency because you’re an orphan.
Trump has effectively created this situation by cutting off all aid to Ukraine, while in addition denying the Ukrainians even the ability to buy Patriot interceptors. Those missiles would have allowed them to fend off Vladimir Putin’s relentless missile attacks on civilian targets. Trump’s actions were clearly intended to leave Ukraine defenseless. But the Ukrainians — with help from the democracies of Europe — have survived, responding to Putin’s attacks by using their own, home-grown, drones and cruise missiles to make effective strikes against Russia’s energy infrastructure.
Now Trump, having already betrayed Ukraine to Putin, is demanding that Zelenskyy commit strategic suicide. He wants the Ukrainians to go easy on Russia because the indirect effects of those attacks are hurting Republicans’ prospects in the midterm elections. As I said, chutzpah.
Aside from the outrageous nature of his demands, Trump’s remarks were interesting because they reveal the extent to which refined products, especially diesel, have replaced crude oil as the key bottleneck in the global energy crisis.
I still sometimes see commentators asserting that fears about the effects of Trump’s disastrous Iran war on energy prices were overstated, because the price of crude oil is “only” $102 a barrel, far above prewar prices but well below the $150-$200 range some analysts warned was possible. But nobody burns crude oil; they burn products refined from crude oil, mainly gasoline and diesel. And here’s what has happened to the price of diesel:
Diesel is currently selling at more than $200 a barrel. It’s true that there is always a “crack spread” between crude and diesel, but it’s typically on the order of $20. So the price of diesel is currently roughly what we would normally expect with crude at around $190.
The current world energy crisis, then, is largely a crisis in petroleum products, refined from crude oil, rather than in petroleum itself. And its proximate cause is a global shortage of refining capacity. As an informative report by Matthew Dalton in the Wall Street Journal put it, “Refineries Are Now the Main Chokepoint for Global Energy Supplies.”
Regular readers may recall that I’ve been making this point for a couple of months. And the shortage of refining capacity is, in turn, helping to keep crude prices down. As I wrote last month, “Buyers aren’t willing to pay extremely high prices for oil they can’t refine.”
So, chutzpah aside, is Trump right to attribute high diesel prices to Ukraine’s campaign against Russian refineries? No and yes.
Much of the world’s refining capacity is located in the Middle East, where it has been disrupted by Trump’s war. As Dalton notes,
the diesel blocked in the Persian Gulf is around three times as large as supplies missing from Russia compared with before the Iran war
However, the way refineries have replaced crude production as the world’s main energy chokepoint reflects the fact that refining capacity has been reduced more than crude production. And the disruption of shipments through the Strait of Hormuz has reduced world supplies of both crude and refined products. It’s at least arguable that Ukraine’s air campaign, which has done much more damage to Russia’s refining than to its crude production, has therefore played a disproportionate role in driving up diesel prices.
And expensive diesel is a big problem for the economy.
High diesel prices raise the cost of living, mainly through indirect effects. Relatively few passenger cars burn diesel — but diesel powers almost all large commercial trucks and two thirds of farm and construction equipment. So high diesel prices raise the cost of production across the economy, cost increases that eventually get passed on in the form of higher inflation.
Furthermore, rising diesel prices are even more likely than rising gasoline prices to drive up interest rates.
Why? The Federal Reserve, which sets short-term interest rates, normally focuses on “core” inflation, which excludes volatile food and energy prices. I’ve written many times about the reasons this focus makes sense. And the focus on core inflation typically leads the Fed to “look through” surges in gasoline prices, which affect headline inflation but not core inflation.
However, because surging diesel prices mostly raise inflation indirectly, via producer costs, they drive up core inflation in a way rising gas prices don’t. And this makes it hard for the Fed to avoid raising rates in the face of higher inflation.
One could argue that the Fed should adjust its measure of core inflation to exclude the effects of diesel prices too. But right now the Fed’s credibility is wobbly: It’s under constant pressure from Trump to cut rates, and many people are still suspicious about the motives of Kevin Warsh, Trump’s hand-picked Fed chair. So this is not a time when the Fed can afford to be seen changing its criteria for monetary policy in a way that might weaken its fight against inflation.
Between their direct effect on inflation and their indirect effect on interest rates, then, high diesel prices are an economic problem for America and a political problem for Donald Trump. Ukraine’s strikes on Russia are contributing to that problem. So Trump actually has good reasons to want Ukraine to stop its highly effective air campaign.
But he neither should nor will get what he wants. Remember the chutzpah factor. You don’t get to betray a nation, then demand that it help you politically, offering nothing in return.
Hackers captured a Flock camera and got a look (alternate link) at the software:
While much of the automatic license plate reader’s (ALPR) most sensitive storage remained encrypted and inaccessible, the joint analysis of the recovered data shows that software running on the device explicitly detects people as well as vehicles, license plates, and bicycles. The camera can produce dozens of images of a single passing vehicle and, according to several weeks of recovered logs, generated more than a million images. Its computer-vision software also sometimes isolated bumper stickers and other graphics, including, in one case, an American flag patch on a motorcyclist’s saddlebag.
If you’re wondering how the hackers got by disk encryption, one of the unencrypted partitions contained the key for an encrypted partition. That’s pretty bad security engineering.
Tropical Weather Outlook NWS National Hurricane Center Miami FL 200 AM EDT Tue Sep 22 2026
For the North Atlantic...Caribbean Sea and the Gulf of America:
Active Systems: The National Hurricane Center is issuing advisories on Tropical Storm Fay, located several hundred miles southwest of the Azores.
Far Eastern Tropical Atlantic: A tropical wave is forecast to move off the coast of western Africa by Wednesday. Although environmental conditions are not expected to be particularly conducive, some slow development of this system is possible when it moves west-northwestward or northwestward across the far eastern Atlantic. Interests in the Cabo Verde Islands should monitor the progress of this system as gusty winds and areas of heavy rain are possible there by the end of the week. * Formation chance through 48 hours...low...near 0 percent. * Formation chance through 7 days...low...30 percent.
Tropical Weather Outlook NWS National Hurricane Center Miami FL 1100 PM PDT Mon Sep 21 2026
For the eastern and central North Pacific east of 180 longitude:
Active Systems: The National Hurricane Center is issuing advisories on Tropical Storm Odalys, located well west-southwest of the southern tip of Baja California, and on Hurricane Polo, located a few hundred miles south-southeast of Manzanillo, Mexico.
Southeast of the Hawaiian Islands (Former TD 15-E): The remnants of Tropical Depression Fifteen-E, located several hundred miles southeast of the Hawaiian Islands, continue to produce showers and thunderstorms that are gradually becoming better organized. Environmental conditions are forecast to be conducive for further development, and a tropical depression is likely to form during the next day or two while the system moves slowly west-northwestward or northwestward. Interests in the Hawaiian Islands should monitor the progress of this system. * Formation chance through 48 hours...high...70 percent. * Formation chance through 7 days...high...90 percent.
South of the Gulf of Tehuantepec: An area of low pressure could form in a few days to the south of the Gulf of Tehuantepec. Thereafter, environmental conditions appear favorable for gradual development, and a tropical depression could form late this week or this weekend while the system moves slowly west-northwestward to northwestward, parallel to the coast of southern and southwestern Mexico. * Formation chance through 48 hours...low...near 0 percent. * Formation chance through 7 days...medium...60 percent.
The release of The Savant is back on. A year after Apple TV put
the thriller starring Jessica Chastain on hold three days before
it was slated to premiere on Sept. 26, 2025, the streamer has
rescheduled it for spring, 2027. The exact timing, which is still
being finalized, will make the series eligible for the 2027
Emmys, I hear.
As Deadline reported at the time of the postponement, The
Savant’s last-minute benching was due to its storyline about
preventing extremist attacks and some imagery, including sniper
attacks, that were considered potentially triggering two weeks
after the assassination of right-wing political activist
Charlie Kirk.
The only people who were potentially “triggered” by this would be whoever answers the phone in Cupertino when the White House calls. Variety and Dark Horizons both echo Deadline’s reporting that Apple TV is finally going to air The Savant early next year, but Apple TV’s own press page still lists it as “Premiere Date: Coming Soon”.
Sofia Schwarzwalder, reporting for The Seattle Times:
Since turning 50, the Mariners legend has been inducted into the
Hall of Fame, launched eight homers at the Mariners Alumni Home
Run Derby this summer and, most recently, tossed a 127-pitch
shutout with 17 strikeouts during an annual All-Star Game against
the best high-school girls in Japan. [...]
The All-Star Game took place Sunday at the Tokyo Dome in front of
a reported 25,000 fans. The game also featured former New York
Yankees All-Star outfielder Hideki Matsui. In addition to his
dazzling performance on the mound, Ichiro led off the game and had
a pair of hits.
Speaking to reporters in Japanese, Ichiro said, “I wanted to see
what my current limits were, and this gave me confidence in
myself.”
Recent protectionist changes by the European Union further
effectively exclude U.S. small businesses like mine from selling
to EU customers. It’s a little complicated, but it has to do with
how tax and customs fees are collected and extracted from
low-value packages. This is not a tariff issue, unbelievably, but
one about reducing competition.
The summary:
Delivering items under €150 per shipment into the EU now costs at
least €3 per package, and may require hiring a specialty firm to
manage time-of-purchase tax collection and payment because of the
many differences in filing by EU nation. Shipping prices have
swelled. No shipper currently offers rates close to affordable for
modestly priced items, like books, while properly collecting the
€3+ customs fee.
If these new rules were prompted by Chinese companies like Temu taking advantage of de minimis shipping exceptions (basically by shipping zillions of cheap items one at a time, rather than in bulk), the new rules ought to apply only for items arriving from China.
The hardest part will be getting out of the habit of opening
apps, and remembering that you have Siri. Give it a few tries.
Learn to trust it. You’ll save incredible amounts of time and
fumbling.
I used the beta-test version all summer, growing more and more
excited. Now that the final version is out, I wanted to see how
often it gets things right. It is AI, after all. So I ran it
through 125 tests.
Some of these tasks are things Apple said are possible. Some
ideas, I picked up from people on Reddit trying stuff. Some, I
just wondered if Siri could do. It failed a handful of times. But
a few other times, it absolutely blew me away. It did amazing
things I bet you never suspected Siri could do.
I’ve been using iOS 27 with the new Siri AI since the week after WWDC, and the single biggest problem I have echoes Pogue’s: remembering that Siri is now useful. I keep doing things manually, then thinking “Hey, I should have tried that with Siri...”, trying it again with Siri after the fact, and realizing only then that Siri accomplished the thing.
So let’s not take the bait. Nor overcomplicate. We needn’t spin
our collective wheels spitballing answers to big-picture,
long-term Al-policy questions. We don’t know enough yet. The best
next steps are the concrete ones: Big Al needs to follow all
current laws — just like everyone else. So far — they haven’t.
When Big Al breaks those laws, they must face prosecution and
penalties — just like everyone else. So far — they haven’t. The
state and federal agencies tasked with enforcing those laws need
to apply them to Big Al — just like everyone else. So far — they
haven’t. In short, we have to attend to the basic features of the
rule of law. So far — we haven’t. If we can’t or won’t insist on
that now, then we shouldn’t expect to be able to later.
One of the key arguments for a great power — other than the great power itself wanting to be one — is that they act as a guarantor of stability and the status quo. That is far from the only public or global good. And a great power will ensure that status quo on its own terms and mostly to its own advantage. But if you have any acquaintance with history, you know you can do a lot worse than relative peace and the status quo. Trump’s Iran War has been a bracing illustration of all these realities. Once the great power starts letting things break, those breakages can start multiplying very fast. Eventually you’ll find a new equilibrium, of course. But eventually can take a long time. And again, even a passing acquaintance with history tells us that things can suck without end for extended periods of time.
There’s an interesting New York Times piece from over the weekend that illustrates all these things. We know the outline. But it provides new details. As a knock-on effect of the U.S. war with Iran, the ongoing battle between Saudi Arabia and the Houthi rebel government in Yemen has again become hot. In recent weeks, the Houthis have partly cut off Saudi Arabia’s other path to the ocean. Put simply, the Saudis can export oil through the Strait of Hormuz or the Red Sea. The former has been mostly closed for months. Now the Houthis are in de facto or near control of the second. That’s a big crisis for the Saudis. This is part of the larger U.S.-Iran battle because the Houthis are clients of Iran. And Iran’s core strategy has been to create enough pain for the U.S.’s regional allies that they will force the U.S. to end the war. Remember, each time the U.S. attacks Iran, they respond by attacking the various Gulf emirates.
The de facto leader of Saudi Arabia, Mohammad bin Salman (MBS), has been urging Trump to help Saudi Arabia beat back the Houthis. He’s mainly been refusing them. What the Times story details is that on Thursday MBS called Trump and apparently literally begged him for help, to the extent that Trump gave in and agreed to join the Saudis’ fight. Trump had told his advisors the day before he wanted to stay out. Then MBS convinced him. But by Sunday he was back to wanting to stay out. That’s where things stand. This is an inconstant, impressionable and weak man. This is the nature of personalized rule when the would-be autocrat is in physical and mental decline.
There’s nothing righteous about teaming up with the Saudis in this case. It’s two pretty nasty players who’ve been fighting for years and causing huge civilian carnage along the way. But Trump has been willing to help before. From what I can tell, at least some of Trump’s current resistance is tied to the fact that he’s miffed at MBS for not helping with opening up the Strait. (Put a pin in that for a future post; it’s probably playing a bigger role than we imagine.) But he also doesn’t want more escalation of his politically and electorally disastrous war before the midterms. That pitiful and comical back-and-forth also demonstrates the role of personalism. The U.S. doesn’t really have a policy. It has the mindset and top fears, on any given day, of Donald Trump.
If my narrative above was a documentary, this is where you freeze the shot and say: this is why you think long and hard before you launch a war like this for essentially no reason. Lots of things can go wrong and you may end up needing to do things you don’t want to do and really shouldn’t do. But you have to because you’ve created a set of circumstances where you have no choice.
Here’s another thing to consider. The Saudis have a huge, huge amount of military hardware. On paper, they should have one of the most potent militaries in the world. But it’s always been known or mostly suspected that it’s vastly weaker than the price tag would suggest. U.S. reporting sometimes gives you the sense that the Houthis are some mountain folk on horseback. That’s not true. They control most of the country and have for some time. In practice, they’re an internationally isolated government. But Yemen is still a poor and war-torn country. The fact that the Saudi military can’t prevent them from basically blockading Saudi Arabia tells us the story. The truth is what everyone has always suspected. The Saudis have a paper army (let’s be generous and call it cardboard); when it gets into trouble, they have to call the U.S. Now they’re calling because of a crisis the U.S. started on its own. But the U.S. isn’t helping. And now Saudi Arabia is mostly blocked off from the sea.
Let me be emphatically clear: MBS isn’t some valiant player who has become yet another victim of Trump’s perfidy. He is awful in basically every way you can imagine. And the Saudis’ war in Yemen has been horribly destructive. Tens of thousands of Yemenis have died in the conflict.
But the supply of oil rests on that promise that the U.S. will take care of things if its regional allies — with their generally feeble militaries — get into trouble. The U.S. is now failing that promise two or three times over: by starting the war in the first place, by letting the Gulf kingdoms deal with the blowback on their own. That’s a reality that can’t hold. These patrimony states will either find other protection or build real militaries themselves.
In a way, it is a more brutal and militarized version of the breakdown in relations with America’s NATO and EU allies in Europe. The U.S. has become a chaos power which is not meeting the terms of the regional deal, and the other players are trying to figure out what to do in its place, what Plan B is — only there’s no immediate Plan B available. It’s not that there aren’t any downsides to the U.S. global hegemony or that it doesn’t have its critics. But what we’re seeing here isn’t the U.S. global hegemony being replaced by some more inclusive, less militarized successor. We’re seeing it just disappear. Perhaps Canadian Prime Minister Mark Carney will make some progress with his “middle powers” banding together to create a new and more just world order. But it’s definitely not here yet.
What is telling, of course, is that the Trump White House is filled with people with all sort of culture war hang-ups about Western Europe. They like sticking it to the Europeans, even if they’re not quite clear on the longterm consequences. But the Saudis and the other Gulf emirates are Trump’s guys. They’re supposed to be top oligarchic players in the new Trumpian, regional, spheres-of-influence world. But they’re getting hosed too. And Trump is doing things that will lead to even more chaos and even higher prices down the line because he mostly wants to avoid them in the next six weeks.
Simply put, when dumb leaders do impulsive things and then leave the consequences to others to clean up, things can degenerate really, really fast. And that’s exactly what’s happening.
GM has confirmed it is NOT rolling phone projection to GM EVs.
Instead this announcement is specific to JUST their new gas
powered light-duty pickups, which have always supported Apple
CarPlay and Android Auto.
Comerica Park has had several alternate identities since it became
the Tigers’ home in 2000. Some have called it Comerica National
Park for its spacious dimensions. Some fans simply came to call it
Comerica, or abbreviated it to CoPa, as they grew comfortable with
it over the years.
Starting next year, the Tigers’ ballpark will have a new formal
name: Fifth Third Park.
NASA’s Perseverance Mars rover used its Mastcam-Z camera to capture this 360-degree panorama of “Turquoise Bay,” a geologic area of interest in the “Margin Unit.” The 818 images used to create the natural-color panorama were captured between Oct. 5 and Oct. 16, 2023, the 933rd to 944th Martian days, or sols, of the mission.
Figure A is an enhanced-color version, in which color bands were processed to improve visual contrast and accentuate color differences.
NASA’s Jet Propulsion Laboratory, which is managed for the agency by Caltech in Pasadena, California, built and manages operations of the Perseverance rover. Arizona State University leads the operations of the Mastcam-Z instrument, working in collaboration with Malin Space Science Systems in San Diego, on the design, fabrication, testing, and operation of the cameras, and in collaboration with the Niels Bohr Institute of the University of Copenhagen on the design, fabrication, and testing of the calibration targets.
This paper documents how artificial intelligence has affected stocks and flows in the U.S. labor market. Combining CPS and JOLTS data with AI exposure and adoption measures from OpenAI and Lightcast, respectively, we construct labor force stocks, worker flows, and market tightness by AI exposure and adoption. Since the introduction of LLMs, workers with high AI exposure and adoption have experienced larger declines in job-finding and job-switching rates than other groups, while their within-job activity switching has increased noticeably relative to others. The positive effects of AI on nominal wage growth and hours worked attenuate markedly in the post-LLM period, suggesting that LLM-driven reallocation has operated through within-firm task reorganization and a reconfiguration of labor inputs, alongside weaker demand for workers most exposed to AI. To quantify LLM-driven reallocation pressure, we construct individual-level hirability and separability indices and showthat dispersion in job-finding prospects has risen markedly since 2023, largely driven by the AI factors. The natural rate of unemployment—recovered from the trend components of unemployment inflows and outflows by AI exposure and adoption, as well as from a theoretical model of structural unemployment—is estimated to have risen by about 0.1-0.2 percentage point since the introduction of LLMs, albeit with considerable uncertainty.
2. “[The Mises] library now has a permanent independent home: https://freecapitalists.org/. It holds 945 books, 3,374 journal issues and 2,732 recorded lectures, all free, in PDF, EPUB and MOBI, with the rights recorded per work.”
SpaceX rolled its Super Heavy booster, tail number B21, out to Pad 2 late Sunday night, Sept. 20, in preparation for the launch of Starship Flight 14 no earlier than Sept. 28. Image: SpaceX
SpaceX placed a Super Heavy booster on the launch pad at Starbase in Texas Monday, as it continues testing and preparations for the first planned orbital flight of Starship, scheduled for launch as soon as Sept. 28, pending final approval from the Federal Aviation Administration (FAA).
The Super Heavy booster, with the tail number B21, departed its assembly building shortly before midnight local time and was placed on the launch mount at Pad 2, roughly two hours later. The stainless-steel booster stands 236 feet tall (72 meters) and boasts a diameter of 9 m (29.5 ft). By comparison, a Falcon 9 rocket has a diameter of 3.7 m (12 ft). The downcomer pipe that carries methane fuel down the center of the Super Heavy Booster’s liquid oxygen tank to the Raptor engines at its base is roughly the size of an entire Falcon 9 rocket.
SpaceX hasn’t said whether it intends to perform a fully integrated wet dress rehearsal tanking test of the rocket once assembled prior to the upcoming launch attempt.
As of Monday morning, there were no road closures published for the City of Starbase, suggesting that it may be a day or two at least before the Starship upper stage, tail number S41, is rolled out to join B21.
Although SpaceX is targeting the launch for Sept. 28 at 7:15 a.m. CDT (1215 UTC), it can only proceed once the FAA approves the license modification needed for SpaceX’s orbital flight plan.
This would be the first time that the FAA grants an orbital license for an object the size of a Starship upper stage (171 ft/52 m in height).
If something were to go wrong that prevented Starship making a planned deorbit burn, it could pose a danger during an uncontrolled reentry. Its heat shield and bulk could result in large portions of the craft crashing to Earth. The FAA wants to ensure that the vehicle and SpaceX are truly ready for this next step.
“In addition to completing the environmental review, license applications must also meet FAA safety, policy/payload, and financial responsibility requirements to receive authorization for flight,” the FAA said in a statement.
SpaceX rolled its Super Heavy booster, tail number B21, out to Pad 2 late Sunday night, Sept. 20, in preparation for the launch of Starship Flight 14 no earlier than Sept. 28. Image: SpaceX
Orbital flight is at hand
Depending on when Starship Flight 14 takes place, it very well may be the next Starlink mission for SpaceX and has been given the additional designation of Starlink 31-1. The company recently ceased launches of its V2 mini broadband internet satellites from Florida, but continues to build and replenish its fleet with missions from Vandenberg Space Force Base in California.
SpaceX needs Starship in order to begin launching the larger and more capable Starlink V3 satellites.
During the most recent test flight in July, SpaceX deployed several Starlink V3 satellites along the same suborbital trajectory as the Ship 40 upper stage. Those satellites were able to deploy their solar arrays, capture imagery of the Starship’s heat shield, and briefly connect with the broader Starlink constellation using laser links before they met their planned demise.
View of Starship in space from a Starlink V3 satellite on Flight 13.
This composite is made of imagery from four separate cameras on a single satellite. Six of the satellites were equipped with cameras to scan Starship’s heat shield and transmit imagery down to operators to… pic.twitter.com/sNTHHz5vLr
On Starship Flight 14, SpaceX aims to deploy 26 Starlink V3 satellites into orbit a 171-mile (275 km) orbit, with an estimated orbital inclination of 30 degrees to the Equator.
“Each Starlink V3 satellite will add 1 Tbps of capacity to the constellation, for a total of 26 Tbps of capacity added on this mission alone. That’s ~10x the capacity compared to a single launch of V2 mini Starlink satellites on Falcon 9,” SpaceX said in a prelaunch mission writeup.
“After deploying from Starship, the Starlink V3 satellites will unfold their antennas and deploy their solar arrays and make initial contact with the ground and the rest of the Starlink constellation via radio frequency and laser links. The satellites will then begin raising their orbits with their onboard thrusters. Following their on-orbit checkouts, the satellites should begin serving customers as soon as a few weeks after launch.”
The Starship preparing for our fourteenth flight test completed a full-duration, 60-second static fire with all six Raptor engines pic.twitter.com/DY11p3KVxU
Markdown is becoming source code, not documentation
That Markdown should be checked in to /src, next to the code it produces
Code and tests should be derived from that Markdown, rather than from ephemeral prompts (or at least prompt sessions should eventually turn into persisted Markdown)
In order to supplement my income as a professor at Montana State University, I do consulting on the side. I enjoy consulting and the act of writing code & helping build systems, both for their own sake and also because it keeps my skills relevant and allows me to teach students about the latest ideas in software development.
Obviously the biggest thing to happen in development in the last few years is agentic coding: using LLMs to generate code in lieu of hand coding. I have written a few essays on this topic:
It is starting to feel as if the application logic of the software is being defined and edited as markdown, and the actual code that is generated by the agent is sort of becoming a low-level implementation detail.
Now, as the essays above show, I am ambivalent about AI-generated code. However, my consulting work shows that organizations are headed in this direction, often at terrific speed.
What I want to do in the remainder of this essay is think about the ramifications of Markdown becoming, more and more, the source of truth for software systems.
There is a line of thinking, captured in the quote above, that LLMs are akin to compilers, taking high-level specifications and turning them into low-level implementations. In this view, we don’t need to look at the code an LLM generates, just as we don’t look at the machine code a compiler generates.
As I mention in Code is Cheap(er), I do not totally agree with this analogy for a few reasons, but the one relevant to this essay is: compiler workflows retain their original source code while LLM workflows typically do not.
Today, LLM-generated code is often created via a string of prompts fed into an agent as a developer builds out a feature. In practice, this means that the generated code is the closest thing we have to “ground truth� for that feature. There may be documentation for the feature stored elsewhere (e.g. Linear, Slack threads, wikis, etc.) but, so far as the codebase is concerned, the generated code is the source of truth.
My opinion is that, in professional agentic coding environments, we need to accept that LLM-generated code that emerges from ephemeral prompting sessions is not ideal, and begin moving towards capturing and checking in Markdown alongside generated code in the source directory.
Markdown has many nice properties that make it similar to traditional source code:
It is plain text and therefore diffable, greppable and reviewable in pull requests
LLMs read and write it natively
Humans can read and edit it without tools
And, in fact, it is already acting as source, to an extent, in AGENTS.md, specs, plans, TASK.md and so forth. We just haven’t standardized capturing that source yet.
In Markdown is the new source code, Brody says he keeps his Markdown files in .scratch/research/ and .scratch/plan/ as he works. I have adopted the convention of creating a /tmp directory for similar ephemeral needs.
My proposal is that we promote some of these files to a new directory, alongside our existing source code: /src/md
The Markdown captured in this proposed directory would be lower level than traditional design documents:
It contains architectural decisions
It contains source-level decisions
It contains low-level data design decisions
It is much closer to a specification (although it is not one) than a design document as traditionally managed by a project manager or designer.
Other sources of truth for the behavior of the system can still exist. These sources would provide higher-level and/or “process-oriented� documentation: high-level design documents, issues that need a resolution workflow and so forth.
But the core, current and static intended behavior of the system would increasingly be captured directly in Markdown in the source directory.
I have seen many people online saying that tests are the new specification (or always were). I think there is some truth to that.
However, tests are not a good mechanism for human/agent interaction:
They involve a lot of ceremony, often obscuring what they are testing
They are typically lower level than most humans want to deal with, particularly when understanding a system
Higher-level explanations such as Mermaid diagrams don’t fit naturally into them
I think the following division of labor makes sense:
Markdown sits in /src and is the specification(ish)
Tests sit in /test (or wherever) and are based on that Markdown, providing automated confirmation of correctness
Again, the core idea here is that, rather than generating code and tests from prompts, a developer would work on Markdown in the /src directory, from which the code and tests would be derived.
The Markdown in /src/md sits between a formal specification for the system and high-level design documents.
As with source code, there is a Complexity Budget associated with this Markdown. It will require thoughtful management to keep these documents clean, well-factored and at the right level of abstraction.
Developers should be expected to interact with both the Markdown and the derived code, so synchronizing the two (when appropriate) will become an important skill.
For example, developers will often do subtractive, constraining work on generated code, and those changes may need to be moved back into the Markdown.
I believe that agents should not be used to generate much content in /src/md. This directory should be mainly human authored and curated.
This is necessarily the weakest part of this essay because this is a new idea and I haven’t used it extensively yet. It is me thinking out loud and inviting discussion.
With that said, here is a possible /src/md standard:
src/
md/
README.md # index of all md, entry point for agents
TODO.md # a list of general TODOs open for this module
OVERVIEW.md # a technical overview of this module
features/FEATURE_1.md # a set of feature-specific documents
data/DATAMODEL_1.md # descriptions of data models in the module
api/API_1.md # descriptions of APIs the module provides
infrastructure/INFRASTRUCTURE_1.md # descriptions of infrastructure used by the module
Here the features, data, api and infrastructure directories are all optional; the idea is to divide along different axes to best capture a solid working description of the module’s behavior directly in the /src/md folder.
As code gets cheaper to generate, what remains valuable is the intent behind the code: what it does, why it does it, and what it must not do.
Today that intent is often lost in ephemeral prompting sessions, or scattered across wikis, tickets and Slack threads.
I think that, in the name of locality, we should consider capturing this intent in Markdown and checking it in to /src, alongside the code it produces, where both humans and agents can find it.
I don’t know exactly what the right structure for something like /src/md is yet, and I expect my thinking will change as I (and others) get more experience with it.
But I am fairly confident that Markdown is becoming source code, and that we should increasingly treat it like source code.
Thousands of people gathered outside the John F. Kennedy Center for the Performing Arts Friday evening to protest Trump’s takeover of the building and his threat to shut it down or even demolish it unless his name goes onto the facade. U.S. District Judge Christopher Cooper of the District of Columbia has ordered the board of the center to give 30 days’ notice before making any major physical changes to the building.
Recognizing the leeway the courts have given him over anything that falls under “national security,” Trump this morning decided to take a proactive approach to making sure the courts don’t stop his triumphal arch. He announced on social media:
“At the strong request of the United States Military, and for National Security purposes, I have agreed to convert the magnificent Triumphal Arch, planned since the Civil War Era many years ago, at the Receptive Circle adjoining the Arlington Memorial Bridge, into a top grade Military Complex/Triumphal Arch, to house, store, and have the rapid ability to use large numbers of drones, plus Snipers, on both the roof and plaza areas, and additionally have and hold large quantities of sniper ammunition in storage. There will be no facility like this anywhere in the World. Out of the 59 top cities and Capitals, Washington, D.C., IS THE ONLY ONE IN THE WORLD THAT DOES NOT HAVE A TRIUMPHAL ARCH, but it will now and, by far, the greatest of them all!”
This is the same justification he made for his ballroom where the East Wing used to be. When it became clear that his claim to need an entertainment space up to his aesthetic standards would not fly, he began to claim that the ballroom is imperative for national security. We have since learned that there already is a secure space under the White House, built in secret during President Barack Obama’s administration.
Dan Diamond reported in the Washington Post last Wednesday, September 16, that officials from the National Park Service have agreed that the construction will adversely affect Arlington National Cemetery, the Lincoln Memorial, and several dozen other historical sites, but urged those concerned about historic preservation to sign on to the project through a memorandum of agreement that will stand as approval by noon tomorrow anyway.
The document asserts that the arch is supposed “to celebrate 250 years of American independence by honoring America’s founding principles.” Now Trump says the arch is imperative for “National Security purposes” and will have drones and snipers.
Rebecca Miller, executive director of the DC Preservation League, responded to the request to sign the document: “This is not consistent with NPS practice, NPS regulations, or the intent of the National Historic Preservation Act.”
While Trump suggests he will defend the United States from atop his triumphal arch, our European allies are much more concerned with Russia’s drone strike last Sunday on a passenger train traveling from Kyiv, Ukraine, to Warsaw, Poland. The train was just over a mile—two kilometers—from the Polish border when the drone hit at a border crossing. The drone hit just after a convoy carrying former leaders and high-level diplomats, including former U.K. prime minister Boris Johnson, had passed through.
The train operators were warned of the coming drone and no one was hurt, but European leaders widely interpreted the strike so close to Poland as, in the words of Kaja Kallas, the European Union’s high representative for foreign and security policy, “clearly a message to the western world.”
Poland is a member of the North Atlantic Treaty Organization (NATO). Twelve nations founded NATO in 1949 to resist Soviet aggression. After the Soviet Union collapsed in 1991, NATO’s mission shifted toward crisis management, and then to resisting the aggression of Russia’s president Vladimir Putin.
Over the years, NATO has grown to include 32 countries, 30 of which are in Europe (the U.S. and Canada are the two NATO countries in North America). The success of their collective defense system rests on Article 5 of the North Atlantic Treaty, which states that an attack against any one member of NATO will be treated as an attack against all of them. So a threat to Poland threatens all the NATO countries.
Russia has been pushing NATO countries with what European leaders call “hybrid attacks.” Rather than launching classic military attacks, Putin has been allowing drones to go into NATO airspace, cutting undersea telecommunications networks on which European countries depend, and possibly placing bombs on a train in France.
Russia has been a bad actor for years, destabilizing NATO countries by flooding them with disinformation that affects elections, paying for political parties, bribing politicians, and so on. But the increase in Russian provocations now seems to be related to Putin’s attempt to undercut European support for Ukraine as Ukraine’s drones have brought the war home to Russia’s oil industry and to the Russian people.
In a speech on Wednesday, NATO Secretary General Mark Rutte, former prime minister of the Netherlands, noted that “Russia wants to stop us helping Ukraine—but their actions will only lead us to do more for Ukraine.”
Kurt Volker, who served as U.S. ambassador to NATO under President George W. Bush, told NPR’s Elissa Nadworny that President Trump “has largely looked at all of this and said, that’s a European problem. He doesn’t feel a threat to the United States from Russia, and he doesn’t see a need for the U.S. to increase its pushback on Russia at all.” “I disagree with this,” Volker said. “I think that we have a vested interest in freedom and free people everywhere being safe and prosperous. It creates a better world for us.”
Trump’s stand is interesting in light of news that Russia has been helping Iran in its fight against the United States, sending upgraded munitions as well as satellite imagery and targeting data to hit U.S. forces in the Middle East.
Last week, CNN reported that fourteen Russian spy satellites moved over the Prince Sultan Air Base in Saudi Arabia, used by the U.S., two days before a devastating March 27 attack by Iran. A CNN investigation showed that the spacecraft had access to a large spectrum of data. U.S. officials and international intelligence sources told CNN that the information the satellites gathered helped Iranian forces conduct some of its most precise attacks against American forces and assets.
Two months later, a Russian close to Putin footed the bill for a three-day celebration for Donald Trump Jr.’s wedding to Bettina Anderson. According to Justin Elliott, Brett Murphy, Joshua Kaplan, and Alex Mierjeski of ProPublica, Umar Kremlev spent hundreds of thousands of dollars on the event, held on private islands in the Bahamas.
On Tuesday, September 15, the Department of Justice announced charges against five people working for Russian intelligence “to conduct attacks and murders around the world, including in the United States.” The indictment alleges that a network of Russian hit men has operated since at least 2024 and has recruited U.S. citizens to surveil and murder people, intending to target “all the countries that are helping Ukraine.” As Daniel Boffey and Andrew Roth of the Guardian note, it was an unwritten rule of the Cold War that Russia would not attack people in the U.S. (although Russian agents are widely believed to be behind the murder of U.S. journalist Paul Klebnikov in Moscow in 2004).
On September 16, Congress passed a major sanctions package targeting Russian officials, the energy sector, financial institutions, and the “shadow fleet” of tankers that get around sanctions by using shell corporations and flying under the flags of countries with a loose regulatory system. The measure is named the Lindsey O. Graham Sanctioning Russia and Iran Act of 2026, in honor of the late South Carolina senator.
But on Thursday, September 17, Anton Troianovski of the New York Times reported that Trump is suggesting Putin will be more willing to end his war if the U.S. makes business deals with Russia regardless of whether it stops its assault on Ukraine. In February, Troianovski reported that Gentry Beach, a Texas investor with ties to the Trumps, signed an agreement last fall with one of the biggest energy companies in Russia to develop Alaska’s natural gas resources.
According to a September 14 piece by Dexter Filkins in the New Yorker, the Trump administration has essentially privatized U.S. foreign policy for their own interests. The “generally held view,” a former U.S. official told Filkins, is that Russia has offered administration officials and their allies business deals in exchange for their supporting Russian demands against Ukraine. A classified report a European intelligence agency provided to Filkins lists Trump, his son-in-law Jared Kushner, special envoy Steve Witkoff, former envoy Richard Grenell, and Gentry Beach as people who might participate in any of ten money-making ventures on the table.
The world, and the place of the United States in it, is changing fast. In June, Defense Secretary Pete Hegseth called it “shameful” that European allies did not help the U.S. attack on Iran and said the U.S. would review its military commitments to Europe. On September 17, Dan De Luce, Gordon Lubold, Courtney Kube, and Abigail Williams of NBC News reported that the Pentagon is weighing a plan to pull tens of thousands of troops and weapons, ships, and planes out of Europe despite the warnings of NATO allies about Russia’s increasingly aggressive moves.
In Wednesday’s speech, Rutte outlined what he called NATO 3.0. If NATO 1.0 was the phase of the organization that pushed back against the Soviet Union and NATO 2.0 was the period from then until now, he said, NATO 3.0 is one in which the weight of NATO shifts away from the United States and toward the United Kingdom, Europe, and Canada.
The essay makes for hard reading and I acknowledge NHJ’s courage in writing about her mistakes and the cost to her child. The piece is raw and true when talking about her personal choices, but the larger story in which NHJ embeds her personal history is mostly false. The problem isn’t funding. The failures she documents are failures of management and accountability, not lack of resources. NYC spends upwards of $40k per pupil on average, the highest of any large district in the country. Moreover, schools in NYC with lower-income students get more than the average. PS 307, where NHJ initially sent her child, is currently funded at just over 52k per student, far above the national average.
Nationally, there haven’t been big gaps in funding within states by race or income for decades. NHJ has reckoned with her failing her own child but she has not yet reckoned with the failure of her entire educational philosophy.
The role of ideology in blinding NHJ is dramatic. NHJ’s daughter earns high grades in her math classes but she fails standardized tests. Most parents, especially conservatives, know what that means. The classes are a lie. But NHJ is blinded by ideology and assumes it’s the standardized tests that are biased. It’s only when her daughter demands to go to a better school that she and her daughter confront the truth:
Najya knew very little algebra and had huge gaps in many of the building blocks of math that she should have learned in elementary school, like mastery of long division and fractions.
The confrontation is almost disastrous:
My child’s confidence wilted like an unwatered plant. She started to develop an almost debilitating anxiety around taking tests. She became sullen at school and began to act out. For the first time ever, I got messages from teachers about Najya’s behavior.
Fortunately, Najya battles back and recovers but much more could be said here about the costs of social promotion, DEI and mismatch on the so-called beneficiaries.
Ironically, NHJ invokes the heroic history of Black Americans integrating schools to justify keeping her own child in a segregated one. Painful.
NHJ thought that she and her husband–politically connected, astute people who were not afraid to speak up–could do well for their daughter and the other kids in the school. But in the end she has written a great piece on why voice fails–even a powerful voice–in the absence of the threat of exit. Hannah-Jones could have saved herself some grief and her child a poor education by reading my post The tragedy of Jonathan Kozol.
It’s been said that Ayn Rand’s heroes don’t exist, but her villains do. Case in point. Hannah-Jones says that she and her husband “felt an obligation to make educational decisions based on the collective good.” But she wasn’t just sacrificing herself for her ideology; she was sacrificing her child, who had no choice in the matter. “I don’t think she’s deserving of more than other kids,” she said in 2017. Nearly a decade later, Najya reminded her that in the abstract your child may not deserve more than other children, but she is nevertheless entitled to expect more from you. “Sometimes I wish instead of always thinking about other kids, you would have thought about me.” You don’t have to be a Randian to think that your child should not be sacrificed to the collective good, but it doesn’t hurt.
We had a holiday flat in Walton-on-the-Naze which we used to spend a lot of time at. Around the time we were moving to the opposite side of the country some friends and neighbours there were looking to downsize and rent. So they’ve been our lovely tenants up until now when they’ve moved away.
So we drove over (well, Mary did the driving as usual) on Friday to check the place was fine. It was. hmu if you want a nice two-bed flat with a sea view in a well-maintained block!
On Sunday we drove back (ditto) via the old family home to pick up a lot of stuff. I now have around ten boxes full of a wide variety of things to find new homes for. Items that are too interesting or (not very) valuable to throw away or leave for a house clearance, but that none of us want or need to keep. It’ll take a while.
Brian, left, came home with us and is definitely staying.
§ Interactive Investor are still unable to show the correct price of that “null” fund. Amazing.
On the morning of September 11th, 2001, American Airlines flight 11, and United Airlines flight 175, took off from Boston’s Logan International Airport, only minutes apart. Both were bound for Los Angeles. Neither, of course, ever got there.
The idea of constructing a memorial to the 2001 terror attacks, at the airport from which two of the four hijacked planes departed, was perhaps to be expected. But it needed to be done just right. There’s a fine line sometimes between commemorative and jingoistic. What they came up with, I’m pleased to say, is superb, and ought to serve as a model for such memorials everywhere.
Reached along an ascending pathway that twists upward amidst grass and trees, the main structure is a sort of open-topped glass chapel, inside of which are two vertical slabs, one for each of the two aircraft that struck the World Trade Center — and mimicking the shapes, one can’t help noticing, of the twin towers themselves — engraved with the names of the passengers and crew. There’s one for flight 11, the 767 that struck the north tower, and the other for flight 175, which hit the south tower minutes later.
The glass and steelwork allow the entire space to be flooded with silvery light, creating an atmosphere that’s quiet and contemplative without feeling maudlin or sentimentalized.
There are no flags or any of the crudely patriotic touches one might expect (and dread). It’s everything it should be: beautifully constructed, understated, and respectful.
Officially it’s called the “Place of Remembrance,” and it was built by the Boston-based firm of Moskow Linn Architects, as part of a public competition. The final design was chosen by airline workers, airport representatives, and family members of the victims.
The engraved names are separated into columns of crew and passengers, and the names of off-duty United employees on the flight 175 plate include the small “tulip” logo of United Airlines. This might seem a strange touch, but this memorial was built primarily for the community of people who work at the airport. Among the passengers and crew killed on the two jets were more than a dozen Logan-based employees.
But anyone is welcome, of course, and I wish more people knew about it. Although it’s easily accessible from terminals A or E, it’s not well advertised. It sits on a knoll just to the southern side of the central parking garage, across from the Hilton hotel.
The easiest way to find it is to follow the signs to the ride-share pickup point for terminals A and E. There are two pickup points; go to the one closest to terminal A. Once you step out of the elevator it’s just a one-minute walk around the corner.
An event was held this year on the 25th anniversary of the attacks, during which a sculpted wreath and plaque were added.
Regular readers may recall that I put a visit to Tulainyo Lake on my bucket list a few years ago. Last week I did it.
Impossibly remote, otherworldly beauty, and an enduring mystery. Just how deep was this lake? Wikipedia claims not to know. Measuring it is non-trivial. A worthy challenge.
The skinny: This relatively small alpine lake is about 117 m deep! That makes it the 25th deepest natural lake in North America, and by far the deepest lake on Earth for its size.
In a cleanroom at the Max Planck Institute for Extraterrestrial Physics (MPE) in Garching, Germany, two engineers look up at the heart of MICADO. One of the first instruments that will operate on ESO's Extremely Large Telescope (ELT) in Chile’s Atacama Desert, MICADO will observe the Universe in the infrared, and each slot in this giant rotating wheel carries a different filter that lets light through at different colours or wavelengths.
This so-called Centre Wheel Mechanism was built by the Netherlands Research School of Astronomy (NOVA), part of the MICADO consortium, led by MPE. What makes this photograph so astounding is the sheer scale of the device compared to the engineers working on it, Jeongha Lee and Federico Biondi. In today’s telescopes, a filter wheel is typically a few tens of centimetres across. This mechanism measures about 1.5 metres — an extremely large telescope, it turns out, also demands extremely large instruments.
Size is only part of the challenge. Since MICADO observes at infrared wavelengths, the mechanism has to work at cryogenic temperatures to prevent its thermal glow from contaminating the observations. But materials behave differently at very low temperatures, which complicates the accurate positioning of the optical elements in this wheel. Some of them, like special masks that will be used to observe planets around other stars, need to be placed with an accuracy of just a few microns, which is less than the width of a human hair.
Once in place in Chile, MICADO will image the Universe with a sensitivity comparable to the NASA/ESA/CSA James Webb Space Telescope, but six times sharper. It will pick out individual stars in distant galaxies, characterise planets outside the Solar System, and track the stars orbiting the supermassive black hole at the centre of the Milky Way. For now, though, it is taking shape in Garching, a few hundred metres from ESO’s Headquarters, a whole hemisphere away from the mountain where it will eventually get to work.
“If we are thinking about AI just in terms of how do we cure cancer or get better energy, you can do that without having agentic AI and having it just roaming free in the internet.”
As Roon noted: “this sounds completely incoherent to me”
An agent is a system that can plan, use tools, write code, query data, run experiments, check its own work, and keep going. That is how the work gets done. Treating “agentic” as optional decoration, as if the serious version of AI is a polite chatbot locked in a box while the unserious version “roams free on the internet”, is the kind of sentence you write when you’ve heard the buzzwords and never watched a lab actually use the technology. You do not cure cancer with a model that only answers questions. You cure cancer with systems that can read the literature, propose hypotheses, design assays, analyze results, rewrite the next experiment, and do that loop a thousand times faster than a human postdoc. That loop is agentic. Strip the agency out and you are left with a very expensive autocomplete.
I agree with those points, but my main concern is different. How would we enforce such a prohibition on commercial agents? Set up a Chinese-like firewall that bans Americans from accessing sites with foreign agents? Monitor all those sites over time, so we know which suppliers to ban? Ban VPN as well? Give our government the power to inspect hard drives, in case agentic functions might be embedded there? Set up FBI “phishes,” luring Americans in with the prospect of agent access from abroad, and then arresting them, as we do with child ****?
Something else? How about insisting that all American (and foreign?) web sites set up tough captcha problems, so that agents may not be used (ha ha)?
You might also ask how an AI “agent” is to be defined, after all even O3 had some “agentic” abilities, such as opening up museum web sites to see which exhibits are on. Is it typing things into boxes and filling out forms that is to be prohibited? How much regulation of software would that require, how would that regulation actually occur, and what else would end up being restricted?
I do not think Obama intends to be supporting massive restrictions on freedom of speech and civil liberties. Rather this is a good example of how some political factions will simply have “ideas about what might be good,” without having freedom concerns — or for that matter practicality and civil liberties concerns — center of mind in the first place.
And this would cause the immediate bankruptcy of both Anthropic and OpenAI, right?
I can readily imagine that, upon the advent of agentic AI, we need some significant changes in our cyber laws. Now would be a good time to both commission and also cite some peer-reviewed academic literature on this matter!? That is not an impossible thing to do, yet our public discourse seems oddly resistant to the notion.
Since the start of the satellite record, the Arctic sea ice melt season has lengthened in most decades, particularly in the 2000s (left). Since 2010 (right), the melt season appears to have stabilized. NASA Earth Observatory images by Michala Garrison based on data from Boisvert, L., et al.
For decades, Arctic sea ice has been melting earlier in spring and freezing later in fall, extending the melt season and contributing to widespread ice loss. A new NASA-led study has found that while the Arctic melt season has lengthened dramatically since satellite records began, that trend unexpectedly stabilized around 2010.
The Arctic sea ice melt season is now about 40 days longer than it was in 1979, according to the study. Most of the increase occurred before 2010. Since then, the average melt season length has remained relatively unchanged, despite large year-to-year fluctuations.
Researchers analyzed satellite observations between 1979 and 2023 to track when sea ice begins to melt each spring and refreezes each autumn. They found that the change was driven primarily by sea ice freezing later in the year rather than melting earlier in the spring.
“Previously, there was more of this multiyear ice that didn’t melt away each summer,” said Linette Boisvert, a co-author on the study and ice scientist at NASA’s Goddard Space Flight Center. “Now that the ice is thinner and there’s less of it, there’s a lot more variability.” On average, though, the decline in sea ice thickness and extent that occurred during the 2000s appears to have stopped for the time being.
To understand why, the team examined changes in the Arctic’s energy balance—the net difference between incoming heat from the Sun, atmosphere, and ocean and the outgoing infrared radiation emitted back to space.
During the period of rapid ice loss in the 2000s, reduced ice cover exposed darker ocean water, which absorbed more sunlight. The additional solar energy delayed freezing and helped extend the melt season. In the left map above, the reddest areas mark where the melt season grew fastest that decade, by up to 5 days per year. Much of the Arctic ice today is younger and thinner than the multiyear ice that was once more widespread in the Arctic Ocean, leaving it more vulnerable to variations in cloud cover, storms, and winds.
Since 2010, changing cloud patterns have reduced the amount of sunlight reaching parts of the Arctic Ocean. The result has been a melt season that fluctuates from one year to the next but remains relatively stable over longer periods. The right map above reflects this shift, with the lighter blues and reds showing the more modest rates of change during that decade.
These findings don’t suggest that shifts in Earth’s climate have stopped affecting the Arctic. The region continues to warm nearly four times faster than the global average, and the remaining sea ice is substantially thinner than it was several decades ago. Instead, the study suggests that the Arctic may have entered a new phase, in which annual weather patterns exert a stronger influence on melt season than they once did.
“Melt season length is much more dependent on atmospheric effects,” Boisvert said. “They seem to be playing a bigger role because the ice is generally thinner and more vulnerable to begin with.”
The researchers caution that the apparent stabilization may prove temporary. Thick Arctic ice still exists throughout the year to the north of Greenland and the Canadian Arctic Archipelago. Continued thinning of ice in those regions could trigger another period of rapid sea ice loss, with the potential to further extend the melt season.
For now, the study highlights the importance of continued satellite observations of Arctic sea ice and the energy balance that controls its growth and melting. Whether the recent stabilization represents a lasting change in the melt season or a pause before another period of rapid change remains an open question.
NASA Earth Observatory images by Michala Garrison, using data from Boisvert, L., et al. (2026). Story by James Riordon/NASA’s Earth Science News Team.
Dan Vanderkam: “Over the past few months I’ve been working on mapsnap, a program to automatically georeference old insurance maps. This post explains why these maps are interesting, how mapsnap works, and why this is worth… More
Mapping Tariffs visualizes the impact of U.S. tariffs on Canadian businesses. “Since May 2025, Tara Vinodrai and Karen Chapple have led a team of researchers at the School of Cities to develop interactive mapping and… More
(Lord’s day). Up, and finding my father somewhat better, walked to Huntingdon church, where in my Lord’s pew, with the young ladies, by my Lord’s own showing me the place, I stayed the sermon, and so to Hinchingbroke, walking with Mr. Shepley and Dr. King, whom they account a witty man here, as well as a good physician, and there my Lord took me with the rest of the company, and singly demanded my opinion in the walks in his garden, about the bringing of the crooked wall on the mount to a shape; and so to dinner, there being Collonel Williams and much other company, and a noble dinner. But having before got my Lord’s warrant for travelling to-day, there being a proclamation read yesterday against it at Huntingdon, at which I am very glad, I took leave, leaving them at dinner, and walked alone to my father’s, and there, after a word or two to my father and mother, my wife and I mounted, and, with my father’s boy, upon a horse I borrowed of Captain Ferrers, we rode to Bigglesworth by the help of a couple of countrymen, that led us through the very long and dangerous waters, because of the ditches on each side, though it begun to be very dark, and there we had a good breast of mutton roasted for us, and supped, and to bed.
On April 2, 2025 — “Liberation Day” — Donald Trump imposed high tariffs – ranging from 10 to 48 percent — on imports from virtuallyevery one of our trading partners.With that announcementthe United Statesabruptly turned its back on generations’ worth of solemn international agreements, effectively voiding a rules-based international trading system the U.S. itself had largely constructed.
Although the Supreme Court eventually ruled that most of the tariffs were illegal, the Trump administration reinstated many of them using other dubious legal strategies. Businesses are, to say the least, unhappy about the uncertainty created by these unilateral, unstable actions. However, the consequences of Trump’s liberation tariffs have been very different from what both supporters and opponents originally expected.
Contrary to Trump administration expectations and predictions, there has been no revival of U.S. manufacturing employment, and investment in manufacturing — at least as measured by construction spending — has fallen off a cliff. And import prices, even excluding petroleum, have gone up, not down, belying claims that foreigners would pay the tariffs.
However, the Trump tariffs haven’t caused a recession, either in the U.S. or globally. Nor have they led to a 1930s-style global spiral into protectionism: Retaliation by other nations against U.S. tariffs has been limited, and there has been hardly any sign of emulation — of other nations deciding to follow Trump’s lead by imposing their own high tariffs on trading partners. Instead, a number of countries have made substantial moves to strengthen their trading relations — e.g., after decades of stalled negotiations, India and the European Union agreed to a free trade deal. And Canada, of course, is trying to compensate for its now-troubled relations with the U.S. by becoming an “associate member” of the EU (although nobody quite knows what that might mean).
Yet for me the biggest surprise arising from the Trump tariffs has been the complete absence of a significant domestic political constituency. This failure has been driven home by polling on Trump’s confrontation with Canada, which appears to be nearly as unpopular as his war with Iran.
This is not, I believe, what most economists or political analysts would have predicted. Conventional economic analysis, while arguing that free trade raises real income for a nation as a whole, also suggests that tariffs can nonetheless benefit significant groups within a nation. Moreover, because the beneficiaries from tariffs are often localized and organized while the costs are dispersed, tariff advocates often wield disproportionate political influence. Indeed, one of the main purposes of world trade rules has historically been to strengthen governments’ hands against their own domestic anti-free-trade constituencies.
However, the actual political response to Trump’s tariffs hasn’t followed this traditional model. Rather, support for the tariffs appears to be limited to that segment of the population — around 20 percent — that supports almost anything Trump does.
Beyond the paywall, I will address the following:
1. Why conventional economics says about tariffs
2. Polling on the Trump tariffs
3. Explaining low support I: Value chains
4. Explaining low support II: The service economy and affordability
It has been half a month since I started a new role at a big company. Nobody knows anything here. The specs, code, tests, PRDs, tickets, resolution of those tickets, reports, etc., everything is made by Claude Code. Nobody on my team likes this. They are being forced to ship as much as they can. I have heard multiple times from higher management that pushing code is not a bottleneck, so why are we slow? People are working 12 to 13 hours a day just to press enter. Nobody is reading anything. Everyone, literally everyone, from an L1 to an L7 engineer here is doing the same thing. Talk to Claude.
I've started using Codex Remote to run coding agents on various machines while controlling them from my phone.
Sometimes I use those machines to hack on LLM projects, and occasionally that means I need to configure an API key.
I don't like pasting API keys into agent sessions, so I wanted a way to get those keys onto a machine without pasting them into the ChatGPT app directly.
With this plugin, I can tell Codex to run:
uvx --with llm-keys-ui llm keys-ui --all
Then have it tell me the URL - including local network or Tailscale device IPs - for an interface to save additional API keys.
Then later it can use a command like llm keys get anthropic as part of a shell command when it needs to use a key.
In 1946, George Kennan, who was acting as the head of the U.S. Embassy in Moscow, wrote a message to the Secretary of State, known as the “Long Telegram”. In the Long Telegram, Kennan laid out a theory of how Soviet power could be defeated. He argued that Soviet leaders would always be hostile to the U.S., but that they were also cautious — they wouldn’t recklessly start a world war like Germany had. He also argued that the Soviet system was weak and unstable, and that given enough time, it would collapse from its own internal contradictions. This became known as the doctrine of “containment”, and it ended up being exactly the strategy that the U.S. used to win the Cold War. It took 45 years for the strategy to work and the USSR to fall.
I am certainly no George Kennan. I’ve never lived in China, I haven’t been there in many years, I don’t speak Chinese, and I certainly don’t talk to any leaders there. I’m also not a career diplomat or a professional geopolitics guy of any kind. So although I’m going to write a blog post with the same general goal as Kennan’s Long Telegram, I don’t want to suggest that it’s anywhere near as authoritative or insightful.
But I’m still going to write a post about “how to beat China”, because I think it’s useful to think through these sorts of big strategic questions. This post is also an important follow-up to a series of posts I wrote about geopolitics during the Biden years, about U.S.-China competition:
(There were more, but I figure your appetite for clicking through old posts is limited.)
The basic premise of those posts was that the competition between a China-led New Axis and the U.S. and our old allies — Europe, Japan and Korea, hopefully India, etc. — would define the upcoming era of geopolitics. And my conclusion was that we should use an updated version of the basic strategy we used against the USSR in Cold War 1. I recommended that we should build up economic power within our bloc of allies, establish military deterrence, and wait for China’s internal contradictions to do the heavy lifting of removing the threat.
That strategy was always going to be harder than it was in Cold War 1, because China A) is a lot bigger than the USSR, B) has a better economic model, and C) is a lot more globally integrated. The strategy I recommended was much tighter economic cooperation between the U.S. and a maximally large set of allies, to build up a bloc capable of overmatching even the mighty Chinese manufacturing juggernaut. This is the approach that’s being promoted by experts like Rush Doshi and Kurt Campbell. If you’re interested in reading about how that approach would work, and why it would be helpful, I recommend Doshi’s interview with ChinaTalk:
Anyway, I still think building up an anti-China economic juggernaut would be a great thing to do, and I still think the U.S. would benefit from closer economic integration with its friends and allies. But I think the election of Trump shows why this strategy probably isn’t going to work. The United States is simply too internally divided to engage in the sort of far-seeing, purposeful, smart kind of international competition that we pursued so effectively in the 20th century. Americans care more about fighting other Americans than about fighting the Chinese, and that state of affairs will persist for a while.
Donald Trump’s presidency is an outgrowth of America’s internal divisions; he cares much more about fighting his own internal enemies than about prosecuting international rivalries. He has willfully degraded or torn up America’s key alliances, especially with Europe, and created enmity where friendship once reigned. He has flagrantly trampled on every principle of human rights, mutually beneficial economic cooperation, democracy, and international non-aggression that the post-WW2 U.S.-led international order fought to uphold. He has, in short, made it impossible to prosecute the sort of Cold War 2 strategy that I spent the Biden years advocating.
This doesn’t mean America’s alliance system is necessarily dead forever. As Doshi and Campbell pointed out in a recent article, the old alliances could be reconstituted, if America credibly overcame its internal divisions and returned to being the mostly unified, stable, reliable great power that it was last century. But overcoming those divisions is going to take decades at the very least, and that’s exactly the window of time during which China will be at its peak of relative power.
So I think we’ve basically missed the chance to use that strategy effectively, and I’ve recalibrated my thinking. This post is meant to explain my recalibration. I do think there’s a path to defeating Chinese power, but it doesn’t look like what I previously had in mind.
Who is “we”, what does it mean to “beat” China, and why should we even care?
Before getting to the question of how to beat China, we need to answer the questions of who and why should do this “beating”. In 2024 the answer was obvious — the U.S. and its erstwhile allies still represented a far more liberal power than China and its allies, so ensuring that the former was more powerful than the latter would further the cause of global liberalism. China threw minorities in concentration camps, threatened its neighbors with invasion and war, supported Russia’s invasion of Ukraine, and repressed free expression all over the world. That was — and is — behavior worth resisting.
Trump has thus forfeited America’s claim to moral superiority over China. It’s true that Trump and his ragtag movement are far less competent than the Chinese Communist Party, but that doesn’t mean that increasing American power will lead to a more liberal world. At this point, it probably won’t. And of course Democrats will try to undo some of Trump’s geopolitical shifts, but if past experience is any guide, they will have only marginal success. Moreover, the GOP is not going to revert back to Reaganism after Trump leaves office; they will keep fighting for their illiberal visions both at home and abroad for a long time to come.
None of that means, however, that liberalism as an idea is dead. Europe, Japan, and many other countries that were on America’s side in the Cold War still uphold the basic ideas of democracy and human rights, as do many developing nations. The average person living in Tokyo or Paris or Bangalore still enjoys far more personal freedom and dignity than does the average person in Shenzhen or Shanghai.
And even leaving aside the relative merits of different social and governmental systems, there are plenty of people in plenty of countries who simply don’t deserve to be trampled on by the bootheel of the CCP. Japanese people, Indians, Filipinos, Koreans, and so on deserve to be able to determine their own destiny without being subject to the whims of the powerful men in Beijing. And Ukrainians, Estonians, Poles, etc. deserve to be free from the Russian tyranny that China quietly backs.
So when I say “how we can beat China”, what I actually mean is how we can keep China from dominating other countries. This doesn’t mean we should try to make China collapse, or impoverish the Chinese people, etc. Instead, it just means how smaller nations — and nations who value human rights and democracy — can resist Chinese power.
And at some point, if the U.S. ever does manage to tamp down its internal divisions and return to being a liberal power, it will still mean the same thing.
General Motors is reversing course after having begun to remove
Apple CarPlay from its vehicles, showing off instead a redesigned
infotainment interface for the 2027 Chevrolet Silverado and GMC
Sierra pickups that melds the smartphone apps with the truck’s
native vehicle controls on the same screen.
The new system, which will roll out later this year, marks a
significant walk-back after the automaker faced widespread
criticism for removing Apple CarPlay and Android Auto from its
Ultium-based electric vehicles beginning with the 2024 Chevrolet
Blazer EV.
One of the dumbest own goals in recent memory. Tesla gets away with not supporting CarPlay because they created their own system that’s so good that many Tesla owners prefer it, or, at least find it good enough as an alternative. GM tried to replace CarPlay with a system that no one liked.
He takes the same “this is pretty much exactly what Apple used to label an ‘S’ year” angle I did, so, unsurprisingly, I think his review is spot-on. Brownlee emphasizes one point that I should have, but didn’t: according to Apple’s published specs, the regular iPhone 18 Pro gets longer battery life than the iPhone 17 Pro Max. That’s just a year-over-year spec that anyone can understand, for an attribute that everyone cares about.
Sidenote, per that point: Brownlee wonders why Apple still refuses to publish the capacities of iPhone batteries in mAh. We eventually find out when people take new iPhones apart, so why not publish the numbers? Brownlee only mentions batteries but I’ll point out that Apple still does the same thing with RAM. There is no spec on the tech specs page for any iPhone telling you how much RAM it has. In some ways this is a little silly, but the way Apple thinks about it is that they only publish specs that they think are useful for comparison. Storage is useful for comparison, so Apple dutifully publishes storage capacities. In fact that is the spec by which they price higher tiers. Battery life is useful for comparison, so Apple publishes that as a spec, based on multiple use cases. But mAh capacity of the battery, to Apple’s mind, isn’t useful for comparison. Not for comparison to Android phones, especially, and not even for comparison to other iPhone models. If they published a spec that says iPhone A has a 4,000 mAh battery and some Samsung phone has a 5,000 mAh battery, one could conclude that the Samsung phone “wins”. Obviously a bigger battery leads to longer battery life, but battery capacity alone doesn’t tell the battery life story for any device. The main reason that the year-over-year iPhone Pro battery life has improved so much that the regular iPhone 18 Pro gets longer battery life than the 17 Pro Max isn’t related to battery size — it’s the increased efficiency of the A20 Pro SoC (and perhaps secondarily the improved thermal system). Same thing for RAM. To Apple’s mind, iPhones perform much better with less physical RAM than Android phones do, so they don’t think RAM-vs.-RAM is a useful comparison. In fact, they think looking at RAM would be misleading. So they don’t publish it. They know that those of us who care are going to learn how much RAM is in these phones (12 GB, just like last year’s 17 Pro models), and how big the batteries are in mAh. But they’re only going to list the specs that they think are useful for comparison purposes.
In 2016, I removed Google Analytics from this blog to avoid being
complicit in feeding the biggest machine for harvesting personal data. Instead,
I relied on GoAccess to analyze my server logs.1 For the past couple
of years, the statistics have made no sense, despite my attempts to filter bots:
AI scrapers inflate the number of visitors to around 2,000 per
day. Eventually, I settled on GoatCounter, an open-source, privacy-friendly
web analytics platform. I replaced the JavaScript client to filter bots more
aggressively and added a CSS fallback. To improve reliability, I implemented a
local proxy running on each of the five web servers serving this blog. The rest
of this post details how these pieces fit together and how I deploy them on
NixOS. ❄️
GoatCounter does not collect personal data: instead of storing the reader’s
IP address or relying on cookies, it creates a session identifier valid for 8
hours from the user agent and the IP address. Its feature set is modest but
sufficient for a blog. If you want to look at the interface, GoatCounter’s
author runs a public instance for his site. A hosted
version lets you try it before running your own instance. With a single binary
and an SQLite database, GoatCounter is one of the lightest self-hosted
solutions. Privacy-friendly alternatives, in increasing order of complexity,
include Umami, Plausible, and Rybbit.
Custom JavaScript client
GoatCounter includes a small JavaScript client—2,189 bytes minified and
gzipped. It ships some features I don’t use: a visitor counter, tracking clicks,
configurable settings, etc. I replace it with this function to register a hit:
If a reader has disabled JavaScript in their browser, I record the hit using a
CSS image. The :hover pseudo-class loads it only after an interaction, another
trick stolen from Bear Blog. About 2% of my visitors fit into this
bucket.3
<!DOCTYPE html><htmllang="en"class="nojs"><head><script>// The JavaScript code for this blog requires ES6if("noModule"inHTMLScriptElement.prototype)document.documentElement.classList.remove("nojs");</script></head><body><!-- ... --><style>.nojsbody:hover{border-width:0;border-image:url('/count?p=/en/blog/2026-kpi-goodhart&t=Building...&r=NoJS&e=false');}</style></body></html>
Where GoAccess reported around 2,000 visitors a day, GoatCounter counts fewer
than 200 humans.4 I assume AI scrapers use a low-effort approach: if the
content is available without barriers, as on this blog, they don’t spawn a
complex mechanized browser that could trigger a page view. Even crawlers running
JavaScript, like Googlebot with its headless Chromium, do not
interact with the page and never trigger the events I listen
to. The interaction-based “proof of humanity” I use is likely to keep working.
Local proxy
Five servers across the world in Europe and in North
America serve the content of this website, but GoatCounter runs on only
one of them. To avoid losing track of visitors when GoatCounter is down, I run a
local proxy listening on the same /count endpoint. On each server, it stores
the hits in memory with a buffer large enough to survive several days of
downtime. It sends them in batches to the upstream backend using the
/api/v0/count authenticated endpoint.
I proposed the code for the proxy in pull request #909. GoatCounter’s
maintainer declined to maintain so much code for such a niche use case. As a
fellow open-source developer, I often hold the same position for my own
projects: a one-time contributor effort may translate into a long-term
maintainer commitment.
I expose the endpoint for the proxy on the domain of this website to evade ad
blockers. This sounds like I don’t respect the reader’s choice, but as
GoatCounter is privacy-friendly, I find it acceptable.
My web servers run NixOS, a declarative Linux distribution with built-in
configuration management. I manage this small fleet with Colmena, a
stateless deployment tool for NixOS. My configuration is available on
GitHub.
Deploying applications in containers
For better isolation, each application runs inside an ephemeral lightweight
container, powered by systemd-nspawn. Each container runs a stripped-down
NixOS instance. A module wraps NixOS’s containers options to
avoid repeating the same options for each application.5 The containers
share their network namespace with the host: the additional isolation is not
worth the increased complexity. For a smaller footprint, I also disable a few
non-essential services.
{ config, lib,...}:letcfg= config.luffy.containers;in{# User-configurable settings for our custom module
options.luffy.containers= lib.mkOption {default={};description="Ephemeral containers sharing the host network.";type= lib.types.attrsOf (lib.types.submodule {options={config= lib.mkOption {type= lib.types.deferredModule;default={};description="NixOS configuration of the container.";};};});};# Translate our options to NixOS containersconfig={containers= lib.mapAttrs
(name: container:{ephemeral=true;autoStart=true;privateNetwork=false;extraFlags=["--resolv-conf=replace-host"];config={imports=[ container.config ]; networking.firewall.enable=false;
system.stateVersion= config.system.stateVersion;
systemd.services={ console-getty.enable=false; systemd-logind.enable=false; systemd-oomd.enable=false;};};})
cfg;};}
To configure a GoatCounter instance running in a container and listening on
127.0.0.4:8088, we import the module6 and declare the container in the
config.luffy.containers attribute set:
As the containers are ephemeral, we need to keep persistent data in directories
on the host. We add a mounts option and ask NixOS’s containers to expose the
configured directories through the bindMounts option.
{ config, lib,...}:letcfg= config.luffy.containers;in{
options.luffy.containers= lib.mkOption {type= lib.types.attrsOf (lib.types.submodule {options={mounts= lib.mkOption {type= lib.types.listOf lib.types.str;default=[];description="Host directories mounted read-write at the same place.";};};});};config={containers= lib.mapAttrs
(name: container:{bindMounts=
lib.genAttrs container.mounts (path:{hostPath= path;isReadOnly=false;});})
cfg;};}
For example, to persist GoatCounter’s database in the /var/db/goatcounter
directory on the host, we add the directory to the mounts option and alter the
service definition to tell GoatCounter where the database is.
A container may also need some secrets. Colmena can upload secrets without
storing them in the Nix store. We add a keys option to our containers. It
takes an attribute set mapping secret names to the commands to populate them.
Then, the module declares the required secrets to Colmena in the
deployment.keys option, makes the container depend on the presence of the
secrets, and exposes them to the container.
{ config, lib,...}:letcfg= config.luffy.containers;in{
options.luffy.containers= lib.mkOption {type= lib.types.attrsOf (lib.types.submodule {options={keys= lib.mkOption {type= lib.types.attrsOf (lib.types.listOf lib.types.str);default={};description="Secrets, as a command to run locally. They are mounted in /etc.";};};});};config={# Colmena uploads each secret in `/var/keys` and make them available# to the group "keys".
deployment.keys= lib.concatMapAttrs
(_: container: lib.mapAttrs
(_: keyCommand:{inherit keyCommand;group="keys";permissions="0640";destDir="/var/keys";})
container.keys)
cfg;# The container can only start if the required secrets are available.
systemd.services= lib.mapAttrs'
(name: container:letunits=map(key:"${key}-key.service")(lib.attrNames container.keys);in
lib.nameValuePair "container@${name}"{requires= units;after= units;})
cfg;# Mount each secret inside the container.containers= lib.mapAttrs
(name: container:{bindMounts= lib.mapAttrs'
(key: _: lib.nameValuePair "/etc/${key}"{hostPath="/var/keys/${key}";isReadOnly=true;})
container.keys;})
cfg;};}
For example, GoatCounter needs credentials to download the GeoIP database. I
provide a local command to fetch the secret from my password manager and expose
it inside the container through the /etc/goatcounter.env environment file.
I wrote a NixOS module to encapsulate GoatCounter: the
container definition, the service definition, and the secrets. The module
accepts the following options: package, serve.enable, serve.listenAddress,
serve.port, and serve.databaseFile. I already detailed the container
configuration in the previous section. In the end, I chose not to reuse the
GoatCounter module from NixOS: it’s small, so it’s better to insulate my module
from unexpected future changes.
{ config, pkgs, lib,...}:letcfg= config.luffy.goatcounter;databaseDirectory=builtins.dirOf cfg.serve.databaseFile;chown="${pkgs.coreutils}/bin/chown -R";in{
config.luffy.containers.goatcounter={
config.systemd.services.goatcounter={description="GoatCounter Web Analytics";wantedBy=["multi-user.target"];serviceConfig={EnvironmentFile="/etc/goatcounter.env";SupplementaryGroups=["keys"];DynamicUser=true;Restart="always";ExecStart= lib.escapeShellArgs [(lib.getExe cfg.package)"serve""-listen=${cfg.serve.listenAddress}:${toString cfg.serve.port}""-tls=none""-db=sqlite+${cfg.serve.databaseFile}""-automigrate"];# Transfer database ownership to dynamically assigned user "goatcounter".ExecStartPre="+${chown} goatcounter:goatcounter ${databaseDirectory}";ReadWritePaths= databaseDirectory;};};};}
The following snippet configures GoatCounter to listen on 127.0.0.4:8088:
The same NixOS module configures the local proxy, with the
following options: proxy.enable, proxy.listenAddress, proxy.port, and
proxy.site—the site receiving the batches of page views. The local proxy has
no persistent data, but it needs the API key to authenticate to the main
GoatCounter instance: its container uses the keys option but not the mounts
option.
{ config, pkgs, lib,...}:letcfg= config.luffy.goatcounter;keyCommand= _:["…"];in{
config.luffy.containers.goatcounter-proxy={ keys."goatcounter-proxy.env"= keyCommand "GOATCOUNTER_API_KEY"; config.systemd.services.goatcounter={description="GoatCounter Proxy.";wantedBy=["multi-user.target"];serviceConfig={EnvironmentFile="/etc/goatcounter-proxy.env";SupplementaryGroups=["keys"];DynamicUser=true;Restart="always";ExecStart= lib.escapeShellArgs [(lib.getExe cfg.package)"proxy""-site=${cfg.proxy.site}""-listen=${cfg.proxy.listenAddress}:${toString cfg.proxy.port}""-ratelimit=10/1"# 10 requests per second per IP];};};};}
For each server, I enable the local proxy with the following snippet. The
nginx configuration shown earlier exposes the /count endpoint under the same
domain as my blog.
Litestream is a streaming replication tool for SQLite databases. It
compresses the changes committed to the write-ahead log (WAL) next to the
database and sends them to a remote destination. I encapsulate its configuration
in a NixOS module, which takes an attribute set databases
mapping a name to the path of the database to back up.
Litestream also runs in a container. I mount the databases to replicate, as well
as the secrets to push the backups to a Hetzner storage box using SFTP:
We can restore the database from the backup with a few shell commands. First, we
stop the containers. Then, we move the damaged database away, invoke litestream
restore from the right environment, and restart the containers.8
Ten years after removing Google Analytics, JavaScript-based analytics is
back on this blog, but without storing cookies or IP addresses, and without
involving a third party. I still write for myself first, notably because it lets
me dig into a topic and refer back to it years later. But knowing a bit more
about my fellow human readers is a nice bonus, even the ones disabling
JavaScript. 🐐
Nginx scrambles IP addresses before storing them, thanks to the ipscrub
nginx module. ↩
GoatCounter already filters some bots based on the user agent or the IP
address. But AI scrapers lie about their user agent and hide behind
residential proxies. ↩
Without JavaScript, I cannot send the real referrer. I insert “NoJS”
instead. ↩
I am missing the humans reading the RSS feed. I am not comfortable adding a
tracking pixel, and bots are likely to fetch it, compromising the
statistics. I’ll live without counting these readers. ↩
A NixOS module is a function receiving the configuration of the whole
system as config and returning three attributes:
imports adds other modules to import,
options declares user-configurable settings, each with a type and a default value, and
config sets values for options declared by any module, like containers from NixOS.
If a module does not need to declare options, you can return the config attribute
set directly. When a module does not require any argument, you can define it as an attribute
set instead. ↩
Most of the time, you don’t need an explicit import. NixOS automatically
imports the modules shipped with Nixpkgs. For my own
modules, some machinery also imports them automatically. ↩
Litestream warns against using the auto-recover option as
it can cause data loss. But I don’t properly monitor my servers and I prefer
uninterrupted backups to a slight chance of losing the last few records. ↩
In my case, the process is slow: around 20 minutes for a 20 MiB database.
You can test by restoring to a copy with the -o option, but you still need
to stop the Litestream container. ↩
It is excellent. It has one of the best user interfaces I have seen on any product. The model is good and the speed and clarity exemplary. It integrates with your calendar and email, if that is want you want, very easily and smoothly. It all feels very…American.
One of the interesting challenges of the AI ecosystem in 2026 is that new,
effective patterns emerge faster than I can adopt them. I’ll find a handful,
get back to work, and realize a month later that I’d missed four or five more.
The adoption cycle for Imprint this year has been something like:
January: get every engineer onto Claude Code every single day
March: ok, let’s also get everyone else onto Claude Code or Claude Cowork every single day
April: local development is bottlenecked on checkout and worktree model,
instead create ~10 local workspaces which each have an independent checkout of every repository,
and operate at the workspace level, not at the repository level, so it can generate cross-repository
pull requests across frontend, backend, infrastructure and data monorepos
June: oh boy, agent-driven development is heavily constrained by lack of a common task management
system with higher visibility and less permission complexity than Jira,
so let’s migrate the entire company over to Linear and hard stop on Jira
July: yikes, now we have visibility into all these tickets, many of them are trivial
but managing them through local development isn’t scaling, let’s roll out an orchestrated harness
which internally we call “Agent Fleet”,
along the lines of Stripe’s Minions
The most recent question for me has been figuring out how to adopt the software factory pattern.
(After some light research, the specific AI-context origin of this term is slightly messy to
attribute, but I think it might be Justin McCarthy in February 2026’s
Software Factories And The Agentic Moment.)
The software factory pattern is looping on a broad goal, and then relying on the harness to
drive progress towards that goal. Our first pass at implementation is fairly basic:
An agent skill /linear-project-loop which reads in a Linear project and starts by auditing
that project’s goal definition on these dimensions:
An RFC in Notion that describes the project’s goals, how those goals are measured, and the general approach
A Datadog dashboard or Snowflake queries that measure progress against those goals
If those are missing, or the Linear project is missing in its entirety, it iterates with you on creating those missing tools.
Then it reviews the state of the metrics and issues for the project.
If new work is identified, it adds those issues to the project.
It updates the state of issues that have moved.
It works on the non-blocked tasks based on the project’s current state. This is often writing a pull request, updating a pull request, pinging for review, asking
a clarifying question, etc.
When a task completes, if the project description is fresh, it takes on the next task.
If the description hasn’t been updated in a while, it reruns the loop starting with the first step.
Right now I am running this locally in a local harness, but it’s working well enough that I anticipate
moving the behavior to be driven by the same orchestrated harness that we assign one-off tasks to.
What I particularly like about the factory pattern is that it parallels very closely how I’ve been working locally,
while forcing me to recognize the places where I was accidentally hording parts of the state for myself regarding
the goals of the project. I was already asking agents to iterate on specific Linear projects, but they didn’t
have the ability to evaluate if they were going in the right direction, or if it was missing necessary tasks.
Now it does.
The other place this has been extremely helpful for me is checking in on projects post release.
For example, I shipped our passkeys implementation earlier this year, but some months go by without my checking in
on how it’s going. If we saw adoption spike, or error rates start to turn, I might miss it, but running the
factory in a less frequent post-release mode would catch it immediately.
The final thought that’s been interesting to me is how much all of the pieces here compound only to the extent
that you have the other pieces. For example, this factory pattern depends on having Datadog MCP and Snowflake access available
to manage goal-tracking, but it also depends on Linear being the single source of state for the company’s work,
and an orchestrated harness that can perform work independently from your laptop. Keeping up with this
many migrations is a fascinating industry moment.
On September 19, 1676, three hundred and fifty years ago today, Nathaniel Bacon and his followers burned Jamestown, the capital of the Virginia Colony. The destruction of the seat of government was the culmination of a year of conflict between Governor Sir William Berkeley and poor settlers in the colony. Fears of another such uprising in the future led Virginia lawmakers to make sure poor men would not make common cause, passing laws to divide them along racial lines.
The crisis had begun a year before, in the fall of 1675, when Thomas Mathew refused to pay members of the Doeg tribe what they believed they were owed for goods they had sold him. They raided his farm on the Northern Neck of Virginia, taking some of his pigs. A number of Doegs were killed in the skirmish.
The Virginia militia retaliated for the raid but mistakenly fell on a village of Susquehannocks, who were actually allied with the Virginia government. Blindsided and furious, the Susquehannocks began to raid local farms.
The raids set a smoldering power struggle within the colony ablaze.
Since the colony’s beginning in 1607, both English custom and the drive to produce cash crops had created a clear line between men who had land and power and those who worked for them. Horrific death rates made those men who had paid for the passage of workers from England to North America drive them hard to get as much labor out of them as possible before they died.
After the arrival of Africans to the colony in 1619, those enslaved people joined indentured white workers to make common cause against their “masters.” They worked and socialized together and, according to advertisements and court cases, ran away, committed crimes, and had children together.
They also suffered similar punishments when they ran afoul of the law. And those few who lived past the deadly early years of their servitude shared similar access to the benefits of freedom, although slaves could not simply outlive their contracts but had to buy their way out of bondage with money they earned in their spare time.
At first, so many poor Virginians died in the colony that the few who survived posed little threat to their former masters. But by the 1660s, the survivors had grown into a large population of poor men, white and Black both, who were free but could not afford prime land in the eastern part of the colony, so they migrated to the western frontier hoping to become farmers.
There, these settlers thoroughly resented the eastern government that seemed to ignore their interests. In 1675 they saw the increased fighting with the local tribes as an opportunity to weaken those tribes and take their lands.
But Governor Berkeley disagreed. He wanted to avoid an expensive war and he wanted to honor a 1646 treaty under which allied tribes paid an annual tribute to the colonial government and fought alongside the English against tribes that didn’t have such an agreement.
Nathaniel Bacon had arrived in the colony in 1674. He was well connected and wealthy—he was actually related to Berkeley by marriage—but was frustrated that Berkeley wasn’t following his advice. Bacon began to speak for the angry westerners and by spring 1676 had welded them into a powerful coalition that was attacking local Indigenous tribes without the government’s blessing. Finally, Berkeley declared Bacon a rebel.
Under Bacon, vagrants and poor farmers, including former slaves and servants, went to war against the Pamunkey tribe and the Indigenous tribes who lived around them. And then they marched on Jamestown. On July 30, 1676, Bacon issued the Declaration of the People of Virginia, complaining that the governor had raised taxes too high, was corrupt, had put his own “ignorant” judges in place, and had failed to protect settlers against Indigenous Americans. He included a list of Berkeley supporters he called “Confederates, aiders, and assisters” of Berkeley’s perfidy. Bacon ordered them all to surrender to him within four days and declared that he and his men intended to confiscate their estates.
In a dramatic affront to the colonial system in which leaders held their positions by virtue of the Crown, Bacon signed his name “Nathaniel Bacon, Generall by Consent of the people.”
Bacon’s men held control of Jamestown from July through September before Berkeley’s forces forced them to retreat. Berkeley’s men abandoned the town when Bacon’s men tried to recapture it. Aware that more of the governor’s men were on their way, Bacon’s forces burned the town down on September 19.
On October 26, Bacon died from dysentery, the “Bloodie Flux,” and the rebellion fell apart. But the crisis had left the colony in ruin with its people dead or wounded, farms plundered or burned, crops ruined from lack of care.
In the wake of Bacon’s Rebellion, Virginia’s wealthy elite set out to preserve their control over the colony. They pushed Indigenous Americans off their land and enslaved those who fought back. From 1670 to 1715, colonists enslaved between 30,000 and 50,000 Indigenous Americans. Entire tribes disappeared, and white farmers moved onto their lands.
And the elites set out to drive wedges between Black slaves and white servants, establishing greater punishments for Black Virginians. In 1705 the Virginia Slave Codes pulled all those regulations together and went further. They prohibited Black Americans from owning cattle, hogs, or horses. They made it legal to kill an enslaved Virginian in the process of “correcting” them. And they made enslavement hereditary.
At the same time, they gave white servants new legal rights and limited the length of white indentures. The assembly passed laws requiring masters to provide white servants with food and clothing, as well as money to set themselves up after they earned their freedom. This, combined with a booming tobacco market, enabled more white men to buy land. The assembly also reduced the poll taxes for voting, making it easier for poor white men to vote.
And they made it costly for white and Black Virginians to socialize. Any white person attempting to marry across race lines would be fined and sent to jail, and the minister performing such a marriage would be fined the astonishing price of ten thousand pounds of tobacco. White servant women who had mixed-race children had to either pay a whopping fine or have their term of service extended for five years. And the child would be a slave until they turned thirty-one.
As leaders bound Black Americans more tightly into slavery, they courted white Virginians into joining the cultural and social world from which they had previously been excluded. Wealthier Virginians reached out to their less-prosperous neighbors, rubbing elbows with poorer white men in taverns and welcoming them into their imposing homes to emphasize that they were all friends.
Indeed, the needs of poor white landowners were not all that different from those of wealthier planters, and it was easy to believe that all Virginia voters had the same interests. They understood what it meant to be under the thumb of a tyrant, for they saw enslaved people and their enslavers all around them. They believed that owning land made a man independent, for that was their experience. And, unlike the royal officials who used their offices to enrich their friends, Virginia voters could argue that they had the best interests of the country at heart. They were free and independent.
They were, one might say, created equal.
—
Notes:
For more information about Jamestown, check out the work of my friends at
"The Auctions and Market Design section of INFORMS is pleased to announce that Yan Chen, Daniel Kahneman Collegiate Professor of Information at the University of Michigan School of Information, has been selected as the recipient of the 2026 Market Design Impact Award. The award will be presented at the AMD Business Meeting at the INFORMS Annual Meeting in San Francisco, tentatively scheduled for Monday, November 2, 6:45–7:45 PM.
Award citation: "For pioneering behavioral market design-combining theory, digital experiments, and large-scale field experiments-with lasting impact on the practice of market design, including the reform of Chinese college admissions, the organization of gig workers on ride-sharing platforms, and the design of recommender systems that increase contributions to digital public goods."
Now in its second year, the Market Design Impact Award recognizes major contributions to market design-original research from the past fifteen years that has had a lasting impact, directly or indirectly, on the field and/or the practice of market design.
Award Committee: Eric Budish, The University of Chicago Booth School of Business Tim Roughgarden, Columbia University Nicolas Stier, Meta
Conflicts of interest were carefully handled such that they would not influence the committee decision. "
I observed, for example, that when I got an invitation to travel to give a talk in a different time zone, it mattered what time zone I was in when I got the invitation. if well rested, in my home time zone, I would think, No big deal, about making a long trip and would likely accept. However, if I was jet-lagged in a different time zone when the invitation came in, and in reach with the misery of travel, I would be far more likely to decline.
…Perhaps you’ve noticed when taking a long-haul flight that waiting for a connecting flight feels much worse if your layover is close to your final destination.
That is from the new and very stimulating The Opposite of Happiness: How Bad Feelings Make and Break Us, by George Loewenstein. A very Smithian book I might add. Reading this book, one also wonders if the researchers who do behavioral economics are more depressed than average? (“I’ve met many depressive characters in my life, but one of the most reliably miserable people I’ve ever known is my friend and collaborator Matthew Rabin.”)
UK productivity rose at almost twice the pace previously estimated in the decade after the 2008 global financial crisis, according to new official figures that make Britain look much less of an international outlier.
Output per hour worked, the main measure of labour productivity, grew by an average of 1.3 per cent per year between 2009 and 2019, the Office for National Statistics said on Thursday. The ONS had previously estimated average annual growth of 0.7 per cent over the period.
The figure is based on a new “component-based” methodology that has already been adopted by many other national statistics institutes. It draws on a range of data sources to improve the ONS’s count of both the number of workers contributing to UK output and the number of hours worked.
…this month, Singapore launched a scheme promising actual cash to citizens as a reward for logging reading time on a government website.
It’s unlikely to make you megabucks – you have to rack up 50 reading sessions of at least 15 minutes to earn one Singapore dollar (£0.59), with only one logged session allowed per day. But behavioural scientists and psychologists told the Guardian such a scheme could still help boost a habit in precipitous decline…
We all know reading has long-term benefits, but a key element of the Singapore scheme hinges on introducing a short-term reward for the activity, mimicking the immediate dopamine hit of scrolling. In fact, the “gamified” element may be “smarter” than the financial reward offered, says Patrick Taylor, director of education at the Behavioural Insights Team (which originated in David Cameron’s Cabinet Office, also known as the “nudge unit”). “Having a manageable 15-minute daily goal, built around existing routines like commuting or bedtime, with streaks and tracking to keep progress visible” are the aspects that could make the scheme a success, he says.
My thanks to WorkOS for sponsoring this last week — a big week — at DF.
SSO is table stakes for enterprise deals, but building it into your app yourself means writing SAML controllers, parsing XML assertions, and handling IdP-specific quirks for each provider. Learn how SAML flows work, the tradeoffs between building or buying, and best practices for security, routing, and UX.
Tropical Weather Outlook NWS Central Pacific Hurricane Center Honolulu HI Issued by NWS National Hurricane Center Miami FL 800 PM HST Mon Sep 21 2026
For the central North Pacific...between 140W and 180W:
Active Systems: The National Hurricane Center is issuing advisories on Tropical Storm Odalys, located well west-southwest of the southern tip of Baja California, and on Hurricane Polo, located a few hundred miles south-southeast of Manzanillo, Mexico.
Southeast of the Hawaiian Islands (Former TD 15-E): The remnants of Tropical Depression Fifteen-E, located several hundred miles southeast of the Hawaiian Islands, continue to produce showers and thunderstorms that are gradually becoming better organized. Environmental conditions are forecast to be conducive for further development, and a tropical depression is likely to form during the next day or two while the system moves slowly west-northwestward or northwestward. Interests in the Hawaiian Islands should monitor the progress of this system. * Formation chance through 48 hours...high...70 percent. * Formation chance through 7 days...high...90 percent.