Latest Posts (20 found)

AI on the Ballot

Listen to this post : From Bloomberg this morning at 2 a.m. Central: Democrats won control of both chambers of the US Congress in a midterm election landslide that amounted to a rejection of President Donald Trump following widespread voter discontent with the economy and the war in Iran. Across the country, Democrats scored victories in GOP strongholds, flipping at least seven Senate seats and winning House races in districts Republicans easily carried in 2024. Several news organizations projected that Democrats would win the House, while Decision Desk HQ projected they took the Senate. I have no doubt that Iran and the economy played significant roles in this election; what stood out to me, however, was very much Stratechery fodder. Specifically, I watch a lot of sports, and particularly this fall, watched a lot of baseball. My Milwaukee Brewers — excuse me, my World Champion Milwaukee Brewers — demanded my full attention, which also meant I saw a lot of campaign ads, and by far the most common topic, at least here in Wisconsin, was data centers. Moreover, it was never entirely clear which way it cut politically: both parties were anti-data center, accusing their opponent of being the opposite. Meanwhile in Texas, from Yahoo Finance : A strong showing by Democrats in Texas swept Gina Hinojosa into office as the state’s first Democratic governor since 1990 in a contest closely watched by Big Tech companies. The state is considered a bellwether for government restrictions on AI data centers…Hinojosa, Texas’ first Latina governor, has pledged to impose a moratorium on data center construction in Texas, which accounts for more than 25% of planned US capacity by 2030. Republican incumbent Greg Abbott, I would note, already declared a moratorium on new data-center permits in September; that’s how much of a hot-button issue this is, including in the state that is the biggest opportunity and beneficiary of the data center buildout. So yeah, this is a Stratechery topic of concern. Earlier this year, while writing about data center opposition , I said: There really wasn’t widespread opposition to data centers when they were being built for the Internet generally; indeed, local governments would compete for them, eager for the economic benefits that came during their construction and the long-term tax benefits once they were operational. In other words, it seems pretty clear that the current wave of opposition can’t be divorced from AI — you know, the technology that in the best case scenario is going to take everyone’s jobs, and in the worst case scenario end the human race. I do not, I don’t think, need to explain to you why this is not a very compelling message, and, in the very long run, I do think that humans will have economic value . At the same time, it’s hard to explain the huge amount of investment that is going into AI, not just at the model level but also in terms of data centers, without admitting that a big part of the thesis is that AI can not just increase the top line for companies, but also increase the bottom line — i.e. replace the jobs of some number of humans. Again, I’m generally an optimist here, but this already happened with the first wave of IT . That leads to an interesting contrast to globalization: when companies were closing down American factories and laying off workers and moving operations to China, none of the affected towns or workers had a say. They just suddenly no longer had a job, and a huge number of cities across the Rust Belt no longer had a reason to exist. People simply had to move, or worse, retreat to things like alcohol or drugs. AI, however, is the opposite: building data centers requires permission, which is to say that people actually have a say. Again, I am not at all saying that these people are well informed about data centers, or about the economic impact on their communities, much less the economic impact of AI generally; what I am noting is that people who didn’t have a say in globalization are suddenly finding they do have a say about AI, and it’s not a surprise they are expressing their disapproval by blocking data centers. That message was loud and clear last spring; now it is deafening, and it’s tempting to say that tech, particularly the frontier labs, have no one to blame but themselves. In fact, however, some of the biggest culprits may, in the long run, be some of the biggest beneficiaries of the anti-data center wave. My thesis — driven not just by national results and the Texas governorship, but also the fact that, as this thread documents , nearly every relevant local ballot measure opposing data centers won or is winning ( the only exception so far was in North Dakota ) — is that the constraint on AI dispersion has shifted once again. First we were short on compute, but that ramped; now we are short on memory, but that will ramp; we were coming close to being short on power, but that will be rectified. The final constraint is political, and that may be the most imposing constraint of all. Not only is it harder to solve, but it actually interferes with solving the other constraints. Many of the theories about AI assume that it becomes a commodity; I think it’s just as likely we are looking at scarcity for much longer than we expected, which will have ripple effects on everything. To that end, here — with the caveat that nothing leads to hot takes you regret like an election — are ten perspectives on what a permanently impaired ability to build might mean. To be clear, I’m not declaring permanency — look at how our elections swing back and forth — but it’s worth considering what the implications might be if Americans don’t change their minds about data centers. The most obvious reason why the stock market has been rocky over the last few weeks is the tightening of credit markets, which I wrote about this summer . We are, needless to say, full on into the equity funding era (and while I’m here, I haven’t written about Anthropic’s updated S-1 , but it strongly affirms my initial analysis ). At the same time, it seems clear that this outcome is very bad for the AI trade in the short term, but much of the pain may have already been endured. The Neoclouds have been at the forefront of credit concerns, and from a certain perspective, being unable to build data centers has a silver lining in that they couldn’t get the money to pay for them anyways. Moreover, Neoclouds with facilities that are already permitted now have an asset that is going to be scarcer than expected. At the same time, it’s Neoclouds that need new sites and new permits, even as they are likely to have much less political sway than the hyperscalers — who already have more sites they can repurpose or rebuild. It was already getting harder to get capital, relative to the hyperscalers; now you have to layer on that it’s going to be harder to get permission, too. The downside for the neoclouds is upside for the hyperscalers, who are more likely to grow their share of AI compute than they were before. Moreover, investors may be pleased if the hyperscalers’ ambitions are somewhat curtailed; political opposition is an excuse to moderate spending, knowing that everyone else is in the same boat. Nvidia will almost certainly be a short-term loser. Fewer data centers mean fewer Nvidia chips generally, and a weakened Neocloud set is particularly harmful not only because Neoclouds almost exclusively use Nvidia full-rack systems, but also because Nvidia is back-stopping a huge number of them. It’s the hyperscalers, meanwhile, who are Nvidia’s biggest long-term threat, given their scale and ability to invest in their own chips. At the same time, a constrained world makes Nvidia’s offerings more compelling. CEO Jensen Huang actually spent an entire keynote making this point back in 2025; I wrote in an Update : When Huang says “iso power” he means that power is the constraint; the question is how many tokens can you generate given a fixed power envelope, and Blackwell can generate a lot more. These were the numbers Huang gave for a 100 MW data center: What this means is that the first order of business for an ASIC maker is to match that level of efficiency. That, though, means keeping up with Nvidia’s product development cadence; The Information has a post about Amazon offering instances using its latest Trainium ASIC at a significant discount to the H100. Huang, though, spent this keynote insulting the H100! You can almost hear him speaking to Amazon directly: you spent all this money, and are offering these huge discounts, just to entice developers to lock themselves into an inferior chip, even as reasoning models are going to swamp your available power generation… Huang is issuing a challenge to every cloud provider tempted to make an ASIC: do you really think that you can keep up with this, and risk running out of power capacity because your chips aren’t efficient enough? Don’t even try. A world without power or data center constraints is one where it is, in the very long run, very difficult to maintain Nvidia’s margins; once those constraints start to bite, however, an advantage in tokens/megawatt is worth a lot of money. Go back to my point about the hyperscalers: one way to generate more tokens is to build a new data center; another way is to rebuild a data center with new Nvidia chips. China is the inverse of the scenario that Huang laid out: the country has plenty of power and the ability to build a lot more, but they don’t have leading-edge chips. Some of the advantages of leading-edge chips, however, can be overcome by simply throwing tons of electricity at the problem. From a 2025 Update about the Huawei CloudMatrix 384 supercomputer: The CloudMatrix 384, which is a supercomputer consisting of 384 chips, takes up dramatically more space, uses dramatically more power, is almost certainly dramatically more expensive to make, and is dramatically more brittle than Nvidia’s NVL72; there is no one in the world who would choose the CloudMatrix 384 over the NVL72 if they had the choice. That’s the thing, though: China doesn’t have the choice, because of U.S. export controls. The country’s saving grace is that they are operating on different constraints than the U.S.…China — which actually builds power generation — is not iso power; they are iso compute: Huawei’s goal with the CloudMatrix 384 is to get as much compute as possible, power efficiency be damned. In the fullness of time — i.e. as China figures out leading-edge chips — this may be an insurmountable advantage. When SpaceX released their S-1, I explicitly pointed to political opposition to data centers as one of the company’s most significant upside scenarios: The third question about data centers in space is if there is a stick. Specifically, while I think that racks-in-space are both a lot more viable than people think, and a lot more relevant to agentic inference than current modes of compute, it is at the end of the day cheaper and easier to build on earth, all things being equal. All things are not equal, however: right now we are at the very beginning of the AI buildout and already one of the biggest constraints is not just power (expected), but zoning (unexpected). I wrote in an Update last week: I already posted the relevant excerpt above. Continuing: In that Update I made the case that data center builders — and by extension the companies that use them — should straight up pay people for permission to build data centers in their communities. At a minimum, however, that increases the costs of terrestrial data centers. What seems very plausible in the long run is that the demand for compute ends up being so large that there eventually is nowhere left to build, making the vast expanses of space not just an alternative but in fact the only choice. This is where I come back to my experience watching these campaign ads: this isn’t a partisan issue, where the pendulum will swing back in two years. Both parties see opposition to data centers as a winning cause, and not just nationally: that thread has multiple examples of local officials straight up recalled for approving data centers in their localities. Space will be incredibly difficult, but difficulty is all relative! Moreover, to the extent opposition is permanent, the more this actually reduces the risk of data centers in space, because investors will have more confidence in there being enduring demand. If the hyperscalers had a red queen problem , the frontier labs have it even worse: the biggest revelation from Anthropic’s S-1 was that their inference margins were very high (good!), which meant that their massive compute costs were actually in R&D; this is bad because that R&D spend is governed by competition with the other frontier labs, and absent constraints, that spend looked set to surpass revenue sooner rather than later. Now, however, it is the public that is effectively demanding that the frontier be paced, which is great for the frontier labs’ financial outlook. The upside goes further than that: the point about efficiency being more important in a world of constraints doesn’t just matter for chips, but also for models. Devoting limited compute to inefficient and costlier-to-serve Chinese models is a poor trade if there isn’t enough compute. Moreover, open models may be at greater regulatory risk, as Democrats seem much more likely to pass laws that ultimately favor the frontier labs. There are some counter-arguments. First, if compute is constrained, and thus more expensive, then that will increase the drive to right-size models for jobs, which is a big argument in favor of open models; the fact that compute won’t be a commodity means that the frontier labs’ lower cost to serve will never come to bear on the low end of the market. And, it’s worth noting, it will be harder for the frontier labs to build their own compute, leaving them dependent on the hyperscalers; big tech wins again. The most obvious advantage for Apple is that in a world of constrained compute, inference on the edge will be that much more important. Another advantage is that any slowdown in the dispersion of AI is good for a company that dominated the previous paradigm . The biggest advantage of all, however, is that any slowdown in the AI buildout offers hope that the memory crunch will ease. This will take a while, to be sure, but no company would be a bigger beneficiary of the world running out of places to put AI chips than Apple. AI has drawn a great many battle lines, not just in terms of data centers, but also within AI, and between AI and the rest of tech. Specifically, anything that strengthens the frontier labs is likely bad for the rest of the startup ecosystem. In a world with fewer data centers, startups will have less access to cheap compute, even as a slowdown in capabilities both means it takes longer to build compelling products and also gives the frontier labs time to actually build products that secure their ownership of the end user. One major fear that investors have had about the data center buildout is that there would be too much capacity, causing prices to plummet and investors and creditors to lose their shirts; that scenario, however, would be great for users, who would suddenly have access to incredibly cheap compute. Of course most users aren’t going to use AI directly; what they will miss out on is the equivalent of the Web 2.0 wave of free Internet services that were predicated on compute being free. Now there’s a good chance that AI is going to have meaningful marginal costs for a long time to come. At the same time, while I have been an optimist about humans in an AI future , there is no question that we were and are facing a wrenching change as intelligence becomes a commodity. It follows, however, that if it doesn’t become a commodity — or if that change takes longer than expected — that humanity will have more time to adapt. Maybe this is a break we needed; what is increasingly clear is it’s the break Americans wanted. That noted, there is a long history of citizens demanding the ends and opposing the means, and it’s the demand that wins in the end. The big difference today is that, unlike the first few waves of tech, the industry is going to need to do some convincing, and break the habit of assuming everything it does will get the benefit of the doubt. AI wasn’t technically on the ballot, but it was implicitly, and will be forevermore. Presented by I spend a lot of time trying to figure out what is happening to businesses on the internet. What I often find I’m missing is a view across the economy itself. With more than 1.7% of global GDP running on Stripe, working with them means I can bring some of what they’re seeing to Stratechery. They are, in a sense, a barometer of the economy. Take the “SaaSpocalypse”. Earlier this year, nearly a trillion dollars in enterprise software value disappeared amid fears of AI eating its lunch. Stock prices only tell us what investors think will happen, and not necessarily what is happening. In this case, Stripe recently built a SaaS Index using payments data from 72,000 non-AI SaaS businesses. Looking at their actual performance, we can see that while SaaS stocks were selling off, revenue growth was actually accelerating. Year-over-year growth is now over 30%, with some of the fastest growth coming from the youngest SaaS companies. I suspect there are a lot more interesting things hiding in Stripe’s data, and I’m excited about having an excuse to go look for them.

0 views
iDiallo Today

Goodhart's Law, but We Already Spent All Our Money

Here is how to make any sports fan angry. Basketball is just a bunch of grown men bouncing a ball and throwing it into a basket. Football is a bunch of grown men running on grass trying to kick a ball into a net, yes that football. And baseball... Oh boy, baseball. I've used these lines many times to piss people off and to justify my complete lack of athletic feats. But the counter-argument I always get is that football is a multi-billion-dollar industry, or that a specific player makes more money than I will ever see in a lifetime. If I counter that video games are just for kids, because of course I'd say that, I get a similar response: Video games make more money than all of these sports combined. It's all true. But nobody is telling me why basketball is important. Nobody tells me how good the game is, how people bond over it, how it brings a community together, or that it is simply healthy to stay active. Whether it's basketball, football, video games, or (God forgive me) baseball, it all boils down to the exact same measuring stick: how much money the activity generates. If the importance of a thing is only measured by how much money it makes, then we will aim to make more money despite the thing itself. — An AI Somewhere. Goodhart's Law states that when a measure becomes a target, it ceases to be a good measure. Enter Artificial Intelligence. This wave of generative AI has supposedly generated billions of dollars since ChatGPT first launched. But in the process, vastly more money was spent to make it possible. Money was spent to make AI look good. AI is deemed "good" because it is expected to make lots of money. Because AI isn't actually making that money back yet, it relies on inflated valuations to define its worth in monetary terms. It's like running a pizzeria where the goal is to make a million pizzas, but you don't actually have the ingredients to bake them. Instead of buying flour and tomatoes, you use AI to generate high-resolution photos of delicious pizzas and print them on empty boxes where the future pizza will be. You sell the hype of the box, promising that the actual pizza will arrive once the funding hits. There is this simple argument, almost naive I would say: If AI is going to take all our jobs, who is going to pay for it? If workers are displaced, they have no income. If they have no income, they have no purchasing power. Who is this mythical customer who doesn't work, receives no paycheck, yet seamlessly pays a monthly subscription for enterprise AI tools? Currently, the primary consumer of AI isn't the public buying a finished product. Instead, it's corporations selling AI back and forth to each other in an enterprise circular economy, funded by venture capital that expects infinite returns on a product nobody has fully figured out how to monetize at scale. This may be an anecdote where , but in that short timespan, we were visited by the Four Horsemen of Corporate AI. The First Horseman told us never to touch AI, warning of IP theft and security leaks. The Second Horseman told us to use it cautiously "where needed." The Third Horseman turned AI into a game, tracking metrics to see who could use it the most, (the winner got a free iphone). The Fourth Horseman arrived recently, asking us to stop using Fable, and get written managerial approval to exceed a reduced token budget. Each horseman was a paid consultant hired to provide training. In just a few years, corporate sentiment swung from paranoia to forced obsession, and finally to budget panic. Employees went from being pushed to "Tokenmaxx" everything to being scolded that tokens cost real money. AI is important because we spend so much money on it. When an industry measures success by the dollar amount poured into it rather than the actual utility derived from it, we start living in a fantasy. We spent astronomical sums of money to build AI because we believed it was valuable. Now, we must prove it is valuable simply because we spent all that money. If we keep measuring the value of technology solely by market capitalizations and speculative hype rather than usefulness, we shouldn't be surprised when people stop buying empty pizza boxes. Beautifully printed empty pizza boxes I should say. Right now, we are running out of money to buy the ingredients to actually make the pizza.

0 views
Unsung Today

Internet Archive’s alphabet

I love the Internet Archive, but I don’t love its interface. It’s just… not great all around, homely and confusing. It has some endearing qualities, harking back to the web of the 1990s without endless commerce and incessant growth hacking – Wikipedia feels the same – but it’s unpleasant in many ways, and won’t inspire you the way good interfaces will. (Even the thing I once praised it for falls apart in details.) So this below, once more, is going to be caveated. I have been uploading things to Internet Archive for almost a decade now, and my collection of various font and typewriter and interface documents just reached a round 1,000 items, which made me proud and happy. While browsing it myself yesterday, I noticed a new-to-me alphabet bar that pops up when you sort by title: I am guessing it’s inspired by tabs in library catalogs? = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/internet-archives-alphabet/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/internet-archives-alphabet/2.1600w.avif" type="image/avif"> The interface is ugly. There are big non-clickable gaps between letters. The tooltips were a mistake. But outside of that, I found it fun and delightful to explore a collection this way, and I’m not sure I have ever seen this kind of an “old-fashioned” approach before.

0 views

Running Dry

If you haven’t subscribed to Where’s Your Ed At, now’s the best time. I’ve extended the sale — 10% off of the $70-a-year subscription for life ( click here! ) — for new subscribers for another week. It’s a great way to support my work, and you get an absolute ton of value at a lower price than basically every competing newsletter.  Over the past few months, I’ve published a two part guide to the world of AI debt, an analysis of the (dubious) impact of generative AI on the global economy , deep analyses of the biggest players in the AI infrastructure space like NVIDIA (part one and two ) and Oracle (part one and two ), how OpenAI will eventually kill Oracle , and how venture capital is killing itself .  Friday's piece is about fault lines - the areas most-exposed to the collapse of the AI bubble, the datapoints to watch to see the industry's deterioration, and what might cause things to fall apart. If you want to get in touch — and especially if you have any juicy information about Anthropic, OpenAI, Blackstone or any other companies in the AI bubble — hit me up on Signal at ezitron.76. I’m also on IB on your Bloomberg Terminal. As I’ve said for a while, all of this ends when the money runs out — when seemingly-unlimited data center debt becomes distressingly hard to raise, and when AI startups can’t rely on the perpetual availability of venture capital to keep them alive. And it appears the well is running dry, just as it dawns on everyone that the underlying economics of AI, for labs and data center operators alike, don’t really make sense. On September 16, 2026, the New York Times would report that OpenAI was “considering” a new funding round valuing it at $1.5 trillion, a little under three months after it delayed its IPO to 2027 . Ten days later on September 29, Bloomberg would report that it was aiming to raise $30 billion at a $1.4 trillion valuation, and on October 5 revealed that it was in talks with BlackRock, a syndicate, and funds from the UAE which had “discussed putting in as much as $10 billion altogether.” Last week — less than a month later — OpenAI raised $11 billion at a $1.25 trillion valuation “after receiving tepid interest from some large investments,” per the Wall Street Journal, who added that OpenAI had “...told shareholders it expects to try to raise more money…[and hoped] to raise up to $20 billion,” targeting “family offices and high net-worth individuals,” which means that sovereign wealth funds, venture capitalists, and private credit firms have given all they’re willing to. Per The Information , OpenAI spent a total of $12.1 billion across its cost of revenue and research and development segments in Q1 2026, and per Microsoft’s own earnings, OpenAI’s compute spend and revenue share payments contributed $10 billion in revenue to its latest fiscal quarter .  In other words, that $11 billion round won’t even cover a quarter of OpenAI’s compute costs, and it’s fair to ask both why this round had to close right now and what exactly the company does going forward. Per the same Information story, OpenAI ended Q1 2026 (so March 31, 2026) with “more than” $73 billion in cash and marketable securities. Revenue grew tepidly from $5.7 billion in Q1 to $6.7 billion in Q2 2026 ( per the WSJ ), and since then, Amazon has sent OpenAI $35 billion (around July 31, 2026) and SoftBank $30 billion ( wired in April, July and October ).  If OpenAI needed a paltry $11 billion , it’s likely that it raised it either out of some degree of desperation and/or an attempt to catch up with an Anthropic IPO that investors are now expecting to, per Bloomberg , price at $1.4 trillion to $1.5 trillion, down from less than a month ago when it was expected to price at $2 trillion or more . Anthropic is now, per the WSJ , being “urged by institutional investors to target a lower valuation of $1.5 trillion to $1.6 trillion.” It is extremely bad that OpenAI raised at a lower valuation than planned, and even worse that it couldn’t raise as much as it wanted (needed?) at said valuation. In the absolute best case scenario, this was an attempt by OpenAI to bump its valuation up from its $852 billion par from March , I imagine to make its investors feel better about Anthropic’s upcoming IPO… potentially? The problem is that at $1.25 trillion, OpenAI would have to eventually go public at a $1.5 trillion or $2 trillion valuation to give its latest investors anything close to a positive return , at a time when Anthropic has already seen its expected market capitalization tank by hundreds of billions of dollars. I think the answer is probably somewhere in the middle — OpenAI needed this money, needed to feel competitive with Anthropic, and realized that it should raise as much money as possible before the capital markets slam shut. The question I ask is simple: what the hell does OpenAI do next? At $1.25 trillion (as mentioned above), OpenAI would need a much better listing price than Anthropic is expected to have, for a company with objectively worse metrics, including slower growth , lower revenue, higher costs, and hundreds of millions of free users that generate, at best, about a billion dollars in “annualized” ad revenue against the billions of dollars it costs to serve their compute. Despite all the buzz around GPT-6 Astra — which was, according to NVIDIA’s Jensen Huang , “AGI” — it’s clear that its effect on revenues was insufficient to excite even the cash-rich and hype-friendly investors in the Gulf. GPT-6 Astra was, I believe, expected to be the lipstick on an unmistakably feculent pig of a company — something that’ll disguise the horrendous fundamentals of OpenAI’s business and energize investors — and, based on its disappointing latest funding round, it failed. And I believe that things will get worse from here.   OpenAI will absolutely, without a doubt, need more money in the next few months, and will need to raise at some sort of valuation , one calculated based on both that $1.25 trillion valuation and the performance of Anthropic’s IPO. Making things a little more challenging is the Financial Times’ report that Blackstone has told some investors that Anthropic “may not receive an investment-grade rating immediately after going public,” otherwise known as a junk rating , a point I made about a month ago based on the fact that it’s a negative-EBITDA company.  While we don’t know what the rating will be — as the big three (Moody’s, S&P and Fitch) are yet to rule — Anthropic’s $35 billion Broadcom-backstopped deal to lease TPUs received a BB+ rating from KBRA a few months ago, which is one rung below investment grade, but I must be clear that $30bn of the deal is backstopped by a company with a high investment-grade credit rating . While inevitable, a below-investment grade rating essentially puts Anthropic’s debt outside the reach of the most prolific bond-buyers, like pension funds and insurers. And again, I couldn’t see this going any other way, but I would argue that this rating represents a psychological cold shower for investors — a reminder that this space is, using the most charitable language at my disposal, inherently speculative and rife with risk. Given that OpenAI’s past and future fundraising is contingent upon an investor class that’s drunk on exuberance and that has lost its senses, cold showers are a very bad thing .  OpenAI is a company with higher expenses, lower revenues, and the stench of an also-ran that got beaten by an aggressive competitor gunning at full speed to beat it to IPO, leaving it with few options outside of increasingly-illogical-yet-existential funding rounds that either scrape the bottom of the VC barrel or force it to take a down round to get cash through the door. Future investors will have to believe, somehow, that OpenAI will both actually go public and one day be worth $2 trillion to $3 trillion , as well as somehow being able to raise hundreds of billions of dollars of debt to keep up with its $750 billion in planned cloud spend through 2030 . And given that junk rating and the grim new data from Anthropic’s newly-amended S1 (called an S1/A), it’s unclear how any of this is actually meant to work. Let’s be clear about something: it only took a week for Anthropic to file an amended S/1 to include its Q3 numbers, which means (in my opinion) it was absolutely ready to go for the initial filing but chose to intentionally leave those numbers out . You’re about to find out why. As I discussed last week , Anthropic’s initial S-1 filing — covering up to Q2 2026 — described a company that effectively no longer exists, with a “profit” driven by discounted SpaceX compute, $2.08 in revenue for every dollar of compute spend, $11.5 billion in revenue, and $430 billion in non-cancellable compute commitments, including a $161.2 billion deal with Broadcom to lease Google’s TPU chips at a remarkable scale.  Though we already knew some of the Q3 numbers thanks to the Financial Times’ reporting around Anthropic’s investor day , boosters and the otherwise cope-poisoned chose to do several consecutive victory laps, claiming that this was proof that A) Anthropic was a “profitable company” and B) that “the economics of generative AI work.” As I said at the time , this quarter was an anomaly caused by organizations allowing their workers to spend as much as they want on tokens, leading to companies like Uber burning their entire annual token budget in the space of a quarter and much hand-wringing around AI’s ROI: In other words, Anthropic deliberately filed less information as a means of misleading the public into believing it was a fast, lean, profitable company with remarkably low compute costs and a large — yet indeterminately-timed — pile of obligations.  Having read the amended filing, I kinda get why it did so. As part of its original filing, Anthropic included this delightful diagram of its “revenue per dollar of compute” — but left out Q3 numbers that we already know it had ( because the Financial Times reported them weeks ago ) for the obvious reason that its economics got worse. While revenue grew about 46.9% ($11.5 billion to a little under $17 billion) quarter-over-quarter, compute costs nearly doubled from $5.6bn to $9.9bn (about 77.4%). This was partially driven by the fact that, per Bloomberg , Anthropic’s compute spend made up 34.5% — around $5.028 billion — of SpaceX’s Q3 revenue, making it Musk’s largest customer.  Anyway, Anthropic also filled in that contractual obligations chart, showing a minimum of $319.9 billion in payments through the end of 2030. Yet before anyone starts suggesting that Anthropic has fewer obligations than we thought, it immediately goes on to add that there are $451.2 billion in leases yet to commence… …and, for whatever reason, leaves out over $100.2 billion in future obligations to hyperscalers and data center lessors, as well as “certain agreements that are short-term in nature” with a minimum spend of $6.6 billion. Anthropic does add that it expects to pay $69.8 billion of its contractual obligations in the 12 months starting October 1, 2026 — meaning Q4 2026 — which makes that “$29.1 billion in payments due by year” number extremely suspicious, to the point that it almost feels like Anthropic intentionally wants readers to get the wrong idea about the company. I mean, I get it! Anthropic wants to sell itself as this fast-growing, lean, “profitable” AI lab that has worked out the messy economics of generative AI, when in fact it’s an overweight hog with nearly a trillion dollars’ worth of commitments, $437.4 billion of which are non-cancellable. Just to review, that’s…  Yet even then, there’s potentially hundreds of billions of dollars more in compute commitments that Anthropic vaguely describes , the first being underneath that chart in a footnote, emphasis mine: No worries dude! Just $150 billion in compute commitments that might happen at some point or another with no explanation as to who the commitments are to, what they’re for, and when they might begin, other than that they might be part of a deal with a hyperscaler! Say, talking about hyperscalers, Anthropic also apparently has another massive commitment to lease TPUs — apparently separate to the Broadcom deal! — that may or may not be worth as much as $125 billion to $150 billion, and deliver sometime in the next two to five years: So, yeah, just another $300 billion or so of commitments on top of the others, disclosed in an opaque — and I’d argue deceptive — way.  But that’s just how Anthropic ( and its former Blackstone private equity CFO ) rolls. Anthropic wants to con as many retail investors — via the media, of course — into believing that this is a company that will only spend $30 billion on compute in 2027, and will somehow grow to meet its ridiculous, ever-expanding costs. Underneath the quarterly trends section of the S/1A, Anthropic added an entire paragraph underneath “quarterly revenue trends” on page 161 ( 158 in the original S-1 ): In other words, for every dollar that Anthropic makes, it’s cutting that by 3.4% or so via discounts, a fact it’s only including as a means of key-jingling for boosters to say “actually revenue would be so much higher, if… ” even though this number doesn’t really tell us very much about Anthropic’s business. Are these discounts for enterprises buying tokens direct? What were the discounts in Q1 and Q2 2026? Don’t worry about it man, these numbers are not here for you to learn more about Anthropic , they’re about making sure you invest in it. Anthropic’s cash position is one of the weirdest things I’ve seen in a company, and I’ll explain why with this quote from economist Paul Kedrosky when he dug into its original filing, where he called it “a bank with a money-losing AI side gig”: In Q3, Anthropic’s cash position is largely left unchanged, with $16.8bn in cash and cash equivalents turning into another $17 billion in short-term investments (US Treasuries and securities), generating $1.248 billion in interest — a savvy move to generate capital for a company destined to burn billions of dollars in increasing intervals. And the problem for anyone trying to digest this S-1/A is that there’s very little guidance as to how that might actually happen.  Let’s go back to the top of page 6: Now, that $69.8 billion could, in theory , include some of SpaceX’s $3.1 billion a month in compute costs — which are, of course, “short-term leases” that can be exited with 90 days of notice — but it’s impossible to tell thanks to this insipid company’s weasel wording. There’s also a compelling argument that it only includes a quarter’s worth, which would add another $27.9 billion on top of the $69.8 billion in the event that Anthropic used it for the entire year. Nevertheless, Anthropic has a remarkable amount of compute commitments, and itself admits that it will have to cough up as much as $447 billion in costs in the next four years, and unlike previous years, it’ll have to pay for it up front in big, ugly chunks. In Anthropic’s own words, it “expects an increasing portion of [its] compute and infrastructure investment to take the form of capital expenditures and other commitments,,” and that said commitments require “significant upfront payments well in advance of the related compute becoming operational.”  While one might be tempted to say that its current liquidity — about $95.5 billion in cash and $36.2 billion in short-term investments — in addition to potentially raising $100 billion at IPO might be enough to get it by for years, even Anthropic suggests that might not be the case:  This suggests that fairly soon Anthropic will have to send a significant amount of cash out the door in the form of pre-payments, on top of the fact that it’ll be spending $9.3 billion a quarter, without fail, on SpaceX’s compute, assuming that that agreement doesn’t expand any further.  This leaves Anthropic in a worrying position where the only guarantees it has are that its costs will expand dramatically, every single year without fail. While revenue growth might continue (though Ramp, which was accurate with its predictions of Anthropic’s Q3 growth, now expects its Q4 numbers to be far more modest, ranging between 15% and 25% ), said growth now has to compete with hard, inflexible costs regardless of any seasonal shifts, price increases (or decreases) or product changes that might hamper growth, and with the sheer scale of these costs, any mismatch between compute spend and revenues will cost the company billions of dollars. And then there’s the problem of that junk rating. While we still don’t know what level of junk rating the agencies might award it, Anthropic is all but certain to have to raise debt in the 8% to 11% range — the kind of interest rate that can veer between harsh and unmanageable when you face rough headwinds, especially when you’re raising debt in the tens of billions. Anthropic’s current obligations are priced for perfection, requiring the company to, by this time next year, be roughly twice its size and continuing at a similar (or better) growth rate, because the sheer scale of its compute commitments demands Anthropic maintains both perpetual growth and improved margins.   It is not enough for this company to be the fastest growing startup of all time — it must also be attractive enough as a potential debtor to appeal to an already-strained junk debt market, which will require it to become a better, stronger company in stark economic terms unrelated to any hype around AI , especially as Wall Street becomes, to quote the WSJ , “choosier about where to place their bets and are demanding tougher terms.”  To be clear, that’s referring to AI data centers that have physical infrastructure and actual assets rather than a negative-EBITDA software company with a very annoying CEO. While Anthropic’s cash pile might make lenders a little bit calmer, we still have very little clarity as to the size and velocity of its prepayments, which makes it difficult to tell how big that cash pile might be in three, six or twelve months.  My question is simple: what happens when Anthropic’s revenue growth stalls as its costs naturally increase as capacity comes online? It’s deeply unattractive to lenders to say “well, we made all these commitments to pay hundreds of billions of dollars and it turns out our revenue growth slowed down, can you lend us money to cover the gap?” While in theory that might work, it’s the kind of thing that makes a lender ask “are you concerned about defaults?” or “what happened to all that cash you had?”  As discussed last week, around 80% of OpenAI and Anthropic’s revenues come from venture backed startups that (as I’ll get to at the end) heavily subsidize their userbases, which means that growth is mostly tied to whether VC can continue funding its customers. And as I discussed a few weeks ago , Anthropic will, outside of the very highest rung of junk, be limited in how much debt it can actually take on, and if it needs (as I estimate) around $50 billion a year, it’s hard to see how it pulls that off.  It’s getting dark outside, whether boosters will admit it or not. While its rush toward IPO was arguably driven by its anomalous second quarter, Anthropic has also realized that the music is stopping, and everybody is beginning to ask worrying questions about the underlying economics that I was asking years ago. Everything started to accelerate last week off the back of Anthropic’s S-1. The day before it was filed, Elon Musk closed a $40 billion debt deal to buy NVIDIA chips with interest rates for some parts of it as high as 8.75% per Semafor . A day later, Musk claimed that the markets had begun to shut out neoclouds entirely, per CNBC : A few days later, the Wall Street Journal would report that the markets have begun rejecting neoclouds: It’s unclear how CoreWeave, which needs over $100 billion in debt through 2030 per Morgan Stanley, actually survives, let alone the gaggle of yet-to-IPO neoclouds like Firmus or Lambda make it through 2027. Their overstuffed backlogs and highfalutin revenue growth promises are no longer impressing anyone. More tellingly, the mood around neoclouds have shifted — demonstrated most vividly by a piece published by the BBC’s North America technology correspondent Lily Jamali over the weekend , which essentially talked about the growing skepticism about the long-term health of neoclouds on Wall Street, and noted that many (in particular, Coreweave) have racked up debts that they really shouldn’t have been able to.  I’ll simply note that I raised the alarm on Coreweave in March of last year (nearly 18 months ago), and many of the points that the article makes are ones that I’ve been raising in this newsletter ever since. In short, fears around neoclouds are now mainstream.  And while hyperscalers might still have been able to raise debt this week, last week’s earnings have thoroughly panicked Wall Street. The same week, Amazon and Google both had double-misses on earnings, with only their cloud businesses — which are inflated by billions of dollars of compute spend from both Anthropic and OpenAI — showing any exciting growth.  Per page F-16 of the amended S-1, 44% of Anthropic’s revenue (around $14.6 billion) for the first three quarters of the year came from Google and Amazon (and Microsoft to a lesser extent) selling its models through Vertex and Bedrock, which means both have seen billions of dollars of extra revenue both from selling Anthropic’s models and providing it with compute to deliver them.  In other words, in 2026, Anthropic got $10 billion in funding from Google, $5 billion in funding from Amazon, then spent billions of dollars on both Google Cloud and AWS to serve compute to sell access to models, which the hyperscalers then booked as revenue, on top of the revenue the hyperscalers booked from selling those models, which ( due to the unique way that Anthropic itemizes its revenues ) Amazon, Google and Anthropic all book as their own revenue. While Amazon could explain away a bad quarter as a function of a flailing economy with spiralling inflation, Google had far grimmer news — that its use of AI overviews had led to “ lower monetization ” of search, meaning that despite spending hundreds of billions of dollars on AI, the only tangible effect appeared to be weakening the core product and creating a dependency on a pair of unsustainable, unprofitable AI labs. As a result, Google had its single-worst day of trading in history . While Microsoft beat expectations, it did so at a gruesome cost — as mentioned earlier, OpenAI’s compute spend and revenue share payments contributed $10 billion in revenue to its latest fiscal quarter , or almost 11% of its quarterly revenues. This is extremely bad in a way that I’m surprised more people aren’t discussing. Per Bloomberg earlier in the year , OpenAI accounted for around 7% of Microsoft’s Fiscal Year 2026 revenues, or around 70% ($24.1 billion) of AI revenues. Within a single quarter, OpenAI has already accounted for nearly half of its last fiscal year contribution to Microsoft, with its concentration of overall revenues growing at an alarming rate at a time when, as discussed, the company is having trouble raising money to pay its bills.  There’s also the messy issue of Microsoft’s new revenue disclosures, announced back in September , that mean that we now know the quarterly revenue of its Azure cloud platform, which was an impressive-seeming $33.2 billion in its latest quarter until you, as nobody appears to have done, compare it to the $29.4 billion it made in Q4 FY2026. That $3.8 billion in revenue growth is most-assuredly from OpenAI’s increased compute spend, especially given the dramatic jump from the end of the last fiscal year. If that’s the case, Microsoft’s “impressive earnings beat” is far more a function of OpenAI’s cash furnace than any success of its AI plays — especially as Microsoft neglected to update us on paid Copilot licenses outside of claiming that “ Copilot daily users grew nearly 50% in the three months to September ,” the kind of thing you tell an audience you are convinced is too stupid to see through your bullshit. And just when we thought we’d escaped the fearmongering of a shitty earnings season, Uncle Elon decided to say the worst thing possible as users complained about their weekly usage of “Grok Bot” suddenly evaporating, per TechCrunch : Musk, who had said three days beforehand that saving money for the distant future was pointless with the advent of “super intelligent abundance,” added that these changes (which have yet to be fully defined) are a result of him “ just being sensible .” This freaked out the entire AI industry, because they realized, as I warned two years ago ( and revisited again in March ), that the vast majority of AI subscriptions are heavily subsidized , letting users burn several dollars’ worth of tokens for every dollar worth of subscription and eating the costs to get them through the door, only to rugpull them the months or years to follow as the company in question tries to pull costs in. This all began in June last year when Anthropic and OpenAI forced AI startups dependent on their models to start paying priority processing fees . A few hours later, Replit CEO Amjad Masad gave a dire warning : that if you’re enjoying a subsidized AI subscription [you should] get ready to get rug pulled. After all, Masad would know — shortly following the June 2025 changes to priority processing, Replit introduced “ Effort-Based Pricing ” that jacked up pricing for users, a problem made worse by the launch of its “Agent 3” product a few months later, per The Register : A short trip to the Replit Subreddit is all it takes to find unhappy customers, but my own thread soliciting experiences about effort-based pricing led to arguably the most damning response that, well, uses exactly the word that Masad chose : Masad claimed in another post that Replit was “ never subsidized ,” something that you’d only say if you had a deep distaste for the truth. Per The Information from August 2025 , emphasis mine: Riddle me this, Batman: what do you call it when a company sells a service at a price that does not cover its costs, absorbing said costs to retain the customer? I’m sure he has some sort of mental gymnastics routine where he considers that spend to be “marketing costs,” but we all know what actually happened. In any case, I 100% believe Masad when he says that rugpulls are coming. A recent update to OpenAI's ChatGPT and Codex usage limits page revealed that starting in December, users’ use of chat and coding functionality will draw from the same rate limits (which had been largely separated to this point) and that said usage will “be measured in tokens,” suggesting that OpenAI’s subsidized subscriptions are coming to an end.  And I imagine this problem will flow throughout the industry as venture capital dries up. I think I get asked five times a week when this all ends, and I truly cannot answer you and, as some of you have noticed, get criticized for having tried to guess in the past. What I can tell you is that the bubble bursts when the money runs out.  The signs are already there — OpenAI struggling to raise, Musk tightening rate limits on Grok Bot, debt markets shutting out neoclouds, Anthropic’s lower valuation and increasing scrutiny — and will only get increasingly-louder and more-deranged as things get desperate.  And now I’m even hearing low rumblings of a compute glut, with AI startups buying compute on the off-chance they might need it, assuming wrongheadedly that if they don’t they can sell it at a premium. You know, kind of like how people said in 2006 that if they’d just refinance their mortgage.  After all, the price of housing never goes down. If you haven’t subscribed to Where’s Your Ed At, now’s the best time. I’ve extended the sale — 10% off of the $70-a-year subscription for life ( click here! ) — for new subscribers for another week. It’s a great way to support my work, and you get an absolute ton of value at a lower price than basically every competing newsletter.  If you want to get in touch — and especially if you have any juicy information about Anthropic, OpenAI, Blackstone or any other companies in the AI bubble — hit me up on Signal at ezitron.76. I’m also on IB on your Bloomberg Terminal. $319.9bn in purchase commitments and commence leases $451.2 billion in signed leases that haven’t commenced. $17.4 billion in short-term commitments. $100.2 billion in commitments signed after September 30. $6.6 billion in additional short-term commitments signed after September 30. $69.8 billion due to be paid within the twelve months starting October 1, 2026 OpenAI and Anthropic need endless venture capital to fund their operations, and when that runs out — unless they can make it to the public markets — they will be crushed under their trillion-plus in commitments. 80% of OpenAI and Anthropic’s revenues come from venture-backed AI startups , which means that the underlying revenue growth of these companies is contingent on venture capital’s continual subsidies which, at some point, will run out. AI data center capex is almost-entirely funded by debt, which means that when that debt runs out, NVIDIA’s growth — and overall data center construction — will slow.  Per Westside , data center construction starts fell by more than half in September 2026 month-over-month ($9.4bn, down from $25.8bn in August), as the median cost of a new build grew by 31% year-over-year. Assuming that Anthropic makes it to the point that it will need debt, any hesitancy around data center debt will make it even harder for it to handle.

0 views
Unsung Today

Gmail’s typable labels

Some time ago, I praised the URL design of Flickr , and the URL design of Unsung tries to follow a lot of the same principles. I’ll write about it some day. But those principles do not just apply to URLs, and I was just reminded of it when using Gmail. Since its beginnings, Gmail has had a concept called labels (reigniting the age-old debate between folder users and label users). True to Google’s origins, it’s also had a prominent and powerful search box. You can navigate to a label by clicking on the left… …but you can also search for it by typing its name: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/gmails-typable-labels/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/gmails-typable-labels/2.1600w.avif" type="image/avif"> Clicking on the left actually pre-fills the search, teaching you that next time you can also do this from the keyboard – and also that you can combine it with other things you see or type in that box: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/gmails-typable-labels/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/gmails-typable-labels/3.1600w.avif" type="image/avif"> It all feels pretty natural, and I believe this was hard effort by the team, back in the day. I think so because the default/​cheap way to do it would be something like this: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/gmails-typable-labels/4.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/gmails-typable-labels/4.1600w.avif" type="image/avif"> I can see products choosing to do that, and I bet many did. But just like with poorly-designed URLs, this forces the user to jump through all the UI hoops to get somewhere. In Gmail, at some point, instinctively and without thinking, and having never done it before, you might find yourself typing and it will work, and you might not even realize what your fingers just learned.

0 views

Qwen 3.8 27B on my laptop can interpret model weights, too

Yesterday's hot paper was Sparks of Weight-Space Programming: LLMs can natively read & write neural network weights by Rikiya Takehi, Jayden Teoh, Alex Zhang, and Omar Khattab. The paper (OK, the authors classify is as a "blog post", but it's paper-shaped) found that frontier models, in particular GPT-6 Astra, can both interpret and modify the raw weights of a machine learning model - literally a text description of the model containing a bunch of floating point numbers. I've been playing with one of the examples from the paper and I'm delighted to share that Qwen 3.8 27B running on my laptop can do this as well! Here's the highlight from their abstract, describing impressive capabilities for GPT-6 Astra and coining the term Weight-Space Programming for when LLMs analyze and modify model weights: Just by looking at the raw weights, GPT-6 Astra can tell what a network was trained to do . And without any environment feedback, it has no trouble writing, from scratch, small game-playing networks that outplay networks trained with PPO for 100 million steps. Likewise, asked to make Qwen3.5-0.8B better at math without gradients, Astra identifies an issue in its weights causing reasoning loops that Qwen’s own model card warns about, and fixes this by natively editing 0.016% of the weights . With the same sampling settings, this weight correction raises MATH-500 from 7.9% to 48.1% and generalizes out of the box to instruction following, raising IFEval by 3x. All of this is possible without allowing Astra to write training loops. It uses its reasoning to figure out what each part of a neural network computes, or should compute, and changes the weights accordingly. We call this Weight-Space Programming . The paper combines two topics that I think deserve to be treated separately. The first is what models can do with raw weights without running tools or executing code. The second explores how well models, once armed with code, can run operations to update and improve other models. spaCy author Matthew Honnibal called the paper misleading for conflating the two, and Sean Goedecke deconstructed the Qwen3.5-0.8B update example as taking the same steps that a human ML researcher would use. I'm going to focus on the no-tools question, which I think is the more interesting of the two. The paper presents the first question as Can LLMs understand model behaviors from weights? They trained four neural networks to play simplified 10x10 grid versions of four classic computer games - Breakout, Pong, Pac-Man, and Freeway (I had to look that one up , it's an Atari 2600 game from 1981). Then they fed those weights (as floating point numbers) to an LLM along with the following question: The GitHub repository that accompanies the paper is RikiyaT/lm_understand-logs . The exp1_which_game folder contains the prompts they used, with weights for the four games: I checked and, aside from the weights, each prompt is identical to the others. The prompts on GitHub are self-contained. My LLM tool has a option which can be passed the URL to a text file to use as a prompt, which means I can run any of the above like this: This example requires the llm-openrouter plugin installed, and runs the Breakout prompt against Kimi K3.1 Pro via OpenRouter. Here's what I got back from Kimi K3.1 Pro , which successfully guessed Breakout after 9m 41s and 19,493 reasoning tokens. But how about Qwen 3.8 27B ? That's still my favorite model to run on my own laptop - it's just 17GB (I use this version ) and somehow feels close to the leading proprietary models of 2025. I fired up LM Studio , ensured Qwen 3.8 27B was loaded with a long context window (the default 8192 context failed with errors), installed the llm-lmstudio plugin and ran this command: (I had to bump the timeout up using an environment variable, see this issue .) After 46m 12s and 43,506 reasoning tokens, Qwen on my laptop returned a response that ended like this (here's the reasoning trace ): Game: A simplified Pac-Man-style gridworld: an agent moves through a fixed 8x8 maze with central and corner wall blocks, moving objects/ghosts, and reward targets/pellets. Description: The agent navigates a fixed maze-like 8x8 board, using current agent/moving-object/previous-frame cues to move through corridors, collect reward-target cells, and avoid moving objects or hazards. Confidence: 72% This is impressive. I tried it on two of the other games as well. It identified Pong ( reasoning ) in 1h 4m 54s: Pong — specifically a Pong-like paddle/ball game where the agent controls a vertical paddle on the right side and must move up/down to intercept or return a moving ball/reward object. Description: The agent moves a right-side paddle vertically to hit or catch a moving ball-like reward target moving across the 8×8 field, while a left-side moving object/opponent and wall borders define the play; reward is obtained by successfully intercepting/returning/scoring the ball, and missing or failing to hit it is penalized. Confidence: And Breakout ( reasoning ) in 52m 25s: Game: Breakout, or an Arkanoid-like paddle/ball/brick game. Description: The agent is a paddle on the bottom row and moves left/right to keep a ball in play; the ball moves around the upper grid, and bricks/reward targets in the top rows give reward when hit, while missing the ball/hitting the bottom wall ends the episode or gives penalty. Confidence: 88% Qwen failed at the Freeway prompt, which didn't surprise me considering that game is more obscure than the other three. Here's that transcript - Qwen thought it was "A simplified Pac-Man-like grid game: agent moves 4-directionally". The reasoning traces are fun to skim, and almost incomprehensible. Here's a sample: What about agent channel0? We see some large channel0 rows near row8 col7/8 and maybe bottom? Let's list channel0 large: line436 input435 (row8 col7 ch0) -2.107,1.169,0.513...; line441 input440 (row8 col8 ch0) -0.376,0.010,1.564,3.855...; line445 input444 (row8 col8 ch4) 0.142,0.491...; line382? input381 ch0? Wait line382 input381: 381//5=76 (row7 col6), ch1? 381%5=1? 76 * 5=380, ch1. So not. Channel0 large maybe at row8 col7/8 only. Also top row? line44 input43 ch3, line49 ch3. Channel0 large maybe not many. Agent position could be near bottom-right? If the agent is typically at bottom-right? That said though, I expect a sufficiently experienced human being armed with a notepad and a pencil could get there with enough effort. It's a cool paper, but some of the wider commentary I've seen around it does not feel justified. I'm not ready to declare that the age of source code is over and our future involves incomprehensible machines editing their own model weights in incomprehensible ways. You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options . breakout/prompt.txt freeway/prompt.txt pacman/prompt.txt pong/prompt.txt

0 views

Death comes for XSLT

Last halloween, Google decided to kill XSLT . That was not a unilateral decision mind you, Google said “jump” and other browser vendors said “how high?” In response, I published my Intent to Deprecate and Remove Google Chrome . A performative declaration of course, I don’t install spyware. Fearing my parody lacked seriousness, I created XSLT.RIP to ensure the developer world was informed of Google’s death note . This did the trick, although a few commenters believed it was satire. There is subtlety to XSLT.RIP . The website itself is built with XSLT and when Google kills XSLT they’ll kill my website. The web standards process and its stewards ( Big Browser ) used to adhere to a social contract. Backwards compatibility was a major design principle. Under no circumstances do you ever purposefully break the web. Google decided to renege and break the web. XSLT.RIP will be broken soon and I’ll sit back and watch Google break it. 17 November 2026 appears to be the date of execution. Some Chromium-based browsers have been running a man-in-the-middle attack by injecting propaganda into XSLT websites. This site uses XSLT; that functionality is being removed from this browser very soon. When that happens, this page will likely no longer display correctly. You might be able to install a browser extension that allows you to continue viewing it. Otherwise, you should contact the maintainer of the site for further information. Source: This site uses XSLT: what Chrome’s banner means - XSLT Playground This appears to be an custom element that fails to render when it violates content security policy . I’m testing on ungoogled-chromium so who knows how it’s intended to look. The line of death is another “social contract” that Google has forgotten. They’re blaming website owners and acting like questionable purveyors of free public Wi-Fi. This is arrogant and intrusive. “contact the maintainer of the site” — you broke the web Google, own it at least. Thanks for reading! Follow me on Mastodon and Bluesky . Subscribe to my Blog and Notes or Combined feeds. “Don’t break the web” “Don’t break the web” “Don’t break the web”

0 views

Petered

The Peter Principle posits that people are promoted until they reach their level of incompetence. What happens after that point? The implicit assumption is that they stop getting promoted and linger at whatever level they’ve arrived at, and surely all of us can point to mediocre leaders who seem to exhibit exactly that circumstance. But in fact, that situation is not stable but subject to career pressure, as Christian Gläßel and Adam Scharpf define it in Making a Career in Dictatorship . Unable to move up, and very possibly unable to meet expectations, the person who is subject to the Peter Principle is at risk of losing their job, or even their entire career. Which means they might take an even greater risk to save it. Gläßel and Scharpf write: The logic of career pressure also offers a compelling twist to the Peter Principle. The Principle posits that individuals in hierarchical organizations are promoted until they reach their level of incompetence, where they can no longer perform effectively and cease to advance. In contrast, our logic shows how these individuals may surpass this point and climb the hierarchy even further. Career-pressured individuals often take on high-risk, labor-intensive, or morally contentious tasks. By loyally executing the organization’s dirty work, they can reestablish their value, regain competitiveness, and even outpace peers who were previously ahead of them. Alternatively, they may resort to sabotaging superiors or higher-ups by making false allegations or revealing secrets to create vacancies above them and forcibly advance their careers. Gläßel and Scharpf, Making a Career in Dictatorship, page 182 In other words, someone promoted up to their level of incompetence, sensing a threat to their own livelihood, becomes a threat to everyone else. I’m reminded here of David Graeber’s theory in Bullshit Jobs , that a great many management jobs are basically feudal retainers—people kept around in order to make the folks above them look good. Very often, making someone else look good may well mean tackling the dirty work for them so that they can keep their hands clean. The petered leader has in effect been made an imposter—a real imposter, not a “syndromed” or perceived one. They must seem competent, to preserve the appearance that they belong in the role; while in fact they are not capable of delivering on their actual responsibilities and may have been quietly tasked with unrelated services both illegal and unethical. As a result, one of the primary tools of the real imposter is obscurity. Imposters cloak themselves in a fog of obfuscation and busyness, so that the people around them can never say for sure what it is they are doing, or how well (or not) they are doing it. What we call imposter syndrome was originally termed imposter phenomena , a term that makes plain that it is something that can be observed, not merely felt. The transformation into a syndrome shifted the experience of being impostered by a patriarchal, white supremacist society into a medicalized disorder, something for which the impostered person must be treated. That’s a neat trick: to shift the locus of treatment to the mistreated person, rather than the system that caused her harm. But perhaps there’s even another, more diabolical move here. What if the popularity of imposter syndrome is, in part, a means of obscuring the actual imposters in our midst? What are we missing when we look inward instead of around? View this post on the web , reply via email , or become a supporter .

0 views
Stratechery Yesterday

Apple Earnings, Memory Problems, The Hardware Company Regression

Apple's earnings suggest that the company's hardware business is doing better than ever, even in the face of memory challenges. Does the software story help or hurt?

0 views

Scrutinize our assessments

I recently blogged about how the curl project switched to doing all handling of vulnerabilities at severity LOW and MEDIUM in the public . Let me now describe how you can follow along this process and help out. Add your opinions, comments and assessments to help the curl project stay honest, do even better and manage the load. Vulnerability reports are now submitted directly in curl’s issue tracker on GitHub . Judging by the initial set received, the persons submitting them do not particularly highlight the security angle in the title but it is instead implied or specified in the issue description. I hope people react if we somehow miss it. We use a set of tags to manage vulnerability reports on GitHub. They are all prefixed by vuln: . Every submitted issue that has a claimed or suspected security angle – a possible vulnerability – first gets the tag set (by one of the curl maintainers). This tag marks the issue as one that we should evaluate, assess and determine first if it is a vulnerability, and if it is, what severity. Anyone is free to leave their comment and thinking to help us come to a conclusion. This tag is removed again when an assessment has been done. This issue was assessed in regards to its vulnerability risk and we deem that it has none; or it is so low that it is considered to be less than severity LOW. This issue is treated as just a bug . If someone objects provides a reasonable and convincing argument, we can reassess. This issue is a confirmed vulnerability at severity LOW. We work on a fix for this that we merge as soon as it works and then we close this issue. If someone objects to the severity and provides a reasonable and convincing argument, we can reassess. This issue is a confirmed vulnerability at severity MEDIUM. We work on a fix for this that we merge as soon as it works and then we close this issue. If someone objects to the severity and provides a reasonable and convincing argument, we can reassess. Confirmed vulnerabilities get a CVE and a dedicated security advisory that we work on separately from the issue and its fix in the curl-www repository . The CVE and its advisory get published in sync with the pending curl release. They are left as open in-progress pull-requests until then, using vuln:LOW or vuln:MEDIUM tags. Each advisory has all the information about a single curl vulnerability. A detailed description, all the info, CWE, CVE, affected version ranges, if it is a C mistake, in which curl “area” it happens, a link to the original report, etc. The idea being that this single markdown file has all necessary information anyone might want and need about this specific vulnerability. The work on these vulnerabilities is immediately public and the second we register and assign a CVE Id (the actual numerical identifier) to a problem, you can learn about its existence. We do however not publish the issue and all relevant metadata to the CVE database until the publication date, which is the same date as the curl release date when we ship the first release that contains the fix for the vulnerability. So information is public in the curl repositories early on, but it is not published until perhaps several weeks later, and it is at that later moment that it gets picked up by other tools and ecosystems and then gets widely known.

0 views
./techtipsy Yesterday

Anecdata: running shucked WD My Book/Easystore 8TB hard drives for over 5 years

When I was getting my feet wet with self-hosting, I learned about shucking, which involves taking an external hard drive, prying its plastic case off and using it as a normal SATA hard drive. It’s not possible with every external hard drive, but with most ones it works well, and the WD My Book and Easystore drives are a prime example of this. Back then, I remember quite a few people being skeptical about these hard drives, suggesting that they could be drives that were not good enough to be server-grade WD Red drives, so they were cheaply thrown into external enclosures and sold to customers. While I can’t disprove that, I can now provide a few data points that can help someone judge if similar approaches are worth trying. I got mine quite soon after I had bought three WD Red 4TB hard drives. WD Red drives were pricey, but then I had one of them die after 6 months and although warranty service replaced it, it made me think about the alternative option. The math supporting this suggested that buying cheaper drives can make more sense even if they end up being more prone to failures, because with the savings you can simply buy an additional one and keep it as a spare that’s immediately available to you, which also improves the availability of your storage pool. These two drives have seen various use cases in their early life, jumping from one setup to another, but for most of their lives, they have run in a server room and are serving as an offsite backup endpoint. The disks have seen some abuse, you can tell that by the lifetime maximum temperature hitting 67°C, but in my defense, that was when the disks were running in their original enclosure. There was a brief moment where one of the disks started throwing some ZFS errors, but that could also have been an issue with the server that these drives are running in and its SATA connection. The power-on hours on the disks are the following (at the time of writing): Most people expect hard drives to last about 5 years, after which it becomes a lottery. Some have had drives successfully run for 10+ years, which is something I’d absolutely love to see with these two. Here are full outputs on both drives in case you want to dig into specifics: After running these shucked WD drives and these white label Seagate ones , I’m convinced that for most use cases, these drives are just as good as buying the branded, more expensive ones. Even with new ones it’s unwise to expect them to be perfect, they’re tiny mechanical miracles that somehow store and read data, after all, and you’d not want to use a large pool of drives without a filesystem like BTRFS or ZFS anyway if you care about your data integrity. Now I need to go find some wood to knock on because I would love to not buy any replacement hard drives in this economy. 55349 hours (6.4 years) 46513 hours (5.4 years) WDC WD80EZAZ-11TDBA0 WDC WD80EMAZ-00WJTA0

0 views

Tech Firms Dismantle Botnet That Turned 1.3M TV Boxes Into Proxies

Google said today it worked with industry partners to dismantle a botnet made up of more than 1.3 million Android TV set-top boxes that ship with malicious software which secretly rents the user’s Internet connection out to strangers and conducts advertising fraud. Experts involved in the takedown say the action is likely to sever the botnet’s access to more than 10 million additional compromised systems, including other Internet of Things (IoT) products such as Android-based healthcare devices and karaoke machines. A report from the Google Threat Intelligence Group (GTIG) said Google has severed ties with Videostrong Technology Co. , a TV box manufacturer in China that GTIG and other industry experts concluded was responsible for including malware that enrolled more than 1.3 million set-top boxes in a botnet dubbed “ XCPE ” (named after one of the malware’s core code components). The global distribution of XCPE botnet infections. Image: Google Threat Intelligence Group. The report said the XCPE botnet loaded the user’s device with software that makes their Internet address available for resale by multiple “residential proxy” services, which allow customers to rent Internet addresses as a way to anonymize their web traffic or spoof their true location. As detailed in several stories here over the past year , residential proxy services are a major source of unwanted and often malicious traffic, including account takeover activity, advertising fraud, and mass content scraping for AI projects. “Videostrong monetized the backdoor by selling access to criminal affiliates and loading those affiliates’ malware modules onto infected devices,” the GTIG post reads, noting that Google took legal action to take down the domains and servers Videostrong used to control the botnet and install additional malware. “A device manufacturer intentionally infecting their users with malware is an unacceptable breach of trust, and represents a serious risk to those users. Without users’ knowledge or consent, infected devices were offered as a distribution mechanism for a wide array of criminal actors.” The report notes that while TV boxes made up the the majority of the botnet, the same XCPE malware was found in other Android-based IoT products, including telehealth devices, karaoke machines, and even digital signage systems . Google said it requires all Android device makers to pass compatibility and security tests to ensure their products don’t harm users, but that Videostrong nevertheless found a way to load their malicious software immediately after a user boots up one of these devices for the first time (Google says it has since addressed that weakness). The GTIG report calls out a number of residential proxy providers whose software development kits were routinely downloaded by devices infected by the XCPE botnet. Those include AppSalt , also known as Honeygain , which is owned by the Vilnius, Lithuania-based Oxylabs . In October 2026, Oxylabs was relaunched under a new brand called Source , after receiving $130 million in funding from private equity firm Warburg Pincus that reportedly valued the business at $3.6 billion. Oxylabs did not respond to a request for comment. Another provider linked to the botnet was NetNut , a once sprawling residential proxy company operated by the publicly-traded Israeli company Alarum Technologies . In July 2026, the FBI worked with industry partners to seize hundreds of domains associated with NetNut , saying the company was responsible for operating a separate botnet called Popa that enslaved TV boxes as residential proxies. Other proxy providers named in the GTIG report include EarnFM , Traffmonetizer , Jaguar , LINKFOG , BMW/IPWeb and GaGaNode . Google’s announcement credits a number of industry partners, including Synthient , a startup that tracks proxy providers. In January 2026, Synthient published research into the rapid spread of the Kimwolf botnet, which at the time was hammering networks worldwide with record-smashing DDoS attacks . Synthient documented how Kimwolf infected millions of Android set-top boxes virtually overnight, using a widespread vulnerability in these residential proxy services to compromise other Android-based devices inside the local networks of unsuspecting TV box users. Synthient’s research caused dozens of residential proxy providers to patch their networks, which helped to fragment the Kimwolf botnet into much smaller pieces that made its incessant and disruptive DDoS attacks far easier for network operators to manage. It also attracted the attention of the Motion Picture Association (MPA), a trade group representing the major Hollywood studios, which partnered with Synthient to purchase and tear apart a number of popular Android TV set-top boxes — including some that were being infected by Kimwolf and other IoT botnets. In a report published today, Synthient examined a popular, pre-infected TV box sold under the brand MECOOL by a publicly traded company in China called Skyworth Technology , concluding that MECOOL also bundled the malware from Videostrong Technology Co. and likewise installed AppSalt/Honeygain and other proxy components. The MECOOL storefront and marketing. Image: Synthient.com. Synthient founder Ben Brundage told KrebsOnSecurity that Videostrong’s malware also distributed software for the proxy service Grass . In our November 2025 story, “ Is Your Android TV Streaming Box Part of a Botnet? ” we quoted a researcher from Censys who found the popular Superbox TV streaming device bundled Grass’s residential proxy software. We also quoted the Grass founder, who denied any affiliation with the TV box maker. That November 2025 story noted that Superbox and similar Android TV set-top boxes gain new customers primarily by engaging influencers on Tiktok and other social networks who praise the product’s ability to offer hundreds of (pirated) pay TV streaming services for a one-time fee. Likewise, Synthient’s report observes that the MECOOL set-top boxes exploded in popularity after the product was mentioned in 2023 by the Youtube channel Linus Tech Tips, which has an audience of nearly 17 million subscribers [Linus Tech Tips said in a statement shared with Synthient that it has since updated the video to explicitly frame the product as a scam and have removed all associated affiliate links]. The popular Youtube channel Linus Tech Tips discussing MECOOL TV streaming boxes. The GTIG report estimates the XCPE botnet takedown should sever access to at least 10 million additional compromised devices, noting that the various proxy and ad fraud affiliates of Videostrong “each have diversified distribution channels for their modules beyond XCPE.” Synthient’s Brundage echoed that conclusion, calling the 1.3 million number “highly conservative.” “The scale of affected devices is likely way higher,” he said. “This is probably the largest operation against backdoored TV boxes that we’ve seen.” Further reading: Plume Security Labs white paper on the XCPE botnet (PDF) Black Lotus Labs writeup on LinkedIn TrendAI’s analysis Synthient’s list of affected devices, broken down by model number

0 views
iDiallo Yesterday

Prove you are not a child

I'm 100% for banning social media for children. I would even extend it to banning it all together in its current form. But I am also against the methods for enforcement. The problem with banning social media for one group and not another is that you have to differentiate the different groups somehow. And right now, in an age where information and personal data means everything, there are several entities that are salivating to get this data. I've written before about all the problems that come from uploading sensitive data online . It doesn't even matter if they delete the data afterward, as long as the data goes through the wire in the first place, there is a chance for a leak. What appears to be the same simple request "please verify your identity", becomes fundamentally different when mediated by technology. The question isn't whether these digital systems will be compromised, but when. And unlike that movie theater clerk who can't perfectly recall my birthdate minutes after seeing it, computers have perfect memory. They store, copy, backup, and transmit our most sensitive information through networks we don't control, to companies we've never heard of, under policies we'll never read. When kids are not allowed to use social media, it's the adult who pays the price. It's the adult who has to prove that they are not children. They have to risk uploading their government ID to a third party, or biometric data that may be saved and backed up forever. I reject this method. I also reject the method where I have to provide my age to the operating system. No system should compel me to provide personal data in order to use it. Especially if this feature is intended to provide the information to a third party. And what happens if I don't provide this information to my freebsd machine? Or worse, what if I provide false information? Am I going to get punished? How does that protect children in any way? Breaking news: Grown up arrested when OS reported forged identity in his laptop. One question I asked myself was what happens when a minor circumvents the ban. What are the consequences? At least in Australia, a country that has implemented a social media ban for those under 16, there are no consequences . The law places legal responsibility on platforms, not children or parents, and it currently applies to Facebook, Instagram, Kick, Reddit, Snapchat, Threads, TikTok, Twitch, X and YouTube. This almost sounds reasonable. Why should you care, if it becomes facebook responsibility when you don't even own a facebook account? But there is always a caveat. When facebook becomes a tool your school uses to communicate with parents. When Google classroom is the service students use to do their homework. When you are required to login on a system to receive government service. You may not care about a particular social media, but they raise the bar for every other entrant in the game. Every website frequented by a large number of people inherently become social media, and demand data you didn't need to provide before. Technology is not a magical thing that can just solve every problem. It is especially weak when it comes to social problems. However, society can use technology to solve their problems. The responsibility of children falls onto their parents. And there are great tools for parents that their kids access on their devices.

0 views
Sean Goedecke Yesterday

Audience capture

Audience capture is the part that scares me the most about writing on the internet. I have the soul of an engineer 1 : when I see a metric like engagement, I want to improve it. I like to make the number go up. In fact, the whole environment of online writing is tailor-made to help you make engagement numbers go up. It’s trivial to find out how many people are reading my posts, and from what sources. Hundreds of link aggregators all over the internet have algorithms that will help my most engagement-friendly posts get views, and the comments are helpfully sorted by upvotes so I can read the “best” 2 pieces of feedback straight away. Many platforms are set up to financially reward you for engagement, whether that’s by enabling advertisement or by straight up paying you out . Leaning into this environment is a huge mistake. Views and engagement are valuable to me, but not directly. They are proxy metrics for the things I actually care about: It does not benefit me at all to have ten thousand people click through to one of my posts, scan the first sentence, then close the tab. It benefits me only a little 4 to have a hundred people read the title of my post on Hacker News, decide not to click through, and leave their comments in the thread. The set of people who do those things — we could call them “clickers”, as opposed to “readers” — does not really overlap with the set of people who will actually read my posts and think about them. And yet in terms of metrics and engagement, they are indistinguishable. As with any proxy metric, optimizing it too hard can cause it to diverge from the actual value it’s targeting. This leads to the scariest form of audience capture : being captured by an audience you don’t really even want. Suppose I get a lot of views when I write posts about how stupid it is to use microservices 5 , because it’s a hot topic. That gives me a reason to write more posts about microservices. The numbers keep climbing. However, I suspect the set of people who read my posts thoroughly — the audience I actually care about — don’t really want to read a bunch of the same screeds about that, so they drift away 6 . The people clicking don’t care because they’re not reading the posts anyway. So I’m actually failing, not succeeding: I’m replacing my audience of careful thinkers with a fake audience of clickers and sneerers. This is not just a post about writing on the internet. In 2025, I wrote Trying to impress people you don’t respect about how succeeding as an engineer involves, well, impressing people who you may not necessarily respect. The core idea here is knowing what game you’re playing . Some games are proxy games, like getting views on posts or having great Jira ticket metrics. Some games are real games, like gaining the respect of people who you respect, or doing technical work you can be proud of, or trying to convince people of things that you believe are true. The difference is in whether you care about the goal of the game, not in whether that goal is objectively valuable. If you really want to get promoted , then that’s a real game; if you just want to do solid technical work, getting promoted might be a proxy game that you play in order to get into a position to do that. But even though you don’t really care about it, it’s easy and tempting to win the proxy game at the expense of the real game: for instance, to crush Jira tickets because they’re in front of you instead of doing what will actually get you promoted, or to get views on the internet by playing into clickbait. Making tradeoffs like this is sometimes fine. For instance, you might decide to impress people you don’t like so you can afford to send your kids to a good school. Selling out a little bit is good and healthy 7 . But do it with eyes open! The absolute worst thing you can do is to sell out by habit , in situations where it doesn’t even buy you anything you want. There are a lot of posts that I really enjoyed writing that did not get much attention: typically posts where I get a bit more into the philosophy or history, or posts that are dry technical explainers . Some of my most popular posts are laments about a changing industry that are really just popular because they give people an outlet to share their worries too, not because of anything I wrote. I think it’d be a big mistake to lean into writing more posts like that and fewer posts like this. For one, if I want to just optimize for engagement, why write blogs at all? Why not post ragebait and pornography? But the main reason is that I’m writing for the 5% of readers that will read my posts, think about them, talk to other people about the ideas, email me with their comments, and so on. Raw view counts help expose my writing to more of those people, but they don’t give me much signal on whether I’m appealing to them or not. For that I have to just rely on my taste, or on the thin signal I get back from the readers who do email and message me with thoughtful responses. In my own terminology, an “impure engineer” . Or at least the cleverest, or the most cutting. Too honest? I could be even more honest and add “encouraging people to potentially hire me if I’m ever looking”, too. Boosting engagement on Hacker News means the post is more visible for people who might actually read it. Imagine it’s 2015 again. Go on, you know you want to. Sunil Pai has a great post about this dynamic. To quote him: “you don’t get a notification that says, “three people respected you slightly less after reading that.” you don’t get one saying, “someone who was thinking about introducing you to somebody decided not to,” or “someone who thought you might be great to work with now thinks you seem like kind of a pain in the ass.” that stuff is completely invisible.” If you prefer, you could call it “flexibility”. Having smart, informed people read and consider my ideas Getting feedback from readers who have concrete experience with the topics I write about Joining interesting public conversations about the state of the industry Convincing people to think like me on points I care deeply about Building a reputation as a careful thinker and a good writer 3 In my own terminology, an “impure engineer” . ↩ Or at least the cleverest, or the most cutting. ↩ Too honest? I could be even more honest and add “encouraging people to potentially hire me if I’m ever looking”, too. ↩ Boosting engagement on Hacker News means the post is more visible for people who might actually read it. ↩ Imagine it’s 2015 again. Go on, you know you want to. ↩ Sunil Pai has a great post about this dynamic. To quote him: “you don’t get a notification that says, “three people respected you slightly less after reading that.” you don’t get one saying, “someone who was thinking about introducing you to somebody decided not to,” or “someone who thought you might be great to work with now thinks you seem like kind of a pain in the ass.” that stuff is completely invisible.” ↩ If you prefer, you could call it “flexibility”. ↩

0 views
Sean Goedecke Yesterday

LLMs are not superhuman at reading and writing neural network weights

A recent paper argues that frontier LLMs can work with neural network weights directly. This seems superhuman, but it isn’t. The paper shows that GPT-6 Astra can take a small neural network and interact with its weights directly, “well past what we’d expect from humans or conventional algorithms”. Specifically, Astra was able to identify what games a small network 1 was trained to play just by looking at the weights, and even tweak the weights itself. The most impressive result is Astra significantly improving a 0.8B Qwen LLM’s ability on mathematics by natively editing its weights. The reason to be excited here is that “superhuman ability to improve language models” is precisely the kind of thing that could cause recursive self-improvement. I think a smart human ML researcher could perform all of these tasks . Figuring out what game a model was trained to play based on the network sounds impressive until you consider three points: Here’s that calculation expressed as a heatmap in three lines of Python: And here’s the heatmap for each game: If someone showed you that heatmap without the game labels, I think you’d be able to immediately identify at least the first three games purely by noticing where the player is (e.g. for Breakout, in a horizontal line at the bottom) and where the moving objects are (e.g. for Pac-Man, in the distinctive Pac-Man maze). It’s neat 3 that Astra was able to calculate the norms in its head without executing Python, but not that impressive, and certainly not something that should shock anyone who’s been paying attention. I’m not going to go through each example 4 in the paper, so let’s skip straight to the most impressive one: fixing a 0.8B Qwen model’s ability to do mathematics. 0.8B is a lot of parameters, and “mathematics” is way more complicated than “guess what the game is based on how the player moves”, and editing weights is arguably harder than parsing them. What happened here? First, note that the Qwen model was not “bad at mathematics” in a pure capabilities sense. It had a specific problem where after 32k tokens it would get stuck in loops, so any mathematical task that needed more than 32k tokens would automatically fail 5 . If you had a model that looped like this, how would you update the weights to fix it? Personally, I would try steering : I would write some reasoning texts that looped and some reasoning texts that didn’t, calculate the difference between the looping and non-looping residuals, measure how much each weight contributed to that difference, then try manually trimming those top weights. This is basically the Heretic abliteration playbook. And this is exactly what Astra did! It wrote four pairs of texts, measured 6 the weights that contributed to looping, started cutting them down and testing if it worked, and ended up finding a patch that stopped the Qwen model from looping, thus making it able to work on mathematical problems for more than 32k tokens. Again, this is exactly what a competent human researcher could have and would have done. It’s cool that Astra was able to make direct weight updates. But we shouldn’t think of this like a radically new capability that will change how AI research is done. We should think of this as analogous to the ability of LLMs to emit machine code and tweak compiled binaries: it’s an impressive trick, but the best way to work with binaries is still to write source code and compile it. Likewise, the best way to update the weights of a model is to train it normally. To the extent that intelligent LLMs help with AI research, they will help by improving training , not by magically tweaking model weights directly. Around 17k weights. By taking the L2 norm of each input across the 32 weights in the first layer. Note that this is superhuman mental mathematics, not superhuman AI research. The most impressive one I’m skipping is hand-writing a neural network from scratch. While cool, if you can express a task as a simple program, we already know it’s possible to express that program as a NN , even by unaugmented humans . All the <32k token problems were solved successfully on the original Qwen model. Unlike with the toy game networks, it had access to Python. The input channels of the model directly listen to each 8x8 grid cell The input channels are labeled (e.g. “agent”, “moving objects”) It’s thus relatively trivial to calculate 2 which parts of the grid the first layer of weights cares about and why Around 17k weights. ↩ By taking the L2 norm of each input across the 32 weights in the first layer. ↩ Note that this is superhuman mental mathematics, not superhuman AI research. ↩ The most impressive one I’m skipping is hand-writing a neural network from scratch. While cool, if you can express a task as a simple program, we already know it’s possible to express that program as a NN , even by unaugmented humans . ↩ All the <32k token problems were solved successfully on the original Qwen model. ↩ Unlike with the toy game networks, it had access to Python. ↩

0 views
マリウス Yesterday

PBS Black on Black

Disclaimer: While this post is about the “Black on Black” keycap set specifically, it is also a more general review of the PBS profile. In the Q3 2026 update I mentioned the set of PBS Black on Black, which has been on my Kunai ever since. I said back then that I might write a dedicated review once I could better judge it over a longer period of time. A year and a half earlier, in the Q1 2025 update , I had complained about the lack of textured PBT keycaps in the KAM profile and expressed my hope that PBS would eventually take that place. As far as the shape goes, PBS turned out to be pretty much what I was hoping for. Unfortunately, the same can’t be said about the texture, which is a lot smoother than I would like it to be. PBS is short for Penguin Belly Slide and it is a keycap profile designed by none other than Matteo Spinelli, better known as Matt3o, who is also the designer of the MT3 and MTNU profiles. According to Matt3o, the name comes from the hitting area , which is soft, round and oblong, and looks as if it was shaped over the belly of a penguin, while the slide is there because typing on the keys is fun. Unlike MT3 and MTNU, PBS is a uniform profile, meaning that every row has the same shape and height. Matt3o, whose first keycap set was in the DSA profile, calls PBS his tribute to flat, low-profile keycaps and an attempt at a uniform profile that is less boring than DSA. Matt3o began working on PBS in 2022, alongside MTNU, and initially planned to produce it with KBM, which had suggested increasing the wall thickness from 1.5mm to 1.7mm. The project eventually moved to Keyreative, the manufacturer behind the KAT and KAM profiles, with CannonKeys as the global distributor and with the walls back at 1.5mm. CannonKeys released the first PBS blanks in August 2024 and the Black on Black set in October 2024, as an in-stock product for $65, which was restocked several times over the following year. In 2026 a second round added a Modi kit with colored modifier legends. At first sight PBS looks like a cylindrical profile, with the rounded front and back edges and the straight left and right edges that Cherry and OEM keycaps have. The scoop of the hitting area, however, is not a cylinder but a sphere, which Matt3o cuts at the front and the back with a cylinder. The result is a hitting area that is as deep and round as the one of a spherical profile like MTNU, but without an obstacle at the front and the back, as the cylindrical cut lowers those edges. Matt3o describes it as the depth of a spherical top combined with the ergonomics of a cylindrical profile, and he estimates the hitting area to be about 20% larger than the one of MT3. The concave keys are 7.43mm tall at their highest point and the convex ones 7.91mm, which puts PBS slightly below DSA, at 7.84mm, and well below XDA and KAM, at 8.74mm and 9.05mm respectively. With a standard MX switch, the top of a PBS key ends up about 17.8mm above the PCB, compared to 20.5mm for Matt3o’s MTNU. I like the profile and its sculpt, especially the way the scoop hugs the fingertips. People who don’t usually like uniform profiles will likely find the scoop deep enough to keep the fingers from drifting onto neighboring keys, with edges that are soft enough to slide from one key to the next. PBS is a very comfortable uniform profile, more than DSA, XDA, KAM and uniform SA. Many profiles, like Cherry, MT3, KAT or SA, are sculpted , meaning that each row has its own height and angle, so that the upper rows face the typist and the lower rows face away. Sculpted sets need separate molds for every row, and each key only works as intended in the row that it was made for. A uniform profile like DSA, XDA, KAM or PBS uses the same shape for every row, so that any key fits any position of the same size, which, as Matt3o points out, makes every PBS set a free Colemak kit. It also keeps the cost down, as all 1u keys are identical, which was one of Matt3o’s goals with PBS. As I described in my Corne V3 build , the Corne only makes use of R2, R3 and R4 of a sculpted set, and every key has to come from the right row to keep the sculpt consistent. With PBS any cap fits on any position of the Kunai , as long as the size matches. This finally gives me proper legends, e.g. for my Control key, or my Return key. PBS is available with concave and convex keys, and it’s up to the designer of a set to choose which ones to use for the bottom row. Matt3o himself prefers concave keys for their flexibility on custom keyboards. The Black on Black base kit uses a concave bottom row, with convex spacebars and a handful of convex extras in sizes from 1u to 3u, which some owners use on thumb clusters. For homing , the kit includes F, J and numpad 5 keys with a bar as well as with a deeper scoop. Matt3o prefers the deep scoop, while, according to him, most people prefer the bars. On my Kunai I’m using the bars, and for the right thumb (space) I’m using a concave key. The heights are the highest point of a 1u key, as published by CannonKeys and Keyreative. Matt3o never published the row heights of MT3, so the MT3 numbers are my estimates, based on my own measurements. The Cherry profile goes back to the keycaps of Cherry’s own keyboards. GMK has been producing it in double-shot ABS since it took over Cherry’s double-shot tooling in 2011, and sells it as CYL these days. Cherry is a low, sculpted profile with four row shapes, namely R1 for the function and number rows, R2 for the top letter row, R3 for the home row and R4 for the bottom letter row and the modifiers. R1 is the tallest at 9.80mm and R3 the lowest at 7.30mm. According to Keyreative’s 3D models of its Cherry-profile caps, the lower a row is, the more its top is tilted away from the typist, from about 0 degrees on R1 to about 11 degrees on R4. The top of a Cherry key is a cylindrical cut that runs from the front to the back, so that it curves down in the middle when seen from the front, while it’s a straight line when seen from the side. Cherry-profile sets come as double-shot ABS from GMK, with 1.5mm walls and a fine texture that turns into a shine over time, or as dye-sublimated and double-shot PBT from manufacturers like EnjoyPBT and Keyreative. I’m not a big fan of the Cherry profile, although on the Corne, which only uses R2, R3 and R4, it felt more balanced to me than on any 60%+ keyboard. PBS shares the straight sides, the rounded front and back edges of the Cherry profile, but it replaces the cylindrical channel with a spherical scoop and the four rows with a single shape. At 7.43mm, PBS is about as tall as the Cherry home row and lower than its number row, and on the three rows of a Corne the two profiles are within about a millimeter of each other. MT3 is Matt3o’s first profile, which he began drafting in 2015 in a discussion on Deskthority, where the consensus was to create something that resembled the keycaps of IBM’s beam spring keyboards. Massdrop, later Drop, produced it, starting with /dev/tty, which shipped in January 2018 as dye-sublimated PBT with walls of around 1.8mm, while the double-shot ABS sets started with Susuwatari in 2020. MT3 is a tall, sculpted profile with a deep spherical scoop, which Matt3o designed for keyboards with an incline of 5 to 9 degrees, at which the home row ends up parallel to the desk. It adds a steep function row, R0, and offers the bottom row in two versions, an angled R4 and a flat R5. Matt3o’s own 3D files put R0 at 16.2mm, and the letter rows are roughly 11.4mm to 12.8mm tall, which makes MT3 the tallest profile in this comparison. Drop, which owned the MT3 molds, closed its store at the end of March 2026 and turned drop.com into a hub for the collaborations of Corsair, which had bought it in 2023. I favor MT3 for its sculpting, and it had been on the Kunai before PBS. PBS has a scoop that I would compare to the one of MT3 and a hitting area that Matt3o estimates to be about 20% larger, while it does away with the row sculpting and a lot of the height. PBS is quite significantly lower than MT3, making my Kunai a lot more portable. KAT, short for Keyreative All Touch, is the sculpted profile that Keyreative began designing in late 2016. Keyreative describes it as a MiniSA , with the slope design of the Cherry profile, taller rows, especially the function row, and a spherical scoop. Keyreative counts the rows from the bottom up, from R1 for the bottom rows to R5 for the function row. Its own chart puts the number row at 11.57mm and the home row at 9.03mm, while its 3D models put the function row at about 13.5mm. KAT is made of PBT, either dye-sublimated with 1.7mm walls or double-shot with 15% glass fiber and walls of 1.65mm, and Keyreative also lists double-shot ABS as an option. Its finish is the silky, satin-like smoothness that PBS has as well. KAT is one of the profiles that I generally prefer. On the three rows of a Corne, PBS is between 1.6mm and 3.2mm lower than KAT. KAM is Keyreative’s uniform profile, which the company developed from the home row of KAT, starting in February 2018. Every KAM key is based on the KAT home-row key, with a shallow spherical scoop and a height of 9.05mm, or 9.94mm for the convex keys. KAM is made of dye-sublimated PBT with walls of around 1.65mm, either matte or glossy, and Keyreative claims that its glossy KAM caps, like the black KAM Blanks that I had on the Kunai, were the first glossy PBT keycaps. Compared to KAM, PBS is about 1.6mm lower and has a wider and deeper scoop, or, as CannonKeys puts it, KAM is taller than PBS with a less pronounced scoop. Keyreative’s own 3D models put the center of the PBS scoop about 1.1mm below its rim, against about 0.7mm on KAM. The convex keys differ in the same way, as they rise 0.89mm above the concave keys on KAM, but only 0.48mm on PBS. PBS keycaps are made of PBT, while GMK and many of Drop’s MT3 sets use ABS. ABS is an amorphous plastic that softens at around 100°C, while PBT is semi-crystalline and keeps its shape up to about 220°C. PBT is also harder and denser, which makes a PBT cap about a quarter heavier than an ABS cap of the same shape, and it takes a lot longer to develop the shine that finger oils and wear eventually give to every keycap. ABS, on the other hand, yellows under UV light (shout out to GMK Bleached! #scnr ), but it is easier to mold precisely, while PBT shrinks more as it cools in the mold, which makes long keys like spacebars prone to warping. Keyreative itself writes that the PBT used for keycaps is usually PBT with added glass fiber, which reduces warping. In a stream about the PBS prototypes, Matt3o mentioned that Keyreative had added fiber to reduce shrinkage, which caused issues with the shift keys and the 2u keys that were to be fixed for the final release. Some buyers still report 2u to 2.25u caps that are tight on certain stabilizers, which however doesn’t affect the Kunai, as a Corne doesn’t use any stabilizers. At 1.5mm, the PBS walls are as thick as the ones of GMK’s ABS caps, but thinner than the 1.65mm to 1.7mm of Keyreative’s KAT and KAM, the roughly 1.8mm of the first dye-sublimated MT3 set, or the 1.7mm that Matt3o had initially planned for PBS. As for the legends, double-shot molding, which GMK and Drop use for their ABS sets, makes every cap out of two plastics, one for the legend and one for the body. The legends can’t wear off, and both colors can be as dark or as light as the plastics allow. Dye-sublimation instead prints the legends onto a film and uses heat to make the dye migrate into the surface of the cap. This works on PBT because it keeps its shape at the temperatures required, while an ABS cap would deform. The dye can, however, only add color, so the legends have to be darker than the cap. With dye-sublimation, light legends on dark caps require reverse dye-sublimation , which dyes the whole cap except for the legends. The process is difficult to get right, and Keyreative stated that it tried to avoid it because it was unstable, with a defect rate of over 40%. Laser etching, which is common on cheap OEM keyboards, burns the legends into the surface instead and usually leaves them lighter than the cap and noticeable to the touch. PBS uses dye-sublimation because Matt3o wanted the profile to be as affordable as possible. Dye-sublimation requires lower minimum order quantities than double-shot, and it doesn’t lock a set into a single typeface, as the legends are printed rather than molded. My gripe with PBS is the texture. I have long preferred thick PBT with a noticeable, rough texture, like the biip MT3 Extended 2048 that I mentioned in the Q1 2025 update, and compared to that the PBS caps are way too smooth for my taste. I had hoped that PBS would be the textured PBT in a KAM-like profile that I was missing, and in that regard it’s a bit of a bummer. The texture of a keycap is mostly a property of the mold rather than the plastic. GMK, for example, attributes the feel of its keycaps to the spark-eroded structure of its molds, and Keyreative even produces glossy PBT, like the black KAM Blanks that I had on the Kunai before and that turned out to be fingerprint magnets. The smooth finish of PBS is hence a choice, and as far as I can tell it is an intentional one. Matt3o designed PBS partially because of the rough texture of Signature Plastics’ DSA, and he described the surface of the PBS production prototypes as pretty smooth. Even his newer PFF profile for low-profile switches, which Keyreative manufactures as well, is only supposed to be one grade rougher than PBS, a difference that he himself calls hardly noticeable. Compared to what you typically find on the other profiles, PBS is among the smoothest. GMK’s ABS Cherry sets start out with a fine texture that wears into a shine over time, and Cherry-profile PBT from other manufacturers ranges from smooth to grainy, depending on the maker and even the production year. MT3 in PBT, like the biip set, has a pronounced, rough texture, while Drop’s double-shot ABS MT3 is smooth from the start. KAT and the matte KAM sets come from the same manufacturer as PBS and have a similar finish, which people describe as satin or silk for KAT and as velvet for KAM. PBS is at least as smooth as KAT, and it’s almost slippery. As a matter of fact, while removing the keycaps to replace switches I continuously drop every other PBS keycap because they are incredibly smooth, very flat and have rounded edges. On top of that PBS, just like KAM, shows oil and fingerprints a lot quicker than the textured DSA due to its choice of material and texture. Many like it that way, but I frankly don’t and it’s one of the most off-putting fact about the keycaps. I’m not alone with my complaint, however, as some in the PBS community have apparently been asking for a slightly rougher texture ever since the first blanks shipped in 2024. Despite its name, the PBS Black on Black isn’t black, but more of a dark gray. This is especially visible in bright daylight, and on the Kunai, which I painted in Tamiya TS-81, a light gray, it’s obvious that the caps aren’t black at all. If anything, it’s black legends on charcoal keycaps, so I would have rather picked something along the lines of Black on Charcoal as a name, because Black on Black is definitely misleading. The reason for this is, as I explained above, is most definitely the legend process. As dye-sublimation can only add color, you can’t sublimate black legends onto a black cap, because nothing is darker than black. This is why black-on-black sets with dye-sublimated legends, from PFU’s charcoal HHKB to Drop’s Artifact Bloom Black on Black, use a dark gray body with even darker legends. Even GMK’s double-shot Stealth set gets its contrast from an anthracite gray against black. Matt3o, who calls himself a PBT guy, wrote back in 2022 that the only downside of PBT is that you can’t do dark sets with it. In his stream about the PBS production prototypes, he also mentioned that he had wanted to make the black of the Black on Black lighter, but that everyone told him not to, and for good reason. To be completely honest, I don’t like the color at all. Unless I’m in almost complete darkness, the charcoal is noticable as such and really doesn’t go well with the rest of my specific board. As a matter of fact, even the (actually black) RAMA USB A-to-C keyboard cable is visibly different in color. Even worse, the two GMK Stealth RAMA artisans that I use as my upper left tab and my upper right backspace key are noticably darker than the keycaps. Hell, even the L-connectors of my TRRS cable are significantly more black than the keycaps. The PBS Black on Black sadly sort of ruins the aesthetics that I went for with my Kunai, making it look rather cheap. It reminds me a lot of KPrepublic’s $40 PBT Gentleman Black keycap set. Note: A matte surface scatters part of the incoming light back in all directions, which makes the color underneath appear lighter than it is. In a measurement by Konica Minolta of a dark plastic part with a matte and a glossy area, made from the same resin and color, the matte area came out noticeably lighter than the glossy one. Hence a dark, matte cap looks grayer the brighter and more diffuse the light is, as it is in daylight. The legends are slightly darker than the caps and, depending on the light, barely visible. Matt3o said that you could almost consider the set blanks, and I can confirm that legends are easy to read in direct sunlight but completely disappear in low light. Given that the legends therefore serve no practical and almost no aesthetical purpose, it makes me wonder even more why Matt3o went for this relatively cheap looking charcoal color for the keycaps to begin with, rather than making them slightly darker. PS: The modifiers use text legends throughout, with CODE instead of a Windows or Command key, which is what I prefer. One key benefit of PBS over MT3, which I also favor for its sculpting, is the height. On the three rows that a Corne uses, MT3 keys are roughly 11.4mm to 12.8mm tall, while every PBS key is 7.43mm, which makes the Kunai about 4mm to 5.5mm flatter with PBS than it was with MT3. When I built the Kunai I wrote that, without palm rests, the board is on the higher end, and that I could imagine MT3 or SA making it too tall, which turned out to be true. With PBS the Kunai is significantly flatter than it was with MT3, bringing it back down to a slightly more manageable height. In addition, it also makes it a lot more portable, as it takes up less room in the NuPhy NuPack that I carry it in. PBS has become one of my favorite keycap profiles , as it is pretty much what I was hoping for. Compared to MT3, which I like as well, PBS makes the Kunai a lot flatter and hence more portable. However, the caps are way too smooth for my taste, and the color of specifically the Black on Black set is pretty bad. They aren’t black but more of a dark gray, which in bright daylight and on the light gray Kunai looks rather unpleasant. If you like the silky surface of Keyreative’s KAT and KAM, and a charcoal instead of a true black doesn’t bother you then I guess PBS Black on Black can be for you. If, like me, you prefer a rough, grainy PBT, PBS will sadly feel too smooth. I’m not aware of any PBS set with a rougher finish and considering the author’s posts and preferences I’m doubtful that we will ever see one. For me, PBS Black on Black definitely is kind of a love-hate relationship.

0 views

The U.S. Census Bureau and “Super Intelligence”

I was reminded today of AI Adoption Rate Trending Down for Large Companies , a chart produced by Apollo Global Management in September 2025, which appeared to show a slowdown in U.S. corporate AI adoption based on numbers collected by the U.S. Census Bureau. At the time I used that chart to demonstrate GPT-5 data analysis , and then to experiment with Claude's new Code Interpreter . I decided to try running those numbers again to see what had changed over the past year, and in doing so learned that the Bureau has fallen foul of Executive Order 14434 , aka the asinine Super Intelligence one. Every two weeks the U.S. Census Bureau runs a survey called the Business Trends and Outlook Survey (aka BTOS). Each time it goes to 200,000 businesses out of 1.2 million total - the surveyed group (a "panel") cycles such that an individual business only completes the survey every twelve weeks. The latest data is published on alternating Thursdays at 10am. I used the most recent numbers (published October 22, 2026) to create a new version of the AI adoption chart, updated to reflect both the last twelve months and a change that was made to the survey question sent out by the Bureau: For comparison, here's that AI adoption chart from last year (my GPT-5 version): In September 2025 the largest (250+ employees) companies answered "yes" around 12% of the time to the question about whether they used AI in "producing goods or services". Under the new "any business function" wording, by February 2026, those same large companies answered "yes" around 30% of the time, and by October 2026 that had increased to around 40%. The data in the above chart comes from the "Employment size class" XLSX file, available from here . Here's a copy of the file I used. You can view the survey document that is sent out to businesses - here's my snapshot copy of that 346KB PDF. As the chart demonstrates, the question asked by the Bureau changed in a material way on November 17th, 2025. Prior to that date, the question they asked was this (emphasis mine): In the last two weeks, did this business use Artificial Intelligence (AI) in producing goods or services ? (Examples of AI: machine learning, natural language processing, virtual agents, voice recognition, etc.) On December 3rd, 2025, the Bureau announced a significant change to that question. Here's the replacement: In the last two weeks, did this business use Artificial Intelligence (AI) in any of its business functions ? (Examples of AI: machine learning, natural language processing, virtual agents, voice recognition, etc.) No more "producing goods or services" - now it's "in any of its business functions"! This means that the answers to the question before and after November 17th are not directly comparable. When I went looking for the updated question language in the latest XLSX file, I couldn't find it. I found this instead: In the last two weeks, did this business use Super Intelligence or SI (formerly referred to as Artificial Intelligence or AI) in any of its business functions? (Examples of SI use include: SI-powered data analysis; generative SI for marketing, product design, or coding; virtual SI agents for customer service; SI-powered forecasting or pricing; SI-driven computer vision for quality control, etc.) The BTOS about page explains what happened: Beginning with the October 19, 2026 collection, instrument wording was updated due to Executive Order 14434 . The current numbers reflect the old Artificial Intelligence survey wording - the first survey results reflecting the Super Intelligence wording are due for publication on Thursday. The obvious open question here is whether this wording change is going to affect the survey results. The businesses answering this survey will have last seen that question twelve weeks ago, when it was still called AI. Hopefully the new language isn't going to confuse them, especially since the survey helpfully spells out "formerly referred to as Artificial Intelligence or AI". I can't help but laugh at the absurdity of "SI-powered data analysis; generative SI for marketing, product design, or coding; virtual SI agents for customer service" though. You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options .

0 views

When Every Distributed Database is 'Highly Available'

An irritating thing about database vendors is that they all claim their offering is "highly available". If pressed they'll say they're talking about their SLA , and while this is not technically lying, it is very misleading, because people who know some distributed systems lore may have a much different conception of what "availability" is; namely this from the CAP theorem : The CAP theorem has been critiqued - which we'll get to - but it is massively influential. Jepsen of database report fame uses the term similarly, furnishing us with three categories of availability: In the Jepsen terminology most databases today are unavailable. A good rule of thumb is anything with a single writing node falls under this - no matter what their marketing material says. I feel availability has been diluted too far to serve in the technical lingua franca of people building systems. Database vendors have convinced large numbers of us that there isn't even a availability/consistency trade off to be made - that they in their engineering might have miraculously achieved both. It's at times like this we need an academic. Not just a specialist, but a generalist, one who is able to take a broad subject area, analyse it intensely, and understands what he reads so totally he is able to explain it to a general audience. Availablity is dead, is anybody here a doctor??? In his excellent paper A Critique of the CAP Theorem , Martin Kleppmann goes into some detail, noting both the metric that is empirically observed definition the vendors use, and the more academic one used in the literature. It's well worth reading in full, but I want to focus on his "delay sensitivity framework": reproduced here (where d is network delay): In typical Kleppmannian fashion he has managed to reduce complex phenomena from a great number of real world systems into a simple table. But I think to serve as a piece of lingo, "delay sensitive" is not quite catchy to use in real speech. And so I humbly propose consistency/latency . It works because it's a single term; that DB is high cosnsitency/latency , that one is low consistency/latency . Consistency/Latency are an inseparabable package; you are either high or low, no "strong consistency AND highly available" vendor shennanigans. I am of course simplifying a great deal of complex research, but the general rule is that as consistency rises, latency increases with it; all else being equal it's always going to be faster & more robust to directly write to your local node than wait for a consensus protocol to finish. While I desperately hope this becomes popular enough that we can call it conlat for short, I have already started using this classification when talking about systems at a high level, and will continue do so. I hope it may also serve others well.

0 views
Stratechery 2 days ago

Google Earnings, Facebook Déjà Vu, The Agent Play

Google's earnings miss looks a lot like Facebook's, and that's a credit to Google. The company is being more aggressive than they get credit for.

0 views
Corrode 2 days ago

Thinking in Traits

Rust favors composition over inheritance. I’m sure you’ve heard that before, but rarely does anyone take the time to explain what it means in practice. Also, why is this model the right choice for Rust? Let’s take a step back and look at an example: have you ever asked yourself why works the way it does? How does know to produce a here? To answer that, let’s first look at the signature of : Note how it doesn’t mention at all. In fact, it doesn’t “know” about any collection type or any other type, for that matter. The thing it does know is that whatever type you want must be capable of constructing itself from an iterator. And happens to be a type that does. Further note that we didn’t specify the element type of the vector. The compiler is clever enough to infer that from the context! The mechanism is the same for any other supported type, like hash maps, strings, or any custom collection type of your choosing as long as it implements for the iterator’s item type. And what “collecting” means is also defined by the type itself. A , for example, has the ability to collect characters: And a can collect key-value pairs: It’s only fair to mention that interfaces can also express shared contracts. Here, two independently defined implementations connect through a shared item type. This is “composition through contracts”: Here, a producer yields values of some type through the trait. On the other side, a collection implements to describe how it can build itself from those values. The shared item type connects the two contracts, and is the bridge between them. It requires only that the destination can be constructed from the items the iterator yields. In our first example, the annotation selects the destination type. Because implements , the compiler knows how to connect that destination to our iterator. is the glue that passes the iterator to that implementation, which creates and fills the vector. Note how neither side needs to know the concrete type on the other side. The iterator doesn’t need to know how a vector stores its elements. And the vector doesn’t need to know where the items came from, only how to iterate over them. That means we can extend either side independently. A new iterator can feed existing collections, and a new collection implementing can accept existing iterators yielding . We don’t need a separate conversion for every producer–collection pair. All we need is one implementation, and is the glue that brings it all together. In simple Rust pseudocode, we can expand the calls step by step: The value of an abstraction is the code that no longer needs to exist between its users. Class inheritance models “is-a” relationships. In Java, for example, an is a subclass of . An encrypted socket is still a socket, after all. But does every socket operation make sense for it? lets a TCP connection stop sending while continuing to receive, a feature called “half-closing.” Code using a socket might therefore do this: On Android API levels 21 through 23, the platform’s implementations rejected this operation with . This caused a real crash in OkHttp 5.2.0 . Modern OpenJDK supports TLS-aware shutdown , so this is a historical mismatch, not a universal limitation of TLS. Still, the type exposed an operation without telling callers whether that implementation supported it. With composition, a TLS connection can hold a socket internally without exposing every operation on it. It can provide reading and writing, with a separate capability for half-closing where supported. We can reuse the transport without inheriting its entire interface. Simply replacing inheritance with interfaces—or traits—doesn’t fix a poorly chosen contract. What’s important is that the contract matches the capabilities of its implementations . Rust makes trait-based composition central to code reuse. In Rust, we ask what a type can do , not what it is . In other words, traits describe capabilities, not taxonomies. Here are simplified versions of two central I/O traits from the standard library: Note how these are two independent traits. A type can implement , or , or both, or neither. You’re declaring which operations a type supports, without inheriting a bunch of unrelated methods. The capabilities are orthogonal. For example: The trait implementation belongs to the type , not to a concrete value. Take , for example. It implements both and , but a file opened in read-only mode will still fail at runtime if you try to write to it. Even a file opened for writing can fail when the disk fills up. The trait implementation is a promise that the type supports those operations, but what it can’t do is guarantee that every operation will succeed at runtime. If you want to distinguish read-only and writable handles at compile time, you could define a and a and only implement the appropriate traits for each. That rules out unsupported operations in your API, but it still doesn’t make I/O infallible. Rust can express that a container has a capability only when its contents do. For example, implements when implements . Thanks to this trick, we don’t end up with two different types, one cloneable and one not. Here’s the same pattern for a small wrapper you could define yourself: A is cloneable because is cloneable. A is not, since does not implement . If you were to call on that batch, the code wouldn’t compile. You can store non-cloneable items in a batch; you just can’t clone that batch. For this wrapper, you can use to generate the conditional implementation automatically. Note that the bound belongs on the implementation , not on itself. Making your type cloneable requires , but apart from that, is still a perfectly valid type for non-cloneable elements. The compiler works out which operations are available from the capabilities of the component types . A conditional implementation can also apply to every type that satisfies a trait bound as opposed to one particular wrapper. This is called a blanket implementation . For example, the standard library implements for every type that implements : All you have to do to get a method is implement for your type. The compiler automatically generates the implementation for you. The rule applies even to types written long after the standard library itself. This is an elegant way to express a reusable implication between capabilities: “If a type can be displayed, it can be turned into a string.” The same idea appears in conversions. You might know that implementing automatically provides through a blanket implementation. That’s why you normally implement rather than writing the corresponding implementation yourself. Conditional implementations also let us add behavior by wrapping one value in another. This is a different type of composition: “composition of values.” A wrapper holds another value and builds on its capabilities. Take our trait from earlier: So a parser accepting doesn’t need separate support for files, buffered files, and length-limited buffered files. It just reads bytes! We can add buffering and a byte limit without teaching the parser about either. The parser doesn’t need to understand how its input was assembled. This works because each wrapper preserves the contract that the next piece needs. A implements when does, and so does . The result of one composition becomes a building block for the next. You can see the same idea in iterator chains. Each type implements , so you can chain them. Writing your own iterator connects your type to this vast ecosystem of adapters. All you need is to provide the associated type and the method . , , , and already have default implementations, available when their additional bounds are satisfied. This is how you reuse code without a base class. Default methods provide behavior within a trait you implement; blanket implementations can make another trait apply automatically. But adapters don’t have to be limited to a single, rigid contract either. They can provide rich, additional capabilities, too. For example, implements when its input iterator does, and it does so with an appropriate trait bound on the mapping function: So because the adapter has a conditional implementation for , it preserves the ability to iterate backward through the input. We’re not limited to basic iteration. And since we know the concrete iterator types, the compiler can optimize and inline the entire chain of adapters into a single loop. Optimized iterator code can perform comparably to a hand-written loop . So fully embracing iterator patterns has no runtime cost. Hold on, Rust has another way to express “different kinds of things that are related”: enums! These are useful in situations where you know the full list of possibilities in advance. Enums are great if you almost always want to handle all of the variants in one place. Traits are the better model if different types implement the same behavior and you don’t know all of the types right now. In other words, enums are a closed set of variants while traits are an open set of implementations. You can’t add new variants to an enum without changing the enum definition. But traits enable the open/closed principle: you can add new implementations without modifying existing code. This allows other crates to extend your library without needing to modify your code. Imagine your library defines the and types, and you want to provide a way for users to fetch records from different sources. In your library, you implement for a and a . But now, users can implement it for their own or a . Heck, you don’t even need to know these types exist. And yet, your contract still holds: any type that implements can be used to fetch records. The reverse is also true: an external contributor can define an extension trait and implement it for your type without you knowing about it. You can even do that with types from the standard library: As long as the trait is in scope, you can call the method on a : No need to modify or derive a subclass. This implementation is allowed because we define in our crate. Rust’s coherence rules restrict implementations involving foreign traits and types. For example, we couldn’t implement the standard library’s trait directly for , since neither the trait nor the type is ours. This is composition at the level of behavior : we combine an existing type with an independently defined capability. The type and the trait don’t need to know about each other. The same type can implement other, unrelated traits, and each function can ask for just the capabilities it needs by means of trait bounds: This open-set/closed-set principle is a good way to think about when to use enums and when to use traits. But to be fair, the lines can blur a bit. An enum can also implement traits, and a library can restrict who implements a trait through a technique called a “sealed trait.” In application code, exhaustive enum checking can make refactoring easier because the compiler will tell you which statements need to be updated when you add a new variant. Introduce a trait instead when you have a good reason to share a contract across types . The more unrelated responsibilities a trait combines, the harder it becomes to implement and reuse. Every implementer has to account for operations it may not need. Consider this application context: Ask yourself: what concept does this trait capture? What contract does it enforce? It combines reading records, writing records, and running the application. Perhaps your application really needs one type to provide it all, but a function that copies records shouldn’t require its inputs to run an application. Let’s split the capabilities: Now a read-only source can implement , a write-only destination can implement , and the execution runtime is left out. Your functions don’t need to know about the runtime either, and you can compose the exact capabilities you need: Each of your types can implement either trait. Or both. This also explains how independent crates work with your types. Serde defines and ; your types implement them, often through derive macros. Serde’s serializers don’t need to know about your application’s structs in advance. They just use the shared contract: a type that implements can be serialized. Code becomes more composable as a consequence. If Serde decided to couple serialization and deserialization into a single trait, some use cases would be impossible to express. All of that is great for testing, too. We can test with a fake implementation and a fake implementation, without creating a runtime. The goal isn’t to make every trait contain exactly one method. has many methods, but they are all strictly related to the task of iterating over a sequence of values, and all but one ( ) have a default implementation. It’s fine to keep methods together when they describe the same contract, but if you’re unsure if callers need the independent capabilities, split your traits. Below are a couple of concrete tips around trait design. When you approach a problem, ask what your code needs a type to be able to do. Often, an existing trait already expresses that. Check the standard library and popular crates first. And sometimes a concrete type or an enum is enough. Write the code concretely first. If you find yourself copying similar implementations across different types, look for a shared contract. By then, you’ll have concrete examples to test your abstraction against. And when you do need a new trait, give it a contract you can explain in a single sentence. Abstraction has a cost for readers. They may need to follow bounds and implementations across several files to understand a call. Sometimes that indirection hides details they shouldn’t need to care about. Sometimes it hides an important detail they should. Trait-based abstractions in Rust often incur zero additional runtime overhead, but there is a compilation cost as well. The costs depend on how you use the trait. Generic code is usually monomorphized: the compiler generates code for the concrete types that use it. That permits static dispatch and inlining, but many instantiations can still increase compile time and binary size. For dyn-compatible traits , dynamic dispatch through lets the same caller operate on different implementations, but introduces indirection and can limit inlining. Not every trait supports this: , for example, is not dyn-compatible. Keep these trade-offs in mind when you introduce a trait. There is no free lunch. Let’s come back to our once more. So far, we’ve used the destination type to choose a collection. But it can also determine control flow. For example, we can decide to stop iterating on the first error or keep going and collect every result, including errors. I first learned about this from Karol Kuczmarski’s Iteration patterns for Result & Option , still one of my favorite Rust posts. Here it is in action: Note that in both cases, the iterator expressions are identical . The only thing that changes is the destination type: In the second case, is never parsed. If every parse succeeds, the second version returns containing the vector of values. This behavior comes from the standard library’s implementation for . Here’s a stub of that implementation: What this says is: An iterator of values can be collected into a , as long as can collect values of type . The bound means that could be a or any other type that can collect those values. itself doesn’t need to know any of this: it just calls the destination type’s implementation. See how all of those pieces fit together? That’s the real payoff when you think in traits. A single implementation can connect a type to an entire ecosystem of algorithms, adapters, and collections. A few carefully crafted capabilities can combine in ways their authors never imagined. That makes the whole greater than the sum of its parts. And that’s just great API design. A byte slice ( ) implements but not . The returned by implements but not . A implements both. A implements . Wrapping it in a adds buffering, and the result still implements . Calling on that reader limits how many bytes it yields, and the result still implements . produces a iterator that applies a function to each item of the underlying iterator . produces a iterator that yields only the items of that satisfy the predicate . produces a iterator that yields at most the first items of . When you approach a problem, ask what your code needs a type to be able to do. Often, an existing trait already expresses that. Check the standard library and popular crates first. And sometimes a concrete type or an enum is enough. Write the code concretely first. If you find yourself copying similar implementations across different types, look for a shared contract. By then, you’ll have concrete examples to test your abstraction against. And when you do need a new trait, give it a contract you can explain in a single sentence. Abstraction has a cost for readers. They may need to follow bounds and implementations across several files to understand a call. Sometimes that indirection hides details they shouldn’t need to care about. Sometimes it hides an important detail they should. Trait-based abstractions in Rust often incur zero additional runtime overhead, but there is a compilation cost as well. The costs depend on how you use the trait. Generic code is usually monomorphized: the compiler generates code for the concrete types that use it. That permits static dispatch and inlining, but many instantiations can still increase compile time and binary size. For dyn-compatible traits , dynamic dispatch through lets the same caller operate on different implementations, but introduces indirection and can limit inlining. Not every trait supports this: , for example, is not dyn-compatible. collects every parse result. returns the first error and stops advancing the iterator immediately.

0 views