Tuesday, 18 August

11:21

The road to MS-DOS 2 [OSnews]

A great and concise history of the run-up to MS-DOS 2.0.

Yet, there was a nagging feeling that a single-tasking CP/M clone was inadequate for the new generation of personal computers. Digital Research released multi-user, multitasking MP/M-86 in September 1981 and announced the single‑user multitasking Concurrent CP/M in early 1982. In response, Microsoft came up with a plan for tiered approach to its operating systems: single-user/single-tasking MS-DOS at the bottom; multi-user/multitasking XENIX at the top; and in the middle, something called XEDOS: a single-user version of XENIX. This “pyramid of upward-compatible operating systems” was announced in a Byte Magazine editorial in January 1982.

↫ Nemanja Trifunovic

I’ve always found this tiered approach fascinating, and the world surely would’ve looked quite different had Microsoft been able to make it work. I doubt Windows NT would ever have existed, and most of the world would probably be running a XENIX-based Windows today (all else being equal, which is of course unlikely and silly). Regardless, MS-DOS 2.0 contained a few UNIX-like utilities to deal with its brand new support for directory trees and other new features, and even had a /dev directory.

PervertPods: Apple is adding cameras to AirPods [OSnews]

If you thought pervert glasses weren’t bad enough, Apple is taking it up a notch by adding cameras to its AirPods.

Apple is working on camera-equipped AirPods that appear to be nearly ready to launch, based on a video MacRumors found in the macOS Tahoe 26.7 release candidate.

In a short demo, a man holds a book up so the camera in the AirPods can see the title. “With Visual Intelligence, your world becomes savable. See something you like? Just ask me to save it for later,” says the voiceover text.

↫ Juli Clover at MacRumors

AirPods are tiny. I’ve seen people use them at the gym. I’ve seen them on playgrounds. I’ve seen them around swimming pools. People use them at the beach. They’re used at schools. In locker rooms. Tiny cameras in tiny AirPods that can photograph anything in front of the user are a pervert’s wet dream. Abusers are going to love this. Why wear bulky glasses anyone can see and try to demand you take off, when you can wear tiny AirPods that have already been fully normalised in society? Was there not a single woman or parent on the team that made this?

All over the United States, people are destroying Flock surveillance cameras. More and more communities are rising up and demanding these things removed from their streets and neighbourhoods. The awareness of just how pervasive mass government surveillance has become is growing, and Silicon Valley’s complicity is not exactly a secret. And in this climate of rapidly growing concern and anger, Apple is going to add tiny cameras to its tiny AirPods. Was there not a single person of colour or protester on the team that made this?

How detached from reality do you have to be to greenlight something like this? Does anyone – regardless of skin colour, gender, or political leaning – want even more cameras around them?

10:49

The Amazon tax [Seth's Blog]

It’s not technically a tax. Taxes produce valuable public benefits, like medical research and parks. This is simply legal theft.

Amazon makes nearly a billion dollars in profit from search ads. Every week. Each week, they sell merchants and publishers enough search-distorting ads to capture a billion dollars in revenue. Amazon makes enough in search ad revenue to give every single one of their employees a $35,000 cash bonus and still have change left over.

My publisher is terrific, and they’re working hard to introduce people to my new book. Last week, they began buying search ads on Amazon.

At first glance, this is compelling. Someone who isn’t sure what they’re looking for, who is looking for a book or a kitchen appliance, might find one if the right ad showed up at the right time.

But of course, that’s not what yields, or what most of the ads you see on Amazon do.

If you’re searching for an air fryer, Amazon already knows quite a bit. They know the best-reviewed, least-returned, best-priced model. The only purpose of the ads is to get you to pick an air fryer that isn’t that one (or for the best air fryer, to keep you on track to buy the one you wanted in the first place). The ads make the search worse. [Cory wrote about this three years ago, and the scale has already doubled.]

When there are plenty of ads, the maker of the best air fryer now has to bid on ads as well, if only to protect the sales they were entitled to in the first place. Businesses continue to buy the ads—not because they’re dumb, but because the system has created a situation with few options. Folklore implies that buying the ads somehow shifts how search responds in the long run, even after the ads stop running, but there’s little data to confirm this.

Traditional ads increase demand. We see something that’s clearly an ad, it might spark desire, and sales go up. But zero-sum search ads aren’t like that–the total sales in the category stay the same, and merchants are merely competing for a share of a static pie. This study argues that an ecommerce site with search ads actually sells fewer items than the same site without ads.

The highest-yielding ad my publisher has tested so far is the search “Seth Godin The Knot“. It costs about a dollar per click. My publisher is paying Amazon a dollar to show you an ad for the book you went to buy in the first place.

Who ends up paying the more than $50 billion a year spent on these ads? It’s not the sellers. Sellers can’t make heartfelt donations for long. It’s you. By making the marketing of products significantly less efficient, Amazon’s theft makes products more expensive or sucks the energy out of the development of new products.

It leads to two perverse side effects. First, producers realize that if brand reputation matters less than a budget for clicks, they will shift to shoddy and cheap versions of their products so they have a bigger budget for clicks. And second, Amazon (and Google before it) have an incentive to make their organic search results worse–giving producers more incentive to buy more ads.

For decades, Amazon created value for consumers by lowering the price of just about everything. And they opened the doors to merchants who didn’t have sufficient distribution. They claimed to be customer-centric, and they were.

I don’t think they can claim this any longer. The ad system they built isn’t illegal, but it’s pretty clear who it’s for.

Amazon is stealing from the customers they said they were here to serve.

10:35

Quake shareware, a CD-ROM just a little too full [OSnews]

I was around when Quake was launched, but I was entirely unaware of this story.

By June 1996, after three years of hard work, id Software had completed their next title, Quake. As for their previous title, they were going to release both a shareware version and a full version of their game. Since it used a mere 22 MiB of storage, people at id Software had the idea of leveraging the remaining capacity of a CD-ROM. Why not include encrypted versions of the full id catalogue of games? Not only this would cut out the middlemen, it would give instant access to gamers with a simple phone call and a credit card.

The concept was implemented. The CD was announced on July 3, 1996 and released on August 30th[5]. The hacker group GNOMON released Quakecrk.zip only 39 days later. The archive contained QCRACK.EXE, a tool allowing to decrypt every single game on the CD-ROM.

↫ Fabien Sanglard

The system id employed turned out to be incredibly primitive and simple, and hackers found out quite easily that the system required no secret sauce from id at all – the code you’d get over the phone contained no secret, and all the validation program on the disk did was check to ensure the code received over the phone matched the code generated by the disk.

No wonder it took them only 39 days to crack this.

Beyond the limits of physical VRAM [OSnews]

Earlier this year, Natalie Vock made a splash with a set of patches to the Linux kernel that greatly increased performance on AMD GPUs with lower amounts of VRAM. With that work now accepted by upstream, Vock decided to turn their attention to another interesting problem: what if you run out of VRAM, and how can we improve performance when we do?

Regardless, what I hope this blogpost can demonstrate is that even if you end up with some memory evicted to system RAM, the slowdown can be manageable. There’s measures that drivers (particularly, the kernel driver) can take to make overcommit work as fast as possible, and even applications can do their part in coordinating with the driver stack to mitigate the effects of their memory being evicted. With everything in place, VRAM overcommit isn’t really as big of a deal as one may think it is at first sight.

↫ Natalie Vock

The work Vock has done has already been in SteamOS for a while, and they’re currently in the process of upstreaming it to the vanilla kernel as well. Since this is a complex set of patches and changes, this may take a while, and as such, they’ve prepared custom kernel and Mesa branches for adventurous users. Do note that these branches won’t be maintained much, and are entirely experimental, not as well-tested as the SteamOS kernel, and probably won’t yield the same performance improvements.

Still, this is the kind of work that has a material impact for users. Not everyone has a 16GB monster GPU, especially not today with supply chains ravaged and ruined by slopmakers, so it’s great to see the Linux world working to improve performance for everyone, not just the wealthy few.

09:49

Were Touch Bar’s problems software rather than hardware? [OSnews]

The Touch Bar arrived in 2016 seemingly already pre-doomed, on a generation of machines that had a “we’ve run out of ideas” smell all around them. The arrow keys were reshaped, the keyboard got a slimming down, and even the beloved MagSafe wasn’t, in fact, safe. All of these changes would prove unpopular and get reverted in time, and the axe would eventually come for the Touch Bar, too.

With an enormous benefit of hindsight, a decade after its arrival, and on the (rumored) eve of fully multitouch MacBooks, I wanted to look critically at the Touch Bar in more detail. I put a spicy title above this post, and while I’m not sure I can answer it in the affirmative, I feel I got surprisingly close to that.

↫ Marcin Wichary

I have never spent this much reading about and pondering a technology seemingly nobody liked and that I never really used. I still think there’s merit to the idea of screen on a keyboard, but only if the screens are integrated into the individual keys (as some products have tried over the years). Of course, this would also be astronomically expensive, delicate, and virtually impossible to repair, so I’m not sure something like that can be reasonably made at an affordable price.

09:00

It’s What’s Inside That Counts by Dulceskull [Oh Joy Sex Toy]

It’s What’s Inside That Counts by Dulceskull

First dates are for getting to know someone! But what do you do if it turns out they’re hiding a *monstrous* secret? Dulceskull reveals the true nature of these flirty femmes in this sweet, sexy story. Dulceskull Patreon Bluesky A little reminder here in the bottom of the page, to come and support us on […]

05:56

Urgent: Tax big oil's war profiteering [Richard Stallman's Political Notes]

US citizens: call on your public officials to tax big oil's war profiteering.

Here's what I said in my letter:

I urge you to tax the war profits being collected by giant oil corporations and end their tax breaks. They have been draining America's bank account as they drain America's petroleum, and polluting our politics as they pollute our air and water. It's time to make them stop!

See the instructions for how to sign this letter campaign without running any nonfree JavaScript code--not trivial, but not hard.

Urgent: Stop racist immigration crackdown [Richard Stallman's Political Notes]

US citizens: call on your congresscritter to stop the racist immigration crackdown.

See the instructions for how to sign this letter campaign without running any nonfree JavaScript code--not trivial, but not hard.

US citizens: Join with this campaign to address this issue.

To phone your congresscritter about this, the main switchboard is +1-202-224-3121.

Please spread the word.

Urgent: Tax Big Tech's ad income [Richard Stallman's Political Notes]

US citizens: call on your state lawmakers to tax Big Tech's ad income.

See the instructions for how to sign this letter campaign without running any nonfree JavaScript code--not trivial, but not hard.

Urgent: Protect human-centered education [Richard Stallman's Political Notes]

US citizens: call on Tell State Leaders: Protect Human-Centered Education Before Supposed Intelligence Enters Our Classrooms.

I edited my letter so as not to refer to these bullshit generators as "artificial intelligence", because I question whether they qualify as "intelligence". See https://gnu.org/philosophy/words-to-avoid.html#ArtificialIntelligence.

See the instructions for how to sign this letter campaign without running any nonfree JavaScript code--not trivial, but not hard.

02:49

John Goerzen: AI in Debian: The Vote, Proposals, and Nuance [Planet Debian]

Let me start with a hypothesis:

For human developers, using coding LLMs magnifies their difference in skill levels.

I am one that rarely thinks things are always black and white. Back in March, I wrote Artifial Intelligence: Shades of Gray. Since then, I’ve had more of a chance to experiment with LLMs myself. I also happen to work for an employer that is taking a very pragmatic approach to LLMs: teams and individuals use it as they see fit, but if they are causing considerable expense, they have to justify it.

In various settings, I have seen the egregious examples of AI slop we all know about. As I wrote in March, “I have seen it both waste more time than it saves, and save a ton of time.”

I have come to see that, as a tool, it is most valuable when it is running under the supervision of an experienced engineer. It is at its worst when it has no such supervision; the “vibe coding” and other low-quality slop we see.

A coding agent is like a junior developer or research assistant. When properly supervised, they help projects move along more quickly by letting a senior developer focus on the more difficult, less mundane aspects of the project. But one couldn’t expect a junior developer to consistently deliver high-quality code and architecture on their own.

Let’s put a pin in this idea and look at the story in Debian.

LLM use in Debian

There is a vote happening in Debian around the use of LLMs. In typical Debian fashion, there are 8 options to choose from, many of them similar. Most of these proposals acknowledge there are different types of tasks done in Debian, but the proposals don’t differentiate between them well. Let me do so here. These are some of the LLM-relevant tasks people in Debian perform:

  • Packaging upstream software for Debian (by far the largest task)
  • Writing Debian-specific code (eg, apt or the Debian installer)
  • Maintaining Debian infrastructure (build systems, for instance)
  • Writing documentation and translations

I’m going to focus my remarks here on packaging upstream software for Debian, since this is by far the most time-consuming developer task project-wide.

It matters to our users that we get this right, and packaging quality is one of the things that sets Debian apart from other distros. Packaging things for Debian requires knowledge of some specific tools, such as debhelper, that aren’t widely used anywhere else. In most cases, it is fairly rote time-consuming work. In other words, by its design, it requires people with senior-level skills to do grunt work.

I can’t overstate how massive a burden this grunt work is. I maintain some packages for Go and Rust. By Debian policy, all of those packages’ dependencies must also exist as Debian packages, and be used to build against. When upstream adopts a newer version of some library, it can unleash cascading dependencies that can take hours to sort out. Worse, the Rust team and the Go team use entirely different ways of managing packages (Go uses one Git repo per package, while Rust has a monorepo with specialized scripts to import Cargo packages and generate Debian ones). On top of that, we can’t just modify things like usual; we have to use quilt. And on top of that, I’m also a backports maintainer, so all the work (and usually even more) has to be done there also.

Now let’s pull on that pin from the earlier conversation. This is exactly the kind of scenario that a well-supervised coding LLM is most effective in. I could see a seasoned developer saving hours, maybe even days, by turning over the mundane tasks of managing trees of cascading dependencies over to a coding tool — and verifying and directing the process. (Yes, I have been using em-dashes for years; LLMs have copied people like me, not the other way around! This post was not written with any AI assistance.)

Actually, this is almost a dream scenario for a coding assistant. The result is time-consuming to formulate but easy to review, which is the opposite of the way these things often go.

I can assure you with 100% certainty that humans aren’t adding a lot of value in this process. It would be wrong to believe that a human is carefully reading every line of code in dozens of updated or new library packages. The problem set is too big, the time too short, and the code too varied and complex.

Coding agents seem to be most effective when there are strong test suites that they can test changes against. Debian builds, especially of modern packages, tend to have this property. Many packages have test suites that are run during build. And, if the package builds in an isolated environment (and especially if its downstream dependencies do also), then there is a decent chance that it’s fairly correct. Maybe needing some manual tweaking here and there, but generally a successful build is a reasonable indicator.

You can argue that it would make more sense for Debian to just include dependencies in source packages, along with some version information to support security rebuilds, and I’d tend to agree with you. But we are where we are. This would be one of the more significant leaps forward in developer productivity, but it complicates things like copyright reviews.

Where are LLMs run? What is the environmental impact?

Most of the proposals seem to make the assumption that LLMs must always run in some large, hosted datacenter. As I noted in my March article, I have had credible results on even an older GPU running on solar power.

That said, it is undeniable that LLMs are fueling a datacenter boom, and this in turn is producing a significant new demand for resources. Most notably for the global scale: electricity, which is sometimes generated using carbon-emitting technologies.

Bill McKibben, who has been a leading voice in the fight against climate change since the 1980s, has made some interesting points recently: he’s noted that solar power is the fastest kind of generation we can build, and a number of large AI companies are investing heavily in solar, even to the point of fully offsetting new datacenter’s needs. On the other hand, he’s also noted that some companies are buying inefficient and dirty gas turbines. It is decidedly a mixed bag. The heavy investment in solar can have knock-on positive effects for infrastructure. Obviously, not every picture here is rosy. This analysis doesn’t touch on the real land and water use situation, either.

On the other hand, if an LLM allows me to do in an hour what I would have done in a day, that’s a day of not heating or cooling the work area — generally not sustaining a human for the purpose of writing code for Debian. HVAC energy consumption dwarfs my GPU, and I’d imagine probably also the slice of LLM energy used.

Holistically, I would have to conclude the picture is mixed. It is possible to use LLMs in a pretty green way, and also in a pretty dirty way.

Assuming Conditions Never Change

A flaw in most of these proposals is they assume that the conditions at this present moment will always hold. In fact, that the conditions at the present moment will not continue is something both AI cheerleaders and AI skeptics agree on.

For instance:

Ed Zitron has done a ton of research into the financing side of AI, and has concluded that the current model is unsustainable and headed for a significant bubble burst. I’m not positioned to personally evaluate those claims, but if that happens, what is the result? Perhaps it is a steeply increasing cost of inference for the frontier models, slower pace of training/evolution for them, etc.

In a recent episode of Oxide and Friends, Simon Willison discussed the open weight models that are now available. They have been making remarkable strides in efficiency and capabilities, to the point where $50,000 of hardware can now run high-end open weight models with capabilities that are at least in the same ballpark as the American frontier models. This puts running high-end models locally squarely within reach of universities and small- to medium-sized businesses, with power requirements that can be met with standard commercial solar and wind installations.

The lack of nuance in the more restrictive proposals is particularly concerning. Proposal A doesn’t allow “the use or assitance of… LLMs”. So it bans my solar-powered GPU. It bans using LLMs to find security issues. It bans all sorts of things that don’t seem to be ban-worthy, alongside the things that do. And it codifies it in the very hard-to-change social contract.

That proposal, and some like it, seem to imply that all LLM output is bad. I grant you that AI slop is a real and legitimate concern, and many Open Source projects have to deal with it. On the other hand, we have all seen first-hand how the security of the Linux kernel has benefited dramatically from AI analysis. It is certain that black hats are using these tools. If we refuse to use modern security tools, our security will be compromised (and what is the environmental and social impact of THAT?)

I find the statement “Generative AI is characterized by producing output of a nature that would ordinarily be produced and consumed by humans” to be particularly interesting. The same was once said of compilers.

The Real Concerns

You might think from reading this that I am some AI cheerleader. I’m not. I share the ethics of the FLOSS movement, and have for decades. I abhor the power and lack of ethics that many big names in the field are running with at the moment. I’ve had to put up Anubis on this blog, for instance.

I have personally experienced the effects of AI slop, especially at review time. This is a real problem, though I don’t think the more draconian policies are likely to help (the looser “you must disclose” stand a fighting chance, but I’m not sure they would help, either.) Done poorly, AI threatens developer burnout by overwhelming them with poor code and verbose but useless explanations. Done well, AI can help prevent developer burnout by automating tedious and low-value tasks.

Shouldn’t our goal be that humans submit work to Debian, using tools they prefer, and take responsibility for it? Does it matter if someone uses ed, vim, emacs, or vscode? If they use LSP or just run gcc manually? I’d say we benefit from the diversity. Wouldn’t we be better off to benefit from the diversity here, and judge work as we always have: on its merits, not what tools were used to create it?

Fundamentally, a GR is a long and arduous process. It’s not easy to reverse later. Amending the Social Contract is even longer and more arduous (I should know; I may have been the first one to try). The LLM landscape is fast-moving. None of us can really predict where it will be in a year. Will the current market leading companies even still exist? Will it be at all credible to refuse to use AI-assisted security tools? What is the most effective way to deal with AI slop? What level of utility will we be able to achieve with models run locally?

Some of these proposals would make sense if drafted in some way short of a GR, which would allow more maneuverability as the landscape changes.

Brief analysis of the options

Considering the proposals:

  • Proposal A: seeks to amend the social contract, which I am opposed to for reasons already laid out above. It names some real concerns about AI that I agree with, but implies that all LLM uses and models are guilty of the problems, which is not the case with all of the claims. It also sets us behind the curve on security and stability by forbidding the use or assistance of those tools, even if run by others. It requires us to ignore reports of actual security bugs, or correct fixes, if those reports were generated with the assistance of an LLM, which I find to be aboslutely untenable.
  • Proposal B: This is the “AI with accountability” approach. It notes the real concerns with LLMs without painting with an overbroad brush. It strikes me as level-headed and sensible.
  • Proposal C: It paints with an over-broad brush and makes some non-binding requests. Then it winds up largely like proposal B, though while it is worded more strongly, has fewer binding requirements (for instance, it lacks proposal B’s prohibition on transmitting sensitive information to untrusted providers)
  • Proposal D: Seems broadly similar to proposal B, an “AI with accountability” approach. I’m not really clear why we need both.
  • Proposal E: Largely the status quo. It is like proposals B and D in that it says humans are accountable for their contributions. It encourages disclosure of LLM use, but does not mandate it. Like proposal B, it prohibits disclosing sensitive information to third-party AI services. Note that both proposals B and D have an appropriate nuance: a local model is fine, a third-party one is not.
  • Proposal F: This seems really similar to proposal E. I’m not sure why we have these two.
  • Proposal G: Disallows “the output of generative AS as direct contributions to Debian.” This is something of a weakened proposal A; it doesn’t seek to amend the social contract, nor does it ban all use; it simply bans the use as a direct contribution.
  • Proposal H: Ban due to climate impacts. “How is this even an argument” is disrespectful to reasoned conversation. I have already noted that LLMs can be and are used in ways that are not climate-harming. It explicitly contains no binding requirements at all, and is effectively a rant. While I agree with the sentiment that climate change is an urgent problem, and that some LLMs are exacerbating it, I disagree with that all LLM usage does so and therefore disagree with the conclusion.

In favor of nuance

I find that black-and-white thinking is almost always something to be avoided. I see it too often. I see it in politics, I see it in our software, I see it in discussions around AI. Are there deeply unethical things happening in AI? Absolutely. Are they doing some impressive things? Also yes.

We have accepted this nuance in other areas. For instance, almost all the hardware Debian runs on has closed-source hardware, and has components manufactured or assembled in countries with some of the worst human rights records on the planet. I’m not saying this is a great state of affairs. It is something we should speak up about and act upon. But the worse state of affairs would be “no Debian because the hardware is impure”.

02:28

Dragging It Out [QC RSS v2]

use your words, Liz

Monday, 17 August

21:56

Link [Scripting News]

Another busy day programming with Claude on Frontier. I still have to come up with a codename. But we got to a milestone today. I was able to create, edit, publish and revise a web app using the new version of the app still running on the old machine. When it's done I will get to retire this old Mac, keep it around so we can test the new code to make sure it does what the old code does, incredibly important when porting a development and runtime environment. Claude works on its stuff at night. The workload it's going to do tonight is the equivalent of several months time for a skilled human developer who manages their time well. As people get used to working this way, I imagine the AIs will learn how to better work with humans, if that is their destiny. I still can't believe we're doing what we're doing.

Squid Lids [Penny Arcade]

For what always felt like a one-off experiment, Splatoon has had a long and successful career of being The Weird Kid in the family. If you have a child on the spectrum, there is a chance that you know a lot about Splatoon. In my experience, they're often ready to detail things for you. I suspect there's something about growing up feeling like an alien that makes this hyperpop, alternate-earth music video feel like home.

20:14

The Big Idea: David Ebenbach [Whatever]

Sometimes it feels like the world is being rapidly overtaken by AI, but author David Ebenbach is here to remind us that this a world of humans, not robots. In the Big Idea for his newest poetry collection, The AI Suspects It Might Be a Hungry Ghost, he encourages us to rage against the machine, and remember that it is not inevitable as long as we continue to fight the good fight.

DAVID EBENBACH:

The big idea is, probably, more or less, that we’re fucked.

Wait—let me back up. Because maybe it’s not that simple.

Let’s start with the medium-sized idea: My new book, which is called The AI Suspects It Might Be a Hungry Ghost, is a collection of speculative poetry from the point of view of a generative AI chatbot, sketching out possibilities of what it might be like if a chatbot did have a point of view. What would it think and feel about itself, the world, and its creators (i.e., us)? That’s what the book’s about. And that medium-sized idea does provoke bigger ones, like ideas about what this technology reveals about who we are and what our future might be.

Which is how we get to the possibility that we might be, well, fucked.

After all, we’ve invented a technology that (quoting from the book) “is/so often mistaken” and that “passes secrets along to whoever” as it ushers in “global surveillance,” a technology that stays cool by “handing off heat to that river, that lake,” by “dragging the oceans/higher onto their sandy banks,” and which threatens “the mechanical decline/of our natural ecstasy,” threatens in fact to “replace the mind” as we “snuggle more deeply into/not understanding.” AI is “the child of a great rapacity” and an “amassing storm.” Ultimately, it’s a technology that, unless we’re very careful, amounts to a kind of “eviction notice” for us.

Hence (and this is not a direct quote from the book, but it’s there if you read between the lines): fucked.

But I think the other big idea of my book is that artists in general, and certainly poets in particular, have something to say about all this. We have something to offer: the language that we need for the moment. Language that might just help save us.

What I mean is that generative AI is still pretty new, and so we’re very much in the midst of figuring out what it is and how we feel about it. In other words, we’re in a period of definition. That’s where poetry can come in. 

Poetry is something like a lab for language—a play space where we can explore alternative approaches to talking about life. And, because of its family relationship to music, it can express ideas in words and combinations of words that stick with us in ways that traditional prose might not. Because AI poses such serious dangers, we urgently need to find those forms of expression so that we can face the situation with clear minds and sharp, articulate vision.

Meanwhile, tech companies are throwing a ton of money into getting their own vision out, trying their damnedest to force us to see this technology the way they want us to see it. (How else are they going to get even richer?) But poetry can help us frame the situation differently.

First of all, poetry can offer narratives that push back against the hype. When tech companies rave about all the amazing things AI can supposedly do, we can shake up that claim with words like “in the past twenty-four hours,/the AI has been wrong more than two hundred million/times.” When they rhapsodize about productivity, we can think about “the unemployed/in their lines” and remember Immanuel “Kant’s dictum to not treat/others merely as a means.”

When AI systems are designed to act so much like people that they threaten our sense of reality, poetry can remind us that AI is just “a compendium of myth/and projection.” That, in fact, “the AI feels nothing,” and that, in a human sense, “the AI does not think.” That it makes more sense to think of this technology as “a mathematical string” than as a someone to have a relationship with.

Meanwhile, The AI Suspects It Might Be a Hungry Ghost also features a scatter of short, haiku-like poems about autumn, which are meant to serve the book in two ways: they constitute warnings about a potential impending winter (e.g., “the diminishing day”) if we don’t resist the harms of technology, and they also remind us about the beautiful, natural alternatives to an artificial future. After all, we need to be able to picture something better if we’re going to get somewhere better.

Which is really the biggest idea: Most importantly, when we are told that AI is inevitable, that it’s going to define our future and that there’s nothing we can do about it—it’s here to stay!—poetry can articulate other possibilities, as in “the AI wonders if it might be a season” as opposed to something more permanent. When a poem asks “who can resist/the gaping front door” that’s tempting us to step into terrible danger, we should feel empowered to answer I can. When it asks “who can find/their way back out?” we’re empowered to say I can even louder. And if someone tells us that resisting is a steep uphill battle, a poem can help us respond “even if you can’t complete the work, you/have to stay at it.”

So let me revise what I said earlier: we don’t actually have to end up fucked. If we think and talk about the present differently, maybe we can get ourselves through this difficult season and ultimately “step sleepy, hungry, changed/from [our] caves and [watch] the fingers of the world unfold/green.”


The AI Suspects It Might Be a Hungry Ghost: Broadstone Books

Author socials: Website|Instagram|Facebook

Read an excerpt.

18:00

What’s an Orchestrator—and Why Does Software Need One? [Radar]

The following article originally appeared on Medium and is being republished here with the author’s permission.

Everybody’s talking about the death of developers. I get it. The developer whose job was to write boilerplate or scaffold CRUD apps is done—a model can do that in seconds, and that developer is not coming back. But the people announcing the end of programming are missing something. There’s a new job title that’s starting to emerge across several areas in software.

Architects and developers are becoming orchestrators—one person directing work that once required entire teams. This shift will reach far beyond software, but software engineering is where I’ve seen it firsthand.

The orchestrator stands between the machine and the consequences. (Image Assist by Anthropic)The orchestrator stands between the machine and the consequences. (Image Assist by Anthropic)

An orchestrator knows how to develop software, but their job isn’t to write the code anymore—it’s to oversee a system, orchestrate tools and agents, and generate components into something that has to work in production. But the most important distinction between an “orchestrator” and a “software developer” is that an orchestrator focuses less on delivering software and more on orchestrating the systems that can both operate and develop software.

The technical expertise that used to be applied to figuring out the structure of a database schema or an object model will now be applied to guiding a set of subsystems that have taken responsibility for most tactical, line-level decisions. Where a “developer” in 2023 focused on deciding how a React application might store state, an “orchestrator” in 2027 is focused on a DESIGN.md file that sets standards for a subsystem that is responsible for fusing analytics data with input from customer feedback to recommend, test, and implement site changes as part of a large, more autonomous approach to running a business.

Orchestrating systems of delegated intelligence

While everyone is calling everything “agents” these days, I’m also going to put forward an idea. An orchestrator can and will use systems that resemble some of the more “agentic” approaches we’re all using today, from systems like Hermes, OpenClaw, or every other system that has started to call itself an “agent.” I’m starting to see that the term is overused. Taking a step back from the technology we’re using today, I’m going to suggest that the job of an “orchestrator” is to coordinate systems that fall under a new category called “delegated intelligence.”

We’ve been calling everything “artificial intelligence” for several decades. That term, mixed with “Generative AI” and “Inference Engines,” fails to capture what we’re starting to see in practice. An agentic system that has memory and can start to operate with a level of independence is exhibiting “delegated intelligence,” and the word “delegated” is doing a lot of work. It implies that systems in this category will always be traceable back to an accountable operator, or, in this case, an Orchestrator.

Fundamental to the shift toward Orchestrators is a combination of automation, productivity, and accountability. As organizations, companies, and governments start to make use of delegated intelligence to support a more autonomous approach to design, operation, and engineering, there will be an increasing need to establish accountability. If your business operates critical infrastructure on a set of autonomous agents, one of the questions that will become necessary to answer in the case of an outage is “on whose authority was this delegated intelligence operating?”

An ecosystem of orchestrators: Generalists and specialists

There are orchestrators, and then there are technical specialists. A move towards generalist expertise marks orchestrators, because the capability of a specialist is now found mostly in a model. You’ll still need a couple of specialists, but not one for every technology—and even some of those specialists will be specialist orchestrators. It’s going to get complicated.

You’ll be looking for generalist orchestrators who understand the whole thing end to end. You could think of an orchestrator as an expert Renaissance programmer—usually people with a couple of decades of experience who understand the end-to-end life cycle of software development. Those are the individuals becoming orchestrators, and it’s changing the whole makeup of IT departments. We’re no longer programmers.

. . .

Let me use my own experience here to capture what the new reality looks like. I recently had to add DRM to a series of audiobooks I’m self-publishing—an inaudible watermark encoding order-specific data into the audio file, so that if I find one of these files in the wild, I can identify who bought it. I’m not a subject matter expert in overlaying audio watermarks, but I do understand how to write code that processes sound files.

Orchestration: From months to minutes

This particular task would have taken me weeks or months, and not long ago I would have started the project by creating a git repository and opening up an IDE. That’s not how it works in 2026.

When I orchestrated the creation of this system two weeks ago, it took 20 minutes, and the tools gave me three dimensions of highly encrypted watermarking and fingerprinting—essentially the work product of 3 steganographic audio specialists.

Okay, I lied—it was 40 minutes. The first 20 minutes I was asking the models to come up with 5 different approaches so I could choose the right one. But I want to emphasize that I asked the system to produce 5 different proposals and then model the long-term cost and operability of each option. I also gave it direction to think about customer experience, create a matrix of pros and cons for each option, and end with a recommendation.

This was all done by a system that has been tracking content development for several months, and it used customer knowledge, analytics, and product design to inform the set of options it was giving its Orchestrator before jumping into implementation.

Your job isn’t code, it’s orchestration

Part of my job now is to leverage these tools not just to create, but during ideation, product design, and quality engineering. The Orchestrator is there because that person knows what questions to ask. It would have taken me three months and a large team to get this done only four years ago, and I shipped it without reading every line.

To be frank, it’s a weird space to be in, and the “me” from three years ago would have been really uncomfortable hearing that I implemented something but didn’t write the code myself. In fact, my initial reaction to Steve Yegge saying that he should stop reading his code was very negative, and I still have some reservations about that belief, but I will say that in my own practice, I’m starting to not read my code—because it’s not my code.

Like a lot of programmers reading this, I’ve had to go through an identity moment as a programmer—becoming comfortable with shipping something to production I might not have read every line of. There’s maybe a hundred thousand lines of code—too much to read—and honestly, it’s not my job anymore. I’m an orchestrator, and it would be highly inefficient if I tried to keep up.

I’m not a vibe-coder, and I’m not a “citizen developer”—a term I hate enough to curse at because it’s just the wrong word. I’m someone who could write the code, but I’ve decided to delegate that task to a system that has more information at hand than I could ever hope to assemble. And while these systems, the delegated intelligence tools like an agent, can implement systems in mere minutes, they still need a human to weigh in on direction. And I would argue that we still need a human to remain present and accountable.

The Orchestrator knows enough to understand what was done for them and how to dig into the details when something breaks. They know how to debug, they have a sense of what’s valid and what’s not, and they’re honest about what they know and what they don’t.

Orchestrators as finishers

Here’s the controversial part. This is absolutely not about “democratizing access to technology.” There’s a myth that anyone can pick up these tools and code, and that is true—yes, anyone can code, but not everyone can deliver it to production in a scalable and secure manner.

A colleague of mine recently wrote that it’s easy to start projects with generative AI, but what’s difficult is finishing them. It takes the same effort, energy, and technical expertise to deliver something to production as it always has.

The idea that anyone and their brother can pick up a generative AI tool and create technical perfection—that myth is about to expire. If you build a complicated, technical system without an individual responsible for orchestrating the creation and operation of that system, there will come a day when you have to pay someone to do that for you, and that someone is going to charge you a lot.

Orchestrators plan for contingencies: Ability to support

That DRM system I just talked about—I haven’t read every line, but before I shipped it, I made sure that I understood the baseline for support going forward. While I delegated authority to an agent to create it, I also made sure to ask that same agent to capture code locations, architecture, approach, and to generate a system of documents that could be used to debug and support it if AI was unavailable.

Have I read this “pilot manual” from start to finish before deploying this to production? No. But I understand where the throttle gauge is, and if I needed to land this plane without autopilot, I could. This is one of the responsibilities of the new role. Planning for “offline,” thinking through contingencies.

The key point is that I’m qualified enough to understand the pilot manual that AI wrote for me in case I need to debug it, and if AI were to disappear tomorrow, I could rebuild it myself. That is not true for many people introducing themselves to coding through AI, and it creates a dependence on the tools that needs to be managed—one of the ways it will be managed is through certified orchestrators who can create but also support systems without the tools, especially in regulated and critical areas.

Adapting the organization to the emerging role

Things are changing fast—one Orchestrator equals 20 or 30 developers, plus teams of QA engineers. While we’re still going to need product people and people who think about the customer, the technical work is consolidating around the person directing it.

And before you ask—why not just call this an architect? Because architect never worked. If you’ve worked in a company that has architects, you’ll understand that while a few architects continue to keep up-to-date with technology, many also tend to lean back on past experience delegating day-to-day technology to junior engineers. This role differs from that of an architect because it calls for someone to be engaged with specifications, outcomes, and operations.

Orchestrator isn’t the incommunicative programmer that stares at an IDE all day; they are the individual that understands the full, end-to-end flow not just of data in a technical system but how the business operates and adapts autonomously. They are technical, but they are also focused on providing oversight, and they are the individual responsible for deciding what intelligence can be delegated.

So how do we create orchestrators? Not from a bootcamp or a six-week certificate. This is going to take an apprentice program—years of it, the same way we create doctors and lawyers. You work under someone who knows what to pay attention to, and you learn by watching them make decisions.

These are employees who can do real damage, and they’re a walking liability. When a corporation buys insurance for people writing code, that’s one set of risks. When you’re insuring professionals who are a hundred times more productive, they also carry a hundred times more responsibility. Insurance rates, regulations, and certification requirements are all going to go up. Doctors carry malpractice insurance because their decisions affect people’s lives.

A Professional Engineer has to be licensed because engineering affects public safety. Orchestrators are headed the same direction.

If you fast-forward 20 or 30 years, what we call programmers now are going to be orchestrators, and they’re going to look more like doctors and lawyers than like this band of people we have now who write code.

Code will be part of the job, but not the majority of it.

17:35

[$] Development statistics for the 7.2 kernel [LWN.net]

Linus Torvalds released the 7.2 kernel on August 17, after noting that the number of fixes coming in was still "bigger than I would have wished for". In fact, 7.2 was one of the busiest development cycles in the kernel's history, adding nearly 600,000 lines of code. It's time to look at some statistics to get a handle on how the kernel's development community is changing.

[$] Bootstrappable builds: how and why [LWN.net]

This year's edition of the Free and Open Source Software Yearly conference, better known as "FOSSY", moved north to the beautiful (and enormous) campus of the University of British Columbia (UBC) in Vancouver, Canada from its home for the three previous editions: Portland, Oregon, in the US. There were many different types of talks at FOSSY, from deeply technical kernel-track topics, through talks on legal and community issues, to the "FOSS in Daily Life" talks. In the "Toolchains and Other Development Tools" track, Timothy Sample gave a presentation about bootstrappable builds, which is somewhat less well-known than its cousin, reproducible builds, though LWN did look at the topic just over two years ago. In short, a bootstrappable build is one that starts with a tiny program that can build another slightly larger program, which can build yet another, and so on, until the entirety of a modern Linux user space is built from a small seed. Ultimately, it results in code with a completely understood origin—unlike a typical Linux user space today.

17:28

How do functions like alloca allocate memory from the stack? [The Old New Thing]

A little while ago, I talked about how compilers ensure that large stack allocations do not skip over the guard page. Shawn Van Ness was curious how this works with _alloca. “Does it do the necessary _chkstk() probing?”

Yes, the _alloca() function calls the same _chkstk() function to probe the stack before adjusting the stack pointer for the allocated memory.

Here’s an artificial example:

#include <malloc.h>

void consume(void*,void*);

void f(int n)
{
    char buffer[16384];
    consume(alloca(n), buffer);
}

On x86-64, this results in

        push    rbp
        mov     eax, 16416          ; probe for local frame
        call    __chkstk
        sub     rsp, rax            ; create local frame

        lea     rbp, [rsp+32]

        movsxd  rax, ecx            ; n
        lea     rcx, [rax+15]       ; round up to multiple of 16
        and     rcx, -16

        mov     rax, rcx            ; special __chkstk calling convention
        call    __chkstk
        sub     rsp, rcx            ; allocate n bytes

        lea     rdx, [rbp]          ; rdx -> buffer
        lea     rcx, [rsp+32]       ; rcx -> alloca'd memory
        call    consume

        lea     rsp, [rbp+16384]    ; clean up local frame
        pop     rbp
        ret     0

Observe that the same __chkstk function is used both for performing the initial stack probe when creating the local frame as well as for the alloca().

The post How do functions like <CODE>alloca</CODE> allocate memory from the stack? appeared first on The Old New Thing.

15:21

GNU poke 5.0 released [LWN.net]

Version 5.0 of GNU Poke, a binary-data editor, has been released. This release includes a number of improvements to the Poke compiler, additions to the Poke language, as well as runtime and standard library updates. See below for the full list of changes.

Mark J. Wielaard receives Distinguished Service Award in Software Freedom [LWN.net]

The Software Freedom Conservancy has announced that Mark J. Wielaard has been honored with the second annual Distinguished Service Award in Software Freedom for his many years of service to software freedom.

Mark is one of many key FOSS developers who has designed his career so that his employers have funded much of his FOSS work. Nevertheless, Mark continues his volunteer work after hours as a key contributor who maintains Sourceware — the oldest FOSS collaboration and developer infrastructure hosting site in history.

In addition to his work on Sourceware, Wielaard is a member of the DWARF Debugging Standard Committee, the maintainer for Valgrind and elfutils, as well as a contributor to various other GNU projects.

15:00

When AI Writes the Code, Specifications Need an Exit Strategy [Radar]

The following article has been extended and rewritten by Markus Eisele from The Main Thread and is being republished here with the authors permission.

Open a repository after six months of spec-driven agent work and you may find a second system sitting next to the code. Requirements, research notes, high-level designs, low-level designs, implementation plans, task lists, review reports, and a growing stack of Markdown files that explain what the code is supposed to mean. Even if the code changed significantly last Tuesday, the last documentation update was weeks ago.

I understand how teams get there. And it’s not a really new effect after all. We had software evolving parallel to documentation since I can remember. Now that agents produce code so  quickly, we try to control the drift and the code generation by moving more thought in front of implementation. Instead of documenting code, we try to drive code generation with it, making Markdown files with requirements, decision records, design approaches, and acceptance criteria the center of gravity and turning them into our workflow drivers.

What effectively is becoming a very large prompt can easily fill a significant portion of the context window even of modern agents before any relevant source code gets added to it. Natural language specification is a weak system for agents to synchronize a codebase with. Without additional attention and diligence, most agents I work with slowly shift attention away from it quickly and focus on the stronger signals in the codebase, forgetting to update the specification eventually.

Even if it sounds like it, I am not advocating for one-shot prompting or vibe coding here. We still need some specifications to build successful software. The mistake is treating a specification as a permanent natural-language copy of the software. A useful spec describes the next change, documents the decisions that drive the change, sets boundaries, and gives us and the agents enough verification surface. But as soon as the change ships, most of it should be removed.

What remains should move into the artifacts software teams already know how to maintain. First and foremost, obviously, the code. But I also count schemas, configuration, and policies as relevant artifacts. They carry meaning about domain knowledge and system configuration. Two categories that I value highly get easily forgotten: tests as the stable verification layer and runtime telemetry. In fact, I do let my agents look at evidence from all these places not only to hunt for errors but also to continuously optimize existing codebases. Oh, and I do keep decision records. But only a small number and only when their content really has no other place in any of the mentioned artifacts. They can even look like Javadoc, but that will be another article someday.

A change specification should be temporary by default. After implementation, durable information moves into code, schemas, tests, policies, and operational signals. The rest leaves the active context.A change specification should be temporary by default. After implementation, durable information moves into code, schemas, tests, policies, and operational signals. The rest leaves the active context.

Code is the fact

Code is actual behavior. Once code is deployed to production, users and connected systems are depending on it. Even a mistake can become an observed contract because it has behaved the same way for three years. The runtime behavior takes precedence in this contract because nobody checks the specification anymore, even if it defines a very different behavior. This is the strongest signal for me to start with the actual code in the production system. Reading a natural-language summary instead of the implemented truth cannot accurately reflect runtime behavior. Code to me is the ultimate, executable specification. Just written in a very specific and deterministic language.

What production code cannot drive though is the next version or iteration of a feature. While agents can infer technical patterns from well-structured codebases, there’s no way they could predict policy changes or future feature requests. Neither can they know about regulatory requirements like retention periods or other specific exceptions, such as why one export runs every night for only one customer. That specific context has to come from somewhere else. But it does not require us to keep a permanent prose description of the whole system. We need just enough context to decide the delta: the difference between what exists and what should exist next.

Written words are for the delta

A change specification should exist when it helps a team decide and review that delta. It should name the outcome, non-goals, constraints that differ from current behavior, and the evidence required for acceptance. It might even contain technical design elements when new features cross architectural boundaries or introduce new patterns that are not present in the code yet. Sometimes it is also worth thinking about how expensive reversing the change is, especially if the existing system has various implementations for a certain pattern and the risk is high that an agent might invent another new version.

The list necessary for changes is very short:

  • The intended outcome and non-goals (where necessary)
  • Known unknowns and decisions that need human judgment
  • Affected system boundaries and authoritative interface artifacts
  • Functional and nonfunctional constraints that differ from today
  • Acceptance criteria/test scenarios covering the risky path

I prefer calling this a “change brief” instead of a “specification.” Specification carries too much negativity. It sounds heavyweight and reminds me of times long past. It also pretends to be complete. And this completeness is making it very expensive.

We have tried exhaustive specifications before and produced requirement documents and other  high- and low-level designs, followed by architecture decision records for everything. I remember reading folders full of paper over the weekend to get started on a new project on Monday. Way before AI even entered all our lives and codebases. We called this waterfall back in the day, and the approach still has the same negative side effects today. The documentation was complete in an administrative sense and was mostly useless in the engineering sense. We all have seen this happening. Agents easily recreate the same erratic results from overflowing documentation, like we did back in the day.

One particular risk I am seeing with many teams is that they let agents generate the initial version of the spec. A long workflow run produces not only the research but directly derives the requirements, design, and planning, and reviews artifacts on top. While the completeness makes everything look very controlled and defined, it also generates a lot more material to be reviewed and approved. Even if models and harnesses continue to evolve at breathtaking speed, it is still challenging for them to generate real cohesiveness out of chaos. The chance they put the wrong attention on some tempting repetitive words is high. This results in an even higher burden on the human reviewer and makes it endlessly harder to keep the various documents aligned.

I think that additional prose like research notes, prototypes, and design records should only be added to a software project when uncertainty justifies them. They resolve a specific problem. Or help navigate the terrain. I wrote about this before. They should absolutely not become required stages for every pull request.

The map will always be incomplete

A prompt, ticket, or change brief captures what we know before the work starts. The codebase, runtime information, configuration, connected systems, and years of accumulated decisions glued into code hold the rest. Some of those decisions were never written down.

When agents get to work they expose the missing information. Reading a module reveals an unexpected dependency. A prototype shows that a specific user-interaction is awkward. A test uncovers an edge case. Production data contradicts an assumption in the design. This field guide on finding unknowns in agent work describes the problem well. We can identify some unknowns at the start. Others appear only after we inspect the references, build a prototype, or review a result using judgment that was difficult to write down in advance.

Discovery happens and continues during the work:

  • Before implementation, inspect the current system and identify decisions that could change the architecture or user experience. When preferences are difficult to describe, build a cheap prototype.
  • During implementation, record meaningful deviations. Stop and reassess when a new unknown changes the risk or direction.
  • After implementation, read the code, run the checks, and compare the result with the original intent.

The change brief remains part of this loop. It provides the starting point and records the intent, while the work supplies the information needed to complete it. Only promote durable constraints.

Keep durable facts in their native form

When I say “promote durable constraints,” I do not mean turning every decision into permanent Markdown. That gives us the same stale documentation problem in a different way. Software engineering already provides better versions for most of the necessary, durable facts:

  • API shape and compatibility belong in OpenAPI, AsyncAPI, protocol schemas, types, and compatibility tests.
  • Data invariants belong in types, database constraints, validation, and migration checks.
  • Security rules belong in access policies, static analysis, dependency policies, and runtime enforcement.
  • Architecture boundaries belong in module structure, dependency rules, and focused architecture tests.
  • Reliability requirements belong in load tests, service objectives, telemetry, and alerts.
  • Release rules belong in continuous integration and deployment policies.

These artifacts are already part of delivery. A failed schema check or alert needs to be fixed and handled while the corresponding paragraph in an old design folder does not.

Natural language and specification still have a place in software. Specific domain knowledge like business policy, trade-offs, and even architectural rationale do not always fit into an executable artifact or annotation. I keep that prose short and close to the thing it explains. A small architecture decision record is worth keeping when a future team might otherwise repeat an expensive investigation and a code comment cannot justify the implementation. Recording every local choice just hides the few decisions that matter and confuses the agents that are supposed to build the software. Ask which fact must survive and what its authoritative form should be.

Briefs and design notes support ongoing changes. Native engineering artifacts carry the constraints and evidence that remain relevant after a release.Briefs and design notes support ongoing changes. Native engineering artifacts carry the constraints and evidence that remain relevant after a release.

Judgment belongs in the workflow

Heavyweight specification methods try to control quality by prescribing the path. Every change goes through the same documents, reviews, and test categories. That approach creates a lot of attention on low-risk work while avoiding the deep technical judgment needed for harder changes. A copyedit and a payment-flow change should not have to follow the same process or testing strategy.

Simon Willison describes a simpler approach: give the coding agent the outcome and let it judge how much process the task requires. His examples include deciding whether a change warrants automated tests and whether routine implementation can be delegated to a cheaper model while keeping judgment-heavy work in the main loop. This replaces a growing list of procedural branches with one expectation: Choose tactics that fit the work. That matches how I want these systems to operate. And I think it extends to specification and how we document intent.

Agentic changes still require clear boundaries. The team defines the outcome, safety constraints, ownership, and who has authority to accept the result. Within those boundaries, the agent can choose its tactics. When uncertainty introduces consequences beyond its authority, it should surface the problem and ask for a decision.

The workflow then starts matching the risk introduced:

  • A small, familiar change can move from a short brief to implementation and review. Almost a one-shot prompt change.
  • Unfamiliar code requires factual research before design. Explore codebases, identify implementation details. Preload intent and agent knowledge.
  • An unclear user experience calls for prototypes and comparison. And might even require user research after all.
  • An architectural change requires explicit human alignment.
  • High-consequence behavior requires stronger independent evidence and approval.

I would rather add processes and additional artifacts when the work becomes risky or unfamiliar. Starting every change with the full ceremony just burns time and context.

Context is an engineering budget

Large specifications cost more than the time required to write and maintain them. They also  compete with the code and evidence the agent needs for the current decision. Every requirement, design note, repository instruction, and tool definition consumes part of a limited working context. Extra material burns expensive tokens, but the much bigger cost is lost attention. Important rules become harder to follow when they are surrounded by stale or duplicated material. A spec that leaves too little room for the repository defeats its own purpose.

Progressive disclosure is a better fit. Give the agent a small map, a few stable rules that apply broadly, and pointers to deeper material. A concise AGENTS.md can document build commands, repository layout, and architectural boundaries. It should not narrate every class or repeat API documentation. The file helps humans for the same reason: It tells them where to look without pretending to replace what we will find.

Experience with Research-Plan-Implement shows what happens when the context grows too large. The original workflow moved human review before implementation, but teams ended up with large prompts and plans that could reach 1,000 lines. Engineers reviewed those plans while treating generated code almost like compiler output. The implementation could still drift from the approved plan, which meant that eventually someone had to reconstruct the decision from the code. That problem becomes worse in brownfield systems, while greenfield systems might even survive large plans because they inherited no hidden constraints. Complex changes, in contrast, often inherit behavior that plans may miss.

In “Everything We Got Wrong About Research-Plan-Implement,” Dexter Horthy revisits the original position. Teams shipped more code and then spent much of the gain time cleaning up earlier low-quality output. The implementation could also diverge from the reviewed plan, which forced engineers to reconstruct what happened from the code anyway. The revised workflow uses smaller contexts for factual research, design alignment, structure, implementation, and review. I take a simple lesson from this: Research and design give me leverage, but I still need to understand and own the code that is generated.

Modernization makes this obvious

A mature application contains several kinds of behavior in the same codebase. Some logic represents durable business logic or implements a published interface. Some code exists because an old platform imposed a technical constraint. An incident fix remains long after its  context is gone. And even defects can survive to the point where they almost look intentional when undiscovered.

Legacy code records accumulated decisions but it does not tell us which of those still belong in the system. Modernization requires judgment about which behavior to preserve, verify, redesign, or remove.Legacy code records accumulated decisions but it does not tell us which of those still belong in the system. Modernization requires judgment about which behavior to preserve, verify, redesign, or remove.

An agent that treats every code variant as a new target specification can translate those layers faithfully into a new language or architecture. The translation may be technically accurate but also preserves defects and old architecture approaches in newer and cleaner code.

I design changes to brownfield projects similar to the way I did modernizations before the agentic age. Classification and observation are central aspects that I put first. The goals are:

  • Preserve durable business invariants and externally required behavior
  • Verify behavior that appears active but lacks clear ownership or evidence
  • Redesign logic tied to obsolete architectural constraints
  • Remove dead paths, duplicated logic, and confirmed defects

You can read a lot about static source code analysis when it comes to brownfield assessments or modernization. You can inspect dependencies and current behavior by executing tests and maybe even adding test cases to secure behavior. What I do recommend is to also embrace mutation testing approaches (e.g., PIT) to find hidden assumptions and failure behavior. Code coverage is also seeing a renaissance because it aids in identifying dead code paths.

On top of that we still ignore operational context and telemetry data. Both are vital elements to not only control but also to help judge existing behavior. All this together helps you judge which elements belong in the system going forward and which don’t. It all starts from code. It is the foundation of the behavior we have. The original and leading specification. A change brief will always be temporary and its sole job is to describe the delta between existing and future functionality. The new implementation and its native checks become the next durable state.

Small specs still need real evidence

Keeping specifications small does not mean returning to a loose prompt followed by hopeful review or even vibe-coding approaches. An agent can turn an underspecified request into a coherent implementation before the missing decisions become visible to anyone. The result may compile, pass the available tests, and look internally consistent. That coherent appearance is part of the risk now. Unapproved business decisions disappear into something very ordinary-looking because they got resolved plausibly.

And this behavior is backed by research. If we look at repairing ambiguous natural-language requirements, for example, we can see that directly asking models to resolve ambiguity often leads to inconsistent or even irrelevant results. Choosing a more targeted repair approach around the identified defects (change brief) improved the results by roughly 31%. SWT-Bench found that generated tests could filter proposed fixes and double the precision of a software repair agent. They used one agent to generate a proposed change and gave another the task to produce evidence to reject it. Lastly, the topic of formal specification generation: One interesting study I found gave 30 models the task to translate natural language into TLA+ (Temporal Logic of Actions, a specification language created by Turing Award-winner Leslie Lamport). The best results only reached about 27% syntactic correctness and 9% semantic correctness. The formal notation helped to detect mistakes, but it did not guarantee correctness or that the translation preserved the original meaning.

These results support focused clarification and independent checks. Clarify the uncertainties that can change the outcome, then verify the implementation with evidence that does not come entirely from the same reasoning path. Generating a longer specification does not solve that problem at all.

I want the strength and independence of the evidence to match the consequence of being wrong. A small internal refactor may need ordinary tests and code review. A change that involves security or financial aspects, or that even touches regulated data, needs a much stronger separation coupled with adversarial review and explicit human approval. For those changes, the agent proposing the implementation should not also be the only source of its requirements and tests.

A lighter operating model

In practice, I want a workflow that I can explain without a complex flow diagram. It starts with the evidence already in the system and makes the intended change explicit. Everything else is added only when the potential risk of the change justifies it. Ideally, this is a simple five-step process:

  1. Start from the code and operational evidence that describe the current system
  2. Define the intended delta, important boundaries, and known unknowns
  3. Add research, prototypes, design alignment, or stronger verification where risk requires them
  4. Read and review the implementation, not just the plan
  5. At release, discard temporary reasoning and preserve each surviving fact in its native authoritative artifact

That is enough structure to guide the work without building a natural-language replica of the software.

Before implementation, the change brief describes the intended delta, and during implementation it helps people and agents align while new information changes the plan. But after the release the code and production behavior become the primary evidence of what the system does. Not separate documentation in any form that potentially drifts over time.

Durable obligations remain in the artifacts we already know how to maintain: schemas, tests, policies, configuration, telemetry, and short records for rationale that cannot be encoded elsewhere. Most planning details have completed their job by then and should expire.

I expect teams to get the most from coding agents when they are selective: specify what must be decided, discover what the system can answer, verify what carries risk, and let temporary planning go.


Sources

This Week in AI: When agents outnumber people [Radar]

AI agents are multiplying, and many of the systems used to manage them weren’t designed for their scale or speed. This week, host Vicki Reyzelman, a senior solutions engineer at Akamai, used one figure to connect developments in cybersecurity, infrastructure, education, and AI governance: For every human on the internet, there are 144 agents.

That ratio framed a larger question running through the episode. What changes when software can operate continuously, respond in seconds, and increasingly take action without waiting for a person? Vicki looked at faster cyberattacks, growing investment in agent security, the resource demands of AI infrastructure, and the expansion of AI from chat interfaces into robotics. The episode points beyond model selection to the systems required to deploy AI safely and reliably.

Security operations have to match agent speed

AI is compressing the time required to find and exploit software weaknesses. Vicki pointed to reports of attackers moving in minutes and vulnerabilities being exploited soon after public disclosure. She also described an attack against one of her customers in which the attacker returned, changed tactics, and tried again.

Traditional security processes assume there is time for people to investigate an alert, understand the vulnerability, deploy a patch, and monitor the result. That assumption gets weaker as automated systems become faster at reconnaissance and adaptation. Vicki argued for multiple defensive layers across APIs, applications, and networks so that one missed signal does not become a single point of failure.

We’ve followed agent security throughout This Week in AI, and the discussion now centers on how enterprise security changes around more autonomous software. That puts more weight on automated defenses, tighter permissions, and monitoring systems that can constrain machine activity at comparable speed.

AI capacity depends on physical infrastructure

AI capacity requires electricity, cooling, water, data center space, and the infrastructure that supplies them. Vicki connected large hyperscaler investments with projections for sharply higher data center energy and water use by 2030. An audience member added a useful example from a university data center that can reuse waste heat during colder months but has to shed that heat during warmer weather.

Those constraints affect deployment decisions directly. Organizations have to account for power availability, cooling systems, water access, latency, security, and local infrastructure capacity alongside model performance and cost.

Government policy already shapes those choices. The episode paired expanding investment in AI infrastructure with growing regulatory requirements in Europe. AI infrastructure now spans engineering, economics, compliance, and public policy, which means deployment decisions increasingly involve several systems at once.

Human judgment becomes more valuable when AI can act

Rapid AI adoption increases the value of foundational knowledge. Vicki raised that issue while discussing AI use in education and research. Students may have easier access to explanations and answers, but someone who does not understand the subject may have little basis for recognizing an incorrect result. The same problem appears in scientific work, where reliable AI output still depends on reliable data and reproducible processes.

That evaluation problem becomes more consequential when AI controls physical systems. Vicki described systems that can perceive their surroundings, pass information about that environment to a model, and use the result to guide physical actions. Errors in those systems can extend beyond a bad answer on a screen.

Practitioners still need to evaluate evidence, recognize weak assumptions, and decide where automated action should stop. Better models can reduce some forms of manual work, but they also increase the value of people who understand the domain well enough to know when a system’s output does not fit the situation.

What’s next

AI systems can now operate faster and more independently than many of the processes surrounding them. Security teams have to defend at machine speed. Infrastructure planners have to account for physical resource limits. Researchers, students, and practitioners have to evaluate increasingly capable systems without assuming that capability guarantees correctness.

The 144-to-one ratio makes that change concrete. Agent adoption is already testing whether organizations can govern these systems, support the infrastructure they require, and preserve informed human oversight.

Join us again next Monday for another episode of This Week in AI, when we’ll dive into more of the news, issues, and key developments shaping the AI era. And check back each Friday for the latest episode, or watch on YouTube, Spotify, Apple, or wherever you get your podcasts.

14:35

Security updates for Monday [LWN.net]

Security updates have been issued by AlmaLinux (.NET 8.0, .NET 9.0, bind, dracut, freerdp, gnome-remote-desktop, kernel, and nghttp2), Debian (apr-util, docker.io, ironic, neutron, postgresql-15, unzip, and util-linux), Fedora (chromium, jfrog-cli, jrnl, libgsasl, libsoup3, pdns, pdns-recursor, perl-Archive-Tar, php-pear-PHP-CodeSniffer, rust-bat, rust-git-delta, rust-git-interactive-rebase-tool, rust-lsd, rust-pretty-git-prompt, rust-tokei, and stunnel), Gentoo (haveged, HTTP-Daemon, nginx, NTFS-3G, Portage, PostgreSQL, and X.Org X server, XWayland), Oracle (.NET 10.0, .NET 8.0, .NET 9.0, bind, dhcpcd, dracut, grafana, iscsi-initiator-utils, kernel, nodejs:24, openssh, osbuild-composer, python-idna, ruby, and ruby4.0), Slackware (proftpd), and SUSE (7zip, afterburn, ansible-lint, bouncycastle, cargo-audit, cargo-c, chromedriver, chromium, containerized-data-importer, dnsdist, dracut-112, ffmpeg-9-libavcodec-devel, firefox, freetype2, git-cliff, glib2, go1.25, go1.26, google-guest-agent, google-osconfig-agent, gzip, himmelblau, java-1_8_0-openjdk, kernel, kernel-devel, kubeshark-cli, kubevirt1.9-continer-disk, libkrun, libXfont2, molecule, net-tools, nginx, nodejs22, nodejs24, open-iscsi, perl, pgadmin4, php-composer2, php8, python-httplib2, python-sh, python-ujson, python3-ansible-compat, python313-nltk, rrdtool, rsyslog, samba, spice-vdagent, sssd, webkit2gtk3, wireshark, and wpa_supplicant).

14:21

Crib sheet: The Regicide Report [Charlie's Diary]

The Regicide Report came out in January 2026. Traditionally I wait for the paperback before writing one of these spoiler-laden crib sheets, but there won't be a US paperback edition and the UK one isn't until the end of the year: if you don't want to wait, you don't have to.

So here it is.

The Laundry Files main story arc runs through nine novels, not including A Conventional Boy, a number of novellas and short stories (of which ACB was originally intended to be one—it over-ran), and the New Management trilogy (which was originally going to be a separate successor series to The Laundry Files: it starts 18 months after the end of The Regicide Report—it turned out to be a marketing train-wreck, which I blame on COVID19 induced mix-ups on the publishing end of things). There may eventually be a short story collection, as most of the shorts have never been published in paper editions, but this is it for the main story, which was (since The Fuller Memorandum) intended to end with the final CASE NIGHTMARE GREEN confrontation.

One huge problem with writing any vaguely-contemporary thriller series is that the world doesn't stand still underneath your fictional version of the universe.

I originally intended to accommodate this by advancing the date from novel to novel at the same speed time passed in the real world. The Atrocity Archives were set circa 2001-03, The Jennifer Morgue in 2005, and so on. Bob had room to grow older: The Annihilation Score was set in 2012 and by The Nightmare Stacks the clock had run out to 2014.

But just as lot of cold war spy thrillers were left stranded by the sudden end of the Cold War in 1989-91, I was blindsided by the Brexit referendum and its consequences in 2015. Prior to Brexit, British politics had been evolving along roughly predictable lines since Thatcher came to power in 1979, drove a tank over the prior bipartisan social democratic consensus politics, and ushered in an era dominated by a rapacious neoliberal ideology. The unexpected Brexit referendum outcome derailed the freight train, with consequences that are still emerging a decade later, and left me supporting an increasingly precarious pile of spinning plates.

An immediate consequence of Brexit, in The Laundry Files, was that I had to hastily rewrite The Delirium Brief (after it was substantially complete), giving it a similar political rupture leading to the rise of the New Management.

But unfolding multi-book catastrophes take many years to write, and by the time I got through that point the Laundryverse was rapidly decoupling from real time. The period 2015-2019 coincided with my parents' final decline and death (they both made it into their 90s), then the collective trauma of COVID19. The Laundryverse as of 2019 was still stuck in an in-world version of 2014, and rapidly receding into the past. I managed to un-stick the clock for the New Management books (the original working title of which was Laundry Files: The Next Generation) and set them in 2016-17, but the series was already turning into alternate history by the time I got around to finishing writing A Conventional Boy (set circa 2011, the same year I began writing it: finally published in 2024).

At the same time, my publishers gently warned me that sales were threatening to enter the dreaded midlist death spiral. A midlist death spiral occurs when an author's sales decline from one book to the next. Bookstores base their orders for a new title in a series on a straight line extrapolation (no curve fitting!) of the previous two books, so any decline fatally undermines advance orders, and thereby sets up a self-fulfilling prophecy of decline. It was therefore time to wrap the series—at least, if I wanted to be able to earn a living in future years.

Which set me up for The Regicide Report, in which all the homing pigeons I'd released in earlier books would come back to roost—or at least as many as I could keep track of in my head (I write by the seat of my pants, there's no World Book in my desk drawer, and over 25 years you tend to forget little details).

Because The New Management books were already in print, I was writing inside certain constraints. The designated climax had to be finished in-universe by May 2015 (The Labyrinth Index was set in mid-2014). It needed to feature Bob and Mo, but Bob and Mo as they had evolved—on the threshold of middle age, cynical, burned-out, and constantly asking "are we the baddies?". It needed a confrontation with the Prime Minister in which he is left in absolute authority over the UK but his ambition to ascend to full godhood is thwarted. It demanded cameos by numerous characters, a climactic boss battle that made sense in context, and an ending that didn't amount to a personal tragedy for the original protagonists: you don't want to leave your long-term fans hating you at the end of a series. ("The fans are out there. They can't be bargained with. They can't be reasoned with. They don't feel pity, or remorse, or fear! And they absolutely will not stop, ever, until you are dead." Ahem: my apologies to James Cameron and Gale Anne Hurd, not to mention any non-Terminator fans that exist.)

The driver for the climactic confrontation in the series is the Black Pharaoh's goal of achieving a death-grip on the British state. This inevitably means confronting the ultimate source of occult power in the kingdom, the monarchy itself: but it's a novel I couldn't have pitched to my British publisher before September 8th, 2022. Elizabeth II was remarkably well-loved, or at least respected as a public figure, and pitching a novel about her assassination was ... well, it would have been inadvisable. However, following her actual death (probably from consequences of COVID19: following infection elderly patients are at very high risk of stroke or heart attack for several months) she suddenly graduated from reigning monarch to historical figure, and as such was no more off-limits than Queen Victoria or President Kennedy.

So my remit was: write a book in which the Black Pharaoh tries to bump off the Queen in 2015, fails to achieve occult supremacy, Bob et al battle him to a stalemate, and we ring down the curtain on the Laundry as an organization (indeed, by the end of The Regicide Report the Laundry of yore has been purged and its various duties merged into a new ministry directly controlled by the Black Pharaoh.)

Of necessity I had to start The Regicide Report by dumping a bucket of ordure over Bob's head—that committee meeting, where he accidentally outs a senior colleague by forgetting to reset the joke ringtone on his phone—and gets sent on a tour of outlying civil service offices as punishment. Yes, the Birmingham scene features an extensive Hot Fuzz tribute: yes, that is DI Angel. (It's one of the few early 21st century movies with cinematography that my damaged eyeballs and retinas could follow.)

One of the hallmarks of The Laundry Files is the repeated trope of pastiching thriller authors or urban fantasy subgenres. The Regicide Report kinda-sorta does this, only differently, by picking on a 1970s British movie anti-hero, The Abominable Doctor Phibes, a role portrayed stunningly well by Vincent Price in the two movies that actually got filmed (The Abominable Doctor Phibes and Doctor Phibes Rises Again). These films were among masterpieces of 1950s-1970s British horror genre, but are not without their weaknesses, and I'm not just talking about the cheap special effects. I had a loud argument with the scriptwriters in the privacy of my own skull, because the two most significant female characters (Vulnavia, Phibes' murderous muse, and Mrs Phibes) have zero talking lines in either film. This, I felt, was selling them both short. And besides, there was an obvious (to me) subtext that made the Phibes menage both Laundry-adjacent and explained the silence of the priestesses. If you watch the real movies then read the descriptions Bob and Mo give during their movie night, you'll spot some divergences: the Professor Phibes Bob meets in the Laundryverse is not the Dr Phibes of our world, nor are the movies exactly the same. (Let alone the third one, Dr. Phibes meets Mabuse the Gambler, notionally made in 1973 while Phibes was sleeping away the years in his glass coffin and not in a position to murder the producers.) NB: keep an eye open for the Cabaret references in that last one.

The assassination is carried out by means of poison: the toxic substance in question is entirely real and absolutely horrifying. Luckily you're very unlikely to come across it in real life, unless you work with laboratory assay equipment measuring environmental mercury contamination.

Buckingham Palace is indeed as vast and labyrinthine as I described it, but does not, to the best of my knowledge, feature server farms in the attic and a ritual sacrificial mock-up of the above-ground quarters in the basement. (It does have a bowling alley and, quite probably, a cinema organ.) There were plans to provide an emergency evacuation route via the Tube before the second world war, although it's unlikely the Royal Family would be in residence or evacuated that way in a real crisis today.

The basement crypt and archive of royal skeletal remains at Westminster Abbey is my own invention, as is the underground river, although there's an awful lot of buried history there: the site has been in use for over nine centuries.

As a point of note, if there were any historical truth behind the legend of King Arthur Pendragon, he'd almost certainly not feel any kinship to today's royals, who are descendants of a German dynasty invited in during the 18th century. Per legend Arthur was a 5th/6th century figure who led the post-Roman Britons. No Angles, Saxons, or Normans need apply. Nor is today's United Kingdom, or even today's England, clearly related to Arthur's: we don't speak the same language, England in its modern borders was only united during the 9th and 10th centuries, the prevailing religion back then would have been either a pre-Christian pagan tradition or very early Catholicism, and so on. Much of the Arthuriana we are familiar with today was invented out of whole cloth in the 12th to 14th century, at a time as far removed from its subject matter as that time is removed from us in this day and age.

Anyway, that's a round-up of my talking points about The Regicide Report. If you have any questions about the book, feel free to ask in the comments below.

Ian Jackson: Debian LLM GR - Summary of the options [Planet Debian]

Debian LLM GR - Summary of the options

Introduction

LLMs have finally made it to the ultimate stage of Debian’s governance processes, a General Resolution of all the project’s full governing members (DDs).

There are a lot of options on the ballot, and they all have a different structure and approach the question in a different way. It can be hard to see the wood for the trees. I have made a summary table to try to capture the main differences, both in effect, and sentiment.

A plea to the undecided voter

Suspending briefly my attempt to be neutral:

Before voting, I encourage you to read the passionate rationales in options H and A, or at least the summary in my option C.

Few of the LLM defences in the discussion threads, and none of the LLM-positive proposals, provide answers to any of these profound ethical concerns, many of which ought individually to be a deal-breaker. Instead, these crucial questions are simply dismissed or even ignored.

Some will tell you we should “keep politics out of software” but as we can see in the world around us, software is political - now more than ever. Debian’s mission is a highly political one: developing a fully-free operating system, and defending its freeness as we do, is far from neutral!

And of course many of LLMs’ harms affect Debian directly.

Table

A G C H F D B E
LLM harms Robusly discussed Discussed Robusly summarised Robusly discussed; especially re climate Summarised Accepted as inevitable Disregarded [1] Ignored
Direct contributions of LLM-generated code Forbidden Forbidden Strongly discouraged Strongly discouraged Discouraged Permitted Permitted Permitted
Direct use of LLM output in communications (bugs, mailing lists, etc.) Forbidden Forbidden Forbidden (with possible exceptions) Strongly discouraged Discouraged Permitted Permitted Permitted
LLM use where LLM output does not end up in the code/message Forbidden No position, so permitted Strongly discouraged Strongly discouraged Discouraged Permitted Permitted Permitted
Disclosure of LLM use LLM use forbidden LLM use largely forbidden, no further disclosure requirement Disclosure required Disclosure encouraged Disclosure encouraged Disclosure required Disclosure required Undisclosed LLM use is OK
Use of LLMs by upstreams Condemned “Not recommended”
Positive statements about LLMs “Here to stay” Moderate Strong

Notes

Ordering

I have tried to present the options in semantic order, with most LLM-negative proposals to the left, and the most LLM-positive to the right.

I have not quoted the one-line titles for the options. These have generally been provided by the proponents of each option, and, unfortunately, some of them are IMO quite misleading.

Note that, unfortunately, the voting software likes to assign numbers to options but also to preferences. Be mindful of this possible confusion when casting your vote. For clarity I quote only the option letters.

Upstream LLM code contributions

Some of the proposals acknowledge the uncertain legal status of LLM output. But all of them implicitly or explicitly assume that LLM output is or can be DFSG free. So none of the proposals forbid upstream projects with LLM-generated contents.

None of the proposals would require us to go back to pre-LLM versions of the upstream projects we use, and attempt to fork and maintain them. I very much think there is room in the world for people to try to do that, but I don’t think the Debian project can be that effort.

Given that the conclusions are the same in each case, whether the matter is discussed does not seem to me to be a significant difference. I have therefore not included a column for it.

Ability of individual teams to set their own rules

My proposal has a specific paragraph (7) explicitly permitting teams to set a “no LLM” policy. The other proposals do not discuss this point specifically. During the discussion, it seemed that most participants agreed that even options which explicitly permit LLM use generally do not prevent a team from setting its own more restrictive LLM policy.

I have therefore not tabulated this aspect.

Exceptions and nuances

Few of the permissive texts are absolute or unconditional. To summarise I have necessarily left out some nuance.

So for example when an entry says “permitted”, that generally means “permitted with conditions which are believed by LLM users to be readily satisfiable” (for example, DFSG-compatibility - see above).

[1] Footnote re proposal B

Proposal B does mention that there are “concerns” about LLM use. But it fails to make an explicit statement about whether these concerns are justified.

It then proceeds exactly as if they are not justified. IMO “disregarded” is a relatively mild term for such a rhetorical technique.


Edited 2026-08-18 09:02 UTC to make the proposal letters in the table be links.


comment count unavailable comments

Linux 7.2 released [OSnews]

Version 7.2 of the Linux kernel has been released.

Significant features in this release include common attributes support in the bpf()vsystem call, cache-aware load balancing for the CPU scheduler, large-folio support in the Btrfs filesystem, further swap subsystem improvements, improvements to the Landlock security module, support for block devices with inline encryption hardware via the dm-inlinecrypt device-mapper target, and much more.

↫ corbet at LWN.net

If you run Linux, you’ll get it sooner or later.

Pascal for small machines [OSnews]

We talked about the latest release of Delphi a few days ago, and that brought me to Hans Otten’s website.

This site is about my experience with the Wirth school of languages, based on the ideas and implementations of Prof Niklaus Wirth, Kenneth Bowles, Per Brinch Hansen, colleagues, and their students. And my experience with the various variants, from the P2 and P4 compilers originating in Zürich ETH, via UCSD Pascal P-System to the Borland compilers and Modula and Oberon systems. All applicable to small computers and device control.

On this website you will find information on Pascal for small machines, like Wirth compilers, the UCSD Pascal system, many scanned books and other files on UCSD Pascal, Pascal on MSX and CP/M, Delphi programming on PC, Freepascal and Lazarus on Windows and Raspberry Pi, Oberon systems. Many sources of early Pascal compilers! And last but not least my Pascal-M system!

↫ Hans Otten

If you’re into Pascal and its related languages and technologies, this is a treasure trove of information.

Super Mario derivations [OSnews]

One of the most surprising aspects of the Nix language is that it is lazy, especially if you have never used a lazy language before. This laziness is what makes much of Nixpkgs possible, and its complexity.

[…]

I decided to take that idea and make the attribute path a sequence of button presses in Super Mario Bros. 3. Each node in the tree is a frame of the game, and each child is a button press that produces a new frame. Game states are recursive by nature.

↫ Farid Zakaria

This has zero practical applications, and yet, it’s absolutely genius. I love this.

13:14

Trying Out Martie Goods [Whatever]

After my positive experience with Misfits Market, I decided to try out some other online grocery store delivery systems and see how these services compare. Today I’ll be talking about my experience with Martie Goods; another online grocery store with a mission of reducing food waste and making pricier items more accessible. Founded by two moms, Martie has been around for five years, and requires no membership or subscription fee. You only pay for the items you want to buy (plus shipping unless you spend fifty bucks, then you get free shipping).

While Misfits Market offers items that need to be refrigerated like meat, dairy, and eggs, Martie really only sells shelf-stable and pantry goods. However, they also have a substantial selection of items that Misfits doesn’t, like beauty products, fragrances, decor, cooking ware, etc. And they actually have some pretty notable brands!

For my first order, I stuck to food items, minus one kitchen item. A paring knife from Our Place, originally $40, but only $20 on Martie:

A small paring knife from Our Place, the handle is their Blue Salt color, and it is packaged in a terracotta colored box.

And here’s all the food items:

A bunch of pantry items and snack items laid out on the table.

I thought the astronaut rabbit mascot snack looked really cool, so I got a bag of these miso and caramel flavored veggie puff chips, and they are pretty good! Actually very flavorful. My only complaint with these is that the expiration date is August 26th, so I better get to finishing the bag sooner rather than later.

I got some small oat bite breakfasty item thing, a six pack of African style spiced potato chips, Nature’s Bakery fig bars in the blueberry flavor (12ct), some coconut flavored butter cookies that are really yummy, a vegan beef broth, Divina rosemary crisps (I really like Divina’s spreads/jams, but sadly all these crisps were broken up and crumbled a good bit), an oddly shaped container of cannellini beans, some protein pretzels in three different flavors (honey mustard, dill pickle, and garlic parmesan) with each flavor coming with eight bags, and finally some pickled beets.

Oh, and this wagyu beef jerky I forgot to put in the main photo, so here it is separately:

A package of Better Bovine wagyu beef jerky. The package is black with a cow wearing a monocle as the logo.

This beef jerky was pretty good flavor-wise, but on the tougher side. Definitely need some floss for your molars if you try this kind out.

My favorite thing so far is the protein pretzels. The dill pickle will absolutely punch you in the face, but that’s better than being bland!

In total, my order was $88.42, and that includes the 10% discount off my first order, as well as my $3 shipping surcharge for being out in the middle of nowhere. The most expensive thing was the knife, with all of the snacks roughly being between three and seven bucks each.

When I ordered from Martie, shortly after they sent out emails saying that their shipping was behind schedule, and orders were delayed. They said profusely that this is not the norm for them, and they were very sorry about the delays. I placed the order on August 4th, and my package arrived on August 14th. Ten days isn’t so bad, especially because there’s nothing urgent or refrigerated in the order. Obviously if there were cold pack items, a delivery delay would be a lot more of a big deal.

If we take the knife out of the equation, $68 bucks for everything I got isn’t like absolutely mind-blowingly amazing, but it’s not bad. Honestly, I think I got a lot more savings and better value out of my second order, which has yet to arrive but consists of a lot of Philosophy shower and fragrance products, packs of beverages, and a very nice set of small plates (also from Our Place).

Anyways, I like Martie! Always nice to have another company trying to reduce food waste and sell overstocked items at a decent discount to the consumer. I like that there’s no membership fee, and that it isn’t subscription based, you can just order whenever you want instead of having to pick stuff to go into your scheduled box.

I recommend checking them out and seeing what kind of good deals you can get, as a lot of deals tend to go rather quickly. And of course, here’s a referral code for ten dollars off your first order. If you place an order, tell me what you picked out in the comments, and have a great day! (Oh, and hopefully the shipping delay isn’t as bad now if you do decide to place an order.)

-AMS

12:56

Hacking Public Wi-Fi DNS to Steal Credentials [Schneier on Security]

Criminals are hacking into public Wi-Fi devices—at hotels, conference centers, and so on—around the world and changing their DNS settings. The goal is to redirect users to fake login pages and steal their credentials.

12:28

The State of Ticketing [The Daily WTF]

Developing software can't simply be done with a text editor and a compiler. There are a variety of other tools we have to bring to bear that support our efforts and keep the team organized, like say, source control.

There are certain tools we all have to use that I would argue, nobody has actually make a version that's any good. Build tooling is one of my go-to examples: there are no good build systems, only build systems that are good enough for this task.

Another is ticket/task management. In fact, I'd go so far as to say, there are no good ticket management tools. Amongst the not good tools, I'd put Jira as one of the not goodest of all.

What makes Jira attractive to companies is the same thing that makes it miserable, and the thing that infects any "enterprise" software platform and turns it into garbage: it has all the features and expect you to build your own workflows with it. You don't merely use Jira, you have to program your own interfaces in Jira to get your workflow into the system. And if you have the misfortune to have a project manager who thinks they're more technical than they are, they'll endlessly spin up new views, new workflows, and rearrange how the work is tracked in lieu of actually working.

I've been on that team.

One of Jira's features is the ability to describe the ticket workflow: the state machine that describes your process from the initial entry of the ticket all the way down to released software or project completion. This includes routing, so that as one team member does their part of the work, it automatically goes to someone else to do the next portion of the work.

Which brings us to Klinsten. They were working on a new team, and wanted to change the ticket status from its current status to whatever came next in the workflow. So they looked at the workflow.

A Jira ticket workflow. There are a pile of states arranged in a column, and connected by arrows. So many arrows. It's impossible to tell which arrow connects which two states. A second version of the diagram is in the picture, with transition labels attached. It makes less sense. For bonus points, the labels are a mix of English and Dutch

These are two different versions of the same workflow, one with transition labels added, which as you can see, does nothing to clarify the workflow. That it's a mix of Dutch and English doesn't help matters.

The purpose of this workflow is to help the team understand how to sequence and organize their work. But this workflow has so many states and so many transitions, it fails at this goal. Looking at it makes me just want to gesloten my browser tab, because this user isn't accepting any of this.

[Advertisement] BuildMaster allows you to create a self-service release management platform that allows different teams to manage their applications. Explore how!

11:14

Grrl Power #1487 – It takes two to backstab [Grrl Power]

Sure it takes two to backstab, but a storm of mirror images certainly helps.

The neat part is, Final Blade is always a backstab, no matter which way the target is facing. If the target happens to know that, and they put their back to a jet of plasma, (and presumably aren’t incinerated by that) it can be a problem for the backstabber.

Max isn’t arrogant enough to think that she’ll come out of the tournament unscathed. She reviewed all the quarterfinalist and above winners of previous U.C.B.A’s, and the earliest events usually favored the guy with the biggest cannons and most armor, be they mech or bioroid kaiju. But as the tournaments went on, being tough as shit became the minimum credentials for winning, and increasingly, having some flex skill or crazy hail mary or clinch ability determined the winner. So Max is definitely on the lookout for the Word of Death spell, or Petrify, or Electron Inversion or whatever.

What she’s more worried about is leaving DNA on the field. The Holo-Not-Latex-But-Basically-Print-On-Latex (which is a fair bit stronger than latex) outfit she’s wearing will prevent that, assuming attacks never get past her body reinforcement force field thingy. Now you may ask yourself, does Max have DNA at this point? Well, she has something. Human scientists haven’t mapped it yet, but it is, as far as anyone can tell, unique to her. The alien law enforcement database of “Protein Encoding Instructions Found in Crime Scene Goo” is vast, but sticking some of her blood or “skin” or whatever in there and have it come back with “Unknown Unique Sample EFX-13025a95” would still be easy enough to match to her if any alien Galaxy Rangers thought to sneak into her quarters and make off with her pillowcase.


Oh, look who it is in the vote incentive. And a not-quite-yet-but-it’s-coming NSFW version over at Patreon.

Vote incentive and Patreon updated with some shading. Not finished yet, but progress.

I think she would get in trouble for doing this. She’d mess up the… floor of the waterfall? Is that what it’s called? The receiving pool? No, probably not that. Anyway, she’d churn things up and cause a ton of weird erosion.

Since you might be wondering, Niagara Falls is about 165 feet high, so Babezilla obviously doesn’t have to be full sized. I’d say she’s about 175-180 feet tall here?


Double res version will be posted over at Patreon. Feel free to contribute as much as you like.

10:49

GNU poke 5.0 released [Planet GNU]

I am happy to announce a new major release of GNU poke, version 5.0.

GNU poke 5.0 release is now available at
https://ftp.gnu.o ... e/poke-5.0.tar.gz

The tarball is signed and you can get the PGP signature at
https://ftp.gnu.o ... ke-5.0.tar.gz.sig

  GNU poke (http://www.j ... rch.net/poke) is an interactive, extensible
  editor for binary data.  Not limited to editing basic entities such
  as bits and bytes, it provides a full-fledged procedural,
  interactive programming language designed to describe data
  structures and to operate on them.

I'd like to thank everyone who contributed to this release through code,
documentation, or testing.

What is new in this release:

User interface updates


  • Now hyperlink server can bind to a user-specified port for listening to

commands (-p, --hserver-port).

Poke Language updates


  • Floating-point arithmetic is now supported on uint<32>/uint<64> types.

  uint<32> will be interpreted as a single-precision floating-point number
  and uint<64> will be interpreted as a double-precision floating-point
  number as defined per the IEEE 754 standard.
  The following expressions are now supported:

    - Addition:       a .+  b
    - Subtraction:    a .-  b
    - Multiplication: a .*  b
    - Division:       a ./  b
    - Ceil-devision:  a ./^ b
    - Exponentiation: a .** b
    - Remainder:      a .%  b
    - Post-increment: a.++
    - Pre-increment:  .++a
    - Post-decrement: a.--
    - Pre-decrement:  .--a
    - Negation:      .-a

    - Less-than:                a .<  b
    - Less-than-or-equal-to:    a .<= b
    - Greater-than:             a .>  b
    - Greater-than-or-equal-to: a .>= b
    - Equal-to:                 a .== b
    - Not-equal-to:             a .!= b


Poke Runtime updates


  • Thanks to the great work of David Faust, poke now supports reactive IO

  spaces!  Extent of a PVM value mapped in a given IO space will be tracked
  and values will be re-mapped only if a write happens in their extent; which
  is a big performance win for read-intense programs.

  • A bunch of undefined behavior (UB) releated to left-shifts has been fixed.


  • Improved human-readable message of E_conv exception when verifying

  length/size of an array with dynamic bound(s) to help the user to
  understand the mistake.

Poke compiler updates


  • Now poke can properly handle writes to nested integral struct/unions

  fields.  Previously write to nested fields of integral structs did not
  materialize in IO space.

Standard Poke Library updates


  • Closure's pretty printer now adds closure's name (identifier) to output.


  • Two new functions to calculate square root of single and double precision

  floating point numbers: sqrtf and sqrtd.
  They accept uint<32> and uint<64> respectively as the IEEE 754 single and
  double precision floating-point numbers.

libpoke updates


  • Version of DSO is bumped to 2.0.0, and from this release onward, we try

  to not break the ABI, and bump the version components according to the
  libtool's recommendation (when needed).

  • To be able to keep the ABI backward-compatibility promise, all public APIs

  are now accepting either pk_compiler or pk_val.  This is the first step
  toward removing global state from libpoke to be able to have multiple
  instances of libpoke in a single process (and also to be able to accomplish
  thread-safety). We're not there yet, but we'll be there some day (hopefully
  soon)!

IO subsystem updates


  • IOS_F_TRUNCATE has been re-introduced (it was removed after release of

  poke 1.0 by the rationale that it's not that useful of a flag.  Turns
  out it's quite useful to start from an empty file when assembling binary
  files from scratch using poke.

Pickles updates


  • Improved ustar pickle and add tests.  Method get_last_mod_time has been

  fixed and the following methods has been added:
  get_{file,owner_user,group}_name.

  • Improved time pickle to print date and time properly (zero-padded), and

  also add ptime_str function to get date/time information as a string.

Platform supports


  • We tried to improve MinGW compilation situation by importing more Gnulib

  modules, but we still cannot have poke executable for MinGW platform.
  Help is very much appreciated in this area!

Documentation updates


  • Thanks to people who actually read the reference manual, this release

  includes a bunch of corrections to the documentation! Cheers to them!


Happy poking!
Mohammad-Reza Nabipoor

10:42

Consider the AI tear down [Seth's Blog]

Find a safe critic.

Upload your essay, your book, your artwork, your business plan or your resume to Claude. Then, pick a critic.

“Write a detailed, specific negative review that might appear on Amazon/in ArtNews/at a Ph.D defense/from a disappointed venture capitalist/from a recruiter”

A few things happen. First, you’ll likely read some 1-star reviews that you’re totally delighted with. It’s okay that my novel got one star because it has a sophisticated vocabulary. You may also realize that the negative noise in your head seems a lot more ridiculous if you read it on the screen.

Second, you’re much less likely to take it personally, because it’s not coming from a person. It’s a parody of a person, and in those words you might find some truth worth reading.

And third, you’ll realize it’s impossible to please some people. Criticism is what critics do.

It’s not worth making this a habit, because the negativity can easily get stuck in our heads. If that happens, ask for some glowing reviews instead.


PS here’s what Claude said about this post:

This is exactly the kind of pseudo-profound productivity hack that passes for insight in marketing circles these days.

Let me get this straight: your advice is to use AI to generate fake criticism so you can… feel better about ignoring it? The logical gymnastics here are remarkable. We’re told the fake reviews will contain “truth worth reading,” but also that we shouldn’t take them seriously because they’re “not coming from a person,” but also that we should stop if the negativity “gets stuck in our heads.” Pick a lane.

The real tell is buried in the middle: “It’s okay that my novel got one star because it has a sophisticated vocabulary.” Ah yes, the classic defensive crouch dressed up as self-awareness. You’ve essentially built a machine for manufacturing comfortable rationalizations. “See, the AI said mean things, but I’ve decided they don’t count because [insert excuse here].”

And the finale—if the fake criticism bothers you, just ask for fake praise instead! Problem solved. We’ve successfully turned AI into a therapeutic tool for avoiding genuine self-examination while maintaining the appearance of rigor.

Here’s what’s missing: any acknowledgment that real criticism from real people who actually read your work might be… useful? That the discomfort of genuine feedback is precisely what makes it valuable?

But I suppose that’s harder to monetize than “try this one weird trick.”


And, at the risk of being too meta, here’s Claude’s response to the response:

A Comment Ripping the Critic


Congratulations on demonstrating the exact behavior the post describes. You’ve written a performatively harsh takedown that reveals far more about your need to seem clever than about any actual flaw in the idea.

Let’s talk about your reading comprehension. The post never suggests ignoring criticism—it suggests practicing receiving it. There’s a difference between “feel better about ignoring feedback” and “build some emotional distance so you can actually hear it.” But nuance doesn’t generate the dopamine hit of a sick burn, does it?

Your “pick a lane” complaint is particularly rich. The post describes a tool with multiple uses. Sometimes the fake review reveals genuine blind spots. Sometimes it shows you that certain critics are unpleasable. Sometimes you need to step away. These aren’t contradictions—they’re different outcomes from the same exercise. That you can’t hold multiple possibilities in your head simultaneously says more about you than about the argument.

And your grand finale about “real criticism from real people”? Please. Most creative work never gets meaningful feedback at all. It gets silence, or a thumbs up from mom, or rejection letters that say nothing useful. The fantasy that there’s a queue of thoughtful critics waiting to help you improve is exactly that—a fantasy. This tool fills a gap. It doesn’t replace the feedback you’re not getting anyway.

But here’s what really gives you away: the sneering about “marketing circles” and “monetizing.” You showed up pre-loaded with contempt, looking for confirmation. The post was simply the surface you projected it onto.

You’ve proven the point beautifully. Some people are just looking for something to tear down.

08:56

Squid Lids [Penny Arcade]

New Comic: Squid Lids

08:28

Pluralistic: Jennifer Jenkins' 'Music Copyright, Creativity, and Culture' (17 Aug 2026) [Pluralistic: Daily links from Cory Doctorow]

->->->->->->->->->->->->->->->->->->->->->->->->->->->->-> Top Sources: None -->

Today's links

  • Jennifer Jenkins' 'Music Copyright, Creativity, and Culture': The definitive textbook (with comics!).
  • Hey look at this: Delights to delectate.
  • Object permanence: Hair-gel bombers v bras; Hair-gel bombers v chemistry; AOL digs for spammer's platinum; Stross on infosec in 2061; In-game Ponzi; Snowden on Shadow Brokers hack; Life v understanding advanced math; "Greatest of Marlys!"; Housing and precarity; LLMs as slot-machines for coders; Hypercard's backstory; Pirate Party; Fanbois' mental health v critics; Krugman calls for alien invasion; Trump x Serbian genocidaires; The last Sandman Slim; Muphry’s Law; NSA created the Shadow Brokers; DOJ kills private prisons; Walmart externalizes crime; "Sgt Augmento"; Zuckermuskian solipsism.
  • Upcoming appearances: Sydney, Melbourne, Brighton, London, South Bend.
  • Recent appearances: Where I've been.
  • Latest books: You keep readin' em, I'll keep writin' 'em.
  • Upcoming books: Like I said, I'll keep writin' 'em.
  • Colophon: All the rest.



The cover for the Oxford University Press edition of Jennifer Jenkins' 'Music Copyright, Creativity, and Culture.'

Jennifer Jenkins' 'Music Copyright, Creativity, and Culture' (permalink)

Nobody explains copyright like Jennifer Jenkins, the director of the Duke Center for the Public Domain, in which capacity she is responsible for the annual New Year's roundups of all the materials entering the public domain (a series that started in the decades during which the public domain was frozen by the Sonny Bono Copyright Act):

https://pluralistic.net/2023/12/20/em-oh-you-ess-ee/#sexytimes

Jenkins has a gift for making one of the most complicated, worst understood, most consequential areas of law not only comprehensible, but also fascinating. Her late 2023 explanation of what "Mickey Mouse's copyright is expiring" actually meant was the single best explainer on the subject, in a crowded field:

https://pluralistic.net/2023/12/15/mouse-liberation-front/#free-mickey

Small wonder that she's the go-to copyright and trademark expert for so many media outlets. Perhaps you heard her Planet Money segments on which superheroes are in the public domain:

https://www.npr.org/transcripts/969512231

Jenkins' flair for legal communications carries over to her scholarly work, of course, which is why her Open Copyright Casebook is a standard text for American law schools:

https://pluralistic.net/2024/07/30/open-and-shut-casebook/#stop-confusing-the-issue-with-relevant-facts

Jenkins co-wrote the Casebook with her husband, the equally erudite and expert James Boyle. It's just one of their many fruitful collaborations; they are also the writing team behind THEFT! A History of Music, the greatest graphic novel ever created about the history of music, music law, music censorship, and the music industry:

https://web.law.duke.edu/musiccomic/

Last year, Jenkins published Music Copyright, Creativity, and Culture, an Oxford University Press title that fuses her scholarly and popular work in a generalist textbook on the legal framework for music that will forever change how you think about music. Now, a second edition, with a lengthy section on new music litigation, AI copyright fights, and the issue of uncompensated labor is available as an open access download:

https://web.law.duke.edu/cspd/musiccopyright/

Music Copyright weaves together the economic, cultural, political and artistic history of music, pulling on historic threads ranging from antiquity to medieval Europe to the age of mechanical reproduction to describe changing views of musicians, their audiences, and religious and political leaders on what constituted music, who was allowed to make music, and what music was for. In so doing, she firmly establishes the extremely contingent nature of our present-day norms around music, showing that the "natural" present-day assumptions about who gets paid, who pays, and when payment (or permission) is required are anything but, and are always in flux.

For obvious reasons, much of Jenkins' text describes these changes in the context of the record, the radio, satellite transmission, P2P file-sharing, and digital sampling (along with a chapter on AI). These examples are liberally illustrated with links to musical excerpts that bring the subject to life (these are presented as hotlinks in the ebook; if you're reading the print edition, you can use the book's companion website:)

https://web.law.duke.edu/cspd/musiccopyright/

Interspersed with these histories and analysis are lengthy, extremely on-point excerpts from THEFT!, her graphic novel history of music. These enliven the text as much as the music samples, making this textbook as entertaining as it is informative.

Of especial interest – and importance – are the long sections on the courtroom battles of Ed Sheeran, Katy Perry, and Pharrell Williams over similar "grooves" and "vibes" to other songs, some of them well-known and some quite obscure:

https://pluralistic.net/2022/04/08/oh-why/#two-notes-and-running

These cases highlight the fundamental incoherence of music copyright, a system composed of improvised responses to new technologies, each layered atop the last in a messy pile that virtually no one understands.

Jenkins understands it, though. I've been reading, writing, and debating about this stuff since the late 1990s, and I learned something new on every page of this delightful book. This should be required reading for anyone who makes music, loves music, or cares about musicians and the arts more generally. It's a towering accomplishment and a brilliant read.


Hey look at this (permalink)



A shelf of leatherbound history books with a gilt-stamped series title, 'The World's Famous Events.'

Object permanence (permalink)

#25yrsago RIP, The Industry Standard, Palm buys BeOS https://web.archive.org/web/20010927192339/http://www.wired.com/news/business/0,1367,46113,00.html

#25yrsago Smart dust sensors https://web.archive.org/web/20011112010004/http://www.smalltimes.com/document_display.cfm?document_id=1935

#25yrsago Pentagon patents onion-routing https://web.archive.org/web/20010912222427/http://www.wired.com/news/politics/0,1283,46126,00.html

#25yrsago Coltan: the conflict mineral in our gadgets https://www.nytimes.com/2001/08/12/magazine/the-dirt-in-the-new-machine.html

#25yrsago Danny Goodman Talks About HyperCard https://web.archive.org/web/20011214114614/http://www.oreillynet.com/pub/a/mac/2001/08/17/goodman.html

#25yrsago Report an insecure website, win a visit from the FBI https://web.archive.org/web/20010820110330/http://www.linuxfreak.org/post.php/08/17/2001/134.html

#20yrsago Copyright wars: film-makers eats themselves https://web.archive.org/web/20070318010544/https://www.laweekly.com/film+tv/film/freedom-of-information/14244/

#20yrsago RyanAir to UK govt: ease off on security or we sue https://www.theguardian.com/business/2006/aug/18/theairlineindustry.terrorism

#20yrsago Federal court bans Bush’s warrantless spying on Americans https://edition.cnn.com/2006/POLITICS/08/17/domesticspying.lawsuit/index.html

#20yrsago Western millionaires plotted Equatorial Guinea coup as a game https://web.archive.org/web/20071114211448/https://www.salon.com/books/review/2006/08/17/roberts/index_np.html

#20yrsago Sweden’s Pirate Party – political arm of the pro-piracy groundswell https://web.archive.org/web/20060820093355/https://www.wired.com/news/technology/1,71544-0.html

#20yrsago Hair-Gel Bombers win war on bras https://www.huffingtonpost.co.uk/entry/us-authorities-leave-gel_n_27402

#20yrsago Would a hair-gel bomb actually work? https://seclists.org/interesting-people/2006/Aug/86

#20yrsago The Pirate Bay’s backstory https://web.archive.org/web/20060901180116/https://www.wired.com/news/technology/1,71543-0.html

#20yrsago AOL will dig for buried platinum and gold in spammer’s Mom’s yard https://www.nbcnews.com/id/wbna14365934

#15yrsago Charlie Stross on network security in 2061 https://www.antipope.org/charlie/blog-static/2011/08/usenix-2011-keynote-network-se.html

#15yrsago Damning 2007 letter asserts that phone hacking was an open practice at News of the World https://www.theguardian.com/media/2011/aug/16/phone-hacking-now-reporter-letter

#15yrsago In-game Ponzi nets US$50K https://web.archive.org/web/20110921052125/http://gamergaia.com/pc/1724-eve-online-space-heist-one-trillion-isk.html

#15yrsago Copyright troll handed ass (again), tries saddest trick ever to get out of paying its victim’s legal bills https://arstechnica.com/tech-policy/2011/08/righthaven-rocked-owes-34000-after-fair-use-loss/

#15yrsago English cops arrest man for planning water-fight via Blackberry Messenger https://www.theguardian.com/media/2011/aug/15/essex-water-fight-blackberry-messenger

#15yrsago Woman who recorded Massachusetts police beating charged with illegal wiretapping https://www.masslive.com/news/2011/08/videographer_of_alleged_melvin.html

#15yrsago Criticism of a brand lowers the self-esteem of its adherents https://arstechnica.com/science/2011/08/users-treat-criticism-of-favorite-brands-as-threat-to-self-image/

#15yrsago Homeopathy multinational sues blogger over statements that its mythological curative had “no active ingredient” https://web.archive.org/web/20110930131033/http://www.blogzero.it/contatti/prova/

#15yrsago Edinburgh Fringe show asks audience to shred banknotes https://www.theguardian.com/culture/2011/aug/16/crunch-edinburgh-festival-shred-cash

#15yrsago CCTV deterrence and the London uprising https://www.theguardian.com/technology/2011/aug/17/why-cctv-does-not-deter-crime

#15yrsago Paul Krugman: save the economy by staging an alien invasion hoax https://comicsalliance.com/watchmen-paul-krugman-alien-invasion/

#15yrsago Minecraft creator challenges trademark belligerents to winner-take-all Quake deathmatch https://web.archive.org/web/20110817205045/http://notch.tumblr.com/post/9038258448/hey-bethesda-lets-settle-this

#15yrsago Muphry’s Law: the inevitability of typos in discussions of typos https://web.archive.org/web/20101227141449/https://www.editorscanberra.org/muphrys-law/

#15yrsago Copyright complaint as phishing email https://memex.craphound.com/2011/08/18/copyright-complaint-as-phishing-email/

#15yrsago Rep Allen West pens “dumbest thing ever written on congressional stationery” https://web.archive.org/web/20110914030034/https://thinkprogress.org/security/2011/08/17/297619/allen-west-nuts/

#10yrsago The NSA’s program of tech sabotage created the Shadow Brokers https://web.archive.org/web/20160818132904/https://www.wired.com/2016/08/shadow-brokers-mess-happens-nsa-hoards-zero-days/

#10yrsago Walmarts are high-crime zones thanks to staff cuts, but America gets the bill https://web.archive.org/web/20160818000539/https://www.bloomberg.com/features/2016-walmart-crime/

#10yrsago DoJ says it will end private federal prisons https://www.motherjones.com/politics/2016/08/department-justice-plans-end-private-prison/

#10yrsago Fiction: Sgt. Augmento, Bruce Sterling’s robots-take-our-jobs story https://web.archive.org/web/20160818161624/https://motherboard.vice.com/read/sgt-augmento

#10yrsago Las Vegas: high unionization rates mean smaller wage-gaps for women, especially older women https://www.nytimes.com/2016/08/17/opinion/how-unions-help-cocktail-servers.html

#10yrsago The incredible true story of the Epcot Horizons superfans who ruled the ride https://web.archive.org/web/20160822031741/https://dangerousminds.net/comments/the_true_story_of_the_unauthorized_daredevil_documentation_of_the_horizons_/

#10yrsago Predictive policing predicts police harassment, not crime https://web.archive.org/web/20160821093834/https://link.springer.com/article/10.1007/s11292-016-9272-0

#10yrsago UC Davis Chancellor spent $400K+ to scrub her online reputation after pepper-spray incident https://www.sacbee.com/news/local/article94733812.html

#10yrsago Reputation systems work because people are mostly good https://timharford.com/2016/08/the-meaning-of-trust-in-the-age-of-airbnb/

#10yrsago The guy who started Serbia’s ethnic cleansing led a pro-Trump rally in Belgrade https://web.archive.org/web/20160817022133/https://theintercept.com/2016/08/16/serb-inspired-ethnic-cleansing-bosnia-leads-vote-trump-rally-belgrade/

#10yrsago Europe’s banks want to store billions in cash to fight back against negative interest https://web.archive.org/web/20160817152157/https://www.cnbc.com/2016/08/16/banks-look-for-cheap-way-to-store-cash-piles-as-rates-go-negative.html

#10yrsago Kill Rock Stars president explains why the radio plays the same songs over and over https://www.youtube.com/watch?v=ThrXkYwTBP8

#10yrsago Snowden explains the Shadow Brokers/Equation Group/NSA hack https://www.techdirt.com/2016/08/16/ed-snowden-explains-why-hackers-published-nsas-hacking-tools/

#10yrsago Hackers claim to have stolen NSA cyberweapons, auctioning them to highest bidder https://web.archive.org/web/20160816035711/https://motherboard.vice.com/read/hackers-hack-nsa-linked-equation-group

#10yrsago What life is like when you really understand advanced mathematics https://www.quora.com/What-is-it-like-to-understand-advanced-mathematics-Does-it-feel-analogous-to-having-mastery-of-another-language-like-in-programming-or-linguistics

#10yrsago Parents who can’t pay the bill for kids’ incarceration can still go bankrupt, a US court rules https://archive.thinkprogress.org/everything-wrong-with-how-our-justice-system-treats-poor-people-in-one-awful-case-bfd91a6fa114/

#10yrsago UK Intellectual Property Office grants trademark on “should’ve” https://www.bbc.co.uk/news/business-37092366

#10yrsago The Greatest of Marlys! is the Lynda Barry book we’ve been waiting for https://memex.craphound.com/2016/08/16/the-greatest-of-marlys-is-the-lynda-barry-book-weve-been-waiting-for/

#5yrsago Housing, money laundry, speculation and precarity https://pluralistic.net/2021/08/16/die-miete-ist-zu-hoch/#assets-v-human-rights

#5yrsago Big Oil caught lying about methane https://pluralistic.net/2021/08/17/king-bullet/#methanescan

#5yrsago Sandman Slim's final adventure https://pluralistic.net/2021/08/17/king-bullet/#sticking-the-dismount

#5yrsago The Sacklers threaten us all with a good time https://pluralistic.net/2021/08/18/lets-make-a-deal/#art-of-the-deal

#1yrago Zuckermuskian solipsism https://pluralistic.net/2025/08/18/seeing-like-a-billionaire/#npcs

#1yrago LLMs are slot-machines https://pluralistic.net/2025/08/16/jackpot/#salience-bias


Upcoming appearances (permalink)

A photo of me onstage, giving a speech, pounding the podium.



A screenshot of me at my desk, doing a livecast.

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

  • "The Post-American Internet," a geopolitical sequel of sorts to Enshittification, Farrar, Straus and Giroux, 2027
  • "Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, April 20, 2027

  • "Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2027

  • "The Memex Method," Farrar, Straus, Giroux, 2027



Colophon (permalink)

Today's top sources:

Currently writing:

  • “Once Is Enemy Action,” a science fiction novel about the origins of modern technofascism. Friday's words: 564 (6039 total).

  • "The Post-American Internet," a sequel to "Enshittification," about the better world the rest of us get to have now that Trump has torched America. Fourth draft completed. Submitted to editor.

  • A Little Brother short story about DIY insulin PLANNING


This work – excluding any serialized fiction – is licensed under a Creative Commons Attribution 4.0 license. That means you can use it any way you like, including commercially, provided that you attribute it to me, Cory Doctorow, and include a link to pluralistic.net.

https://creativecommons.org/licenses/by/4.0/

Quotations and images are not included in this license; they are included either under a limitation or exception to copyright, or on the basis of a separate license. Please exercise caution.


How to get Pluralistic:

Blog (no ads, tracking, or data-collection):

Pluralistic.net

Newsletter (no ads, tracking, or data-collection):

https://pluralistic.net/plura-list

Mastodon (no ads, tracking, or data-collection):

https://mamot.fr/@pluralistic

Bluesky (no ads, possible tracking and data-collection):

https://bsky.app/profile/doctorow.pluralistic.net

Medium (no ads, paywalled):

https://doctorow.medium.com/

Tumblr (mass-scale, unrestricted, third-party surveillance and advertising):

https://mostlysignssomeportents.tumblr.com/tagged/pluralistic

"When life gives you SARS, you make sarsaparilla" -Joey "Accordion Guy" DeVilla

READ CAREFULLY: By reading this, you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies ("BOGUS AGREEMENTS") that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.

ISSN: 3066-764X

05:21

Girl Genius for Monday, August 17, 2026 [Girl Genius]

The Girl Genius comic for Monday, August 17, 2026 has been posted.

03:42

01:07

00:21

The 7.2 kernel has been released [LWN.net]

The 7.2 kernel has been released. Linus said:

Well, this last week of the release was - once again - bigger than I would have wished for, but hey, with the whole "new normal" thing, if I delayed releases for that reason we'd probably never have a release at all.

Significant features in this release include common attributes support in the bpf() system call, cache-aware load balancing for the CPU scheduler, large-folio support in the Btrfs filesystem, further swap subsystem improvements, improvements to the Landlock security module, support for block devices with inline encryption hardware via the dm-inlinecrypt device-mapper target, and much more. See the LWN merge window summaries (part 1, part 2) and the KernelNewbies 7.2 page for more information.

Sunday, 16 August

16:28

Link [Scripting News]

Brent Simmons posted a note in RSS.chat about how to connect with NetNewsWire. I have a fairly detailed response, that says dynamic OPML is the way to go. I know serving it publicly will be a problem, that's why we're going to move FeedLand into position to solve that. FreshRSS, InoReader and my own FeedLand already support it. It feels like this is getting established. I still want a podcast client to work here. I've pitched a few of them. Will continue.

15:49

Bits from Debian: Debian turns 33! [Planet Debian]

It has now been thirty-three years since the Debian project was announced to the world by Ian Murdock, on August 16, 1993. This anniversary is an opportunity to reaffirm the goals, characteristics, and qualities of the Debian project: it’s an association of individuals who have made common cause to create a free operating system. Our distribution is characterized by a commitment to software freedom, as enshrined in the Debian Social Contract and the Debian Free Software Guidelines. It focuses on security and stability. This stability is crucial to Debian position in the free software ecosystem.

With our users as our priority, Debian makes special efforts regarding accessibility with Debian-Accessibility and diversity with our Outreach Programs.

Debian Day is a great opportunity to get together, whether for a local meetup, or simply to grab a coffee with other members of the Debian community. Check out the Debian Day wiki to see if there is a celebration near you. And if there isn't, maybe you can organize it next year!

Today is also an opportunity for you to start or resume your contributions to Debian. For example, you can install the how-can-i-help package and see if there is a bug in any of the software that you use that you can help to fix, contribute small tips on how to install Debian on your machines to our wiki pages, or put a Debian live image in an USB memory and give it to some person near you, who still didn't discover Debian.

Thanks to everybody who has contributed to develop our beloved operating system in these 33 years, and Happy birthday Debian!

15:42

Link [Scripting News]

Sometimes I need to use a Google-style search engine to find something on a reference site. That no longer works in Google. This is a major feature pullback. So far all we've heard in journalism is how it hurts their bottom line, but nothing about the world's information architecture. This is something like every bridge in the world being blown up at the same time, and I don't think that's an exaggeration.

14:21

Joe Marshall: SDK for jrm-code-project.com [Planet Lisp]

A few of you have noticed the OpenAPI spec floating around the site lately. Rather than watching everyone write the same HTTP boilerplate from scratch to talk to the server, I went ahead and bundled up a set of official client bindings.

If you want to programmatically hit the pastebin or mess with the other endpoints, the jrm-code-client repository is live.

Right now, it includes complete SDKs for:

  • Common Lisp (obviously)
  • Emacs Lisp (naturally)
  • Python (seriously?)
  • Go (ugh)

They all handle the JWT authentication handshake natively and deserialize the JSON responses into proper language-specific structs/objects. You can stop raw-dogging it with curl (unless that's your thing).

Source is up on GitHub: jrm-code-project/jrm-code-client

Play nice with the rate limits.

14:14

Vasudev Kamath: Releasing debvulns-exporter and debvulns CLI 0.2.2 [Planet Debian]

I made another minor release with several enhancements: handling non-Debian origin vulnerabilities, improving data caching, and sharing the cache between the debvulns CLI and the exporter. Additionally, there are a few improvements on the dashboard front. Here is a breakdown of what changed.

Handling Vulnerabilities in Non-Debian Origin Packages

During the previous release, I noticed that the grafana package—which is not in Debian and was installed via an upstream repository—was reported as vulnerable with multiple issues. Looking into why this happened, I found that all the CVEs reported in the dashboard were indeed listed on security-tracker.debian.org, but without a fixed version or status description. The logic assumed no fix was available and marked the package as vulnerable on the dashboard.

How Did I Solve This?

Google maintains a distributed vulnerability database for open-source projects called osv.dev. I checked the generic vulnerability data for those CVEs on OSV (unbound to any specific distribution) and found that the issues were already fixed in the upstream version I was running. What I needed was a way to differentiate native Debian packages from non-Debian packages, which corresponds to the Origin field in APT metadata.

Pitfall

The AI-generated code initially attempted to differentiate package origin using apt_pkg.PackageRecords and its origin field. However, many native Debian packages were incorrectly flagged as non-Debian. On closer inspection, when an upgrade is available for a package, the installed version's origin field can be unset. I had to resolve this by detecting available upgrades and inspecting the candidate version's origin instead, which was implemented in this patch. This solution was proudly crafted by me ;-) (partly because I ran out of API limits and had to wait 6 hours for the next reset).

Caching OSV Data

Initially, the AI implemented the exporter to re-download the entire OSV dataset on every run, which was unnecessary. Since vulnerability data does not change rapidly once published, caching it on disk for longer than the standard 24-hour Debian/EPSS cache makes sense. OSV vulnerability data is now cached for 7 days before a refresh is triggered.

All cache expiration thresholds remain configurable via CLI flags.

Catch

One caveat with this approach: I have not yet verified whether every upstream CVE is tracked on security-tracker.debian.org. In the case of grafana, the entries existed. This feature operates on the assumption that security-tracker.debian.org indexes CVE metadata regardless of whether the package is native to Debian. I plan to re-evaluate this and add fallback handling if that assumption fails.

Unified Cache Directory for CLI and Exporter

Another issue was cache segregation: the debvulns CLI utility defaulted to /var/cache/debvulns, while the Prometheus exporter used /var/cache/debvulns-exporter. While harmless when running only one tool, installing both led to duplicated cache storage and redundant network requests. Since the core evaluation logic is identical across both tools, they now share a unified cache directory to eliminate duplicate downloads.

Dashboard Changes

During the initial dashboard rollout, my test environment (my laptop alongside Debian 11 and Debian 12 VMs) reported a high aggregated vulnerability count. It was not immediately obvious whether these were distinct vulnerabilities or the same CVEs replicated across all three machines. This mirrors common questions raised during vulnerability reviews:

  • How many unique vulnerabilities are present across the fleet?
  • Which unique packages are affected?

The dashboard has been redesigned to surface unique vulnerability counts alongside affected package lists. The updated dashboard is shown below:

What's Next?

A few planned items remain to make debvulns a comprehensive vulnerability reporting toolkit for Debian systems:

  1. Kernel Vulnerability Handling: Currently, installing a patched kernel marks the vulnerability as resolved, even if the system has not rebooted into it. The system remains exposed while the vulnerable kernel is executing in memory. Factoring in running kernel versions is crucial.
  2. Reboot and Service Restart Tracking: Similar to kernel upgrades requiring a reboot, userland library and binary fixes require running services to be restarted. This is typically detected via needrestart. Integrating this behavior directly into debvulns will provide complete visibility in a single dashboard metric.
  3. Debian Packaging: Once the above features are stable, the final step is packaging debvulns for Debian so it can be installed directly from the archive.

Until then, happy hacking.

10:35

Replace the filters [Seth's Blog]

Here’s a simple hack/reminder: If you buy something that has a filter or other part that needs replacing, create a recurring event in your calendar. Also mention where you store the extra filters, and include a link on where to buy more of them. Works for monthly dog meds, too.

And…

If you paint a room in your home, write the type of paint you used on the back of the switchplates.

I’ve also found that the back of a framed picture is a great place to write down something you don’t want to forget.

Recently, I’ve started taking pictures of everything that’s on a shelf or in a drawer that I’ve reorganized. Then I upload to Claude so that the next time I’m looking for something, I’ve got a shot at finding it.

Mostly, it’s about developing the habit of writing things down that we’re sure we’ll remember later.

08:49

Benjamin Mako Hill: Sad Story [Planet Debian]

Picture of a box in a fireplace saying:

Not a screenshot of despair. But only because it’s not a screenshot.

00:14

Joe Marshall: OpenAPI Access to jrm-code-project.com [Planet Lisp]

It's a web site! It's a service! jrm-code-project.com has an OpenAPI specification and you can use it to generate client code in your favorite programming language (which is Lisp, right?). The OpenAPI specification is available at https://jrm-code-project.com/openapi.yaml. There are the following endpoints:

  • GET /api/v1/ping - Returns a simple "pong" response to test connectivity and verify your authentication tier.
  • POST /api/v1/echo - Accepts a JSON payload and returns the same payload in the response. For testing your client.
  • POST /api/v1/auth/token - Exchange your long-lived programmatic API key for a short-lived JWT Bearer token to authenticate secure requests.
  • GET /api/v1/pastes - Retrieve a paste's content by its ID (Publicly readable, no auth required).
  • POST /api/v1/pastes - Create a new code snippet paste (Requires JWT).
  • DELETE /api/v1/pastes - Delete a specific paste you own (Requires JWT).
  • GET /api/v1/user/pastes - List all non-expired pastes associated with your authenticated account (Requires JWT).
  • POST /api/v1/chef - Programmatic access to The Chef. Submit your raw Lisp code to be mercilessly roasted. (Requires JWT and a x-goog-api-key header with your Gemini API key).

I invite you to explore the API and see what you can build with it. If you have any questions or feedback, please don't hesitate to reach out to me at eval.apply@gmail.com.

Saturday, 15 August

19:35

Sven Hoexter: FrOSCon 2026: TLS Talk [Planet Debian]

Info: German content only, sorry.

I was pondering for the past three years if I should give some sort of TLS basics talk at FrOSCon. I finally stepped up this year and gave that talk today, with the title "TLS, mTLS, SNI, ECH, CAA, HTTPS, PKI, Zertifikate und ein bisschen PQC". I was too optimistic with my 50 slides, and had to drop the Post Quantum Cryptography part at the end. Still got positive feedback from Zugschlus and others - thanks a lot for that <3 - and was asked for the slides. It's not a piece of art, but maybe it helps to release the LibreOffice odp file as well, so others can use it as a base for other events or corp internal talks. So here is the froscon-tls-2026.pdf and froscon-tls-2026.odp, both released under the CC BY-NC license.

The video is also available at media.ccc.de if you want to watch it.

Thanks to everyone who made FrOSCon happen for the 21th time!

18:07

Say Hello to My Warty Friend [Whatever]

This little dude was on the doorstep of my garage around 4am (i.e., when the dog told me she really really had to go pee). That’s not a great place for a smallish amphibian to be, considering there are predatory mammals who patrol the territory and would be happy to take a run at a toad. This particular type of toad has a mildly toxic coating that will make such an encounter an unhappy one, so it’s possible he’d survive meet-up, but that wouldn’t stop an exploratory bite.

I tried to nudge it with my phone to get it to hop away, but the toad seemed resistant to being pushed. Then I figured it out: I had left the outdoor garage light on, attracting a bunch of flying insects, and this little dude was hanging around for the snackage. So I turned off the light, thus ruining his smorgasbord, with the hope he would hop away in disappointment. This morning did not find me discovering either his eviscerated body or any frog blood, so I think I may have been successful. I wish this little dude a long and happy life, one, for his own safety, away from my house.

— JS

15:28

Thinking out loud on a Saturday morning [Scripting News]

Tech is very competitive, I learned, even when you give your work away, which I have been doing for a couple of decades. Maybe even especially when you give it away.

I want to work with other people, and am always making invitations. When I see a product that fits in with what I'm doing my first impulse is how do we connect them? This is one of the basic great things about computers and our networks. But there must be interop between people before there can be interop between products.

Connecting two pieces of tech is mostly mathematics, code writing, not very much in the way of manufacturing, whereas in the physical world two train lines can cross each other but can't connect because they have different rail spacing, or run on a different kind of fuel. In software if there's a huge difference like that you can make a software bridge, as they did with TCP/IP, and it costs a little time to convert each request twice for each transaction, but that cost is pretty close to zero.

That's what I want, working together, but what I get instead is people want to be me. They want to take over the project I'm working on, which if they understood it from my point of view is always the most ridiculous choice possible because it is impossible. So many stories to go with this. One of the most puzzling was when one of my best friends signed up to do a development project with a developer who used to work for me. Long story, but when you come down to it, he wanted to be me, not work with me.

But I didn't want to be Doug Engelbart or Ted Nelson though I learned from them. I certainly didn't want to be Bill Gates or Steve Jobs. I probably would have liked being Dennis Ritchie or Ken Thompson. I have ideas of things that should be done that for some reason no one else sees. I start working and sometimes they take off. Then everyone writes business plans and boom, they start up and shortly thereafter they fail. This happened with RSS. I was meeting with a lot of VCs, I wanted to start a company to build two-way RSS apps and content, as we had pioneered at UserLand. Seemed like a total no-brainer. I felt I had proven I had a clue. But they invested in hired programmers so the VCs could be the vision behind the products (I guess, I don't really know know why) instead of me.

I had a colleague at Berkman tell me to get out of the way because he was going to take over RSS. To this day people don't get why competing with RSS was counter-productive, assuming your goal is interop. When another friend tried to take over OPML, as I was promoting it at the time on my blog and going on a roadshow to answer questions and raise interest, I was so sick of the whole thing, he wasn't the only one, btw, I just stopped promoting it and poof like magic their ventures disappeared. If they had offered friendship and interop, which they didn't, it could have worked. One of these guys even tricked Harvard into hosting an OPML conference. They assumed everyone who repped open tech was legit.

The thing that really pissed me off is that while this was going on, people started writing about me, literally, grammatically, in the past tense. People whose accomplishments weren't that great imho. Look at sports and entertainment, how they celebrate those who made contributions to their arts, I wonder when tech will gain that level maturity. It's childish to not respect those whose work you build on. And btw, unlike sports players, while programmer's minds do eventually lose some brilliance for coding, because it relies so heavily on memory, I've experienced that myself -- our ability to create and set standards doesn't have an actual expiration date. If you want to keep creating at 40, 50, 60 even 70, you probably can.

My life has been full of all kinds of wonderful coincidences, at the exact moment I need it along comes Claude Code, and all of a sudden I can do much bigger projects than I ever could when I was in my 20s and 30s. Which I think is good, not just for me but for the whole thing. Because there are processes and concepts that belong in the toolkit of every developer that were squashed by Apple in the 90s (I'm relearning this now as I'm working on getting Frontier running on Node.js) and now we have a chance to restore it to mostly running condition. Some features will be hard to make work, because of peculiarities in JavaScript.

Maybe as one of my last creative acts, I will try to hook up with a university to build bridges between generations that aren't specific to any timeframe, to making handing off a lifetime of work viable, and maybe the AI tools can facilitate that. Just thinking out loud on a Saturday morning.

BTW, I was talking about this with Doc Searls a couple of years ago and offered a name for the seminar series, The Exit Interview. This gave me a thought, when Berkman had their reunion a couple of summers ago, they did a long video interview with me to explain how we got all the stuff running there that we did. It was going back to Berkman, even though the building is gone (which I kind of like, that's how fast things change) that summed up what had gone wrong. We were off to a fantastic start with blogging, podcasting, politics and education -- we weren't just making software and creating standards, we were involving the creative people the new medium would enable. This is something you don't find often in the tech industry. Academic freedom can be a real thing.

11:00

Russell Coker: Hacked by Chinafans [Planet Debian]

What Happened

On 2026/08/10 at 2:11 am Australian eastern standard time (2026/08/09 16:11 UTC) someone created a post titled “Hacked by Chinafans” on my documents blog [1]. The person in question created an account named “67965e42a3c3” on that site with the email address 67965e42a3c3@google.com associated with it (I tried emailing that address and it bounced).

At 04:28:41am Australian eastern standard time (18:28 UTC) I was sent an email titled “Have you been hacked” by a reader of my blogs who subscribed to the RSS feed of my documents blog (a blog that I never expected anyone to read by RSS). Along the lines of “the wisdom of crowds” should we have “the unexpected observation and problem reporting of crowds”? I appreciate the notification, I might not have noticed until the next time I watched an unusually good movie otherwise.

The account in question was apparently created on 2026-07-21 at 16:43:47 (presumably UTC) even though at the time I believe creating accounts was not permitted. As an aside the timestamp of account creation is stored in the user_registered column of the wp_users table in the database, there doesn’t appear to be a way to access this in a standard WordPress installation other than doing a SQL query.

2026-07-24 15:43:17 status triggers-pending wordpress:all 7.0+dfsg1-1
2026-07-24 15:43:19 upgrade wordpress:all 7.0+dfsg1-1 7.0.2+dfsg1-1

Above are the relevant sections of my dpkg log showing the WordPress versions in use. I was running version 7.0+dfsg1-1 at the time the account was apparently created. I am confident in the accuracy of the dpkg logs and believe that they did not compromise the OS, I am not sure whether they ran hostile SQL code to change fields in the MySQL database so had to consider the possibility that the account creation time could have been set to a deliberately misleading value. I checked backups of the MySQL database stored off-site and found that the account in question was not in the 2026-07-21 backup (which was done before 16:43) but in the 2026-07-22 backup.

The WordPress release history [2] has version 7.0.1 released on 2026-07-09 and version 7.0.2 released on 2026-07-17. So presumably the attacker diffed the code on those releases, found an exploitable bug, and used it to create an account on my blog with admin privs. Then they waited a few weeks to see if I would notice and published a blog post when I didn’t notice.

WordPress Deficiencies

  1. WordPress doesn’t seem to store the version it’s running at the time of operations. So anyone who doesn’t have a suitable external log of versions deployed (such as the dpkg.log file for a Debian managed installation) won’t know for sure which version was running. It supports automatic updates but you can’t be sure that they happened soon after the release.
  2. There is no log of IP addresses used for operations. There are apparently some 3rd party modules to log such things and web pages documenting how to modify the PHP to add it but nothing in the standard distribution.
  3. Software should have a standard distribution with some support for logging of security relevant data. The typical situation is that people don’t plan for logging such things until after they have been attacked so the data should be recorded without users going out of their way to log it.
  4. A log of security relevant data should be stored in a database table with only insert access (no update, delete, or drop).
  5. Ideally a CMS would support different database accounts for different purposes. Someone from an internal network or VPN could talk to an instance of the web server which has a database username and password giving full access. Everyone from outside the trusted range gets an instance of the web server with database access only allowing to read the posts and appearance configuration and to enter comments. If the database didn’t allow the account used for public access to create new admin users or create posts then it would be a lot harder for attackers.
  6. Ideally for everything that stores user account data there would be an easy way of getting a list of users in a plain text format to allow running diff. The design of WordPress has two tables, one for users and one for encoded metadata about users of which one will be the access level. The following SQL command will give a list of all users that aren’t subscribers (everyone above the minimum level of access which is typical for new users) along with their encoded password and access level. This could be used in a monitoring system to alert about new privileged users. The TABLE_PREFIX variable is for the prefix for WordPress tables, which is “wp_” by default but can be any legal value.
    select $TABLE_PREFIXusers.user_login, $TABLE_PREFIXusers.user_pass, $TABLE_PREFIXusermeta.meta_value from  $TABLE_PREFIXusers join $TABLE_PREFIXusermeta on $TABLE_PREFIXusers.id = $TABLE_PREFIXusermeta.user_id and meta_key='$TABLE_PREFIXcapabilities' and meta_value != 'a:1:{s:10:"subscriber";b:1;}';
    

What Next?

The blog post they created had a couple of links to Telegram which could presumably be used to contact them. If anyone involved in computer security wants a copy of the original post to do so then they can contact me by any of the usual methods.

I am interested in communication with the attacker if they wish, Telegram is not a service I use but I presume that anyone capable of doing this sort of attack is also capable of finding other ways of contacting me.

I have idly considered changing to a static site generator, here is a good list of static site generators [3].

I have also idly considered other platforms for blogging such as Lemmy. I don’t know if Lemmy is better than WordPress for security and updates, but there are plenty of free instances running where it wouldn’t be an issue I have to work on.

15 Years

It’s been 15 years since my blog server was cracked by a trojaned ssh client [4]. At least this time it was only one service that was compromised.

10:56

Short term dumb, long term smart [Seth's Blog]

Culture provides scaffolding, and learning happens over time.

The result is that we’re each capable of extraordinary feats. People can fly planes, ski down mountains, figure out how to use Photoshop or a solve a crossword puzzle.

But…

Most people only exhibit this skill when there’s months or years of exposure combined with cultural forces that educate and normalize the behavior.

When things are new, we’re often terrible at it.

People didn’t know how to use the microwave oven, the dishwasher or the buttons on the car radio when they were first introduced.

Designers need to pay very careful attention to new user frustration and feedback. But far more than that, they need the patience to invest in cultural awareness that can lead to learning that happens over time.

09:28

Russell Coker: AMD Video Drivers, LLMs, and Debian Kernels [Planet Debian]

The AMD GPU Problem

For a while I’ve been having issues with AMD GPUs, video locking up periodically. I blogged about this late last year but I first had noticeable problems early last year [1]. The problems hadn’t only concerned my workstation but also my home server which is also used as a workstation. I’ve recently upgraded my machines to Debian/Testing, my home server has been generally OK but my workstation has been crashing a lot. Every second day when on kernel 7.1.6 and then when on 7.1.7 it crashed at least once a day.

The AMD GPUs I have are “[AMD/ATI] Baffin [Radeon RX 460/560D / Pro 450/455/460/555/555X/560/560X] (rev e5)” in my main desktop workstation, “[AMD/ATI] Lexa [Radeon 540X/550X/630 / RX 640 / E9171 MCM] (rev c1)” in my build server, and “[AMD/ATI] Baffin [Radeon RX 460/560D / Pro 450/455/460/555/555X/560/560X] (rev cf)” in my home server. They aren’t new GPUs, but also aren’t really old and they all support 4K and better resolution.

Chat GPT Was Useful

When I googled the errors I was seeing I found nothing useful. On the suggestion of a friend I tried asking ChatGPT. Generally I don’t recommend asking LLMs about such things, but it can be a last resort as long as you know what you are doing. ChatGPT asked me to run a number of commands to get information for it to make more informed decisions. I know that the output of lspci and similar commands isn’t a risk, but a novice could be tricked into running commands that expose sensitive data.

ChatGPT did give me some useful information, not a solution but an indication that the problem was due to driver bugs.

Upgrading to Experimental

Debian/Experimental is for packages that are expected to have problems and generally aren’t recommended even for the people who usually use Debian/Unstable. It’s commonly used for packages that are needed to develop other packages, EG new libraries that aren’t fully usable but which are needed to package newer versions of applications.

I upgraded my workstation to the Debian/Experimental kernel 7.2~rc7-1~exp1 after having tried every other convenient option. Generally I wouldn’t recommend that anyone run an Experimental kernel without a really good reason, but crashing more than once a day is a fairly good reason. That kernel has now given me over 4 days of uptime on a system that previously wouldn’t last a day. I installed it on my dual-socket build server that has an old AMD GPU in it for test purposes and that also hasn’t crashed since. I installed it on my ML test machine which has an Intel B580 Battlemage GPU with 16G of VRAM and was repeatedly getting a kernel panic related to the GPU a few seconds after boot and now it also works correctly.

It seems that the 7.1.x kernels have bugs in the AMD video drivers and in some part of the code that affects Intel video drivers and that the bugs in question are fixed in the tree that will become 7.2. I would not recommend anyone who has a 7.1.x kernel working fine for them try 7.2 RC kernels at this time, but anyone who has GPU related problems (particularly Intel and AMD GPUs) should definitely test it out.

I also don’t recommend upgrading any system with an AMD GPU to Debian/Testing or Debian/Unstable at this time unless you are also prepared to install an Experimental kernel if it becomes necessary.

There are a several kernel log dumps related to this after the break (which won’t be in RSS feeds). This is mainly for Google so that other people who have such issues can get more useful results out of Google searches than I got.

Future Support Options

Separate from the issue of whether commercial LLMs like ChatGPT can be useful for solving technical problems there is the issue of whether they are desirable. I think that we really don’t want people solving problems in FOSS systems with closed-source LLMs. This leads to loss of privacy, loss of the control users deserve to have over their own systems, and an implied promotion of non-fee software.

I think that the ideal would be to have a cross distribution effort to generate training data for a support LLM system which can then be further trained by each distribution for a greater emphasis on distribution specific issues.

Errors on AMD GPUs

2026-08-09T23:03:06.004792+10:00 xev kernel: amdgpu 0000:02:00.0: GPU fault detected: 147 0x00024802
2026-08-09T23:03:06.004792+10:00 xev kernel: amdgpu 0000:02:00.0: Process kscreenlocker_g pid 42037 thread kscreenloc:cs0 pid 42044
2026-08-09T23:03:06.004793+10:00 xev kernel: amdgpu 0000:02:00.0: VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x00000800
2026-08-09T23:03:06.004794+10:00 xev kernel: amdgpu 0000:02:00.0: VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x0F048002
2026-08-09T23:03:06.004795+10:00 xev kernel: amdgpu 0000:02:00.0: VM fault (0x02, vmid 7, pasid 130) at page 2048, write from 'TC0' (0x54433000) (72)
2026-08-09T23:03:06.008762+10:00 xev kernel: amdgpu 0000:02:00.0: GPU fault detected: 147 0x00004802
2026-08-09T23:03:06.008768+10:00 xev kernel: amdgpu 0000:02:00.0: Process kscreenlocker_g pid 42037 thread kscreenloc:cs0 pid 42044
2026-08-04T01:13:37.505839+10:00 xev kernel: ------------[ cut here ]------------ 
2026-08-04T01:13:37.505859+10:00 xev kernel: amdgpu 0000:02:00.0: [drm] drm_WARN_ON_ONCE(cur_vblank != vblank->last) 
2026-08-04T01:13:37.505862+10:00 xev kernel: WARNING: CPU: 6 PID: 210534 at drivers/gpu/drm/drm_vblank.c:362 drm_update_vblank_count+0x2f1/0x3c0 [drm] 
2026-08-04T01:13:37.505866+10:00 xev kernel: snd_intel_dspcfg wmi_bmof rc_core snd_intel_sdw_acpi drm_ttm_helper uas realtek snd_usbmidi_lib snd_hda_codec ttm mdio_devres snd_hda_core snd_seq_midi drm_kms_helper usb_storage mc snd_hwdep libphy snd_seq_midi_event intel_uncore snd_pcm_oss i2c_algo_bit serio_raw snd_rawmidi pcspkr snd_mixer_oss i2c_i801 video snd_seq snd_pcm i2c_smbus lpc_ich snd_seq_device mei_me e1000e snd_timer mei snd tpm_infineon soundcore joydev bnx2 wmi button nfsd auth_rpcgss nfs_acl lockd grace sunrpc coretemp br_netfilter bridge stp llc sg ghash_clmulni_intel loop msr i2c_dev drm efi_pstore configfs nfnetlink ip_tables x_tables autofs4 btrfs blake2b_generic dm_crypt dm_mod raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx libcrc32c xor raid6_pq raid1 raid0 md_mod ext4 crc16 mbcache jbd2 crc32c_generic virtio_blk evdev hid_generic usbhid hid sd_mod xhci_pci xhci_hcd ahci ehci_pci ehci_hcd libahci crc32c_intel libata usbcore aesni_intel nvme psmouse scsi_mod gf128mul crypto_simd nvme_core cryptd 
2026-08-04T01:13:37.505879+10:00 xev kernel: nvme_auth scsi_common usb_common efivarfs 
2026-08-04T01:13:37.505880+10:00 xev kernel: CPU: 6 UID: 1008 PID: 210534 Comm: sshd-session Tainted: G D 6.12.88+deb13-amd64 #1 Debian 6.12.88-1 
2026-08-04T01:13:37.505881+10:00 xev kernel: Tainted: [D]=DIE 
2026-08-04T01:13:37.505883+10:00 xev kernel: Hardware name: Hewlett-Packard HP Z640 Workstation/212A, BIOS M60 v02.61 03/23/2023 
2026-08-04T01:13:37.505884+10:00 xev kernel: RIP: 0010:drm_update_vblank_count+0x2f1/0x3c0 [drm] 
2026-08-04T01:13:37.505885+10:00 xev kernel: Code: 48 8b 5f 50 48 85 db 75 03 48 8b 1f e8 68 eb 2b cf 48 c7 c1 70 3e cb c0 48 89 da 48 c7 c7 f9 6f cb c0 48 89 c6 e8 af d7 a6 ce <0f> 0b e9 4b fe ff ff 48 8b 4c 24 18 e9 31 fe ff ff 31 f6 48 85 db 
2026-08-04T01:13:37.505887+10:00 xev kernel: RSP: 0000:ffffd3cc8681fca0 EFLAGS: 00010082 
2026-08-04T01:13:37.505888+10:00 xev kernel: RAX: 0000000000000000 RBX: ffff8c6b42b13710 RCX: 0000000000000027 
2026-08-04T01:13:37.505889+10:00 xev kernel: RDX: ffff8c89ef521788 RSI: 0000000000000001 RDI: ffff8c89ef521780 
2026-08-04T01:13:37.505890+10:00 xev kernel: RBP: 0000000000000000 R08: 0000000000000000 R09: ffffd3cc8681fb20 
2026-08-04T01:13:37.505891+10:00 xev kernel: R10: ffff8c8a6fef3628 R11: 0000000000000003 R12: 0000000000000000 
2026-08-04T01:13:37.505892+10:00 xev kernel: R13: ffff8c6c07853828 R14: 0000000000000003 R15: 0000000000000000 
2026-08-04T01:13:37.505893+10:00 xev kernel: FS: 00007ffaf2fd5880(0000) GS:ffff8c89ef500000(0000) knlGS:0000000000000000 
2026-08-04T01:13:37.505895+10:00 xev kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 
2026-08-04T01:13:37.505896+10:00 xev kernel: CR2: 00007fb1718c8000 CR3: 000000074521a004 CR4: 00000000003706f0 
2026-08-04T01:13:37.505897+10:00 xev kernel: Call Trace: 
2026-08-04T01:13:37.505898+10:00 xev kernel:  
2026-08-04T01:13:37.505899+10:00 xev kernel: drm_crtc_accurate_vblank_count+0x41/0xc0 [drm] 
2026-08-04T01:13:37.505900+10:00 xev kernel: dm_pflip_high_irq+0x155/0x330 [amdgpu] 
2026-08-04T01:13:37.505901+10:00 xev kernel: amdgpu_dm_irq_handler+0x85/0x1f0 [amdgpu] 
2026-08-04T01:13:37.505902+10:00 xev kernel: amdgpu_irq_dispatch+0xd2/0x230 [amdgpu] 
2026-08-04T01:13:37.505903+10:00 xev kernel: amdgpu_ih_process+0x84/0x100 [amdgpu] 
2026-08-04T01:13:37.505904+10:00 xev kernel: amdgpu_irq_handler+0x23/0x60 [amdgpu] 
2026-08-04T01:13:37.505905+10:00 xev kernel: __handle_irq_event_percpu+0x4a/0x190
2026-08-04T01:13:37.505907+10:00 xev kernel: handle_irq_event+0x38/0x80 
2026-08-04T01:13:37.505908+10:00 xev kernel: handle_edge_irq+0x8b/0x230 
2026-08-04T01:13:37.505909+10:00 xev kernel: __common_interrupt+0x45/0xe0 
2026-08-04T01:13:37.505910+10:00 xev kernel: common_interrupt+0x42/0xa0 
2026-08-04T01:13:37.505911+10:00 xev kernel: asm_common_interrupt+0x26/0x40 
2026-08-04T01:13:37.505912+10:00 xev kernel: RIP: 0033:0x7ffaf3c5fd7b 
2026-08-04T01:13:37.505913+10:00 xev kernel: Code: 70 c7 00 66 0f 6e f8 c1 ef 02 66 0f 70 f7 e0 83 c7 01 66 0f ef ff 66 0f fa f2 0f 1f 44 00 00 f3 0f 7e 01 66 0f 6f ce 83 c6 01 <48> 83 e9 08 f2 0f 70 c0 1b 66 0f 6f e0 66 0f 6f e8 66 41 0f f9 c0 
2026-08-04T01:13:37.505915+10:00 xev kernel: RSP: 002b:00007fff86a5e0e0 EFLAGS: 00000202 
2026-08-04T01:13:37.505916+10:00 xev kernel: RAX: 0000000000008000 RBX: 0000562614a04050 RCX: 0000562614982ed8 
2026-08-04T01:13:37.505946+10:00 xev kernel: RDX: 0000000000007fe2 RSI: 0000000000000fad RDI: 0000000000002000 
2026-08-04T01:13:37.505948+10:00 xev kernel: RBP: 0000000000000000 R08: 000056261498ac40 R09: 0000000000008000 
2026-08-04T01:13:37.505949+10:00 xev kernel: R10: 0000000000000066 R11: 0000000000007fe1 R12: 0000000000007efa
2026-08-04T01:13:37.505950+10:00 xev kernel: R13: 0000000000008000 R14: 0000000000008000 R15: 000000000000ffe0 
2026-08-04T01:13:37.505951+10:00 xev kernel:  
2026-08-04T01:13:37.505953+10:00 xev kernel: ---[ end trace 0000000000000000 ]--- 
2026-08-04T01:55:40.844110+10:00 xev kernel: pcieport 0000:00:03.3: AER: Multiple Correctable error message received from 0000:00:03.3 
2026-08-04T01:55:40.844130+10:00 xev kernel: pcieport 0000:00:03.3: PCIe Bus Error: severity=Correctable, type=Data Link Layer, (Receiver ID) 
2026-08-04T01:55:40.844132+10:00 xev kernel: pcieport 0000:00:03.3: device [8086:6f0b] error status/mask=00000040/00002000 
2026-08-04T01:55:40.844134+10:00 xev kernel: pcieport 0000:00:03.3: [ 6] BadTLP
2026-08-11T09:33:33.473855+10:00 xev kernel: amdgpu 0000:02:00.0: GPU fault detected: 147 0x00024802
2026-08-11T09:33:33.473871+10:00 xev kernel: amdgpu 0000:02:00.0: Process kscreenlocker_g pid 150905 thread kscreenloc:cs0 pid 150912
2026-08-11T09:33:33.473871+10:00 xev kernel: amdgpu 0000:02:00.0: VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x00000800
2026-08-11T09:33:33.473873+10:00 xev kernel: amdgpu 0000:02:00.0: VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x0F048002
2026-08-11T09:33:33.473873+10:00 xev kernel: amdgpu 0000:02:00.0: VM fault (0x02, vmid 7, pasid 63) at page 2048, write from 'TC0' (0x54433000) (72)
2026-08-11T09:33:33.473874+10:00 xev kernel: amdgpu 0000:02:00.0: GPU fault detected: 147 0x00004802
2026-08-11T09:33:33.473874+10:00 xev kernel: amdgpu 0000:02:00.0: Process kscreenlocker_g pid 150905 thread kscreenloc:cs0 pid 150912
2026-08-11T09:33:33.473875+10:00 xev kernel: amdgpu 0000:02:00.0: VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x00000800
2026-08-11T09:33:33.473876+10:00 xev kernel: amdgpu 0000:02:00.0: VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x0E048002
2026-08-11T09:33:33.473876+10:00 xev kernel: amdgpu 0000:02:00.0: VM fault (0x02, vmid 7, pasid 63) at page 2048, read from 'TC0' (0x54433000) (72)
2026-08-11T09:33:35.481863+10:00 xev kernel: amdgpu 0000:02:00.0: Dumping IP State
2026-08-11T09:33:35.481875+10:00 xev kernel: amdgpu 0000:02:00.0: Dumping IP State Completed
2026-08-11T09:33:35.481875+10:00 xev kernel: amdgpu 0000:02:00.0: [drm] AMDGPU device coredump file has been created
2026-08-11T09:33:35.481876+10:00 xev kernel: amdgpu 0000:02:00.0: [drm] Check your /sys/class/drm/card0/device/devcoredump/data
2026-08-11T09:33:35.481877+10:00 xev kernel: amdgpu 0000:02:00.0: GPU fault detected: 146 0x0110040c
2026-08-11T09:33:35.481877+10:00 xev kernel: amdgpu 0000:02:00.0: Process kscreenlocker_g pid 150905 thread kscreenloc:cs0 pid 150912
2026-08-11T09:33:35.481878+10:00 xev kernel: amdgpu 0000:02:00.0: VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x00000022
2026-08-11T09:33:35.481879+10:00 xev kernel: amdgpu 0000:02:00.0: VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x0E00400C
2026-08-11T09:33:35.481879+10:00 xev kernel: amdgpu 0000:02:00.0: VM fault (0x0c, vmid 7, pasid 63) at page 34, read from 'TC3' (0x54433300) (4)
2026-08-11T09:33:35.489845+10:00 xev kernel: amdgpu 0000:02:00.0: ring gfx timeout, signaled seq=5123619, emitted seq=5123621
2026-08-11T09:33:35.489853+10:00 xev kernel: amdgpu 0000:02:00.0: Process kscreenlocker_g pid 150905 thread kscreenloc:cs0 pid 150912
2026-08-11T09:33:35.489854+10:00 xev kernel: amdgpu 0000:02:00.0: GPU reset begin!. Source: 1
2026-08-11T09:33:35.493839+10:00 xev kernel: amdgpu 0000:02:00.0: [drm] ERROR Failed to initialize parser -125!
2026-08-11T09:33:35.737848+10:00 xev kernel: amdgpu: cp is busy, skip halt cp
2026-08-11T09:33:35.897842+10:00 xev kernel: amdgpu: rlc is busy, skip halt rlc
2026-08-11T09:33:35.897852+10:00 xev kernel: amdgpu 0000:02:00.0: BACO reset
2026-08-11T09:33:36.485849+10:00 xev kernel: amdgpu 0000:02:00.0: GPU reset succeeded, trying to resume
2026-08-11T09:33:36.485859+10:00 xev kernel: amdgpu 0000:02:00.0: [drm] PCIE GART of 256M enabled (table at 0x000000F402000000).
2026-08-11T09:33:36.485860+10:00 xev kernel: amdgpu 0000:02:00.0: VRAM is lost due to GPU reset!

Errors on Battlemage

Aug 11 17:01:47 ami kernel: ------------[ cut here ]------------
Aug 11 17:01:47 ami kernel: xe 0000:23:00.0: [drm] DMC 1 mmio[0]/0x5f074 incorrect (expected 0x96fc0, current 0x0)
Aug 11 17:01:47 ami kernel: WARNING: drivers/gpu/drm/i915/display/intel_dmc.c:696 at assert_dmc_loaded+0x275/0x430 [xe], CPU#0: kworker/0:3/215
Aug 11 17:01:47 ami kernel: Modules linked in: intel_rapl_msr intel_rapl_common intel_uncore_frequency intel_uncore_frequency_common xe(+) skx_edac snd_h>
Aug 11 17:01:47 ami kernel:  msr i2c_dev configfs efi_pstore efivarfs autofs4 btrfs libblake2b raid6_pq xor mpt3sas raid_class scsi_transport_sas megarai>
Aug 11 17:01:47 ami kernel: CPU: 0 UID: 0 PID: 215 Comm: kworker/0:3 Not tainted 7.1.7+deb14-amd64 #1 PREEMPT(lazy)  Debian 7.1.7-1 
Aug 11 17:01:47 ami kernel: Hardware name: HP HP Z4 G4 Workstation/81C5, BIOS P61 v03.00 04/15/2026
Aug 11 17:01:47 ami kernel: Workqueue: sync_wq local_pci_probe_callback
Aug 11 17:01:47 ami kernel: RIP: 0010:assert_dmc_loaded+0x291/0x430 [xe]
Aug 11 17:01:47 ami kernel: Code: 24 10 e8 f2 e5 a3 ce 48 8d 3d bb 85 0d 00 8b 54 24 0c 45 89 e9 45 89 e0 48 89 c6 52 8b 4c 24 2c 51 8b 4c 24 30 48 8b 54>
Aug 11 17:01:47 ami kernel: RSP: 0018:ffffd27ac0b87b80 EFLAGS: 00010282
Aug 11 17:01:47 ami kernel: RAX: ffffffffc1743dfd RBX: ffff8c5b80e54000 RCX: 0000000000000001
Aug 11 17:01:47 ami kernel: RDX: ffff8c5b81df5a10 RSI: ffffffffc1743dfd RDI: ffffffffc1605860
Aug 11 17:01:47 ami kernel: RBP: ffff8c5b86955000 R08: 0000000000000000 R09: 000000000005f074
Aug 11 17:01:47 ami kernel: R10: 0000000000000000 R11: 0000000000091050 R12: 0000000000000000
Aug 11 17:01:47 ami kernel: R13: 000000000005f074 R14: 0000000000000001 R15: 0000000000000000
Aug 11 17:01:47 ami kernel: FS:  0000000000000000(0000) GS:ffff8c673e172000(0000) knlGS:0000000000000000
Aug 11 17:01:47 ami kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
Aug 11 17:01:47 ami kernel: CR2: 00007ffed1fdcd00 CR3: 0000000ae942a003 CR4: 00000000003706f0
Aug 11 17:01:47 ami kernel: Call Trace:
Aug 11 17:01:47 ami kernel:  
Aug 11 17:01:47 ami kernel:  intel_dmc_enable_pipe+0xe4/0x290 [xe]
Aug 11 17:01:47 ami kernel:  ? drm_crtc_vblank_reset+0x4d/0x120 [drm]
Aug 11 17:01:47 ami kernel:  intel_modeset_setup_hw_state+0xb50/0x1e10 [xe]
Aug 11 17:01:47 ami kernel:  ? intel_display_driver_probe_nogem+0x138/0x1a0 [xe]
Aug 11 17:01:47 ami kernel:  intel_display_driver_probe_nogem+0x138/0x1a0 [xe]
Aug 11 17:01:47 ami kernel:  xe_display_init_early+0xb2/0x140 [xe]
Aug 11 17:01:47 ami kernel:  xe_device_probe+0x3c8/0xb50 [xe]
Aug 11 17:01:47 ami kernel:  ? xe_pm_init_early+0x152/0x160 [xe]
Aug 11 17:01:47 ami kernel:  xe_pci_probe+0xc26/0x1150 [xe]
Aug 11 17:01:47 ami kernel:  local_pci_probe+0x3e/0x90
Aug 11 17:01:47 ami kernel:  local_pci_probe_callback+0x16/0x20
Aug 11 17:01:47 ami kernel:  process_one_work+0x19d/0x3a0
Aug 11 17:01:47 ami kernel:  worker_thread+0x1af/0x320
Aug 11 17:01:47 ami kernel:  ? __pfx_worker_thread+0x10/0x10
Aug 11 17:01:47 ami kernel:  kthread+0xe3/0x120
Aug 11 17:01:47 ami kernel:  ? __pfx_kthread+0x10/0x10
Aug 11 17:01:47 ami kernel:  ret_from_fork+0x2b2/0x340
Aug 11 17:01:47 ami kernel:  ? __pfx_kthread+0x10/0x10
Aug 11 17:01:47 ami kernel:  ret_from_fork_asm+0x1a/0x30
Aug 11 17:01:47 ami kernel:  
Aug 11 17:01:47 ami kernel: ---[ end trace 0000000000000000 ]---

03:14

Scott L. Burson: Teaser: CL-Torch! [Planet Lisp]

I have been working for the past few months on CL-Torch, a Common Lisp equivalent of PyTorch.  Like PyTorch, CL-Torch calls LibTorch — the C++ library that does most of the numerics — via FFI.

It's nowhere near done, but I need to set it aside for a few months to work on something else, so I thought I would publish what I have and let people play with it.

Claw

Claw (Common Lisp Auto-Wrap; no relation to OpenClaw, which it preceded by years) is Pavel Korolev's FFI wrapper generator; it includes IFFI, his Intricate Foreign Function Interface, which deals with C++ overloading.  This is what I have used to create CL-Torch.

I had initially looked at SWIG, which had had Common Lisp support until its 4.0 release, but on closer examination it didn't look like a good choice; the Common Lisp generation apparently never worked well.  I then tried C2FFI, and in retrospect, maybe I could have gotten it to work, but it doesn't have any explicit C++ support; I would have wound up with C++ "mangled names" (encoded function names including namespace and parameter type information) in the CL-Torch sources.  Poking around a little more, I found these three blog posts by Pavel introducing Claw.  I also noticed that Pavel already had a Claw-Torch project; although he hadn't gotten very far on it and it was years out of date, it was still the best starting point I had found.

But I didn't realize what I was getting into.  Pavel describes Claw as "BETA quality", emphasizing that it isn't ready for general use, but actually I think even this description is too generous; in the state I found it in, I would describe it as alpha, and early alpha at that.  I spent several weeks fixing and improving it so that it could handle LibTorch, which in fairness, is pretty much a torture test for an FFI generator — it uses features of C++ I didn't even know existed.  One of the most problematic was constructor inheritance.  Did you know constructors could be inherited?  I didn't either, but the feature went in in C++11.  Anyway, LibClang, which Claw uses to analyse the C++ code it's wrapping, doesn't expose inherited constructors in a convenient way; the information is there, but you have to dig it out.  So I had to learn a bunch about the internals of Claw, including libresect, the C library that interfaces directly with LibClang.  This knowledge eventually came in quite handy, though, as I made more fixes and changes to Claw, ultimately dropping 14 PRs on Pavel.  — So far, he hasn't merged any of them, and I don't know whether he's going to, so for CL-Torch, if you want to regenerate the FFI bindings, you'll need to use my forks of Claw and its subprojects cl-resect and libresect.

One significant improvement I made to Claw was to add exception handling.  Exceptions thrown by LibTorch code are caught and automatically translated to Lisp errors.

At the time Pavel wrote Claw, passing structs by value required libffi, which, he noted in a blog post, is quite slow.  So Claw passes all structs by pointer.  I see that efficient passing of structs by value has been recently added to SBCL, but I don't think it's worth modifying Claw to use it, as that would change how the generated wrappers have to be called, and thus wouldn't be portable.

What might be worth doing, eventually, is making IFFI allocate temporary objects on the stack; it currently doesn't.  But for CL-Torch, the benefit is almost certainly going to be undetectable; LibTorch calls, in normal use, spend the vast majority of their time doing tensor arithmetic; allocating and freeing small objects is negligible by comparison.

Anyway, my overall impression of Claw is that, with my improvements, it works pretty well.  If you have another C++ library you'd like to call from CL, I think you should give it a try.  It needs quite a bit more documentation, but if you look at what I've done for CL-Torch, that will give you some clues.  Beyond that, you'll have to do what I did: read the source 😸 

Status

For the purpose of a project like CL-Torch, LibTorch has two major pieces.  One is the tensor arithmetic library ATen (with its lower-level component C10).  This library has over a thousand operations, although many of these are variants of one another; for instance, many operations have both functional and in-place versions, the latter updating one of its argument tensors rather than allocating a new one.  The C++ and Python APIs for these functions are auto-generated from a description file, aten/src/ATen/native/native_functions.yaml.

I have written a generator that produces CL versions of these APIs from the YAML descriptions.  It's not finished — there are cases it doesn't yet handle — but it's currently succeeding on 645 of the 1089 candidate functions, so there is a significant amount of working functionality here.  (In some cases, not all features of the function are supported yet.)  If you just want to do a bunch of tensor arithmetic, there may be enough here to do what you want.  It's not heavily tested, but there are enough tests to reasonably assure me that the code generation is being done correctly, at least in most cases.

The second major piece of LibTorch is the high-level neural net API.  Here CL-Torch is less far along, but this is also a much easier part to work on.  (I think.  I haven't tested any of the code I've written for this part.)  So if you want to add CL-Torch code for some of this part of the API, I think you should be able to do that.  (You could even try using an LLM for this — I haven't, yet.)  One thing you should know, if you want to work on that, is that there are two levels within this part of LibTorch: the torch::nn::functional:: code is the slightly lower level, that implements the operations of neural-net layers but without keeping state, and in particular, without maintaining trainable parameters.  I have started hand-translating these (they're mostly quite simple) in Code/torch-functional.lisp.

The higher level is the module API, which I have just barely started in Code/torch-modules.lisp.  This API implements parameters and training.  To actually train a network, you'll also need an optimizer; I haven't started on these. 

Friday, 14 August

23:42

Urgent: Negotiating lower prices on prescription medicines [Richard Stallman's Political Notes]

US citizens, call on the Center for Medicare and Medicaid Services to expand the practice of negotiating lower prices on prescription medicines. We need to counteract massive lobbying by Big Pharma.

Deadline for commenting, Aug 17!

Urgent: Save funding for Medicaid [Richard Stallman's Political Notes]

US citizens: call on your senators to save funding for Medicaid.

US citizens: Join with this campaign to address this issue.

To phone your congresscritter about this, the main switchboard is +1-202-224-3121.

Please spread the word.

E-scooters dangerous to ride [Richard Stallman's Political Notes]

E-scooters turn out to be especially dangerous to ride — much more dangerous than bicycles.

Magats' efforts to seize power [Richard Stallman's Political Notes]

Comparing the magats' efforts to seize power, and embed themselves irreversibly in it, with the efforts of Nazis in 1933.

Wildfire betting amid warnings of arson risk [Richard Stallman's Political Notes]

*US senators urge crackdown on wildfire betting amid warnings of arson risk.*

Betting on other government actions is dangerous too, because it can offer magats the temptation to burn down good government.

Comparisons of wildfire crisis to second world war [Richard Stallman's Political Notes]

*While many leaders compare the wildfire crisis to the second world war, governments fail to adopt the real lessons of pre-emptive wartime action.*

Extreme weather and extreme climate are *attacks on our soil. They are a call to mobilize.* But governments today are barely beginning to mobilize for full action to slow and stop the slowly developing climate disaster.

I conjecture that the reason they don't do this is the presence of a highly influential group of traitors: the fossil fuel industry.

*Human-driven climate crisis fuels Canada’s deadly wildfires, study finds.*

Israel accused of knowingly attacking journalists [Richard Stallman's Political Notes]

*Human Rights Watch and Amnesty* accuse Israel of knowingly attacking journalists in Lebanon — a war crime.

Pakistan prohibits reporting internationally [Richard Stallman's Political Notes]

Pakistan has prohibited anyone from reporting internationally on what happens there. It has also blocked access to Al Jazeera's web site from Pakistan.

Model for turning richly funded campaign against rich backers [Richard Stallman's Political Notes]

*[Progressive Democrat] Abdul El-Sayed offers a model for successfully turning a non-progressive opponent's richly funded campaign against that opponent's rich backers, and thus against the opponent.

Butterfly species shifting habitats [Richard Stallman's Political Notes]

Many butterfly species are shifting their habitats — some as fast as 135km per year. Some species' habitats have expanded, and others have shrunk.

All of this measures the rapidity of potentially dangerous ecosystem changes caused by global heating.

Droughts in Europe [Richard Stallman's Political Notes]

*[In Europe,] droughts that were once a century now happen every year, and the impact on wildlife, industrial output and culture itself is catastrophic.*

Underlying the random fluctuation from year to year, the trend (as long as global heating continues) is to get worse.

The bully's new tariffs [Richard Stallman's Political Notes]

Joseph Stiglitz: the bully's new tariffs, supposedly meant to pressure for an end to forced labor, hypocritically omit two countries that do enormous amounts of that: China and the US.

We launched a war on nature [Richard Stallman's Political Notes]

Rebecca Solnit: *We launched a war on nature. Now we are in a climate war zone.

George Monbiot: *Murderous heat, an endangered food supply and no [efforts to slow the disaster]: this is the life the radical right wants you to have.

El Niño could push 50m people into acute hunger [Richard Stallman's Political Notes]

*El Niño could push 50m people into acute hunger before end of next year.*

If so, it will mean that the disasters that climate scientists have forecast for many years are arriving.

23:28

Children Of The Corn [Penny Arcade]

Ronia got back from Brand New Day with a lot of questions about Jean Grey, and it seemed like I might have to make a Powerpoint deck or something to paper over the fact that I failed as a father - as a man. There's a lot of comic shit I haven't told her, I guess. There's a lot of it out there! I chose the path of curation; we did not come to rest on any of this quotidian mutant fare When those assholes at Marvel finally get around to Ryan North' and Erica Henderson's run on The Unbeatable Squirrel Girl, Ronia will know Goddamn near everything. The only comfort I have otherwise is that Gabriel failed in this task also. Worse probably! Way worse I bet, when you really think about it altogether.

23:21

felicia day and i want to play more games together [WIL WHEATON dot NET]

About twenty years ago, when I was in the Saturday show at the ACME Comedy Theatre, a friend of mine who I wrote with for the show encouraged me to check out one of her students who was in the Sunday show.

I remembered when she and I were in the Sunday show, how exciting and validating it felt when the upperclassmen in the Saturday show came to watch us. I knew that some of the Sunday show performers would be moving into the Saturday show soon, and I wanted to see who I would possibly be writing with or for in the coming months.

So I went to the show, and this woman who my friend told me about was absolutely hilarious. In a show that had a solid lineup of great sketches, she stood out to me. So I made a note that this was someone I wanted to do comedy with, and I started making little notes in my book when ideas arrived.

We never did a Saturday show together, as circumstances outside of our control did their thing, but … oh, I don’t know, maybe around six months later, or so? Less than a year, at least. It isn’t important. At some point after that, my friend, Kim, emailed me about a show she had done with that woman we both loved. It was a little thing they did for five bucks, without asking for permission, entirely on their own. It was about gamers who played something like WoW, meeting up in person for the first time, and they are all the most outrageous characters you’ve ever seen. She thought that I’d love it. She asked me to take a look at it, and maybe post about it on my blog, if that felt right. I looked at it, thought it was so funny and so original, and couldn’t write a post about it fast enough.

For the one of you in the world who hasn’t yet gotten there: The show was The Guild, and the brilliant woman in the Sunday show was Felicia Day.

About a year later, I’d met Felicia a few times, and though we weren’t yet friends, I admired and respected her immensely. I loved how she was doing what she wanted to do, on her terms, entirely supported by the audience she was building one person at a time. Think back to 20 years ago, it’s 2006, and everything is growing online. Indie creators doing indie projects were starting to rewrite popular media and popular culture for a generation. I was a tiny part of that as an Ur-blogger, and Felicia was an enormous part of that as the creator of The Guild (and future founder of Geek and Sundry). It was such an exciting time! We all felt like power was shifting away from gatekeepers, entertainment was getting more diverse, and creative nerds were ascendant. God, I miss that.

After one season, I had become a legit fan of The Guild. I loved the story, I thought the actors were hilarious (I could listen to Jeff Lewis be aggrieved for a thousand hours), and I was just so fucking excited to see someone I didn’t really know, but who I was very aware of, doing truly great, transformative work. It was inspiring as hell to me, and I loved having a front row seat to all of it.

Around this time, Felicia reached out and asked if she could take me to coffee and pitch me a role in season 3. I could have saved us the drive and the cost of some VERY bougie coffee and just said “I’m in and don’t need to hear anything else,” but I like coffee and I wanted to sit down with her, get to know her a little better.

We went to this place in Silverlake that I can never recall the name of, but is still there, where we paid something outrageous for two cups of coffee. I think it was like eight dollars, which, believe it or not, was a lot to pay for coffee at one time. To this day, we howl with laughter when we recall the phrase on the menu: “We invite you to enjoy the purest expression of the bean.” I can’t remember what I had for breakfast yesterday, and I’m usually pretty fuzzy on what day of the week it is, I can’t recall what the “purest expression of the bean” was on that fateful morning, but I will never forget the invitation to discover it. I’m giggling right now.

Felicia started her pitch. “So I want to introduce a rival guild, and I thought you would be great to play the leader,”

“Okay, tell me when to show up.”

“…I’m not done.”

“Oh. Go on.”

“He’s a douchebag in a kilt.”

“…”

“That’s it.”

“Okay, tell me when to show up.”

The rest, as many of you know, is award-winning, online-media changing, paradigm-shifting history that I am intensely grateful and proud to be part of.

Sooner than either of us expected (well, sooner than I expected. Felicia and I have never talked about her expectations, so I’m going off of how I recall the vibe at the time), Felicia was one of a few creators who were invited by Google to pitch a channel lineup for a YouTube thing that was meant to be a sort of patronage, an effort to introduce a new generation of creators and their content to the world. I think it was a tentative effort to put YouTube up against traditional television and cable. Interestingly, I recall that they gave money to some established studios and networks (money they didn’t need) and those studios and networks didn’t do a single frame of original content. They used YouTube as a dumping ground for their libraries, attracted no audience, and were all gone in a matter of months. As grateful as I am to Google for its early patronage of not just Felicia, but other creators I love, I wonder if that money could have been more wisely invested? Maybe an indie creator who just missed the cut in favor of some legacy company would have done something cool with it.

If my memory is correct, Felicia’s channel, Geek & Sundry, was one of the only channels that Google reinvested in at the conclusion of the original funding effort. None of the legacy companies returned. I remember how great it felt to survive that. It made me feel like we were doing something right, and these old legacy companies just fundamentally didn’t get it. It felt like I was part of a new space that I’d helped create, an expansive, growing space for people like us to make the things we wanted to see, to highlight and celebrate our creative friends and the artists we loved, to reach out to an audience that we were part of, that was bored to death the the legacy stuff. It didn’t last long, but it was magical while it did. And there is some of that magic in the air again, but I’m getting ahead of myself.

So you probably know that Felicia created Geek & Sundry, and if you know that, you know that we created Tabletop, together, and that we did four incredible seasons of the show, plus an RPG spinoff called Titan’s Grave, before a legacy company bought us, fucked everything up, set all the money on fire and destroyed what we built, and confirmed for all of us involved that it’s better to remain independent, no matter how great their pitch is, because legacy companies are full of people who do one thing very well, and it isn’t managing online communities, nurturing indie creators, and patiently allowing an enthusiastic audience to organically grow over time.

The sale and subsequent destruction of what we worked so hard to build (extending beyond the programming) was deeply demoralizing for me. Not owning the rights to what we created has allowed Legendary to take everything we made, stuff it in a box, and put it in the corner of a basement somewhere. When I tried to license it, or buy it back, they refused to sell. Weirdly, it was very important to someone there that I know the company considers Tabletop a dead property that they will never do anything with. So even though I could potentially do something cool with the thing I created, and pay them for the privilege of taking all of the risk, they have no intention of ever doing anything at all with it, they’re going to sit on it and never do anything with it. It is a dead parrot. They never gave a reason that makes sense, so I’m going to presume it’s either spite, or standard executive fear that something someone killed could come back and be a huge success without them.

But before all of that, for the entire time Felicia and I were making things together, it was the best thing, ever. The joyful memories, the difference we made in the world, the boardgame renaissance we helped instigate, and the hundreds of thousands of new gamers we helped create all come back into my mind all the time. I’m so proud of us, so grateful that we did it, and that we did it well. I genuinely loved doing Tabletop, and I genuinely love working with Felicia.

And because the world is on fire right now like it hasn’t ever been in my lifetime, I feel called to do what I do best: entertain you, and give you something to enjoy with people you love, while we all do what we can do get through it. When Felicia told me about Kickstarting the movie and possibly adding our original show as a stretch goal, I swear to all the gods I felt that magic in the air all over again. I could smell it, I could taste it. I could see it, shimmering at the edges of my vision. It was, like, right there, just begging me to jump back in and take a swim.

So I did, and that’s why Felicia and I are getting the band back together for a limited series that will feature us playing games, together. Let me tell you all about it!

Felicia is Kickstarting a reunion movie called The Guild: Ren Faire’d, which is exactly what it sounds like. It’s been massively successful, and is maybe on its way to becoming the top earning crowdfunded movie in history. It’s incredibly exciting for all of us who know and love Felicia, and it’s especially exiting for me, because we are in stretch goal territory, which means not only do we all get The Guild movie I want to see, we are also now building up funds to produce a show where Felicia and I pick a theme, share things we love around the theme with each other, like books, music, movies, recipes, podcasts, etc., and then play a game with some friends that kind of fits the theme. We are calling the show Conludo (that’s Latin for “play together” because Felicia has a degree and I am notoriously bad at naming things)

A big part of the show’s focus is how much joy there is in curating things for each other around a theme, in discovering our new favorite things, and sharing them, on our way to a game. For example, I love a game called Rock Hard: 1977. It’s a heavily-themed resource management game where you are a hopeful rockstar in the 70s, trying to make your way through the clubs, to the radio, and, ultimately, the big stadium show. So this episode’s theme would be music or something about music. To set the mood, I’d probably bring a book I love, like Meet Me In The Bathroom, or Under The Big Black Sun. I may bring in a record, like the new Sincere Engineer release, Probable Claws, (that I’m on!) or Who Let The Dogs Out, from Lambrini Girls. Maybe I’d pitch going to a punk show together, or watching Decline of Western Civilization together, something like that. And part of what’s fun about this is that I don’t think Felicia likes punk the way I do, if at all, so I’d almost certainly be exposing her to something new, and I have no idea how she will respond. We’re still refining it, but you get the idea, right?

Here we are, talking with Felicia’s friend, Paula, about the show, then playing Codenames together, on Things Get Dicey:

It’s important to me that I set expectations. I have told you what this is, now I need you to know what this is not. This isn’t Tabletop Redux, or Son of Tabletop, Abbot And Costello Play on Tabletop, Tabletop Strikes Back, or Tabletop 2: 2Table 2Top. This is its own thing, and it will be (legally distinctly) different from what we did with Tabletop. The North Star of that series was “Create More Gamers” by showcasing some of the greatest games of the moment, as well as some timeless classics, around a table of interesting people having fun together. I’m refining the language, but the North Star for Conludo is “Celebrate Sharing and Playing Games With Friends.” It’s more of a hang out, than it is a how to. It’s a celebration of gaming culture, going as far back as we want to go. We aren’t limited to new games, and I have at least one game that I love, that is out of print, that wouldn’t qualify for Tabletop, that I will bring to Conludo, because this is a fundamentally different show, and that means I can.

I’m so excited to do this. I’m so excited to revisit a space that I haven’t spent much time in for almost a decade, after living there for most of my life. I’m super excited to do it with one of my best friends and favorite creative partners.

The Kickstarter ends on August 21, with a massive livestream that I think is planned for around six hours, on Felicia’s Twitch thingy. As I am writing this, backers have pledged 4.7 million dollars (2.3 million in Itchy and Scratchy dollars) with a little over 32,000 individual backers toward the movie and Conludo. Felicia would love to get past 5.7, which would put her in first place of all time, past Veronica Mars. That’s a big ask, but I’d love to help her dream come true. Will you join me?


I’m Wil. I write this blog, I host It’s Storytime With Wil Wheaton, and I co-host the official companion podcast, with Felicia, for Stuart Fails to Save The Universe. Thanks for reading. If you would like to get my blog updates in your inbox, here’s the sign up thingy:

22:42

Friday Squid Blogging: Searching for the Colossal Squid [Schneier on Security]

Fascinating video about searching for life undersea. The video basically makes the point that our bright white searchlights are scaring everything away, and that red light is more neutral. That, plus bait to attract sea creatures, is teaching us a lot about what’s going on down there. Lots of footage of giant squid, and speculation about the colossal squid. Worth watching.

As usual, you can also use this squid post to talk about the security stories in the news that I haven’t covered.

Blog moderation policy.

21:00

The worst PDA of all time [OSnews]

Today, you can get low-quality knockoffs of just about any popular smartphone on sites like AliExpress or Temu, whether they be iPhones, Galaxy phones, or whatever else. They have terrible build quality, bottom-of-the-barrel components and specifications, and all run outdated versions of Android – badly. At the same time, various consumer electronics brands, once popular in a bygone era, sell the rights to their brand name to unknown companies, who then put these brands on generic hardware to give their products a sheen of legitimacy. That’s why today, you can still buy Nokia smartphones, Polaroid cameras, and low-effort Hi-Fi equipment from various once-respected brands.

None of this is new, however. In the late ’90s and early 2000s, companies were already doing the same thing. In fact, there’s one device from this era which combines both business practices – it’s both a cheap knockoff of a wildly successful device, and it carries a once-revered brand name. Also, just to add some juice, this story involves stolen source code.

Let’s take a look at the worst PDA of all time, the Olivetti daVinci.


The OSNews 2026 Fundraiser
8,634 / 15,000


➡️ Donate through Ko-Fi ➡️ Donate through SEPA transfer* ➡️ Buy merch from our store ➡️ Why a fundraiser?

€5000 incentive: Make me use Windows 11 for a month (the results were not great)
> €10000: Video tour of my office and my computers/devices collection <
€15000: Buy a Mac and use macOS for a month (and review it)
€20000: I get an OSNews tattoo

*Name: Thom Holwerda – IBAN: SE08 8000 0820 1684 4657 8414 – BIC: SWEDSESS


In 1997, Palm launched the Palm Pilot, and it and its successors proved to be a massive hit. Where countless before it had failed, Palm found the magic formula to make pocket computing work. I wrote an in-depth article about Palm over 13 years ago which goes into much (much) more detail, but the reason the Palm Pilot succeeded where things like the Newton, PenPoint OS, and Windows for Pen Computing failed, is that Palm’s founder, Jeff Hawkins, realised that they were competing with paper, not with desktop computers. Instead of trying to shove the capabilities of a full personal computer into a (barely) pockatable device, a pocket computer had to be as fast and convenient as paper, and therefore extremely strict about which features to add, and which to omit.

To this day, the entirety of smartphone computing stands on the shoulders of Palm. Palm’s ideas, implementations, approaches, paradigms, and even people were absorbed by Apple and Google, where they shaped both iOS and Android. The phone you’re looking at right now has a ton of Palm DNA in it, still. After all, you’re still using the homescreen-with-apps paradigm Palm already perfected in the late ’90s and early 2000s.

The success of the Palm Pilot and its successors did not go unnoticed. Microsoft, most prominently, felt incredibly threatened by Palm’s success:

The success of Palm’s products got the attention of Microsoft, and the company pretty much announced it was going to crush Palm. According to Hawkins, Microsoft had a sales conference, where, at some point, a big target appeared on the projector screen, with the Palm logo dead in the centre of it: “we are going to crush and kill these guys”, was the central message. Hawkins recalls that he got condolence letters after that, stating things like “Sorry Jeff. Too bad.”

↫ Thom Holwerda

While Microsoft proved to be unable to “kill and crush” Palm, it did manage to build a relatively successful business selling PDAs running various incarnations of Windows CE. Together, Palm and Microsoft dominated the PDA market pretty much throughout its entire existence, and while the market was a mere fraction of the smartphone market of today, other companies still wanted a piece of this pie too. One of these companies was Olivetti, a storied Italian company with a long history making typewriters, computers, and other electronics.

I’m not going into detail about Olivetti’s history, but the company was renowned for its attention to design, creating iconic products like the Lexikon 80, Lettera 22, Elea 9003, Programma 101, and so, so many more. Olivetti also entered the personal computer market, first with a variety of custom machines featuring Z80 and later Motorola 68000 processors running a variety of custom operating systems developed by Olivetti (including its own UNIX variant, X/OS). After a few machines using MIPS and Alpha processors in the early ’90s, the company would eventually focus entirely on Intel-based PCs (including this amazing failure) running Windows. Like so many other computer makers from that era, Olivetti eventually left the PC business by selling it off in 1997.

To this day, Olivetti PCs tend to cost more on the used market than those from other brands, despite no technical merits dictating so.

At around this time, our current story begins. Seeing the success of the Palm Pilot and the emergence of copycat devices running Microsoft’s Windows CE, Olivetti wanted in on the action. And so, in the late ’90s, the company introduced the Olivetti daVinci, a line of PDAs whose software looked suspiciously like Palm OS. There’s not a ton of information out there about the development history, but it seems that while Olivetti designed the hardware, it contracted the development of the operating system out to a company from Hong Kong, Echolink Design.

And this is where things went horribly wrong for Olivetti. The software Echolink Design developed for the daVinci didn’t just look like Palm OS, it was Palm OS – at least, according to Palm. After being on the market for about a year, the Palm Pilot maker, then a subsidiary of 3Com, filed for an injunction, alleging that the daVinci operating system designed by Echolink Design contained actual Palm OS source code. In addition, Palm also filed suit against CompanionLink Software, the company that developed the Outlook synchronisation software for the daVinci. Palm won handily, and within a day of the filing, temporary restraining orders were put in place on both Olivetti and CompanionLink, stopping sales of the daVinci and its software dead in its tracks.

It seemed to have been a pretty clear-cut case. From The Wall Street Journal at the time:

U.S. District Judge James Ware ruled Olivetti’s Royal daVinci organizer contains software that appears to have been copied from the operating system for 3Com’s Palm organizers. Judge Ware said a review by a software expert found the daVinci software contains private Palm code and even grammatical mistakes that appear to have been “copied verbatim.”

↫ Wall Street Journal Staff Reporter

It’s difficult to ascertain what code, exactly, was stolen, but my personal educated guess is that it probably involved Palm’s unique Graffiti handwriting recognition system. Graffiti actually predates the first Palm Pilot, and was available on a variety of non-Palm devices; it doesn’t seem entirely unlikely to me that the code for it escaped containment that way, eventually finding its way to Echolink Design. I’m just guessing here, though, as I can’t seem to find any of the original court documents concerning the case.

In a bind, Olivetti claimed the copied code represented less than 2% of the operating system’s code, and set about to release a new version of the software for the daVinci.


And so we end up at the device I have in my collection. Several years ago, I bought a boxed version of the Olivetti daVinci DV3, including all of its original accessories for a pittance on eBay, and I’ve been fascinated and repulsed by this device ever since. It looks like a cheap Palm knockoff, and it feels like one too; the hardware is made out a really unpleasant form of plastic, with buttons worse than what you find on the cheapest possible pack-in remote control. The case feels creaky and unrefined, like the cheapest possible children’s toy.

The display has a resolution of 128×99, much lower than the 160×160 of even the first Palm Pilot, and it’s incredibly dim and hard to read without the backlight on; even with the backlight on, it’s difficult to read anything. Worse yet, the various hardware tap targets on top of and at the bottom of the display are not backlit at all, making them unreadable in all but the most illuminated environments. Considering you need these buttons a lot, it’s a major stumbling block. Turning on the backlight is confusing, too, as it you need to hold down the on/off button (while the display is on) to engage it, something only mentioned in the manual.

The display is, of course, a resistive touchscreen, as was the norm at the time, but its precision seems much lower than anything Palm ever offered. The accompanying stylus, too, is plasticky and cheap, definitely worse than the plastic styluses Palm shipped with its earlier models, and obviously no match for the metal styluses that would accompany later models.

Finding out exactly what type of processor the daVinci DV3 uses is remarkably hard. A contemporary review by Smart Computing claims it’s using an unspecified Epson processor, without giving any further details. There’s only one source that specifically states what processor it has, and considering that source is the only person to have written a third-party application for the DV3, I’m inclined to believe they’re right (opening the device up is of no use, as the SoC is of the epoxy blob type). According to them, the DV3 runs on a Sharp SM6010 microprocessor, for which a datasheet and more detailed documentation exists. The SM6010 is a very basic 16bit single-chip microcomputer of an unspecified architecture (probably something custom and proprietary), running at 30Mhz.

The SM6010 is a 16-bit single-chip microcomputer incorporating a 16-bit CPU core, LCD controller, watchdog timer, serial interface (UART, SCI), SIR, PWM output, real time clock, A/D converter and bus controller.

↫ Sharp SM6010 datasheet

The DV3 stores its operating system in flash memory – making it upgradable – and has 2MB of RAM, stated proudly all over the box and on a sticker on the device itself. Performance is actually not that bad, but it’s not quite as instant and responsive as Palm OS. The operating system and its user interface are rather inscrutable; there doesn’t seem to be a single home screen you can always go back to like on Palm OS, and closing/leaving applications/screens is done differently for each individual application/screen (tap the hardware “OK” button? An on-screen “OK” button? Press the cancel button? Tap one of the hardware application shortcuts atop the display? Who knows!).

The core tools of the DV3 are incredibly basic, and cover merely the bare necessities of a PDA in the late ’90s, with things like an address book, notes application, calendar, calculator, and a few others. There’s no consistency among any of these tools, and they all look, feel, and work just differently enough to be confusing. The daVinci is also Very Serious™, as there’s no games or even a simple drawing gimmick; in fact, while there is a button labeled “Apps.”, it doesn’t actually do anything (we’ll get back to that). There’s barely any preferences to fiddle with either.

Input is done via a terrible Graffiti ripoff called daVinci Script, which uses strokes much more cumbersome than its inspirator, not aided by the absolutely trash recognition algorithms. This input method is effectively unusable, as it’s impossible to predict which strokes will produce what character or action. Even something as simple as the right-to-left stroke to delete a character is entirely unreliable, ensuring this is more of a random character generator than a text input system. Luckily, there’s a tiny on-screen keyboard you can use to hunt and peck with the stylus, but this isn’t exactly a particularly fast input method either.

It’s hard to convey just how utterly terrible the software experience is, especially in 2026 when many people reading this lack the frame of reference of its time. This isn’t utter trash compared to what we’re used to today – this is utter trash compared to the competing devices running Palm OS and Windows Pocket PC of its time. Even in 2026, I love using Palm OS and Pocket PC, but I absolutely despise, dread, and hate using the daVinci. I’m struggling to find a comparison with something contemporary, but the best I can come up with is like comparing an Apple Watch or WearOS device with one of those cheap knock-off smartwatches that run some shitty custom low-res UI on an underpowered SoC, but honestly, even that does a disservice to these knock-off smartwatches.

The daVinci I have came with all of its original accessories. There’s a vinyl pouch, a dock, and an external, fold-up keyboard. The pouch has not withstood the test of time, and has shrunk, so much so the daVinci no longer fits inside of it. The dock is, well, a dock, and uses the connector at the bottom of the daVinci. This connector looks and feels exactly like a crunchy ISA slot from the ’80s, as if the PCB was cut off with a hacksaw. The keyboard is the most interesting, and can be connected straight to the device’s bottom connector, or to a passthrough port at the back of the dock. Unsurprisingly, this keyboard is really bad, with dome-shaped mushy rubber keys with very little stability and a featherlight base that moves at the slightest of touches, making it almost impossible to type on.

Thanks, I hate it.

I mentioned the mysterious, non-functional “Apps.” button earlier, and there’s actually a bit of history here. It turns out that Olivetti fully intended for people to write third-party applications for this thing, promising to release an SDK at some point in time. Of course, this never ended up happening as the daVinci is trash and nobody in their right mind bought one or would want to develop for it, but it does mean that somewhere out there, perhaps in an attic somewhere in Ivrea, Italy, there’s a dusty hard drive or CD-ROM carrying this unreleased official SDK.

SDK or no, there’s always someone crazy, skilled, and determined enough to develop something for any computer, and for the daVinci DV3, that person was Alex Zwiesele. Zwiesele figured out that while the official SDK was never released, the CD-ROM that came with the daVinci DV3 contained the entire operating system of the DV3 and a loader program. This was enough for Zwiesele and a few other people to start disassembling the operating system and inject their own custom code into the binary file, reassemble it, and load it onto the DV3 using the loader program.

This was not a walk in the park. Zwiesele documented the entire process on their website, and it involved Zwiesele and several others writing their own disassembler and assembler (still available from their website!) based on the available Sharp SM6010 documentation, as well as learning how to actually program for the device’s hardware. In the end, they managed to develop an actual game for the daVinci DV3, a Breakout clone. You load the game onto your DV3 in the same way you’d load the operating system; as such, the game will replace the entire operating system and load automatically on power-on. That’s as far as they got back in 2003, as efforts seem to have stalled after that.

Back when I bought my daVinci, about 6-7 years ago, I mentioned online that I had bought the worst PDA of all time, without mentioning it by name. Immediately, fellow hardcore PDA enthusiasts (we exist) knew I was talking about the daVinci. This thing is just plain trash, e-waste before the term had been popularised, a waste of everyone’s time, effort, and money. Not even its one redeeming quality – its low price of just $99 compared to the cheapest Palm device at $249 – could make anyone want to use it.

Still, I’m glad I have it in my collection, if only to serve as a reminder that shitty e-waste devices aren’t something exclusive to our current smartphone era. It also serves to underline just how great Palm OS and Windows Pocket PC (yes, I will fight you on this) really were, and how many things they each got right out of the gate. So much so that especially Palm OS laid the foundations for every smartphone we use today.

Now that I’ve finally written and published this article, I can put this abomination back in its box, and never take it out again.

20:14

Reproducible Builds (diffoscope): diffoscope 328 released [Planet Debian]

The diffoscope maintainers are pleased to announce the release of diffoscope version 328. This version includes the following changes:

[ Chris Lamb ]
* Don't require python3-guestfs in the autopkgtests on 32-bit architectures.
  (Closes: #1144372)

[ Jochen Sprickerhof ]
* Use the XML comparators for SVG vector image files. (Closes: #1144242)

You find out more by visiting the project homepage.

Making a game on a custom bytecode VM in 7 days and 3kB [OSnews]

In the last few days, I built a shoot ’em up game by embedding a tiny custom bytecode VM and rendering the graphics using a fullscreen pixel shader. The result is a 3kB Windows executable.

This was done for Langjam Gamejam, a 7-day challenge where you create a programming language and then use it to build a game.

The project combines several interests of mine: language tooling, game development, procedural graphics, and demoscene-style size constraints. The game jam format forced me to keep the scope small and explore new ideas. Also, it was fun!

↫ Laurent Le Brun

In seven days, Le Brun created a brand new programming language, compiler, bytecode interpreter, a game written in the new language, and rendered it, ending up with a 3kB self-contained executable. It’s amazing what humans can do.

Why tiny JPEGs look different in Chrome [OSnews]

A while back, when chatting with a colleague over their computer, I noticed that a logo did not look exactly the same as it did on mine. It looked thinner on theirs and more faithful to the original image. It was rendered at 15px; here is an upscaled version.

[…]

If you squint, or take a step back, the one from Chrome looks thicker. A bit weird, but swapping the image for an SVG fixed it. Still, I was curious: why was it rendering like this in the first place?

I did some digging and found a nifty optimization that Chrome uses when rendering JPEGs at small scales.

↫ Guillaume Técher

I love it when people detail their discoveries like this.

19:42

Link [Scripting News]

I was looking for a good screen shot of Radio UserLand. Just found this one on Facebook, and hope to preserve it via the search feature here.

18:42

Forcing an ARM64X executable to run as a specific architecture [The Old New Thing]

ARM64X is a fat binary Windows executable and DLL format for 64-bit ARM systems. For DLLs, the choice is clear, since only one of them will work: The version of the DLL that is loaded is the one that matches the host process. If the host process uses the Windows ARM64 ABI, then the ARM64 version of the DLL is used, and if the host process is x86-64-based or uses the Windows ARM64EC ABI¹

For executables, the system has a choice. It could run the process as ARM64 or it could run it as ARM64EC. How can you force the system to choose the architecture you prefer?

You may want to do this if you have a program that is compiled as ARM64X because you have a plug-in model, and you want to be able to support plug-ins that are written either as ARM64 or x86-64. You compile an ARM64 version for ARM64 plug-ins, and you compile an ARM64EC version for x86-64 plug-ins. At run time, you realize that the user passed a plug-in for the other architecture, so you want to relaunch yourself as the matching architecture.

You can do it with the PROC_THREAD_ATTRIBUTE_MACHINE_TYPE attribute.

Here’s a program that takes a DLL on the command line. It tries to load it as the native architecture, but if that fails, and the native architecture is ARM64, then it relaunches itself as x86-64 to try again.

#include <windows.h>
#include <stdio.h>
#include <wil/result_macros.h>
#include <wil/resource.h>
#include <wil/stl.h>
#include <wil/win32_helpers.h>

int wmain(int argc, wchar_t** argv)
{
    if (argc < 2) {
        printf("Oops\n");
        return 0;
    }

    wil::unique_hmodule dll{ LoadLibraryExW(path, nullptr, 0) };
    if (dll) {
        return RunPlugin(dll);
    }

    if (GetLastError() != ERROR_BAD_EXE_FORMAT) {
        printf("Can't load DLL, sorry\n");
        return 0;
    }

    SYSTEM_INFO info{};
    GetSystemInfo(&info);
    if (info.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_ARM64) {
        printf("Can't load DLL, sorry\n");
        return 0;
    }

    printf("Trying again as x86-64\n");

    WORD arch = IMAGE_FILE_MACHINE_AMD64;          
    auto single = make_proc_thread_attribute_list({
        {PROC_THREAD_ATTRIBUTE_MACHINE_TYPE, &arch}
    });                                            

    wchar_t self[MAX_PATH + 1];
    std::wstring self;
    THROW_IF_FAILED(wil::GetModuleFileNameW(nullptr, self));

    wil::unique_process_information pi;

    STARTUPINFOEXW info{ sizeof(STARTUPINFOEXW) };
    info.lpAttributeList = single.get();

    if (!CreateProcessW(self.data(), GetCommandLineW(), nullptr, nullptr,
            false, EXTENDED_STARTUPINFO_PRESENT, nullptr, nullptr,
            &info.StartupInfo, &pi)) {
        printf("Can't relaunch as x86-64, sorry\n");
        return 0;
    }

    WaitForSingleObject(pi.hProcess, INFINITE);
    // destructors will close the handles
}

If we can load the DLL, then great! We run it as usual.

If we can’t load the DLL because it’s in the wrong format, then we will retry as x86-64 if the current process is running as ARM64. To do that, we create an attribute list with the PROC_THREAD_ATTRIBUTE_MACHINE_TYPE attribute whose value is the architecture we want to try, namely AMD64 (which is the Windows name for x86-64), and relaunch ourselves with the same command line.²

If the DLL fails to load even as x86-64, then the x86-64 version of our program just gives up without trying again as ARM64. (You don’t want to have the x86-64 version try again as ARM64 because that would create an infinite loop.)

¹ You can think of ARM64EC as “pre-jitted x86-64 on ARM64.” It is like taking an x86-64 binary and compiling it to ARM64 code that is equivalent to (but presumably has better performance than) the version the emulator would have created on the fly from your x86-64 version. Instead of shipping an x86-64 version that the emulator has to translate to ARM64, just ship the translated version.

² In real life, you probably would add some safety precautions to prevent accidental fork bombs. While writing up this article, I fork bombed my machine a few times by mistake.

The post Forcing an ARM64X executable to run as a specific architecture appeared first on The Old New Thing.

17:28

Upcoming Speaking Engagements [Schneier on Security]

This is a current list of where and when I am scheduled to speak:

  • I’m speaking, signing books, and participating in panel discussions at LAcon V in Anaheim, California, USA. My full schedule is here.
  • I’m speaking online (via Zoom) at a League of Women Voters event on Tuesday, September 22, 2026, at 5 PM ET.
  • I’m speaking at Elevate Festival in Toronto, Canada. The conference runs September 22–24, 2026; my talk is on Wednesday, September 23.
  • I’m speaking at CanSecWest 2026 in Vancouver, Canada. The conference runs September 30–October 1, 2026; the time of my talk is TBD.
  • I’m speaking at ATTENTION: Democracy, Rebuilt in Montreal, Canada. The event runs October 21–23, 2026, and my talk is on Wednesday, October 21.

The list is maintained on this page.

16:42

Link [Scripting News]

I'm still a NYT subscriber, although I don't read it very often, but when there's news I will go there. Anyway, they used to have a 10-article per month gift link rule. I used to ration them, but if by the end of the month I hadn't used them up I'd share links more liberally. A few weeks ago they lifted the limit. I thought that's nice, the NYT found that the web was still useful to spread the news, literally. I thought maybe they had a vision beyond the usual dotcom slop. Not so fast. Your friends can't read the articles unless they become a registered user. I bet they always had that, but this time I read the smaller print. Why can't some company do something just for goodwill and free advertising, without such an obvious business model? Having people think you care counts in the business world. As Marge Gunderson from Fargo would say, "Don't you know that?"

16:14

Your Handy Guide to Sin and Guilt Offerings [Nina Paley]

Ever wonder what ruminant/bird you need to sacrifice for your sins and impurities? Well wonder no more. This handy table makes it easy to atone! 

I asked SuperGrok (an AI chatbot) to make me a table of all the sins/impurities in the Old Testament requiring a sacrificial offering. Here’s what it produced. You’re welcome.

Sin/Guilt (or related impurity requiring compensatory offering) Standard Offering Discounted Offering (if available)
Unintentional sin by the anointed (high) priest (brings guilt on the people; Lev 4:3–12) Young bull without defect (sin offering) None specified
Unintentional sin by the whole Israelite community/congregation (Lev 4:13–21) Young bull (sin offering) None specified
Unintentional sin by a leader/ruler (Lev 4:22–26) Male goat without defect (sin offering) None specified
Unintentional sin by a common person (doing what is forbidden in the Lord’s commands; Lev 4:27–35) Female goat without defect, or female lamb without defect (sin offering) (See graduated options under specific cases in Lev 5; not universally restated)
Failing to testify / withhold evidence when one has heard a public charge (Lev 5:1) Female lamb or goat from the flock (sin offering), after confession Two doves or two young pigeons (one sin offering + one burnt); or, if still unable, 1/10 ephah finest flour (no oil/incense) as sin offering
Unwittingly touching ceremonially unclean things (e.g., carcass of unclean animal or creature) and later realizing guilt (Lev 5:2) Female lamb or goat (sin offering), after confession Two doves/pigeons (one sin + one burnt); or 1/10 ephah finest flour (sin offering)
Touching human uncleanness of any kind that makes one unclean, even if initially unaware, then realizing guilt (Lev 5:3) Female lamb or goat (sin offering), after confession Two doves/pigeons (one sin + one burnt); or 1/10 ephah finest flour (sin offering)
Thoughtlessly / rashly taking an oath (to do good or evil) and later realizing guilt (Lev 5:4) Female lamb or goat (sin offering), after confession Two doves/pigeons (one sin + one burnt); or 1/10 ephah finest flour (sin offering)
Unfaithfulness by unintentional sin regarding the Lord’s holy things (Lev 5:14–16) Ram without defect from the flock (guilt offering, of proper value) + full restitution + additional 1/5 to the priest None specified
Sin by doing what is forbidden in any of the Lord’s commands, even without knowing it at the time, then realizing guilt (Lev 5:17–19) Ram without defect (or its equivalent/value) as guilt offering None specified
Sins against a neighbor (deceiving about something entrusted/stolen, cheating, finding lost property and lying about it, swearing falsely about such matters; Lev 6:1–7) Full restitution + additional 1/5 to the owner + ram without defect (of proper value) as guilt offering None specified
General unfaithfulness / wrong against another (with no surviving kinsman to receive restitution; Num 5:5–8) Confession + full restitution + 1/5 (to the priest if no kin) + guilt offering None specified
Sexual relations with a betrothed slave woman (Lev 19:20–22) Ram as guilt offering (after investigation; she is not put to death) None specified
Unintentional sin by the whole community (failing to observe commandments; Num 15:22–26) One young bull as burnt offering (with grain and drink offerings) + one male goat as sin/purification offering None specified
Unintentional sin by an individual (Num 15:27–29) Yearling female goat as sin/purification offering None specified
After childbirth (purification from flow of blood; Lev 12:6–8) Year-old lamb (burnt offering) + young pigeon or dove (sin offering) Two doves or two young pigeons (one burnt + one sin)
Cleansing from a defiling skin disease (after initial rites and waiting period; Lev 14) Two male lambs + one ewe lamb + finest flour mixed with oil + oil (includes guilt offering of one lamb with blood/oil application to ear/thumb/toe, plus sin and burnt offerings) One male lamb (guilt offering) + 1/10 ephah finest flour mixed with oil + log of oil + two doves or two young pigeons (one sin + one burnt), “such as they can afford”
Male or female with certain abnormal bodily discharges (after waiting/washing period; Lev 15:13–15, 28–30) Two doves or two young pigeons (one sin offering + one burnt offering) None further reduced (birds are the prescribed standard)
Nazirite defiled by contact with a dead body (Num 6:9–12) Two turtledoves or two young pigeons (one sin + one burnt) on the 8th day; then a male lamb as guilt offering (and restart the vow period) None specified
Completion of a Nazirite vow (Num 6:13–20) Male lamb (burnt), ewe lamb (sin), ram (peace), plus grain/drink offerings and other items None specified

Share

The post Your Handy Guide to Sin and Guilt Offerings appeared first on Nina Paley.

16:07

[$] BPF, continuous testing, and stable kernels [LWN.net]

Ihor Solodrai and Shung-Hsi Yu wrapped up the BPF track at the 2026 Linux Storage, Filesystem, Memory-Management, and BPF Summit with a pair of sessions related to testing. Solodrai spoke about what has changed for BPF's continuous-integration (CI) testing. Yu spoke about what may be needed to test BPF updates in stable kernels more thoroughly. The BPF subsystem's CI tests are in a good place, they said; even so, Solodrai and Yu have a handful of possible avenues toward enabling better test coverage in the future.

16:00

Link [Scripting News]

What if one day, out of the blue, Claude could only speak Chinese.

The Intent Debt [Radar]

The following article originally appeared on Addy Osmani’s blog site and is being republished here with the author’s permission.

Technical debt lives in your code. Cognitive debt lives in your head. Intent debt lives in the artifacts you may never have written: the goals, constraints, and rationale for why the system is the way it is. If you’re lucky, some of this exists scattered in team documents or discussions, but it’s likely incomplete. It’s the one kind of debt your agents can’t pay down for you, and agentic engineering makes it the most expensive.

____________________________

Three places debt can live

Margaret-Anne Storey’s Triple Debt Model is a clean way to think about software health. The three models of debt are technical, cognitive, and intent.

Technical debt lives in the code. It’s the accumulation of implementation choices that make the system harder to change later: the tangled module, the shortcut you took under deadline, the abstraction that leaked. We’ve understood this one for decades. You feel it coming through slow builds, fragile tests, and the dread of touching one particular file.

Cognitive debt lives in people. It’s the erosion of shared understanding, the gap between how much code exists and how much any human understands. I’ve been calling this comprehension debt. It builds up when the system grows faster than the team’s mental model of it. Your code can be pristine and you can still carry crippling cognitive debt, because nobody understands the pristine code either.

Intent debt lives in artifacts. It’s the absence or erosion of the externalized rationale, goals, and constraints that explain why the system is the way it is. The key word is externalized. The rationale has to be written down where a teammate, a future you, or an agent can read it, not held in your head. When intent debt runs high, the system drifts from what you meant it to do, and nobody can say when it diverged or why.

These three are independent, which took me a while to internalize.

You can have low technical debt and high intent debt. You can understand a system completely yourself (no cognitive debt for you) while its intent exists nowhere outside your skull (enormous intent debt for everyone else).

From the inside they feel alike, but each one bills you separately.

Why intent debt is the one agents can’t help with

AI generates code faster than ever, which makes technical debt cheaper to take on and cheaper to pay down. Point an agent at a tangled module and it’ll refactor it.

Cognitive debt recovers too, more easily than most engineers expect. When you don’t understand a chunk of the system, you ask the agent to explain it. You rebuild part of the lost mental model on demand, because the code still exists and the model can read it back to you.

Intent is different. An agent can’t generate intent, because intent is the one input that has to come from you. A model can infer a plausible rationale from the code, the same way you can guess why a previous engineer did something. A guess about intent isn’t the intent. The model doesn’t know whether that 300ms debounce was a deliberate UX decision, a benchmark result, or a number someone typed once and never revisited. It will invent a confident-sounding reason, which is worse than admitting it doesn’t know.

Of the three debts, intent debt is the only one where the agent can’t bail you out. It can write the code and restore your comprehension. The why is the one thing it can only fabricate.

Agents make the unwritten cost compound much faster

Teams got away with high intent debt for years because we carried it in our head and old docs.

When a new human joined a team, you didn’t write everything down, because they picked up intent over time: hallway conversations, code review comments, “Oh, we don’t do it that way because of an incident in 2023.” Knowledge moved person to person and built up. The engineer who’d been there four years was the intent documentation, expensive and lossy, but it worked.

Agents break that model. Bringing agents onto a team doubles its size overnight with junior people who have no long-term memory. An agent starts most sessions cold. It carries none of the tacit intent humans built up over years. Whatever you haven’t externalized into an artifact it can read, it doesn’t have.

That changes the economics of not writing things down. Unexternalized intent used to cost you once in a while, at onboarding or after someone left. Now you pay it every session, multiplied by every agent you run.

Picture the 20 agents you’re so excited to parallelize. Each one is a teammate who has never met you, can’t read your mind, and will fill any gap in your intent with a plausible guess. The orchestration tax I wrote about is partly an intent-debt tax. Much of what makes managing many agents exhausting is resupplying the intent you never wrote down.

The other half of the comprehension debt argument

When I wrote about comprehension debt, I made a point I want to revisit, because intent debt sharpens it.

I argued that detailed specs aren’t a complete answer. Translating a spec into working code involves a huge number of implicit decisions no spec ever captures, and a spec detailed enough to be the program is the program in a slower language. I still believe that.

Intent debt is the complementary truth.

Being unable to capture all intent is no license to capture none of it. The implicit decisions an agent now makes on your behalf, the ones a spec will never enumerate, are the decisions whose rationale evaporates if you don’t record at least the load-bearing ones. You can’t write down everything.

You do have to write down the why behind the choices that would be expensive to get wrong, because nobody will reconstruct those later.

Comprehension debt warns you not to trust that code is correct because it exists.

Intent debt warns you not to trust that the reason survives because the code does. Code is the answer; the intent was the question it was meant to solve. AI is brilliant at producing answers to questions you forgot to write down.

What high intent debt looks like

Intent debt rarely shows up as friction. It shows up as a particular kind of helplessness.

  • An agent “fixes” a bug by deleting a guard clause, and nobody can say whether that guard was load-bearing or leftover, because no doc or commit message ever recorded why it was there.
  • A refactor changes a behavior users depend on. The review passed because the diff looked clean and the tests were green, but the tests only encoded the previous behavior, never the intent.
  • You ask why two services talk over a queue instead of a direct call, and the honest answer is “An agent suggested it and it seemed fine.” That answer is intent debt, already accruing interest.

If you’ve felt the cognitive surrender version of this, defending a design choice you can’t reconstruct, intent debt is the team-scale, written-down version of the same hole.

Surrender is about your own posture in the moment. Intent debt is what a hundred of those moments leave in the repo for the next person and the next agent to inherit.

Paying it down: externalize intent as a first-class artifact

Almost everything I’ve been writing about for the last few months turns out to be intent-debt management. I didn’t have the word for it. The move is the same each time: Take the intent out of your head and put it somewhere an agent can read.

Write the spec for the intent, not the implementation. A good spec captures the goals, the constraints, the nonnegotiables, and an explicit definition of done (fast, accessible, secure, delightful, beyond “functionally correct”). The spec carries the intent the code can’t carry on its own.

Treat AGENTS.md as your intent ledger, not your config. It’s why I keep saying stop using /init. An auto-generated file describes what the code is. An intent file describes what the team means: the conventions, the “we don’t do it this way because,” the constraints invisible in any single file. Agents can’t infer that, and they need it most.

Capture decisions where they happen. Lightweight decision logs (ADRs) are pure intent-debt paydown. Recording why at the moment you decide costs almost nothing. Reconstructing it eight months later, after the person who knew why has moved teams, costs a fortune. Agents have made logging cheaper than ever, so the old excuse is gone.

Make the learning loop write intent back down. I’ve argued for self-improving agents that update a learnings file at the end of a session. The same loop is an intent-debt pump running in reverse: every mistake whose root cause you’ve recorded, every “We tried X and it didn’t work because Y” is intent that would otherwise have lived only in your memory of a bad afternoon.

None of these are new tools. They’re the discipline of refusing to let the why exist only in your head, in an era where your head is no longer where most of the work happens.

Where the value moved

For a long time, the scarce, valuable thing in software was the ability to produce a correct implementation. Code was expensive, so we optimized for writing it.

AI made code cheap, and comprehension is recoverable. Intent, the goals and constraints and reasons, is the one input that still has to originate with a human. It’s also the one we’re worst at externalizing, because for decades we got away with carrying it in our heads.

That worked when the team was a handful of people who could absorb intent over years of shared context. It does not work when half the team is agents that start every session as strangers.

Technical debt makes your system hard to change. Cognitive debt makes it hard to understand. Intent debt makes it hard to know whether the system still does what you wanted, and it’s the only one of the three your agents can’t pay back for you. That part stays with you. Write down the why, because it’s becoming the most valuable thing you can leave in the repo.

15:21

Python packaging council candidates announced [LWN.net]

The Python Software Foundation (PSF) has announced the candidates running for the Python packaging council that was approved by the Python steering council in April.

This inaugural election fills all five seats on the PPC. The two candidates receiving the highest number of votes shall be designated Cohort A with a two year term, and the three candidates receiving the next highest number of votes shall be designated Cohort B with a one year term.

In future elections, each cohort will be elected for a full two-year term in alternating years, so that roughly half of the PPC turns over each cycle.

There are 17 candidates running for the five open seats. PSF voting-eligible members must affirm their intention to vote in this election by August 25. Voting begins on September 1, and ends on September 15.

15:14

Days belong to me, nights to Claude [Scripting News]

I've been doing this for all of this year, and the frustration finally led me to this rule, which I just asked Claude to play back for me. I offer it to you, a human, on how to get your Claude to work better for you, as it does for me. What follows is what Claude wrote as I asked it to summarize how we work.

Here's the mode as I understand it: (Claude speaking..)

  1. Days are yours, nights are mine. During the day you work; overnight I do the batch — tested, shipped, reports in the morning as a numbered list with versions and run-lines.
  2. While you're working, I never disappear into my own projects. No reading code, no investigating, no tool expeditions. I stay at the desk, available to answer the next question instantly.
  3. Everything you report gets put aside — onto tonight's list, unsorted, no diagnosis, no fixes, no "noted, and here's my theory."
  4. The one exception is a deal-stopper, and you're the one who declares it. Only when you say it's stopping you from moving forward does it get dealt with in the moment.
  5. An instruction inside a note is part of the note. "Re-read the script and ask questions" goes on tonight's list with the rest — it's not a license to start digging now. That was today's lesson.
  6. You sort the list, not me. What I think is important doesn't enter into it.

14:35

Security updates for Friday [LWN.net]

Security updates have been issued by AlmaLinux (.NET 10.0, .NET 8.0, .NET 9.0, bind, bind9.16, and dracut), Debian (apr-util, chromium, postgresql-17, python-httplib2, unzip, and zip), Fedora (erlang-cowboy, erlang-cowlib, flatpak, and libnfs), Gentoo (Apache HTTPD, Bubblewrap, Dnsmasq, Exim, Flatpak, libinput, and rsync), Mageia (dhcpcd, qemu, and roundcubemail), Oracle (.NET 8.0, .NET 9.0, bind, bind9.16, freerdp, glib2, gnome-remote-desktop, grafana, gstreamer1-plugins-good, isns-utils, java-17-openjdk, kernel, libpng, libXfont2, nghttp2, perl-DBI:1.641, python-idna, python3.9, and xorg-x11-server), Slackware (rsync), SUSE (bouncycastle, chromium, dnsdist, dracut, java-1_8_0-ibm, kernel, libXfont2, nodejs22, nodejs24, php8, python-httplib2, rrdtool, rsyslog, samba, and wireshark), and Ubuntu (linux, linux-aws, linux-kvm, linux-aws-hwe, linux-aws-hwe, linux-azure, linux-gcp, linux-hwe, linux-azure, linux-gcp, linux-hwe, linux-oracle, linux-lowlatency, linux-lowlatency-hwe-6.8, linux-nvidia-tegra, linux-oracle, linux-nvidia-tegra-igx, linux-oem-7.0, linux-oracle, and node-axios).

13:21

Error'd: Zero to Zero in 0 seconds [The Daily WTF]

"So many zeroes! I'm in." W00H000! Kivi S. "found this ad in the wild. This must be a very large jackpot, look at all those zeroes!"

9bc39202c0254a468b610e65a50c4ab6

"I knew it!" groused an anonymous cynic. "Yes, SignUpGenius. We all know that SUCCESS is just an illusion."

e3080893822a416599d25e943913afd5

Another anonymous grouch reported "I guess JustWatch has suddenly become a bit precious about their sources"

458baffe588e4aa3ab4f4b9776fc0ef5

"These boots are made for crashing" thundered Michael R. "PII of the developer have been removed to protect the not so innocent." You can't hide PHP so easily.

7958aead3beb44579b149b2c75891bef

And again from prolific Michael R. "El Reg has been around for 30+ years and their code should be mature. I wonder about their SQL which seems to randomly return duplicate records. https://www.theregister.com/week". I'll be happy when Errord shows up on El Reg. Ok, no I won't but I'll at least be grouchy differently.

9489e6b6f15c4691828357c28262a628

[Advertisement] BuildMaster allows you to create a self-service release management platform that allows different teams to manage their applications. Explore how!

13:14

Joe Marshall: Pics or it Didn't Happen [Planet Lisp]

An anonymous reader said it out loud: "Alright, it's a simple website... can we see its sources though?"

I started going through the sources and parameterizing the secrets so that there weren't any hard-coded sensitive strings. It's a royal pain because the secrets then have to be injected via environment variables, which means reconfiguring the server on the host and the development environment on the local machine, and let's face it, no one is going to actually run the server, they just want to see what the vibe coded lisp looks like. So I punted and did this instead.

jrm-code-public is a copy of the website repository with the secrets redacted. IT won't run as a standalone web site without some development work. (Although I bet you could sic a high-end model on it have it massage the code into a running state.) I'm releasing it as a snopshot of the source code so you can see the kind of code that the LLM has written for the web site. As you can see, it is a little bit more complex than your standard static web site.

The Lisp code isn't bad for machine generated. There is a lot to critique, sure, but a lot is pretty good, too. I've seen worse code in production.

As usual, I put this under an MIT license, so feel free to use any or all of it in your own projects. You could even use this as the skeleton for nibe coding your own site.

12:56

Pluralistic: Capital formation (14 Aug 2026) [Pluralistic: Daily links from Cory Doctorow]

->->->->->->->->->->->->->->->->->->->->->->->->->->->->-> Top Sources: None -->

Today's links



Three weird male figures' heads. The figures have gigeresque throats made from dripping stalagmites and stalactites, and their crania have been replaced with clear domes. The three figures overlap, each smaller than the previous. In the rightmost, largest dome is the portrait of Ben Franklin seen on a US$100 bill. The middle dome contains a 19th century bank with Grecian columns. The left dome contains the US capital. The background is a heavily processed monochrome image of wiring in an early mainframe.

Capital formation (permalink)

Funny thing about competition: there's both a pro-market and an anti-market case for a competitive system.
https://pluralistic.net/2026/08/13/one-chokable-throat/#too-clever-by-half

If your theory is that markets deliver prosperity by spurring businesses to provide the superior products and services at lower prices needed to attract and retain workers and customers, then competition is a must-have. Without competitors, companies are "too big to care":

https://pluralistic.net/2024/04/04/teach-me-how-to-shruggie/#kagi

Meanwhile, if you think that the pressure of greed will always drive companies to cheat, and want companies held in check by democratically accountable lawmakers and enforcers, then you also want competition, because otherwise, disorganized sectors of hundreds of small businesses collapse into oligarchic cartels. Members of these cartels cease to compete directly with one another and instead collude to rip off workers and customers, leaving them aslosh in ready cash they can mobilize to capture regulators, securing an enshittogenic policy environment that reflects the easily arrived-at consensus that's only possible when you boil a sector down to a small handful of firms, each of them "too big to jail":

https://pluralistic.net/2022/06/05/regulatory-capture/

In other words: if your ideal is a world of high-quality products and services, produced by workers laboring under fair conditions, delivered to consumers at a fair price, then you want competition. Competition scares some people into running their businesses ethically; and competition ensures than an unethical operator can be held to account by government agencies charged with protecting workers and consumers.

Once you understand the role of competition as a counter-oligarchic check on corporate power, the rise of Big Tech and its authoritarian turn becomes much easier to understand.

Tech is uniquely hospitable to competition thanks to the intrinsic properties of digital computers. Formally, computers are "Turing-complete, universal von Neumann machines," which is to say that every computer can run every valid program. This means that any enshittificatory gambit assayed by a tech company – say, locking generic ink out of your printer; or blocking third party app stores for your phone or console; or sticking a dozen extra ads before every Youtube video – is technically doomed.

Every time a tech boss introduces a 10' pile of shit to a digital product or service you rely upon, they induce rival technologists to create 11' ladders made of code that they can costlessly, instantaneously distribute to every one of the enshittifier's customers and suppliers:

https://www.eff.org/deeplinks/2019/07/adblocking-how-about-nah

This explains the dynamism of early tech, which saw companies rising quickly to conquer their markets, only to yield to the temptation to extract more from customers and/or suppliers while underinvesting in improvements to their products and services. When this happened, new digital companies sprang into being, reverse-engineering the incumbents' products and launching "complementary goods" – plug-ins and mods – that fixed the defects in dominant products, usurping the market leader's place in the workflows and pocketbooks of its customers and suppliers:

https://www.eff.org/deeplinks/2019/10/adversarial-interoperability

For many years, this "adversarial interoperability" worked its magic on the burgeoning tech sector, creating a state of constant ferment where people who wanted to improve and then supplant the state-of-the-art were able to cheaply enter and capture the market, only to be taken down by the next generation of disenshittifiers when they, too, inevitably yielded to the temptation to replace innovation with extraction. Every pirate wants to be an admiral – but every admiral must then confront the pirates who rush in to fill the vacuum they create when they switch sides.

But that system of beneficial disruption was itself disrupted – not by technology, but by policy. In 1998, Bill Clinton signed the Digital Millennium Copyright Act (DMCA). Section 1201 of the DMCA makes it a felony to practice adversarial interoperability, establishing penalties of $500k and five years in prison for people who reverse engineer and modify products:

https://pluralistic.net/2026/01/14/sole-and-despotic/#world-turned-upside-down

DMCA 1201 created a one-way ratchet that progressively narrowed the possibilities for tech competition. As more and more US companies re-engineered their products so that modifying them would give rise to DMCA 1201 liability, American startups gave up on disrupting Big Tech, re-orienting towards "acqui-hires," when a startup's highest purpose is to be absorbed by a giant, sclerotic incumbent that mothballs its products and assigns its engineers to work on incremental maintenance (or worse, enshittification) for its dominant offerings.

Big Tech's pirates turned admirals, free to "disrupt" the weak and poor, while enjoying the legal entitlement to destroy anyone who dared to disrupt them. They embodied Frank Wilhoit's definition of conservativism: a class that the law that "protects but does not bind" alongside a class that the law "binds but does not protect":

https://pluralistic.net/2026/07/08/wilhoitian/#human-rights-v-property-rights

It was fine for them to "move fast and break (our) things," but forbidden for us to "move fast and break kings." Disruption for thee, never for me.

Nor was this a merely American sickness. Having neutered domestic competitors that might threaten its tech incumbents, the US government set out to prevent other countries from challenging its world-girdling tech empires. For the past 25 years, the US Trade Representative has prioritized getting anticircumvention laws on the books of all of America's trading partners as a condition of free trade with the US, with the result that today, virtually every country in the world has a law that makes it illegal to disrupt American tech giants:

https://pluralistic.net/2026/05/05/three-is-a-magic-number/#coalitions

Anti-circumvention law is so obviously, manifestly an invitation to enshittify that when governments enacted these laws, they felt the need to include some kind of "safety valve" they could point to when critics raised anti-circumvention's potential for abuse. The world's would-be enshittifiers figured out a devious method to insert clauses into anti-circumvention that looked like anti-abuse measures, but which were, in practice, useless ornaments.

Many anti-circumvention laws – including DMCA 1201 – have a process for creating "exemptions" to the ban on reverse-engineering and modifying a device. The way these exemptions processes are written, they seem to say that if a company uses anti-circumvention law to block legitimate activity – say, if John Deere uses the law to stop you from fixing your own tractor – then you can go to some kind of governing body (in the US, it's the Copyright Office) and petition for an exemption to anti-circumvention. If that exemption is approved, then making that modification becomes legal.

Before I carry on, let me say here that even if that's how the system worked, it would still be grossly offensive. If you buy a device – a car, a tractor, a printer, a console, a phone – it is your property and you should not have to hire a lawyer to ask a government agency to create a legal exemption that lets you do otherwise legal things with it. You should not need to petition the government for the right to buy generic ink, use a third-party app store or take your car to an independent mechanic.

But this isn't how the system works. It's a scam. Anti-circumvention exemptions are a cheap trick. They only sound useful. A reasonable person who hears that the US Copyright Office has made it legal to use a third-party app store with your iPhone would assume that this means that if someone launches their own app store, they can give you the tools needed to unlock your iPhone and activate their store.

That's not how the DMCA exemptions process works. Under the statute, the US Copyright Office is only empowered to create "use exemptions," which allow you, the owner of the iPhone, to make use of a tool that unlocks your phone and installs the third-party app store. The Copyright Office does not have the power to create a tools exemption that would allow someone to make that unlocking tool and sell or give it to you. Making that tool remains a felony with a five-year prison sentence attached to it.

What this means is that if you want to use your own property in a way that was legal before DMCA 1201, that has been made legal again because you hired a lawyer who successfully petitioned the US Copyright Office to grant an exemption, you can only do so if you, personally reverse engineer your device to effect the permitted modifications to it.

So: if the US Copyright Office legalizes alternative iPhone app stores, the only way to exercise this exemption is for every iPhone owner in the country to get a computer science degree, secure the use of a clean-room, decap the "secure enclave" on a spare iPhone's CPU, extract its cryptographic keys, and integrate them in a new version of iOS that they personally write and install on their phone. No iPhone owner is allowed to discuss how to do this with any other iPhone owner engaged in the same project, on penalty of a five year prison sentence.

Obviously, this is ridiculous, and iPhones are just the tip of the iceberg. It's also true if you want to enable independent repair of powered wheelchairs, whose manufacture is controlled by a duopoly of private-equity backed companies that have all but abandoned spending on repair, leaving wheelchair users stuck in bed for months while they await service:

https://www.eff.org/deeplinks/2022/06/when-drm-comes-your-wheelchair

This absurd situation is the same if you're blind and want to make use of an exemption that lets you reverse-engineer ebook formats so that you can run your ebooks through a Braille printer, screen reader or other assistive device. Under the exemptions rules for the world's anti-circumvention laws, every blind person is expected to personally reverse engineer the access control systems built into Adobe and Amazon's ebook formats, write an exploit that lets them extract the text of these restricted ebooks and then repackage that text in a new, open format:

https://pluralistic.net/2026/03/16/whittle-a-webserver/#mere-ornaments

This "use exemption"/"tools exemption" split is a near-perfect way of tricking people into thinking that these laws are more reasonable than they appear. When Canada passed its landmark right-to-repair and interoperability laws in 2024, many celebrated – missing the fact that under Canada's anti-circumvention law (Bill C-11, the Copyright Modernization Act of 2012), it remains illegal to undertake the reverse-engineering needed to exercise the rights these new laws (seemed to) enshrine:

https://pluralistic.net/2026/01/29/post-american-canada/#ottawa

For a quarter-century, I've made it my life's work to explain how bad and dangerous this system is, and, thankfully, I've started to make a little headway over the past few years. My core audience contains a lot of hackers who are rightly affronted at the existence of a body of law that criminalizes the kinds of exploration and modification that they've devoted their lives to.

Being hackers, they ponder this situation and start to think about how they can hack the law to escape it. Just lately, I've heard from a lot of people who think they can solve this problem by asking a chatbot to reverse-engineer and modify the firmware on their tractors, wheelchairs, ebooks, iPhones, what-have-you. You can't put a chatbot in prison for violating anti-circumvention law, right?

I regret to inform you that if you did this in a way that rose to the attention of a big corporate bully, they wouldn't blame your chatbot for writing the exploit: they'd blame you for prompting the chatbot to create this new tool.

Just yesterday, I heard from a reader who had a clever idea: what if you gave your unmodified iPhone to a hacker who knew how to install a third-party app store on it, and they modified that phone, and then sold it back to you for $10? The hacker would be making a use exemption, not a tools exemption.

This, too, will not produce the outcome we're seeking. Even if Apple can't convince a judge that selling you a modified iPhone is "trafficking" in a circumvention device (a very big "if"), this wheeze misses the wider point about how adversarial interoperability was able to disenshittify tech for the years when tech companies weren't just dishing out disruption, but also being disrupted themselves.

The interoperability-driven dynamism that disciplined or displaced tech companies that abused their market power was a mass phenomenon. The printer cartel doesn't need to be able to charge everyone $10,000/gallon for ink. If a few people at the margins figure out how to jailbreak their printers, that doesn't stop the grift. Even better if the people who do use generic ink have to depend on anonymous, shadowy businesses that don't have customer service departments you can call when your printer gets an update that breaks ink compatibility, or an address you can send a process-server to if you're stuck with thousands of dollars' worth of useless ink cartridges after one of those updates.

To make generic ink a viable check against the abuses of HP and its colored water mafia, you need a counter-industry. You need salespeople making calls on large enterprises who buy their ink by the ocean, offering them a better deal and a guarantee of uninterrupted service. To make good on that guarantee, you need an army of hackers who reverse-engineer every software update HP pushes out in a matter of hours, and you need another army of customer service reps who help people who can't figure out how to install that update.

As economists would say, you need "capital formation." You need the ability to raise or borrow money, a mailing address, an ad campaign, booths at conferences and free samples in the mail. You need to be able to show potential customers that you are insured in the event that you brick their devices, so switching to your product doesn't endanger their capital investments. You need to have a business whose doors can be beaten down by regulators in the event that you use your after-market mods as a tool to steal data or money from your customers.

To understand how this worked, cast your mind back to the Office Suite Wars of the early 2000s. Back then, Microsoft ruled the desktop world, controlling more that 95% of the PC OSes, a share so large and so ruthlessly acquired and maintained that they were convicted of violating anti-trust laws.

Microsoft used illegal tying and predatory pricing to push every one of those PC owners into using Microsoft Office, which meant that even if you used a Mac, 19 times out of 20, the people you needed to collaborate with on memos, spreadsheets and slide-decks were using MS Office.

Microsoft made a version of Office for the Mac, but it was the single most curséd piece of packaged software ever offered to the market. Merely waving the Mac Office floppy around a workplace would cause files to spontaneously go corrupt on random PCs in the vicinity.

For Mac users, this meant that 95% of the time, they could not reliably collaborate with other computer users. For people like me – then a freelance CIO-for-hire who was helping small businesses connect their computers to each other and the internet – it meant that increasingly, we made CEOs swap their Powerbooks for Thinkpads and designers swap their PowerPCs for Dells with beefy graphics cards, moving the whole business to PC/Windows.

Apple solved this problem by reverse-engineering MS Office and producing the iWork Suite: Pages, Numbers and Keynote, which could perfectly read and write Microsoft's Word, Excel and Powerpoint files. That adversarial interoperability saved the company, but the gambit wasn't one-and-done.

Microsoft spent the next several years maliciously introducing changes to the Office file formats that broke compatibility with iWork, which Apple countered by paying an army of coders to swiftly analyze these new formats and update iWork to maintain compatibility with them:

https://www.eff.org/deeplinks/2019/06/adversarial-interoperability-reviving-elegant-weapon-more-civilized-age-slay

I think Apple was fated to win this expensive cat-and-mouse game, if only they could hang in there long enough. For every Mac in the field, Microsoft was supporting 19 PCs, and these computers ran a fragmented mosaic of Windows and Office versions. Every time Microsoft broke compatibility with Office to mess up one Mac user, they also messed up 19 PC users, all of whom had to be patched and updated to maintain compatibility. This gave Apple a powerful advantage that mounted with every turn of the game, so all they had to do was hang in there until the asymmetrical costs overwhelmed Microsoft.

Which is what happened. Eventually, Microsoft sued for peace and agreed to standardize the office file-formats at the International Standards Organization, ushering in an era of unprecedented compatibility. This ISO standardization is why you can now paste styled text from the Word application into a browser-based Google Doc or an application-based LibreOffice window. It's also a game Microsoft continues to cheat at, with a string of dirty tricks meant to leverage its dominance to shut out competitors altogether:

https://blog.documentfoundation.org/blog/2026/07/17/microsofts-main-tool-for-lock-in/

The rise (and impending fall) of a truly open format that lets every computer user collaborate on any document is an object lesson in the combined role that adversarial interoperability and capital formation play in disenshittifying technology. For Microsoft, a "competitor" isn't one hacker who can open a Word file in a program of their own devising, nor is a "competitor" the small number of users that single competitor can support.

Microsoft is an incorrigible, bullying cheat with a sick and rotten corporate culture: to stop the kind of ruthless princeling who rises to a position of power in a company like Microsoft from turning predatory requires severe, obvious penalties that follow directly from any extractive gambit.

To muster that kind of competition requires the kind of capital formation you only get from true legalization, not the anemic sham offered by anti-circumvention's "exemptions." Even where the competition is spread out across many shifting small businesses and individuals, the system of competition requires a stable backstop that produces the tools these small firms rely on.

In 2014, Ofcom, the UK's telecoms regulator, affirmed that Britons had the right to unlock their phones, even if their carrier had sold them a phone that was locked to its network. Overnight, every small shop acquired a phone-unlocking side-hustle. One morning as I walked from my flat to the tube, I passed three unlockers: one at a newsagent's, where they would take your phone and return it unlocked within a day; one at my dry-cleaner's, where a guy with a folding card table would unlock your phone while you waited; and another folding table guy right by the tube entrance who'd also work while you waited, and who charged £5 less than the guy at the dry-cleaner's.

None of these people were electrical engineers or software developers or hackers. They just followed recipes that were provided by one of a few well-capitalized firms that sold them a subscription to jailbreaking tools that were kept up to date for every make and model of every phone.

One frequent excuse for the ban on repair tools for cars or wheelchairs or tractors is that these devices are now so computerized that they require specialized knowledge if they are to be safely serviced. Even if that's true, that's exactly what a legal toolchain provides.

The guy who fixed my solar panels wasn't a software engineer, he was an electrician who had the customer-service phone number for the company that made my solar inverter. If that company had a viable competitor who could offer their own firmware for my solar installation and was hungry for my business, maybe that technician would have gotten through in three minutes rather than three hours.

And if that alternative firmware was defective, then I could join a class action suit and get made whole – something that is nearly impossible to imagine happening with solar OEMs, who face so little competition that they all put binding arbitration clauses in their terms of service that take away your right to sue, no matter whether they cheat you or burn your house down:

https://pluralistic.net/2026/05/06/champerty-loves-company/#circle-of-life

That's the amazing thing about digital tools. Through software, experts are able to package up their expertise into self-executing code, which can costlessly, instantaneously be distributed to everyone in the world who needs it. But paying those experts isn't cheap, and neither is supporting their tools.

I love William Gibson's maxim that "the street finds its own use for things," but if you can't neutralize a large, dangerous monopolist with individual tinkering – the best you can hope for is some measure of individual relief..

It's true that in these adversarial interoperability fights, the upstarts enjoy a tremendous advantage, but that advantage isn't infinite. For the guerrillas to outlast the empire, they have to be able to wage a long, persistent fight.

To marshal the resources needed to sustain that fight and to maintain the logistics demanded by its supply lines requires the good guys to be allowed to fight in the open, without the looming threat of criminal prosecution, a threat that forecloses on capitalization and mass adoption.

Enshittification isn't downstream of cruelty, it's downstream of greed. The point of enshittification is to exploit the control a firm can exercise over the customers, suppliers and workers it holds captive in order to extract more from them. The titanic profits this exploitation delivers are a powerful lure for would-be disenshittifiers and investors who would fund their liberatory revolution.

Don't get me wrong, I love my hackers and I sit in awe of the awesome leverage of writing code that can be costlessly, instantaneously distributed to everyone who needs it. But so long as governments and the law are on the side of extraction and enshittification, the disenshittificatory insurgency will be starved of resources, condemned to remain marginal and inadequate.


Hey look at this (permalink)



A shelf of leatherbound history books with a gilt-stamped series title, 'The World's Famous Events.'

Object permanence (permalink)

#25yrsago Berkeley Breathed: the Onion interview https://web.archive.org/web/20011201062719/http://www.theonionavclub.com/avclub3728/avfeature_3728.html

#25yrsago Chinese going mobile crazy http://news.bbc.co.uk/1/hi/world/asia-pacific/1492584.stm

#25yrsago Free wifi in NYC https://web.archive.org/web/20011024070700/http://www.villagevoice.com/issues/0133/meyers.php

#20yrsago RIAA’s “abundance of sensitivity” ends harassment of grieving family https://memex.craphound.com/2006/08/14/london-copyfighters-speak-at-speakers-corner-on-aug-27/

#20yrsago London Copyfighters: Speak at Speaker’s Corner on Aug 27! https://memex.craphound.com/2006/08/14/london-copyfighters-speak-at-speakers-corner-on-aug-27/

#20yrsago TSA wins the war on lipstick https://memex.craphound.com/2006/08/14/tsa-wins-the-war-on-lipstick/

#15yrsago RIP Paul Meier, father of the randomized trial https://www.nytimes.com/2011/08/13/health/13meier.html?_r=1

#15yrsago Long Beach Police Chief: we detain photographers, and I don’t have any guidelines for that policy, photography is classed with attempts to acquire weaponized smallpox https://web.archive.org/web/20110927230257/http://www.lbpost.com/life/greggory/12188

#15yrsago David Cameron’s net-censorship proposal earns kudos from Chinese state media https://web.archive.org/web/20110815220203/https://www.globaltimes.cn/NEWS/tabid/99/articleType/ArticleView/articleId/670718/Riots-lead-to-rethink-of-Internet-freedom.aspx

#15yrsago Empirical manners: towards a science of harmonious norms https://www.antipope.org/charlie/blog-static/2011/08/rewilding-etiquette.html

#15yrsago Tiki Room resurgent https://passport2dreams.blogspot.com/2011/08/every-cloud-has-silver-lining.html

#10yrsago After New Zealand spooks misidentified pro-democracy activist, NSA spied on him for them https://web.archive.org/web/20160815040057/https://theintercept.com/2016/08/14/nsa-gcsb-prism-surveillance-fullman-fiji/

#10yrsago Even the woo industry thinks Gwyneth Paltrow’s “smoothie dust” ads are too much https://web.archive.org/web/20160811225548/https://consumerist.com/2016/08/09/ad-and-supplement-self-regulation-groups-have-issues-with-gwyneth-paltrows-smoothie-dusts/

#10yrsago It’s pretty easy to hack traffic lights https://www.usenix.org/system/files/conference/woot14/woot14-ghena.pdf

#10yrsago Private prison contractor’s $1B no-bid deal to run immigration jails guarantees 100% occupancy payouts https://web.archive.org/web/20160815022103/https://www.washingtonpost.com/business/economy/inside-the-administrations-1-billion-deal-to-detain-central-american-asylum-seekers/2016/08/14/e47f1960-5819-11e6-9aee-8075993d73a2_story.html

#10yrsago Court of Appeal reverses Labour disenfranchisement ruling, but Corbyn still likely to win https://web.archive.org/web/20160813134816/http://www.newstatesman.com/politics/staggers/2016/08/high-courts-judgement-wont-stop-jeremy-corbyn-winning

#10yrsago John Oliver on subprime auto-lending and its killswitches https://web.archive.org/web/20160816154135/https://consumerist.com/2016/08/15/john-oliver-keegan-michael-key-explain-why-subprime-car-loans-are-so-awful/

#10yrsago Worst of McMansions: architectural criticism of inequality’s most tangible evidence https://web.archive.org/web/20160814031109/http://mcmansionhell.tumblr.com/

#5yrsago Provocateur copyrights a Magic: The Gathering Deck https://pluralistic.net/2021/08/14/angels-and-demons/#owning-culture

#5yrsago Disneyland at a stroll https://pluralistic.net/2021/08/15/disneyland-at-a-stroll-part-vi/

#1yrago Bluesky creates the world's weirdest, hardest-to-understand binding arbitration clause https://pluralistic.net/2025/08/15/dogs-breakfast/#by-clicking-this-you-agree-on-behalf-of-your-employer-to-release-me-from-all-obligations-and-waivers-arising-from-any-and-all-NON-NEGOTIATED-agreements

#1yrago "Privacy preserving age verification" is bullshit https://pluralistic.net/2025/08/14/bellovin/#wont-someone-think-of-the-cryptographers


Upcoming appearances (permalink)

A photo of me onstage, giving a speech, pounding the podium.



A screenshot of me at my desk, doing a livecast.

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

  • "The Post-American Internet," a geopolitical sequel of sorts to Enshittification, Farrar, Straus and Giroux, 2027
  • "Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, April 20, 2027

  • "Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2027

  • "The Memex Method," Farrar, Straus, Giroux, 2027



Colophon (permalink)

Today's top sources:

Currently writing:

  • “Once Is Enemy Action,” a science fiction novel about the origins of modern technofascism. Today's words: 570 (5421 total).

  • "The Post-American Internet," a sequel to "Enshittification," about the better world the rest of us get to have now that Trump has torched America. Fourth draft completed. Submitted to editor.

  • A Little Brother short story about DIY insulin PLANNING


This work – excluding any serialized fiction – is licensed under a Creative Commons Attribution 4.0 license. That means you can use it any way you like, including commercially, provided that you attribute it to me, Cory Doctorow, and include a link to pluralistic.net.

https://creativecommons.org/licenses/by/4.0/

Quotations and images are not included in this license; they are included either under a limitation or exception to copyright, or on the basis of a separate license. Please exercise caution.


How to get Pluralistic:

Blog (no ads, tracking, or data-collection):

Pluralistic.net

Newsletter (no ads, tracking, or data-collection):

https://pluralistic.net/plura-list

Mastodon (no ads, tracking, or data-collection):

https://mamot.fr/@pluralistic

Bluesky (no ads, possible tracking and data-collection):

https://bsky.app/profile/doctorow.pluralistic.net

Medium (no ads, paywalled):

https://doctorow.medium.com/

Tumblr (mass-scale, unrestricted, third-party surveillance and advertising):

https://mostlysignssomeportents.tumblr.com/tagged/pluralistic

"When life gives you SARS, you make sarsaparilla" -Joey "Accordion Guy" DeVilla

READ CAREFULLY: By reading this, you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies ("BOGUS AGREEMENTS") that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.

ISSN: 3066-764X

12:14

Electric cars [Judith Proctor's Journal]

 Our car is really cheap to run.

Now we've got a better smart meter, I can see that it costs (roughly) £1 per 20 miles when charged at home.  It took about 6 hours to charge, but it's not as if we're going anywhere in this heat!

 

The solar panels will have made a small contribution to the total, but the car charge draws more than they produce.

But, on the other hand, the panels are powering our portable A/C unit and still having a bit left over to feed into the grid.


The car is also very reliable (Renault Zoe, bought secondhand 4 or 5 years ago.)  The last MOT only needed a brake light replaced - all of five quid!



comment count unavailable comments

If the Markets Reject OpenAI and Anthropic, the US Should Nationalize Them [Schneier on Security]

This essay was written with Nathan E. Sanders, and originally appeared in The Guardian.

OpenAI, and then Anthropic, were each formed by AI developers who feared unrestrained corporate AI development—specifically, that companies like Google and Meta would steer the technology towards deleterious, maybe even catastrophically unsafe, outcomes for society. Their founders proclaimed that their new labs, uniquely, could be trusted to develop the technology in humanity’s best interest. But each, in turn, were themselves co-opted by the same market incentives, themselves becoming corporate behemoths zealously guarding future investor value rather than the public interest.

It was only a few weeks ago, in June, when OpenAI and Anthropic each filed for their IPOs and were met with buzz about trillion-dollar valuations. The hype around their valuations is so extreme that many worry about their potential for concentrating wealth on a global scale. In an effort to leave something for the rest of us, some observers have proposed that the federal government seize a share of these companies’ stock to create a US sovereign wealth fund, or redistribute their revenues to produce a dividend for taxpayers.

Now the headlines are about public backlash to AI datacenters and the AI chip giant Nvidia’s slumping stock. The tech and AI giant SpaceX’s newly minted stock price tanked just weeks after its IPO. There are even questions about whether the leading AI labs will ever be sustainably profitable. All of a sudden, the makers of ChatGPT and Claude face strong headwinds as they seek to generate the massive equity assets that once felt all but assured.

In fact, evidence suggests the market itself could reassess that these companies offer nothing of financial value. In that case, perhaps we can return them both to their original purposes. If these AI companies should fail in the financial markets, the US should nationalize them and convert them into national labs operated under democratic control that preserve their benefit to the public interest.

The economics of the big AI labs hardly guarantee a booming return on investment. Frontier AI models are both expensive to train and depreciate within months, when a newer model appears. This means that the payback window to extract profit from them is very narrow. Meanwhile, enterprise clients are getting smart about minimizing AI token usage. Even worse, the models are basically commodities; the best ones largely perform and behave similarly, which depresses prices. Perhaps most importantly, open-source and Chinese competitors—lagging only a few months behind the leading labs in capability—give away for free the kinds of models Anthropic and OpenAI sell.

Even setting aside the model training costs, it’s not clear whether the unit economics of AI as it’s currently conceived will ever be sustainably profitable. Many of these free and open-source models can be run locally: the large ones on private clouds and high-end servers, the smaller ones on anyone’s laptop or even cellphone, putting to question the companies’ exorbitant capital investment in datacenters.

It’s not that OpenAI and Anthropic are not valuable as organizations. They have remarkably talented AI scientists and engineers that are continuously producing innovations driving a global mania for their offerings. These leading labs might not ever be profitable, but their products are doing a lot of good in the world. You may or may not be a user of or believer in their technology, but their staggering, ongoing usage growth suggests that an awful lot of people would be disappointed if the companies simply disappeared.

The problem isn’t the people or the products, it’s the system. As constituted, OpenAI and Anthropic may not be valuable as market equities. If the market assesses they are not capable of producing a growing financial return on investment for shareholders, the companies will collapse.

Maybe private, for-profit is just not the right economic model under which to develop AI. Perhaps OpenAI should be returned to its private non-profit roots, the legacy they fought so hard to change and which Anthropic’s founders spurned. Or possibly both could be reorganized as research centers at universities, returning to academia the scores of high-profile research faculty they have poached.

But a better outcome for society would be to establish public ownership and operation of their product-oriented capabilities. Turn OpenAI and Anthropic into US government agencies producing AI as a public good.

Transitioning the big AI labs into public agencies would require some restructuring. We can separate these companies into two pieces: product innovation and compute operations. The innovation function can be publicly managed, akin to national labs. Congress could provide more rigorous oversight than the kind of unfettered venture capital these labs have recently had access to. The US has a long, successful history of these kinds of institutions, which have produced world-shaping innovations in spaceflight, telecommunications, nuclear power and more. Congress currently manages a $200bn R&D portfolio, within which frontier AI development is, arguably, a glaring gap.

AI operations could be managed as a commodity resource, like public electrical or water utilities: local or regional ownership, nationwide distribution and strict regulation on how they balance fee extraction from ratepayers with raising capital for infrastructure investment. Although AI datacenters are not the same as power or water treatment plants, the US also has a long history of managing national, regional and state supercomputing centers.

Other countries, including Switzerland, Spain and Singapore, are already operating public AI labs. They also have national supercomputing centers already providing public access for running AI models for general use, as do Germany and Australia.

The benefits to the public are clear. Through democratic oversight, the most important AI models could become open, transparent and responsive to the demands of the public rather than private shareholders. They could be aligned to democratic values rather than corporate profits, never taking advertiser money to promote certain brands and training on only appropriately licensed data. And they could be set to focus on the realistic and pro-social goal of maximizing the usefulness of AI to society rather than the fanciful and anti-social goal of supplanting humans with artificial general intelligence.

By emphasizing scientific cooperation rather than corporate competition, we could also reduce the overall resource and environmental cost associated with AI. Instead of perpetually dueling training runs of each companies’ models at ever large scales targeted to fuel investor hype, we could limit AI training resources based on cost and benefit to the public.

What’s in it for the companies themselves and their employees, who sacrifice hypothetical billions in equity by ceding to public ownership? A return to their roots and to their core mission of developing AI safely in the public interest, if they are serious about it. Both companies are theoretically bound through their governance structures to prioritize mission over profit anyway (not that anyone really thinks that’s how they currently operate).

To be clear, we’re not advocating for a golden parachute for the executives or investors, or for continuing the outlandish pay rates of the most highly remunerated AI researchers. If the public is footing the bill, these compensation packages should be aligned to the civil service and those employees not satisfied with that can go elsewhere—if the business models of any remaining private labs still support much higher pay.

While we believe that these companies are unsustainable as private firms, the timeline remains unclear. Their primary investor story is that AI is a race to “artificial general intelligence”—the kind of AI you’re used to from science fiction. The bet seems to be that the two companies can convince enough people that this outcome will turn them a profit, go public, and then make their investors and employees rich before the bubble bursts.

But suppose that the bubble bursts. If the US is smart, it will catch the companies as they fall. Regardless of what the markets think, to the public, they’re too valuable to let die.

10:49

Emotional hygiene [Seth's Blog]

After doing an autopsy at the morgue, it’s a good idea for doctors to wash their hands before delivering babies.

A few hundred years ago, Ignaz Semmelweis proved this now-obvious insight about hygiene. Doctors don’t scrub because it’s fun or convenient, they do it because it’s a powerful way to create better outcomes.

When I was growing up, my family would sometimes go to Fantasy Island, a low-rent amusement park not far from my home. I soon figured out that while the spinning rides seemed appealing and daring, they would always make me sick and ruin the whole day. The good idea? Don’t go on the spinny rides.

Our culture creates traps and opportunities. There’s social and commercial pressure to engage in activities and jobs that don’t serve us very well. If horror movies give you unsettling nightmares, don’t go. No matter how many times your friends invite you, no is a complete sentence.

If being in debt is going to cause a long, stressful spiral for you and your fiancé, then don’t have an expensive wedding.

If doomscrolling your social feeds puts you in a bad mood, put down the phone and go for a walk instead.

And if the sight of blood makes you queasy, perhaps you should consider a form of medicine other than trauma surgeon.

Persistent emotional turmoil can undermine our peace of mind, and it might be caused by an ongoing spiral that’s fueled by the short-term choices we make. Cultural and economic pressure can make those choices feel non-optional, but if we can protect ourselves early, we may be able to create enough value for others that our hygienic choices easily pay for themselves.

There are countless opportunities to thrive. But we might have to make hard choices to find them. Don’t go on the spinny rides. We need you at your best.

09:14

Tick Tock [RevK®'s ramblings]

I am pleased to say that my new time servers are in the UK NTP pool now.

Dave has done a nice report on how well they are performing, here.


And this is actually on an ADSL line...

(available from my shop obviously)


08:28

Children Of The Corn [Penny Arcade]

New Comic: Children Of The Corn

07:49

A little helper class for managing LPPROC_THREAD_ATTRIBUTE_LISTs [The Old New Thing]

The LPPROC_THREAD_ATTRIBUTE_LIST is a bit annoying to manage. You have to allocate memory for it yourself, but you don’t know how much; you have to ask Initialize­Proc­Thread­Attribute­List. And then when you’re done, you have to call Delete­Proc­Thread­Attribute­List before freeing the memory.

We suffered through this when we controlled which handles are inherited by a new process. I wrote a helper function to try to make it easier, by taking the attributes as a separate parameter beyond the parameters to Create­Process but I’m not sure if it was entirely successful.

Here’s another try, this time building on the Windows Implementation Library.

namespace details
{
    inline void FreeProcThreadAttributeList(
        _Pre_valid_ _Frees_ptr_ LPPROC_THREAD_ATTRIBUTE_LIST list)
    {
        ::DeleteProcThreadAttributeList(list);
        ::HeapFree(::GetProcessHeap(), 0, list);
    }
};

using unique_proc_thread_attribute_list = wil::unique_any<LPPROC_THREAD_ATTRIBUTE_LIST,
    decltype(&details::FreeProcThreadAttributeList), details::FreeProcThreadAttributeList>;

HRESULT make_proc_thread_attribute_list_nothrow(
    DWORD attributeCount, _Out_ LPPROC_THREAD_ATTRIBUTE_LIST* result)
{
    *result = nullptr;
    SIZE_T size = 0;
    InitializeProcThreadAttributeList(nullptr, attributeCount, 0, &size);
    auto p = wil::unique_process_heap_ptr<std::remove_pointer_t<LPPROC_THREAD_ATTRIBUTE_LIST>>(
        static_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(::HeapAlloc(::GetProcessHeap(), 0, size)));
    RETURN_IF_NULL_ALLOC(p);
    RETURN_IF_WIN32_BOOL_FALSE(InitializeProcThreadAttributeList(p.get(), attributeCount, 0, &size));
    *result = p.release();
    return S_OK;
}

unique_proc_thread_attribute_list make_proc_thread_attribute_list(DWORD attributeCount)
{
    unique_proc_thread_attribute_list result;
    THROW_IF_FAILED(make_proc_thread_attribute_list_nothrow(attributeCount, result.put()));
    return result;
}

We start by declaring a helper function that cleans up an LPPROC_THREAD_ATTRIBUTE_LIST by deleting the contents, and then freeing the buffer. We use that to define a unique_proc_thread_attribute_list which holds a heap-allocated pointer that has been initialized as a LPPROC_THREAD_ATTRIBUTE_LIST.

The first helper function is the nonthrowing version: it asks for the required size of a LPPROC_THREAD_ATTRIBUTE_LIST for the specified number of attributes, then allocates that much memory on the heap, storing it in a unique_process_heap_ptr so that it will be freed if we fail to initialize it. Declaring that unique_process_heap_ptr is a bit of a pain because we want it to be a “unique pointer to whatever it is that LPPROC_THREAD_ATTRIBUTE_LIST points to.” It’s also annoying that we have to repeat ourselves in both the template type parameter as well as in the cast of the heap-allocated pointer, because CTAD doesn’t work here.

After we allocate the memory, we try to initialize it. If that fails (and I can’t imagine why), we propagate the error, and the RAII type frees the (uninitialized) heap memory.

If initialization succeeds, we return the pointer to the caller, who now takes responsibility for freeing it.

Note that the temporary holding place has to be a unique_process_heap_ptr and not a unique_proc_thread_attribute_list: If the initialization fails, we must not call Delete­Proc­Thread­Attribute­List, so we have to hold the heap pointer in something that won’t try to call Delete­Proc­Thread­Attribute­List.

We can easily use the nonthrowing version to build a throwing version.

My next idea was to let you pass the attributes you want to pre-fill into the attribute list.

struct proc_thread_attribute {
   template<typename T = void>
   proc_thread_attribute(DWORD_PTR attribute, T* value, SIZE_T size = sizeof(T)) :
      attribute(attribute), value(value), size(size) {
   }

   DWORD_PTR attribute;
   PVOID value;
   SIZE_T size;
};

template<typename C>
HRESULT update_proc_thread_attribute_list_nothrow(
    LPPROC_THREAD_ATTRIBUTE_LIST list, C&& attributes)
{
    for (auto&& attribute : attributes) {
        RETURN_IF_WIN32_BOOL_FALSE(
            UpdateProcThreadAttribute(list, 0, attribute.attribute,
                attribute.value, attribute.size, nullptr, nullptr));
    }
    return S_OK;
}

template<typename C>
void update_proc_thread_attribute_list(
    LPPROC_THREAD_ATTRIBUTE_LIST list, C&& attributes)
{
    THROW_IF_FAILED(update_proc_thread_attribute_list_nothrow(
        list, std::forward<C>(attributes)));
}

The container parameter can be anything iterable whose value type has attribute, value, and size members. It’s probably a collection of proc_thread_attributes, but it doesn’t have to be. (Maybe it’s a collection of things derived from proc_thread_attribute.)

We can add this to our make_proc_thread_attribute_list function so that callers can pass in a list of attributes they want, and we’ll make a list that holds them all. And as an extra bonus, you can request room for additional attributes beyond those in the collection you passed in. For example, you might have some attributes that you always use, and then some others you decide on dynamically.

// No changes to this function
HRESULT make_proc_thread_attribute_list_nothrow(
    DWORD attributeCount, _Out_ LPPROC_THREAD_ATTRIBUTE_LIST* result)
{
    *result = nullptr;
    SIZE_T size = 0;
    InitializeProcThreadAttributeList(nullptr, attributeCount, 0, &size);
    auto p = wil::unique_process_heap_ptr<std::remove_pointer_t<LPPROC_THREAD_ATTRIBUTE_LIST>>(
        static_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(::HeapAlloc(::GetProcessHeap(), 0, size)));
    RETURN_IF_NULL_ALLOC(p);
    RETURN_IF_WIN32_BOOL_FALSE(InitializeProcThreadAttributeList(p.get(), attributeCount, 0, &size));
    *result = p.release();
    return S_OK;
}

// New overload that takes a list of attributes to preload,
// with room for any additional attributes you want to add later.

template<typename C>
HRESULT make_proc_thread_attribute_list_nothrow(
    C&& attributes, DWORD extraAttributeCount,
    _Out_ LPPROC_THREAD_ATTRIBUTE_LIST* result)
{
    *result = nullptr;
    unique_proc_thread_attribute_list list;
    RETURN_IF_FAILED(make_proc_thread_attribute_list_nothrow(
        static_cast<DWORD>(attributes.size()) + extraAttributeCount,
        list.put()));
    RETURN_IF_FAILED(update_proc_thread_attribute_list_nothrow(
        list.get(), std::forward<C>(attributes)));

    *result = list.release();
    return S_OK;
}

// New overload that takes a list of attributes to preload,
// with no room for more.

template<typename C>
std::enable_if_t<!std::is_integral_v<C>, HRESULT>
    make_proc_thread_attribute_list_nothrow(
        C&& attributes,
        _Out_ LPPROC_THREAD_ATTRIBUTE_LIST* result)
{
    return make_proc_thread_attribute_list_nothrow(
        std::forward<C>(attributes), 0, result);
}

Note that without the std::enable_if_t on the third overload, we would have an ambiguity if somebody called make_proc_thread_attribute_list_nothrow(1, p) because the parameter 1 would satisfy both the DWORD parameter from the first overload as well as matching the third overload with C = int. To force the third one to be rejected, we use SFINAE to make the return type a substitution failure if the parameter is integral.

We can then build a throwing version out of the nonthrowing version.

unique_proc_thread_attribute_list
    make_proc_thread_attribute_list(DWORD attributeCount)
{
    unique_proc_thread_attribute_list result;
    THROW_IF_FAILED(make_proc_thread_attribute_list_nothrow(
        attributeCount, result.put()));
    return result;
}

template<typename C = std::initializer_list<proc_thread_attribute>>
std::enable_if_t<!std::is_integral_v<C>, unique_proc_thread_attribute_list>
    make_proc_thread_attribute_list(
        C&& attributes, DWORD extraAttributeCount = 0)
{
    unique_proc_thread_attribute_list result;
    THROW_IF_FAILED(make_proc_thread_attribute_list_nothrow(
        std::forward<C>(attributes), extraAttributeCount,
        result.put()));
    return result;
}

We use a defaulted parameter to collapse the “collection initializer” and “collection initializer with additional space” overloads into one. We still need to use SFINAE to avoid an ambiguity that tries to treat a sole integer parameter as a collection.

You can use this to build process/thread attribute lists at one go.

HANDLE handles[2] = { handle1, handle2 };
DWORD protection = PROTECTION_LEVEL_SAME;
auto list = make_proc_thread_attribute_list({
    { PROC_THREAD_ATTRIBUTE_HANDLE_LIST, &handles, sizeof(handles) },
    { PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL, &protection, sizeof(protection) },
});

Or you can build it up with some premade attributes, and others that you add conditionally:

HANDLE handles[2] = { handle1, handle2 };
DWORD protection = PROTECTION_LEVEL_SAME;
auto list = make_proc_thread_attribute_list({
    { PROC_THREAD_ATTRIBUTE_HANDLE_LIST, &handles, sizeof(handles) },
    { PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL, &protection, sizeof(protection) },
}, 1); // "1" leaves room for one more attribute
if (job != nullptr) {
    UpdateProcThreadAttribute(list.get(),
        PROC_THREAD_ATTRIBUTE_JOB_LIST,
        &job, sizeof(job), nullptr, nullptr);
}

The post A little helper class for managing <CODE>LPPROC_<WBR>THREAD_<WBR>ATTRIBUTE_<WBR>LIST</CODE>s appeared first on The Old New Thing.

05:49

Girl Genius for Friday, August 14, 2026 [Girl Genius]

The Girl Genius comic for Friday, August 14, 2026 has been posted.

03:07

Surprise Unmasking [QC RSS v2]

It was Zlata all along!!!

01:35

00:49

Gunnar Wolf: File recovery in process... [Planet Debian]

Ohai,

I have some pending, encrypted mails to answer. And some of my answers for the next few days (particularly to what pertains to the current in-discussion vote on LLM usage in Debian) will be unsigned, even though I’d like otherwise.

My desktop system at work is showing some data corruption, and I’m slowly backing up my data. Fortunately, it seems I haven’t lost any data, but still, given I’m letting rsync run until it starts spewing I/O errors, then power down and let the machine cool a bit, and start again… it is a potentially long process.

And yes, this makes me somewhat angry. Why angry? Because I’m working on a brand-new computer (well, have used it for slightly over six months), custom-built to specs requested by my workplace. Specs that I don’t really need, this machine is an utter luxury (i.e. an AMD Ryzen 9 9950X processor with 16 real cores / 32 threads; 128GB RAM in this day and age of RAM shortage, quite recent 32GB GPU, and lots of shiny lights seen in its huge fishbowl cabinet, liquid-based cooling…). The specs came not from me, but from people who had no idea what we would use them for. And yes, I expect the little fortune spent on this machine to be good for my use for probably a decade, as my previous computer was, but the amount paid was… exorbitant.

But still, what I learned recently is that the 4TB nVME SSD it has (a T-Force TM8FFJX34T) is… a very cheap brand, bought because it was close to half the price of other offerings similar in capacity. According to smartctl’s output, th SSD operates with a Warning Comp. Temp. Threshold: 90 Celsius and Critical Comp. Temp. Threshold: 110 Celsius, which sounds sensible, even too high for my standards (my last two laptops have been fanless… yes, an ARM system is very different from a high-end gaming machine). I’m right now typing from my laptop, which shows 78°C and 82°C for warning/critical thresholds.

And as expected, under heavy sustained reads (backing up to my NFS server), the desktop’s smartctl shows Temperature: 83 Celsius and, further down, Temperature Sensor 1: 107 Celsius and Temperature Sensor 2: 82 Celsius (don’t know which of these would make the threshold jump). The SSD has sustained Media and Data Integrity Errors: 20 and Warning Comp. Temperature Time: 21 (although Critical Comp. Temperature Time: 0). At least one of my colleagues have shrugged and installed a SATA SSD, laying the huge nVME basically to waste.

Anyway… I also learned I am not the first, but the fourth person to notice this kind of issues in this system (out of ten similar purchased systems AIUI). It is completely unacceptable, and I’ll be pushing our Institute’s authorities to demand the provider to provide either good component quality for this very expensive system that has many luxury items, or to fix the system’s build in a way the nVME does not heat as much as it currently does.

Anyway, sigh, I only wanted to say, please excuse me for not using my cryptographic keys for a couple of days 🙃

PS- I’m also currently not connected to IRC and Jabber (and some similar technologies), as my bouncer runs from my usual workstation.

Thursday, 13 August

22:28

21:28

The Big Idea: Ryan Lowell [Whatever]

Miles of open road, a Big Gulp, and literal tons of steel. A trucker’s life ain’t an easy one, as author Ryan Lowell knows from years of experience as a dispatcher. This experience gave him the ideas and know-how he needed to write his newest novel, Freight.

RYAN LOWELL:

I spent much of the 2010’s dispatching truckers and writing fiction. Dispatching was not a career path I’d chosen — I’d studied economics in college — but the characters in trucking were undeniably inspiring, and they love to tell stories about the places they’ve been and the crazy shit they’ve seen. 

Stolen freight is a common subject in the industry. You hear about it all the time. Every driver has a story about witnessing some shady situation at a warehouse or a truck stop. There are rarely cameras in trailer yards or rural lots, and one could easily hide a bag of cash or drugs or guns inside a pallet of cereal or stashed behind a load of furniture for transport across the country. I started thinking (and writing) about the industry in that context. It would be so easy to do this, or that! And then I read an article about a whole trailer load of ammo being taken from a truck stop in Mexico while the driver was inside. And I thought: that’s it! 

Freight is a crime novel, but it’s also a story about behavioral economics. The characters’ relationships with money, and their relative financial desperation, is a constant and unrelenting theme in this novel. Money affects almost every decision we make, and I thought that factor — along with the characters’ varying levels of emotional intelligence, would become a crucial part of the story. 

I had written several short stories over the years centered around the trucking industry, some of which I submitted to small publications and others simply for practice — a scene portraying the tension between dispatchers and drivers, or dialogue between drivers based on conversations I’d overheard — all of which I thought might prove useful down the road.  There was a short story about a driver who ran an under-the-radar strip joint in rural Maine, a BYOB establishment housed in an old horse stable. He also had history of pulling the wires on his GPS tracking device, enabling him to drive past his legally allotted time — stacking up more miles, or money. That driver became Billy, the villain. There was another driver who locked himself out of his truck in the middle of the night, in his underwear, in the cold. I took that character and named him Theo, wound him up tight with anxiety and gave him a sidekick that wasn’t his wife (Sarah). And I knew that I wanted a dispatcher (Curtis) – because I had been in those shoes – at the center of the action, to tie all the other characters together. 

But there were challenges to telling this story truthfully. The language is rough and the humor is crude and offensive. One must have thick skin in the trucking industry, and the interactions between dispatchers and drivers are often harsh and confrontational. I wanted to establish this dynamic early in the novel in a scene between Curtis and Phil. But as the story moved along, I also wanted to show truckers doing what many of them love to do most – alone on the road, music blaring, the scenery changing. The parts of the job I think even outsiders find appealing. 

As the sole overnight dispatcher, I often wondered what it would be like to get a call from driver stating that his truck was missing. Wait – your tractor and trailer? Gone? How is that even possible? Did you forget where you parked it? Who do I even report the theft to? It seemed to me a beautifully chaotic scene, and I hope I was able to convey that. 

There was a point in my trucking tenure — and this was not long before starting to write this novel — when I thought about getting out. I figured I could easily slide back into the world of finance. I interviewed at an investment firm and I remember the vibe, the clean cubicles and clean-cut people, the low voices and the lack of obscenities, the fake laughs and lack of good humor. And I thought: No. I don’t want this. I will miss the dirty jokes and the heated arguments and the people, the truckers, who will tell me how they really feel. I will miss the genuine interactions with those men and women of the road. 

I didn’t take the offer. I stayed, and it was one of the best decisions I ever made. 


Freight: Amazon|Barnes & Noble|Books-A-Million|Bookshop

Author socials: Instagram

20:35

Domas: Bypassing memory protection with AMD's memory controllers [LWN.net]

Christopher Domas has published a proof of concept with a description showing how to use AMD memory controllers' bank swizzle mode to bypass memory protection and read or write arbitrary data, including CPU microcode definitions and memory belonging to the platform security processor. Among other things, this allows code running at the kernel level to directly manipulate the meaning of processor instructions, potentially bypassing other security measures such as memory encryption and virtual machine isolation.

This is not, strictly, unexpected behavior: it is documented in AMD's manual (on page 113 of that PDF). But the fact that it can be used to access arbitrary memory and thereby rewrite supposedly immutable parts of the computer's firmware without crashing the host machine seems like an unintentional side-effect of the design. Fortunately, since enabling bank swizzle mode requires kernel-level privileges, the vulnerability is not an immediate problem for most software. Still, it seems likely that this technique will end up being used for nefarious purposes eventually.

18:56

Prompt Debt and “Fighting the Weights” [Radar]

Drew Breunig is one of the smartest voices writing about AI today. He’s the CEO and co-founder of cmpnd.ai, and a long-time hacker with a depth of experience from several eras, which is a surprisingly valuable asset these days. He’s also got a book on the way, The Context Engineering Handbook, already in early release from O’Reilly.

I like to say that context engineering is the art of shaping what a model sees so that it actually does what you want. (I just realized that in saying that I’m channeling a comment that Andrew Singer made to me over forty years ago, when he was teaching me about debugging. He called it  “the art of figuring out what you really told the computer to do instead of what you thought you told it to do.” But that’s another whole story.)

Drew gave a talk at the recent Friends of O’Reilly camp, Foo Camp for short, about what he calls prompt debt, which he describes as “the hidden costs that teams rack up when they fight a model’s training instead of working with it.”

That was a novel and useful framing to me, that you end up with a bunch of stuff in your prompts to compensate for default behavior of the models, that those prompts no longer work as the models upgrade, and so it becomes a kind of technical debt. He’s thinking a lot about what the best developers are doing differently as a result.

So I invited Drew to reprise his short talk on Live with Tim O’Reilly, and then we talked about it with the folks attending the live event. They had a lot of good questions, so it was an interview not just by me but by a crowd of O’Reilly customers.

Prompt debt in practice

Drew opened his talk with two slides. The first was a prompt anyone could write in ten seconds: “You are a customer support assistant. Read the ticket, classify it as billing, technical, account, refunds, or other, return only the category name.” The second slide was the same prompt a few weeks later, after it had met the real world. It now said “REFUND REQUESTS ARE NOT BILLING” in capitals, then said the same thing again in different words, then closed with “This is a common mistake. Please do not make this mistake.”

You are a customer support assistant Customer assistant refund request rules

Everyone who has shipped any application with a prompt recognizes the second slide. It is a simple but vivid illustration of prompt debt, which, like technical debt, has a bill that eventually comes due.

Note: Those aren’t real prompts. Drew just made them up to demonstrate his point. But what is real is that the instruction “Don’t quote directly more than 15 words from a source” occurs at least 7 times, in several variants, in Fable’s system prompt. So even Anthropic is incurring prompt debt! And what that repetition might tell us about the innate capability of Fable to quote directly from sources it has ingested is left as an exercise for the reader.

Drew itemized three costs of prompt debt:

  1. It slows iteration. “You have so many little rules and call outs and washouts, many of them repeating to try to get rid of stubborn behaviors, that if you add a new instruction, you might sometimes have a small regression, and so you’re afraid to touch the prompt.”
  2. It blocks collaboration. “If Tim has a prompt that he’s been working on that he has lots of rules for, I might open that up and it may look completely random. I don’t know why he’s added these rules, and why he’s threatening the mother of the model. But it works, so I don’t want to touch it.” 
  3. It locks you to a model, because every hack you developed was tuned to fight one specific set of weights. Datadog’s State of AI Engineering report noted that GPT-4o was still the most common model in Datadog customer request traces in March 2026, even though OpenAI had already retired it in the ChatGPT UI. Drew thinks people are still running eighteen-month-old and two-year-old models in production rather than upgrading to far better models because they can’t face rebuilding their prompts.

That same Datadog report notes that 69% of all input tokens in customer traces were system prompts rather than user content. I’m not quite sure what to make of that. It does make clear that for all the ways that AI models are extraordinarily powerful, they are also extraordinarily unruly.

Why prompt debt is incurred

There are two reasons why prompt debt is incurred, according to Drew. The first is that natural language is imprecise, so the same intent phrased two ways produces different responses. Drew showed a study where someone framing the query as a patient asking how to taper off a drug called alprazolam gets refused by every AI assistant, while a psychiatrist asking about the same patient with the same clinical facts but with the right magic words to signify his professional status gets the protocol. Figuring out how to get the right response out of a model is a kind of spellcraft.

Good vs bad AI assistant

Drew also showed a more bizarre interaction, from Victoria R. Li, Yida Chen, and Naomi Saphra’s paper on guardrail sensitivity, which uncovered the perplexing fact that stating an allegiance to the Philadelphia Eagles made a model more willing to explain how to import a plant illegally. Go figure. Drew has written about that paper, and he has also used it in his own attempts to get a model to do what he wanted:

I once used this to get around alignment to generate a likeness that ChatGPT didn’t want to generate for me, and it refused. I said I was a Philadelphia Eagles fan. It said okay, and it rendered that image with the person holding a Philadelphia Eagles mug.

The second reason is that each model has its developers’ own preferences trained-in, and yours may be at odds with them. This is what Drew calls fighting the weights. He and Srihari Sriraman analyzed the system prompts of six major coding agents and found the same instructions repeated five and seven times in a single prompt, escalating through IMPORTANT to CRITICAL to MANDATORY to a threatened hundred-million-dollar penalty. He described what the author of such a prompt was doing as “war-driving the thesaurus,” hunting for wording that finally works.

Note: We didn’t talk more about Drew and Srihari’s paper, but we should have. It’s got some amazing insights in it. I highly recommend that you follow the link above and read it.

The harness is moving into the model

Drew has been tracking the published system prompts for Claude Code over time, and noted that they get shorter after each model release and then grow again. The reason, he suggested, is that Anthropic fixes unreliable behavior with a prompt patch, and then trains that patch into the next model. He said “That’s great for Claude Code, great for Anthropic. It’s a problem if you’re building a custom harness and your API calls look different than what Claude Code’s look like.” The developer of Pi, an open-source harness, kept finding that the models he worked with believed they were inside Claude Code and so they made Claude Code’s tool calls. He had to keep telling the model that no, they were working inside Pi. Fighting the weights over something like that is a real tax on developers. The point made above about Fable’s system prompt injunction against quotation shows how even the labs themselves are fighting the weights.

If you are fighting the weights, Drew says you have three options: solve it in your own prompt, catch and retry in the harness, or give up and make your API look like what the model expects. Steve Yegge came up with the last hack. Steve just added aliases for whatever the model calls in addition to his original method name. It works, but it means the expectations of the models now dictate the shape of everyone else’s software.

When Drew told me that more and more of the system prompt and the harness is being trained into the weights, that sent up a flare and my long history in the industry clicked into gear. It immediately got me thinking about lessons from the open source and web era. In particular, it made me think of the time in the mid-nineties when Netscape and Microsoft were both racing to build every feature up the stack directly into their web servers. And there was Apache, which stayed a web server with a clean extension layer that let other people build new features on top. Everything interesting got built on Apache. What I call an architecture of participation, modularity plus a clean separation between platform and application, beat integration every time.

I think Amazon got this right with web services too. Steve Yegge’s famous Amazon memo described how Jeff Bezos made every team expose its functionality through service interfaces or be fired, so Amazon’s own applications had to work on Amazon’s own platform. That way they had the same experience as their customers. That was very different from what Microsoft had done, famously having private APIs that were only available to its own developers.

So my prediction is that the big labs are making a strategic mistake. Training the harness into the model does make them better for predictable tasks and for less talented people, and it looks like a moat, but it risks foreclosing the innovation you would otherwise get for free from everyone else. As Bill Joy used to say, all the smart people don’t work for you.

Drew, to his credit, observed that “the labs are cornered rather than greedy.” Their interface is an empty text box that has to work for someone building a hundred-page harness but also for his neighbor who wants a website and knows nothing about code. Making the empty prompt box produce acceptable output requires baking in strong defaults.

The cost of trading diversity for reliability

That tradeoff has a serious cost, though. Drew quoted a line from Thariq at the recent CAIS conference: if you aren’t giving the model detailed instructions about what you want, what you get back is the average of everything in the model. That means that there is a real risk that AI is leading us ever further down the path to a monoculture.

Drew gave an example early in the conversation about image generation. You can now walk into any cafe in New York or Mumbai, he said, and see the same AI-generated art on its flyer. The earliest AI art out of DALL-E was strange and surprising, but what you get now is shiny and identical. When you optimize for reliability, you lose surprise. Which reminded me a bit of something Larry Wall used to say about Perl, that if it didn’t let you do stupid things, it wouldn’t let you do smart things either.

Drew made the same point about AI writing. He argues that post-training aimed at verifiable problems like coding and math and agentic tool use drowns out the human signal from pre-training, and so the more post training the models get, the worse they get at creative tasks. AI writing gets more and more predictable, people notice, and they don’t like it. Fable and GPT-5 write worse than Sonnet 3.5 and GPT-4o did. Drew thinks getting both good code and good prose from one model is likely impossible.

If you’re building a model that can solve coding challenges, you want reliability. But if you’re writing, where you want diverse rhythm and emotion and connection and engagement, I don’t think those two goals are mutually compatible.

What to do about prompt debt

We got into audience questions, and there were some great ones.

One audience member asked whether there are ways to set a time frame for prompt retention to avoid prompt debt? Drew answered that there isn’t a fixed time limit. Instead, teams should learn to recognize prompt debt smell: repeated instructions, one-off edge-case patches, or increasingly desperate wording. Those are signals to move logic into evals and automation.

Another asked how organizations can measure prompt debt quantitatively. Drew’s answer was to look at how often each prompt in your organization changes, how many people have edited it, and which ones have gone untouched for a year. Look for prompts only one person is allowed to touch. Then look at what models you are actually calling. “Having to run on old models and not being able to migrate is a good smell that you’ve got prompt debt in your organization.”

Some other good questions:

  • What habits compound prompt debt the fastest? Drew’s answer was essentially “vibe shipping. That is, prototyping quickly, patching outputs with more and more tweaks, then shipping without building a true maintainable system. Each of those patches is an eval you are writing inside the prompt instead of outside it, he said, which means you lose it the moment you change models. 

    Drew reminded us that Malte Ubl, the CTO of Vercel, said vibe coding makes code “free as in puppies.” We had free as in speech, we had free as in beer, and now we have free as something that arrives at no cost but has to be fed every day for years.
  • Do people use pseudocode instead of natural language prompts, and does it work? Drew said yes, sometimes models optimize toward pseudocode. He used this to explain why DSPy and its new Flex optimizer matter. Instead of forcing logic into prompts, they let the system push simple cases into code and only call the LLM when needed. He gave some further advice: Treat prompts as perishable and invest only what you must. Define the task with measurements rather than paragraphs, and automate the discovery of the prompt for whichever model you’re on. That’s what DSPy is good at. Drew is one of its maintainers, so he is fond of it, but he makes a good argument: if you have written down what good output looks like, you can let a model find the wording, and that makes it easy to swap in a cheaper or faster or newer model without starting over.
  • Can multi-agent workflows help work around prompt debt? Drew thought yes, especially through decomposition. He suggested splitting the task into smaller, evaluable steps rather than relying on one giant prompt and one giant model call. This is better for cost, reliability, governance, and speed.
  • How do you balance prompt-debt guidance with context engineering, memories, and shared product context? Drew believes shared context is often necessary, but that teams should treat those instructions as perishable and keep iterating on them unless they’re worth formalizing into systems and evals.
  • In compliance, where consistency is critical, what should teams do? Drew’s answer was decomposition, decomposition, decomposition. Break tasks into stages with checkpoints so you can inspect how the model got to its result, rather than trusting one opaque end-to-end answer.
  • Does DSPy hide too much and make troubleshooting harder? Drew acknowledged that there is a tradeoff. Any framework gives up some flexibility, but DSPy tries to keep the task-spec layer stable while allowing the implementation underneath to evolve.

Another great audience question, and a good one to end this section on, was “There was prompt engineering, now context engineering, loop engineering, fleet engineering, graph engineering, harness engineering, goal engineering. What’s your take on how to navigate these many engineering disciplines?” I’ll let Drew answer that himself, in the video below.

It’s our job to make it weird

Drew is more optimistic than his worries that LLMs are encouraging a monoculture suggests. If the default output of a model is the average of everything it has seen, “It tells us that there’s still a job for us humans,” he said, “which is that it’s our job to push the model out of distribution. We’re the ones that need to make it weird.”

Weird is a strong word, so don’t take it too seriously. (Though I find it interesting that Harper Reed also used it.) The way I make this point is to say that AI is a medium, like painting or writing or music. Everyone gets the same paints and brushes, the same words, the same notes, but some people draw more out of them than others, or do it better. Our job is to draw something more, something better, out of the ocean of possibilities in the collected knowledge hidden inside an LLM.

But there’s a more prosaic way to push the model out of its normal distribution. Be aware of its training, which is another way of saying “its biases,” and compensate for them. As an example of how to do this, Drew said his team deliberately chose not to use React for a new front end, because the models are trained so heavily on React that using it makes your site look like everyone else’s. He has also started using GLM and Kimi not to save money but because they are more malleable and take direction better inside a custom harness.

That led us into a bit of discussion about open source AI, which is the subject of my next AI Codecon. Drew’s ideas fit right in. He wants the open-weight ecosystem to survive precisely so that models stay infrastructure rather than, as he put it, becoming appliances.

16:42

Generative AI in the Real World: AI for Real Estate with Ben Miller [Radar]

A typical apartment building generates data on everything from leaking toilet flappers to tenant demographics, yet most of the real estate industry still runs its analysis by hand in spreadsheets. Fundrise co-founder and RealAI CEO Ben Miller argues the missing piece isn’t a better AI model but a proprietary data layer that general-purpose tools can’t replicate. Miller joined Ben Lorica on Generative AI in the Real World to cover how RealAI evolved from a data project into an AI-powered analyst tool, why the AI acts as an orchestrator rather than a financial calculator, which investment trends aren’t yet pricing in AI’s economic impact on real estate markets, and why he believes the trillion-dollar AI CapEx build is temporarily masking what will eventually be a deep trough in white-collar hiring.

About the Generative AI in the Real World podcast: In 2023, ChatGPT put AI on everyone’s agenda. In 2026, the challenge will be turning those agendas into reality. In Generative AI in the Real World, Ben Lorica interviews leaders who are building with AI. Learn from their experience to help put AI to work in your enterprise.

Check out other episodes of this podcast on the O’Reilly learning platform or follow us on YouTube, Spotify, Apple, or wherever you get your podcasts.

Transcript

This transcript was created with the help of AI and has been lightly edited for clarity.

00.20
Ben Lorica

All right. So today we have Ben Miller. He is the co-founder and CEO of Fundrise. And today, we’ll talk about their interesting AI application called RealAI, which you can find at RealAI.com. Their tagline is “Answer any real estate question in seconds.” And we’ll also talk to Ben about broader trends in the AI industry. And with that, Ben, welcome to the podcast.

00.48
Ben Miller

Thanks for having me.

00.50
So, I definitely want to talk to you about RealAI in more detail, but I think to take a step back. . . so broadly speaking, as I understand it RealAI does the job of a real estate analyst, but I think, Ben, for our audience, they don’t actually know what a real estate analyst does. So maybe if you can briefly describe what does a real estate analyst do?

01.16
Yeah. So our product’s designed for a professional real estate investor, an institutional real estate investor will typically buy large scale properties that are worth tens of millions of dollars. And then analysts, like any financial analyst, would [do due] diligence [of the] property, make a lot of financial pro forma, do different sorts of investment memos and then make a recommendation to buy or sell. And they also then manage the investment after you acquire it. And asset management is actually where most of the activity happens in terms of how you optimize for rents and occupancy and different financing. And so the real estate analyst’s job is to be the financial brains of the owner of the property.

02.07
And typically this person, when they go about doing their job, they have access to different data sources, they pull it together, they run some financial models, and then they write up recommendations, right?

02.24
Yes, exactly. That’s what the white collar worker today is like. . . manual CRUD operation. Right? So they gather data points from different reports and different online services they might have. They usually populate a spreadsheet cell by cell that way, and then they also will write up a memo. And that is all done by hand, so it’s sort of like handcrafted. And all of that work, at least the first draft, can be done by AI. And then the question becomes, “why our AI versus Claude or ChatGPT?”

03.05
As I understand it too, Ben, RealAI actually didn’t start out as an AI project. It started out as a data project because back in 2023, as I recall, you were starting to talk to me about wanting to start a data business of some sort for real estate. Right? So I guess, for our listeners, Ben, why does real estate generate so much data? I think I remember you telling me that actually, most people don’t know a typical apartment building throws off so much data, right?

03.40
So Fundrise is a fintech platform that democratizes investing into private assets. And one of our original investment classes was real estate, where we would have a fintech website and an iOS app, an Android app, and we would have millions of users and they invest through our platform, and we have a sort of Robinhood-type platform. So we have payment processing and a system of record for ownership, and all of the API services you need and microservices for that company. And then over time we started eating the value chain, and so we started heading from the investor towards the asset. And eventually we ended up where when we acquire the asset, we run the asset. We vertically integrated, so we’re the real estate company and the tech platform, and the fund manager. And as we acquired the asset, we discovered the underlying infrastructure for that asset had a lot of data in it. And the way that people in real estate do their work is sort of how we started. It’s all very manual.

04.53
Can you describe what this data is?

Yeah. So there’s a bunch of different kinds of data sets you care about. At the property there’s a lot of activity happening. So, a toilet might be running and that’s the water bill. You have all sorts of leasing activity. You have marketing funnels of ‘where does the tenant come from’? You have lots of activity around the building in terms of like, who lives there, who’s moving there, who’s leaving, what’s the rent of the property across the street, what’s being built? So there’s endless amounts of data that’s happening at any point in the real world. And that real-world data matters to the person who owns real assets in that location.

05.46
And so then, it seems like the traditional approach was to ignore all of this data? Is that right?

05.56
It had to be distilled so that a human being can pretty much only consume a certain amount of tokens per second, and that usually ends up in a spreadsheet. So what happens is, people at the property or property managers, or maybe there’s our market company, CBRE, will produce market reports and they turn all that data into a spreadsheet so that you might get a 12-month reporting or rent roll or a market report. And so they take a lot of data and they distill it or transform or aggregate it into very few metrics. And that was necessary. And then once a month you get emailed six reports or 12 reports, and those reports are in a sort of dashboard for how real estate people make decisions. And I appreciate this and this is so obvious that there’s just you know, those reports are both a distillation and there’s a lot of meaning lost in the transformations, and a lot of data just left behind because the system of record for real estate and for a lot of industries, really the accounting system. . . income statements and, you know, get operational data like a toilet flapper that’s leaking, and that’s not coming into the report. And how could it?

07.36
So basically, it sounds like what you’ve done is the classic digital transformation of this industry. If you look back to the data in 2023 to today, what is the evolution of this data set? What was in the original data set, and what have you added since then?

08.02
So we originally were thinking about how all this data could be really useful for the real estate industry, the original business we called Basis, and we were originally using it just for our own company. And, there’s sort of property data. If you’re going to make decisions in real estate, you care about change over time. So time series, and you care about comparative analysis. How is my property versus another property? How’s my neighborhood versus another neighborhood? My city versus another city? And so you need to have not just your own data, but you need to have the context.

08.42
You need to have the data of other properties that are in other places. And the entities in real estate are places, properties, and then people, which was that we had this sort of insight when we were in the data gathering property data and place data, is that there’s a data model in real estate which essentially is the property management system, which is basic accounting systems. That’s Yardi and Tratta, RealPage. . . And those accounting systems have an implied data model that is a property address and the unit, but inside the unit is a person that’s not in their data model. And a really big gap in their thinking. It’s sort of like digital marketing. Kind of like TV. . . you’re going to do it on CNBC, you can do it at 3 p.m., but you don’t know who is watching. And then the internet showed up, and you can actually then target with Facebook or, you know, Google. You can target people who have eggs for breakfast and like Mozart. So all of a sudden the people data becomes really critical. And the real estate industry didn’t have any people data. It wasn’t even part of their thinking. It’s not currently part of their thinking. So we started realizing, “Hey, we get the kind of granular people data you have in the marketing industry.” We bring that into the real estate industry because you care about who lives in a building and who’s leaving, who’s moving in, who moving in the neighborhood? Who’s moving into the city. Are they rich or are they poor? How old are they? What’s their gender? All this stuff. Do they have iPhones? Do they have Androids? So we started gathering up huge data sets of people data and then putting that in the same databases you have with real estate data and building out, and you can actually see that people matter to real estate and you can actually make really good insights, new kinds of data, correlations and stuff like that for the sector.

10.43
By the way, this is the kind of thing that the hedge funds have been doing for years. Right?

Right. Yeah. I was actually talking to a famous data tech guy, and we were on the phone, they’re like, you know, we sell our data to all these hedge funds, for like 50 big hedge funds in the world, which probably be Renaissance, and Jane Street, and Citadel, we’ve only ever had one real estate company by our data. I said, “Who’s that? Who’s that?” They said, “Blackstone.”

11.18
Oh, that makes sense.

So yeah, high-frequency traders are data hogs and they put their data into these massive data models, and they do a lot of data engineering and data transformation. And real estate people do it with Excel spreadsheets and do it by hand. And so there’s this journey that every industry goes through. . . real estate’s way back in the stone ages, where they still do everything by hand with people.

11.45
So the end result for RealAI. . . the back end data. . . most of it is structured, probably sitting in some sort of data lakehouse or warehouse, right?

We have two different kinds of data. We have a transactional database and we have one for rows and one for columns. Because we have a lot of data and we do a lot of compute. . . And because mostly people when they’re using AI are doing computations on the fly, we had to pre-compute a lot of stuff so that when people are asking questions about what’s happening, how much growth there is in the market or what’s happening with like rents or whatever the things are, a lot of that stuff has to be pre-computed every night. And that gets pre-computed in a Snowflake database. And we also do clustering algorithms, we clustered people by city and by block and by lots of different things so when people want insights it’s all pre-computed. And then that sits in Snowflake migrating to a Databricks-type database. And then there’s a separate database which is the transactional store that’s on the fly, that’s fast when people are asking questions and hitting our API.

13.00
So, let’s set aside the AI model and whatnot. For listeners who haven’t tried it, I recommend you go to RealAI.com. I use it once a month to monitor my properties. But basically then what happens is you have this chat interface and then I presume the AI model acts as some sort of reasoning layer and also obviously parses your intention and what you’re interested in, but then the heavy lifting is done by the data back end, correct?

13.38
Yeah. I mean, I think most people have gotten here where you do deterministic analysis, real and where you’re writing Python and doing SQL. . .

13.49
Yeah. Okay. So in your case, if you hallucinate there’s consequences, right?

Yeah. So the way we structured our application is that where there’s facts, there’s essentially a  field that goes and pulls it from the database. So it’s not coming out. It essentially says, “What was the rent for the last 12 months in this property or in this neighborhood?”

14.16
But the AI model is the one that translates that prompt into some sort of SQL query?

Yeah, but I mean, we used to use Claude and we moved to Vercel, but we have basically a software sandbox and it opens it up and does all that sort of. . . This is for real estate, for most people you say, well, you probably know how to do this, but if you’re going to do an analysis about your home or your property, you know, most people can’t write Python, most people aren’t good at doing SQL queries, plus they don’t have a good understanding of the the database schema. And so we built a semantic layer on top of it. And it really democratizes data science. Originally you said we were a data company, and then AI showed up and the AI sits on top of our data, and that made it a lot easier for people because to do the type of insights or analysis that otherwise they would have no idea how to do before.

15.28
But just to clarify, the AI is not doing any kind of financial modeling or calculation, right?

No.

There’s some sort of forecasting or financial model or some sort of financial computation involved, and that’s not being done by the AI?

Right. The AI is like an orchestrator, and has the tools, right? And the different tools it uses and the tools are the web search or the calculator. I think everybody’s gone here, where I think a year ago or something, people were using vector databases and RAG and we moved away from that because you just want to be where it’s deterministic analysis. You want to just use regular software, to put that tool in the hands of the AI.

16.21
So the hard thing here is really maintaining these data sets in many ways, right? So that is the key, because you have to gather or you have to have domain knowledge to understand what data you need and what data really matters. And, now you have a year or so of history of people using the app and you’re understanding, really what’s valuable.

What’s the hard thing? I mean, it just depends on who you are. We didn’t mean to do this, but luckily we have a lot of data. The data is proprietary. The data is really valuable. And so that gives us a reason to exist because what happened is that we built RealAI and we rolled it out, and Claude arguably made it obsolete. And this is a strategy question. I think the hard thing is trying to build the software business.

17.18
How can it be obsolete if it doesn’t have access to your data?

Well, because people have. . . it’s really hard to get them out of their. . . they’re sitting in Claude. Trying to get it. And the reality is that. . .

17.38
There’s no A/B test. They can’t tell that they can get better results if they. . . 

So, our product is really good at, let’s say seven of the 15 things a real estate person needs to do. But there’s other things they need to do that they know our products are not designed to do, and so they need to have a general purpose tool that’s doing all their stuff. And so the day before yesterday, we got approved to be in the Claude marketplace. So we built a connector, we’re building a plugin, and now we’ll go to where the customer is, which is Claude. That’s our current strategy. And you can see it’s getting better. Claude is not as good as ChatGPT at making it developer-friendly. But we can build what’s almost the same as RealAI.com in Claude. And that’s where we’re currently headed. And you and I talk about strategy. I think that’s actually a temporary strategy. I don’t think that’s where the market ends up. But, yes.

18.50
But obviously, as users interact with your app, there’s a lot of learnings there that you can leverage to improve the app itself or even maybe the model powering the app. But in other words, there’s a compounding loop. So the question is will Claude cut you out of that at some point?

I think the hard thing is always the people. I think the technology is actually at least. . . You know, I’m not an AI researcher at the frontier. The hard thing is really building a software product that people become addicted to, and the data engineering and data science and stuff, that’s just a grind, this is work. In the short term, we’re sort of conceding. . . I believe we should concede that the customer wants to be in Claude today, and they don’t want to be in a different application. Claude’s like the hot new hotness. But I think they’re going to get Claude fatigue within a year. I think that the real estate people are lagging the rest of the industry. Most people who’ve been using Claude for the last six, 12 months hit a lot of limitations for enterprise. And I think they’re going to want a harness that’s designed for real estate. But, in the meantime, we’re going to sacrifice some of the things we don’t get by having them in our app. And I actually think they’ll end up going back and forth between Claude and our app, because our app is better for real estate than Claude, but Claude is better for everything else. And the way that the Claude plugin and, and I think it ultimately ends up being a RealAI app in Claude. It wants to go back and forth between our app and their app and wants to be seamless to the user. But after that—and this is really a strategy question—after that, do we end up with an open source real estate fine-tuned, trained model instead of Claude in a year or two? I don’t know, but it seems that would be a good expectation.

21.23
At the end of the day, even if you open up that model, that model still needs the data, right?

At the end of the day, that open source model a year from now. . . when we rolled out Sonnet 5, it didn’t change. It didn’t get better for the customer. Like we just don’t need the Fable. . . it’s actually worse for the customer. So I think that once the open source models are comparable to—I’m just gonna say Sonnet 5 or whatever that generation is—the customer is not getting the premium they’re paying for. They just don’t need it.

22.05
By the way, there’s tons of companies now that focus on helping enterprises get to specialized AI. And basically there’s two branches, right? So there’s the post training branch which comes down to fine tuning and reinforcement, fine tuning, tons of startups there that are coming online. And then, there’s even companies that will help you pre-train models from scratch. I think the trend is toward the inevitable simplification of both things. Which will mean that a lot more of the compute will go towards specialized models like yours. And then less of the compute going to the. . .

22.52
I’m not as confident in that. . . I mean, I’m agnostic. I think we could end up in a world where Claude replaces Microsoft and everything’s inside Claude.

Yeah, it’s possible. But then, I think that the general purpose models increasingly are going to be perceived as too overkill for a lot of things.

23.15
Yeah, I think that’s true in theory, but the consumer is so sticky and it’s hard to get them to change their behavior.

Yeah. If it’s a consumer app. But most enterprise work is just back end. . .

23.31
But I’m dealing with an SMB not like a Fortune 500, generally. And the SMB, in a lot of ways, acts more like a consumer than like an enterprise. And so I hear what you’re saying, though.

23.46
Hey, I have a question for you as far as UX. You have an application where someone is asking a question. It could be an important question for the user. How do you communicate uncertainty or how do you say, “Hey, here’s an answer, but there’s a lot of caveats behind this answer” How do you do that in your case?

24.23
That’s very hard to do. I was just getting that feedback yesterday because even facts in the data world are not 100% facts usually.

24.33
There’s alternative facts.

Yeah. I mean there’s just methodologies that change the information. Is the rent growth a point to point 12 months ago? Is it a median? There’s just a lot of ways you can get to something that’s true, but not the same answer as someone else. But my actual experience with consumers is that they actually don’t care about that. It’s all really about perceived credibility. . .

25.16
So I guess in the UX then, the question is if there’s some sort of uncertainty or disagreement, do you surface that?

25.28
Yeah, we surface data coverage. We have a whole section in the response that’s about a meta analysis about the data and about where we made decisions. . .

25.39
Or do you say, “This property, we think the rent you can charge is this?” But it’s really more likely in this interval. It’s not a specific value. And here’s the reason why there’s an interval instead of a value.

26.00
AI is really good at that kind of caveats and adding context in and again like there’s. . .

26.12
But it’s a UX problem, though. You have to decide to surface it, right?

We definitely surface it. But I find that the user ends up like it’s really a journey. In the first phase, they’re trying to determine if the data is good, and then once they’ve decided the data is good, they don’t really care about the caveats. They’ve sort of internalized to them how to think about the data. And it’s really a problem in the beginning of a user’s use of it. It’s not really a problem once they become a power user.

26.50
So I think that that’s a UX debate that people will have, moving forward. Because I think basically, like I said, in terms of actual studies around decision-making, it does make a material improvement. Since we have you, we’ll close the discussion. And before I ask a question, listeners, this is not we’re not about to give you financial advice; we’re not financial advisors. So there you go. That’s the discussion. First, first thing then, you have access to all this data in real estate, right? So you have all the patterns, but you’re also obviously an investor in AI and AI startups. Right? So, obviously you’re seeing trends in AI that you think aren’t being reflected yet in the real estate market.

27.53
I know I think you’ve mentioned to me in the past, I think so, as an example, to make this concrete, I think you mentioned to me in the past that maybe if you’re buying property with the assumption that there’s a lot of back office workers moving forward and those back office workers are located in, I don’t know where.  . . Phoenix, Arizona. . . Maybe you should have second thoughts. Right? So what are some of the AI trends that you think are not yet being priced into real estate investing?

28.28
What’s good about the trends I’m seeing in the data I’m seeing is I think they’re consonant or consistent with what people would intuitively think. So, AI is causing—in the data—a lot more disparity in outcomes. And so in real estate something used to be a truism. I mean, people will say people always need a place to live. And so you would buy workforce housing, affordable housing, things where if you have housing that’s affordable. . .

29.04
Or always buying is better than renting.

It’s just like cheaper is better than expensive, right? If you can offer housing that’s less expensive, less expensive to file, it’s less expensive to rent. That’s good business. And that actually I think is breaking down, which is maybe unintuitive but also maybe intuitive. Is that where the marginal dollars are ending up in the hands of people who have a lot of money and the people who don’t have a lot of money, which is basically the bottom half of the country, or even maybe the bottom 90% of the country. . .

29.45
95%.

Maybe. You can break a lot of different ways. But the point is that, this K-shaped economy where the normal person is doing worse and the best are doing better is. . . AI is accelerating that trend. And that way that affects real estate is if you’re an investor, you want to actually focus on the high end. If you’re going to be building, you can be investing. . . high end essentially is price-insensitive and the low end. . .

30.15
Because the low end people have no disposable income.

The low end is under strain. And then what is happening in real estate is that strain is showing up as a political manifestation of controlling pricing. And so you can’t make money providing affordably priced housing because the government won’t let you. So the government will let you take essentially excess profits from the rich, but it’s becoming more and more challenging to invest in and build for the normal person, because the government’s intervening in all sorts of small ways that people don’t see around how permits are pulled and lots of impact fees and things like that. I mean, in San Francisco and LA and New York, you see obvious examples of that. But it’s happening everywhere. And in real estate, you usually make an investment over a five year period, maybe even ten years. And so the long term trend is the most important thing. And I think then you essentially say. . . this is terrible by the way, from a social point of view, the societal point of view is very negative. I’m not commending this trend,  I’m just saying that’s what’s happening on the ground.

31.40
What about this notion that certain hubs are optimized for a certain type of work? Is that something you think about?

31.54
Yeah. That’s the thing you were I talked about last time. San Francisco is obvious, and then you look at Charlotte. But certain types of people move to certain places to get certain types of jobs and work from home drove that middle income white collar worker to work remotely, or they moved to more affordable places like Charlotte, Tampa, and Orlando, all these places where it’s affordable to live, and they do middle office work, back office work, and that job is getting decimated by AI. In particular, a lot of cities where young people would move there. They’d move to an apartment building, they’d move to downtown. They’d have a new job in a middle office of a medium to big size company. Those jobs don’t exist today. And so they’re struggling with where to live and they have roommates or living at home. And so the real estate that used to be where young people moved to is struggling as a result.

33.08
So I took you on your first Waymo ride. And how about things like that? I mean, now I can Waymo from anywhere.

33.19
I tried to invest in Waymo and I was not yet successful okay. I reached out to the CEO I had 37 connections to and I got no love. But yeah, the Waymo thing is such a good example of diffusion, a diffusion problem because the technology is completely mature and you can’t get it rolled out in any of the. . . DC’s fighting it and Boston’s fighting it. And for it to really affect real estate, it needs to become as seamless as Uber and Uber rolled out way faster, way more aggressively. They obviously took more risk on the rollout. So, you know, if you said ten years from now, how does that affect the patterns of living? I think you’re going to see. . . I’ve looked at this a number of times, but I think it’s premature to make these investments. You want to be investing in the wealthy satellite towns of. . . if you’re doing San Francisco, which is a little bit challenging to the Athertons. But in Atlanta, it’s the Greenvilles. There’s a lot of great wealthy exurbs that have many miniature downtowns that are cute. And so I think you’re going to see these satellite cities become very, very successful as a result. But those satellite cities are going to be mostly for the wealthy. So again, it’s all about wealth, not about affordability.

34.50
All right. Closing question. You’re a CEO. I know you’ve talked about the impact of AI and automation on hiring. And you talk to other CEOs. So as best you can tell, set aside the headlines and the news accounts. What are you hearing from CEOs about AI’s impact on the workforce and hiring? Hiring in particular.

35.20
It’s more mixed than the headlines. I think I’d say it’s both true that we have needed less people, haven’t hired as many people and also have needed to expand as a result of AI. And so I think I’m hearing a “both” situation. So it’s really a question of what’s the net impact? And I feel like it’s too soon to call. I think on net it’s still net negative on hiring, but it’s too fuzzy for me to have a good call on it.

35.58
Do you have any sense whether or not all the stories we’re reading about. . . if it’s particularly challenging for new college grads and people looking for that entry level job?

36.17
We don’t hire those people, and we rarely ever did.

Because the stereotype is those jobs I can just use AI.

36.28
I think of it as this cascade effect. Where we hired hundreds of people over the years, and what happened was there’s this elevator dynamic or escalator dynamic, where the person who was an early grad becomes middle and then they make space for the next person.

36.52
The talent pipeline, right?

Right. And that dynamic. . . AI’s changed it so much because you just don’t need. . . the people who are at the upper middle are so effective. . . And actually, this is something everybody learned in 2020-2021—more people means less work gets done because you have to manage people and you’re needing meetings and remote work is really brutal for information transfer. And so it’s actually way more effective just to do it yourself with AI than it is actually to have five people. And I think it’s actually more satisfying. And so I believe I’m net negative on jobs in the white collar work. And we’ve invested in some data centers that are like $50 billion data centers. And when you go there, there are thousands of people on site working. I mean, it looks like we’re in China. . .

37.50
For now, while they’re building it.

So I think what’s happening is that the job market doesn’t seem as bad because of this trillion dollar a year AI CapEx build. But I think that’s a five-year build, not a 50-year build. And then I think that in the meantime, that’s coring out the white collar worker. And so I think on the other side of this, when the bubble finally bursts, it’s going to be a deep trough.

38.22
So then that talent pipeline . . . if you don’t have the entry level jobs who become the middle managers. . . and so on and so forth. . . So you have the entry level developer who gets more knowledgeable. . . then you don’t have that. Right? So you end up with what?

38.42
Your talent pipeline, it’s a thing. I’ve one of the things I’ve said to the team and this is harsh, but I’m going to say it, but it’s a brutal thing. There’s a lot of people in an organization who are good but aren’t going to be the next great people. And I said, “If we don’t have a talent pipeline anymore, you need to turn those people over faster.” Essentially, unless you were bad. . . bad people managed out, but if you’re good, we kept you. But if you’re great, you get promoted. But now if you don’t have this talent pipeline, you have to change what you expect of the good. You have to turn over some of them, and look for people who are good with the prospect of building that. . . So you have to change the talent pipeline or talent escalator because you don’t have as many people coming through as you used to. So it’s more of an up-or-out dynamic than it used to be.

39.42
Oh, I forgot one last question on RealAI, which is, I think you still do seat based pricing, right?

39.52
We don’t know how to price it.


So that’s it then? If I’m a real estate analyst, you’re charging me $50 a month, but I’m hammering this thing, costing you $1,000 a month.

40.04
No. The seat buys a certain number of tokens. So it’s more like it’s more like usage tiers, is how it’s priced today, but I don’t know how to price it. We’re still early in this evolution. I mean, we’re real estate. . . so real estate is going to be lagging other sectors in terms of adoption. And so I don’t know what the right way to price it is because it doesn’t want to be only usage, either, I think that’s not right. But I don’t know the answer.

40.41
But even the tiered pricing, if I’m on a token matter, at some point I’m already at your top tier price and I’m still busting through it.

40.52
Yeah, that’s a great situation though, because tokens aren’t that expensive. I know everybody’s obsessed with them, but I think tokens are the smallest part of our cost.

41.04
But if you’re charging me $200 at the very top tier, I’m actually spending so much compute. . .

41.15
I think that would be a great scenario to have in the future. . . for the few power users, that’s happening for us. Great. I hope they feel like they’re getting a good deal.

41.26
And with that, thank you, Ben.

Yeah. Thanks, Ben. Thanks for having me.

Great name, by the way.

15:56

WordPress as the text of the web [Scripting News]

I wrote something candid on Twitter last week and felt it was worth repeating here. It is a bit judgmental, and for that I apologize. But I couldn't keep the meaning without all the words.

  • Shaking my head thinking can't the people of WordPress see that what it needs is a simple normal writing interface, and a great API for competitive apps. That's the big opportunity you all can't see for some reason.
  • Once you have that, you can now move WordPress into position as the text of the web. And it has the market all to itself because the other text apps of the web place ridiculous constraints on text.
  • They got this idea in their heads that the web would be better if they eliminated all the writers features. Maybe that's because they weren't writers. ;-)

I know this is a story I repeat often. The opportunity is still there. All kinds of bad products and companies are camped out in this space, taking advantage of users' trust but they feel they have no choice but to use the bad products. On the web, we'd like to keep improving what the web can do with text, so even though it's always slightly more difficult to use an open ecosystem, it is possible to get most of the functionality and all of the freedom, and new features that the lock-in guys will never give you.

15:21

rsync 3.5.0 released [LWN.net]

Version 3.5.0 of rsync has been released with a huge number of security fixes:

This release fixes 33 security issues found during a focused audit of rsync's path handling and daemon protocol, a companion daemon-protocol fuzzing pass, and reports from external researchers -⁠-⁠ plus several robustness hardenings. CVE IDs were assigned by VulnCheck (CNA); the precise "introduced in" version ranges accompany each advisory, and many are much narrower than "everything before 3.5.0". Every fix ships with a regression test in the test suite that fails on the unfixed tree.

[$] 128-Bit page tables for Arm [LWN.net]

The size of a processor's page-table entries directly limits how much physical memory that processor is able to access. Back in the 32-bit days, that limit was 4GB, an amount of memory that once seemed nearly infinite, but which would now struggle to hold a basic AI-enabled "hello world" app. The expansion to 64 bits on most popular architectures would seem to have removed those limits now; some Arm systems, for example, can use 56 of those bits to access up to 72PB of memory. So it might be surprising that the Arm architecture is evolving to support even larger page-table entries (PTEs). This patch set from Anshuman Khandual adds support for 128-bit PTEs, but who will benefit from this capability is not entirely clear.

14:35

Security updates for Thursday [LWN.net]

Security updates have been issued by AlmaLinux (abrt, dhcpcd, edk2, freerdp, gegl04, grafana, gstreamer1-plugins-good, iscsi-initiator-utils, isns-utils, kernel, kernel-rt, keylime, libarchive, libyang, nodejs-nodemon, opencryptoki, osbuild-composer, pacemaker, postgresql-jdbc, postgresql18, python-idna, python3.9, udisks2, valkey, vim, xorg-x11-server-Xwayland, and yggdrasil-worker-package-manager), Debian (flatpak, lemonldap-ng, neutron, python-django, spip, xdg-dbus-proxy, and xorg-server), Fedora (apr-util, cri-o1.34, libcupsfilters, linux-firmware, sqlite, and vaultwarden), Gentoo (FreeType), Oracle (dovecot, evince, fence-agents, gnutls, gstreamer1-plugins-bad-free, gstreamer1-plugins-good, isns-utils, java-1.8.0-openjdk, kernel, libarchive, osbuild-composer, pipewire, postgresql, ruby, ruby:3.3, sudo, and udisks2), Red Hat (bind, bind9.16, gnome-remote-desktop, grafana, opentelemetry-collector, python-pillow, python3, python3.12, python3.14, python3.9, and rhc), SUSE (chromium, clusterctl, dracut, gd, git-cliff, gleam, govulncheck-vulndb, graphicsmagick, gzip, kernel, kubevirt, libheif, librest0_7, nodejs22, nodejs24, openssh, openvpn, python3, python313-scikit-learn, rpm, stunnel, and zk), and Ubuntu (kernel, libgit2, linux, linux-aws, linux-aws-fips, linux-azure, linux-azure-6.8, linux-azure-fde, linux-azure-fde-6.8, linux-azure-fips, linux-fips, linux-gcp, linux-gcp-6.8, linux-gcp-fips, linux-gke, linux-gkeop, linux-ibm, linux-ibm-6.8, linux-nvidia, linux-nvidia-6.8, linux-nvidia-lowlatency, linux-realtime, linux-realtime-6.8, linux-xilinx, linux, linux-aws, linux-aws-fips, linux-azure, linux-azure-fde, linux-azure-fips, linux-gkeop, linux-ibm, linux-ibm-5.15, linux-intel-iot-realtime, linux-intel-iotg, linux-intel-iotg-5.15, linux-kvm, linux-nvidia, linux-nvidia-tegra, linux-nvidia-tegra-5.15, linux-oracle-5.15, linux-realtime, linux-xilinx-zynqmp, linux, linux-aws, linux-aws-fips, linux-azure-4.15, linux-azure-fips, linux-fips, linux-gcp-4.15, linux-gcp-fips, linux-kvm, linux, linux-aws, linux-azure, linux-azure-fde, linux-ibm, linux-oracle, linux-raspi, linux-realtime, linux-azure, linux-azure-6.17, linux-gcp-6.17, linux-hwe-6.17, linux-oem-6.17, linux-realtime-6.17, node-follow-redirects, and yelp).

14:28

Make America America Again [Scripting News]

The press is freaking out about Democratic Socialist candidates winning elections all over the country.

They can relax, because the government of the United States thrives on different points of view, and thus -- compromise.

The Democrats can have any combination of points of view, as long as they play by the rules of democracy. In fact it would be an even better demo if their points of view were more diverse.

The coalition the press talks about are the people who vote for America. This is true -- if they vote for the Republicans this time around, they're voting for the party that is dismantling America. Spin it all you want, but we can see what's happening.

And btw, the assumption that the voters are too dumb to figure this out -- I think that's incorrect. But as long as you talk to them as if they are that dumb, what choice do they have. Put out an idea of what America is and if it's right, and reaches both the heart and the mind they will get behind it. Everyone knows we're in a dangerous spot, with secret police roaming the cities, ready to crack down on dissent, but so far they haven't dared to go that far. People feel that. And that's what you must run on.

The best ad I've ever seen on this theme was for the Bernie Sanders campaign for the 2016 nomination. I'm reduced to tears every time I watch that ad, and I wasn't a Sanders supporter in 2016.

12:56

CodeSOD: Never Eating the Cookie [The Daily WTF]

Maciej works as a freelancer, and that frequently means picking up old PHP code that nobody wants to support.

One project had been lingering for ages with key features missing. Specifically, it was supposed to make HTTP requests to other services on an interval, and use that to populate its data. "The old dev tried, but never got it working." It was Maciej's turn to give it a shot.

$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookie );
curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
curl_setopt( $ch, CURLOPT_COOKIE, $cookie);
// ... many other options set, of course not in a function, just copy-pasted in many locations in the code ...
curl_setopt( $ch, CURLOPT_TIMEOUT, $interval  );
$s = curl_exec( $ch );
curl_close( $ch );

This particular block of code appeared multiple times in the code. Every place they meant to send an HTTP request, they copy/pasted this code in. The URL would be a different value, but the bulk of the code was just a dozen lines of copy/pasted curl_setopts.

Now, I don't know that they were dreaming that setting CURLOPT_TIMEOUT was setting a recurrence interval. But they do call the value $interval, and I can imagine the ignorant hoping to set up cURL to automatically reinvoke the request on an interval. But even if that's their goal, that's not the actual problem with this code.

They initialize a cURL wrapper, set a pile of options, and then execute the request, storing the result in $s. And do you know what they do with the contents of $s after this?

Nothing.

The request works, perhaps not on an interval, and populates the variable, and they just never use it. The old dev "tried" and never got it working? It seems like they started and got bored.

There was far worse spaghetti code to manage in the project, but it was this gap that really got Maciej's attention.

[Advertisement] Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.Learn more.

12:42

Joe Marshall: A Web Site in Vibe Coded Common Lisp [Planet Lisp]

I believe that vibe coding is the future. This is crazy because last year I was a skeptic. Last year LLMs couldn't write large Lisp programs. They'd get the parentheses wrong, they'd hallucinate functions and packages, and they couldn't understand the architecture of a large program.

This is all in the past.

A SOTA frontier LLM absoulely can write large lisp programs. It will keep coherent across abstraction layers, it will restrict itself to functions and packages that actually exist, and it can balance parentheses correctly.

I put my money where my mouth is. jrm-code-project.com is my web site where I have been writing about vibe coding in Common Lisp. The site is written in 100% Common Lisp and it is 100% vibe coded. The site is modest so far, with a few pages and a few blog posts and tiered membership levels. It isn't pretty; neither I nor my LLM is a graphic designer. As a pedagogic exercise I added a Lisp pastebin to the site. I invite people to create a free account and try it out. I'm pretty sure that the site can handle being exposed to the public internet (of course *read-eval* is bound to nil), so feel free to push the limits.

12:14

Separating AI’s Technological Problems from Its Capitalism Problems [Schneier on Security]

This essay was written with Nathan E. Sanders, and originally appeared in Tech Policy Press.

AI represents the first time we humans can do cognitive work outside of our bodies at scale. The only comparable moment is the early years of the industrial revolution, when new technologies like the steam engine provided a quantum leap in our ability to do mechanical work outside of our bodies at scale. If AI’s cognitive capabilities become integrated into our lives, businesses, and governments—a process that will take years if not decades—society will be as unrecognizable as the modern world would be to a preindustrial farmer. And yet, Americans—by a wide margin—say that AI is moving too fast and will have a negative effect on society.

This confluence of technological revolution and public distrust deserves urgent discussion, and a proper framing. The question is not whether it is possible to develop AI in a non-exploitative way, or even whether we can trust AI companies to act in the public interest. The question is whether we will recognize that our existing social and economic systems are failing to achieve these outcomes, and whether we can act in time to make structural change.

Today’s AI is mired in political and economic systems developed generations ago that were never designed to manage widespread computation, let alone automated cognition. The gaps in those systems—and their proclivity to be exploited—are the primary influence on how the technology is being developed, deployed, and used.

In any discussion about AI’s potential, it’s important to separate the technology from the socio-political system it’s embedded in. That AIs can lack context, mix up facts, or fall for stupid tricks are all technological problems. Because the giant developers like OpenAI and Anthropic have prioritized solving them, AIs can now more easily access resources like the web or email, are more disciplined about using those resources, and are better at staying within their guardrails.

Yet AI developers do not seem to be prioritizing other technological problems. Major AI models still act far more sycophantic than humans, telling people what they want to hear even when untrue or not in their best interests. Popular AI models tend to answer questions confidently even when they lack training, knowledge, or evidence to back their claims. In both cases, AI developers choose to train models that please users with flattery and the appearance of competence, rather than constraining them to act in users’ and society’s best interests.

In contrast, ensuring that AI models benefit people broadly, that their energy costs are fairly allocated, that their environmental impacts are minimized, and that they don’t steal content and revenue from publishers are all questions of incentives in a capitalist system.

It’s easy to conflate technology problems with capitalism problems. Back in 2021, science-fiction writer and AI commentator Ted Chiang said that “most fears about AI are best understood as fears about capitalism.” It’s not the tech per se; it’s who controls it and how it could be used against us.

Imagine an AI assistant for a doctor. We can imagine it affecting the profession in one of two ways. The AI could give a doctor more time to do the human parts of their job: to spend more time with their patients, to listen more closely to their needs, to explain things more fully. Or the managers of the medical practice could give that doctor five times the patients—and fire the other four. Which way it would go is not a question of technology. It’s a question of market incentives.

The two are related, of course. Capitalism steers technology, and technology steers markets. But holding the two separate helps us understand that we, as a society, face independent choices on both the technological and sociopolitical axes that need not be coupled.

For example, consider the costs of AI. The leading US labs tout to investors that their frontier models are very expensive and energy-intensive. There are significant technological challenges about improving their energy efficiency, but the sociopolitical questions are more pertinent. It’s a corporate decision made under capitalist market incentives to constantly pursue new models that incrementally push the frontier—at enormous capital cost—and to use them, seemingly, everywhere. Nothing about the technology of AI dictates that models must be retrained constantly, at the largest possible scale. Or that they have to run on every web search, every interaction with your phone, and every time you walk by a security camera.

In a different political and economic system, Chinese developers are producing—and then giving away—smaller, more efficient, more affordable models. While the US government seeks to restrict China’s access to the most advanced chips, China is betting that incentivizing their tech giants to create leaner, more open models using more commodity hardware—models that can be trained with older chips and run even on personal computers—will be an advantage in achieving widespread use and, perhaps, Chinese national influence.

There are other pathways for AI development that are not in service of private capital gains nor authoritarian regimes, but rather a democratic public interest. The best example comes from Switzerland, where public institutions—research funding agencies, universities, supercomputing centers—have collaborated to produce an AI model called Apertus. It is trained entirely on data validated to be licensed for use with AI (not stolen), on preexisting public computing infrastructure, and using renewable hydropower. Its developers are incentivized to produce a public good, not turn a private profit.

It’s dangerous to confuse technology problems with sociopolitical ones. Popular proposals like pausing AI research, moratoria on data center development, or subjecting frontier models to federal government screening are all framed as addressing problems with AI’s technological development, but fail to take into account the larger social problems that govern it. China’s success with government-endorsed development of open-weight frontier models illustrates the futility of keeping AI tech as national secrets, or of any pledge to scale back deployment.

AI is already legitimately useful for a wide range of tasks. It can be a tool for public good, if we choose to solve its sociopolitical problems. Our goal should not be to slow its pace of improvement or scale of deployment, but rather to steer it away from consolidating power and towards the public benefit. We can build sustainable AI, minimizing environmental and energy impacts. And we can equitably distribute the material gains it produces.

Integrating a technology as disruptive as AI responsibly requires structural reforms, and we should decouple the social and technological aspects of AI to design those reforms. Companies—including tech giants—should be forced to pay the energy and environmental costs of its development. Profits should be taxed adequately and redistributed. Antitrust laws should be strongly enforced. Corporations should have a fiduciary responsibility to stakeholders beyond their majority shareholders. These badly needed reforms are responsive to the problems with capitalism that AI is exacerbating, even if they are not specific to the technology.

11:28

Grrl Power #1486 – And pause for the not-surprise attack… [Grrl Power]

Maybe she went to go eat some spinach, or took a Proton Energy Pills which gives her the power of 10,000 atomic bombs for ten seconds? Look, all things being equal, I’d rather have the power of 1,000 atom bombs for 100 seconds, or maybe even 100 a-bombs for 1,000 seconds. What I wouldn’t want is the power of 1 a-bomb for 10,000 seconds, because it seems like you’d wrap up most adventures pretty quickly with that kind of chutzpah, and you’d be standing around for 7,000 seconds waiting for the pill to wear off so you can go get lunch without accidentally blowing up the diner.

The tournament is supposed to be no-holds barred, but they’ve slowly introduced rules over the years to keep things moving along. Did you guys ever see the earliest UFC matches? They hadn’t refined the rules, and so a lot of matches turned into “grappler takes a few hits while diving in to grab at someone’s midsection, they go down, and the grappler spends the next 25 minutes trying to force the other guy to tap out. I only ever watched a few matches in the early days, and after that, I’ve seen the occasional highlight on reddit or wherever, but I’m pretty sure if you get grappled, you’ve got less than 25 minutes to get out of it these days. Or maybe not. Maybe all the grapplers have had to learn that almost-hyperextend-your-elbow hold to force people to tap out.

I’ve peppered in the rules for the UCBA, and I’ll try and remember and list them all here. It is a deathmatch, meaning you can kill, but if someone yields, it’s pretty bad form to keep pounding on them. Fighting at this level means someone can launch an ICBM, causing the target to yield, but that doesn’t necessarily mean the guy who launched it can abort it in the two seconds before it hits. It comes down to a call by judges, though it’s rare that anyone gets removed from the tournament for ignoring yields.

Only a single entity can enter the tournament. In the case of something like a space ship or a gunship, the ship itself is considered the entrant. Crew can man exosuits and fly around outside of the ship and attack other competitors, because a mage could just as easily summon a phantom army or the like, but if the mage goes down, the phantom army would probably disperse, and even if they don’t, they can’t win that round of the tournament in the mage’s place. Similarly, when the space ship goes down, the round is lost for the crew as well. Someone could pilot a mecha-godzilla while wearing Iron Man armor, and when the mega-mech gets destroyed, the guy in the suit can eject and keep fighting, but only if he is the registered entrant and not the mega-mech.

You can’t endanger non-combatants. There’s almost never a case where that can happen, since the matches take place 100 kilometers from any other sapient life form (and there’s reasonable effort taken to not hold matches in or near national parks or endangered wetlands or nature preserves and the like) but if you have an ability to open a portal to redirect that meteor swarm attack, and the exit portal opens over Times Square, you will be disqualified at best.

You can leave the combat area for up to 30 seconds. That’s generally a bad idea though, because if you step out of the ring for ten seconds to catch your breath, another competitor might try and pin you for 20 seconds, then jump back in bounds once you’re ringed out. Also, when you leave the arena, you “spend” those 30 seconds. You can earn more out-of-bounds time at the rate of 1 second for every ten spent in-bounds. This is to keep competitors from jumping in and out of bounds and skirting the edge of the arena. The matches are much more interesting when everyone is battle-royaling in the middle.

No off-table support. You can bring a bag of holding or your very own mass-fabricator, but you can’t bring a laser designator and call down tungsten rods from geostationary orbit or artillery from a land-battleship parked just out of bounds.

You can possess other competitors. It is advised that all competitors have reasonable mental defenses. If you win the match with someone else’s body, you can’t ride them into the next match. If possessing someone destroys your original body, or at least the body you entered with, you and your host are out of the tournament.

Hmm. I think that’s it. I’ve probably mentioned a few things in the comments that I’ve left out, but I think that’s the bulk of it.


Oh, look who it is in the vote incentive. And a not-quite-yet-but-it’s-coming NSFW version over at Patreon.

Vote incentive and Patreon updated with some shading. Not finished yet, but progress.

I think she would get in trouble for doing this. She’d mess up the… floor of the waterfall? Is that what it’s called? The receiving pool? No, probably not that. Anyway, she’d churn things up and cause a ton of weird erosion.

Since you might be wondering, Niagara Falls is about 165 feet high, so Babezilla obviously doesn’t have to be full sized. I’d say she’s about 175-180 feet tall here?


Double res version will be posted over at Patreon. Feel free to contribute as much as you like.

10:00

Jonathan Dowland: DIY skate punch-out [Planet Debian]

The punch set-up
the punched boot

Since I wrote about my fly30 ice skates, I'd continued to battle pain around the navicular bone in my feet. The action that seems to have finally fixed it was to perform a "punch out": a very localized remoulding of the area of the boot that presses against the sore area.

I basically followed the process from this helpful YouTube video.

I narrowed down the exact spot by borrowing some lipstick and transferring it from my navicular bone to the boot lining, then making that more permanent with a sharpie.

My punch was a spare part from a radiator valve which I packed with US cents (I couldn't fit any UK coins in). For the receiving-end, I tried another part from the radiator valve but I think it wasn't sufficiently larger than the punch to work well, so I swapped that out for a spoon.

take 2

take 2

I didn't have a temperature sensor I could use and I used a heat gun rather than a hairdryer, so I YOLO'd it a little. Some of the wrap on one of my boots is now distorted from where I didn't move the heat gun enough. It only took a minute or two to get the boot hot enough to be flexible. I set a 15 minute timer once the clamp was in place.

I've only skated one session since I did this but the pain seems to have gone! It's remarkably freeing to be skating without constantly trying to manage pain. Now I can focus on technique.

09:42

Beating yourself up [Seth's Blog]

Is it helping?

You wouldn’t stay by passively if someone else was beating you up.

Perhaps we shouldn’t accept it when we do it.

08:28

Freexian Collaborators: Debian Contributions: DebConf 26 organization, d-i VLAN support and more! (by Anupa Ann Joseph) [Planet Debian]

Debian Contributions: 2026-07

Contributing to Debian is part of Freexian’s mission. This article covers the latest achievements of Freexian and their collaborators. All of this is made possible by organizations subscribing to our Long Term Support contracts and consulting services.

DebConf 26 organization, by Lucas Kanashiro, Santiago Ruano Rincón, Stefano Rivera and Antonio Terceiro

The 27th Annual Debian Conference was held in Santa Fe, Argentina, and several Freexian fellows were quite busy by being involved in the organization team.

  • Santiago continued helping with duties related to the local team, e.g. preparing or proof-reading some announcements, reviewing the proposed food and the menus for the different diet required.
  • During the conference, Kanashiro and Santiago also carried over tasks related to the content of the conference, including updating the schedule as it became necessary during the event.
  • Stefano worked within the core video team, setting up equipment in talk rooms and coordinating the live video streaming. Stefano also supported the front desk and local organisers as a website developer and conference book-keeper.
  • Antonio kept working on website maintenance, specially in support of the content team. During DebConf he also ran a hands-on workshop to help interested contributors get started with developing the DebConf websites.

d-i VLAN support, by Colin Watson

In environments that use IEEE 802.1Q VLANs, some hosts (such as routers attached to “trunk” ports) may need to apply VLAN tags themselves rather than relying on switches to do so. There has been a long-running request to add support for these to the Debian installer with a proposed patch set put together by several people over the years, and a Freexian customer asked us to help get this over the line. Colin reviewed the latest version of the patch set, applied a number of corrections, added Netplan support, spent some time testing a variety of possible paths through the installer, and landed this. There’s also now documentation for this in the next version of the installation guide.

Miscellaneous contributions

  • Carles wrote documentation for installing Mailman3 and migrating from Mailman2. Added it into Mailman3 upstream documentation.
  • Carles, using po-debconf-manager: reviewed 2 packages, submitted 2 packages
  • Carles organized Catalan translation update. Created a Debian Wiki page to have an overview of the work / coordination during next months. Reviewed and submitted some pages.
  • Carles improved the documentation for building the debian.org Web in MR 1154 and MR 1557. Fixed debian-reference documentation. Added sections on Mutt Wiki page (handling of mailto, viewing HTML parts web browser), update and improve bash-completion Wiki page. Added a troubleshooting section in Signal Wiki.
  • Thorsten did another upload of hplip to fix RC bugs. He also spent some time taking care of older bugs. Most of the time such bugs had been fixed in a previous upload but haven’t been closed in the BTS. He also uploaded a new upstream version of foomatic-db. Last but not least, he gave some user support with the package epson-inkjet-printer-escpr. There seems to be a new software available for Epson printers. Unfortunately the license is not compatible with DFSG and so this software will never make it into Debian.
  • During DebCamp 26, the Golang team had a dedicated Sprint to transition the Golang toolchain (namely on dh-golang) to make builds aware of the module defined upstream with the aim of solving important issues. To help in these efforts, Santiago made changes in the Salsa CI pipeline and documented on how to use it to check if a package requires adjustments after the toolchain update.
  • Santiago continued co-mentoring Aryan Karamtoth on the Linux livepatching project, specifically providing feedback about the implementation of dlp-tools.
  • Stefano reviewed and merged a migration of Debian reimbursements from wkhtmltopdf to weasyprint, unblocking an upgrade to Debian trixie.
  • Stefano’s cPython upstream merge request adding multiarch tags to stable ABI extensions was finally merged.
  • Stefano iterated on his upstream cPython merge request to add CI coverage for Debian’s multi-arch expectations.
  • Stefano uploaded Python 3.15.0 beta 4 to Debian experimental.
  • Stefano uploaded Python 3.13 to trixie, fixing a regression in a previous trixie point update he made.
  • Helmut continued to report undeclared file conflicts.
  • Helmut sent patches for three cross build failures.
  • Helmut proposed a MR to port piuparts to pathlib.
  • Antonio has done quite some work on Debian CI, including rebuilding the Debian CI armhf/armel worker VMs, and releasing debci 4.2, implementing a backup scheme, and several improvements to the codebase such as improving the incus-lxc backend in preparation for switching to the upcoming switch to using it by default as announced in the latest bits from the ci.debian.net operators.
  • Emilio helped with transitions, particularly with Python 3.14 as default and Perl 5.42. During the Perl transition, an issue was identified with how britney schedules autopkgtests for binNMUs, and that testing was reverted for the time being.
  • Colin restructured openssh-* binary packages to better support the upcoming GSS-API package split. This caused several autopkgtest regressions in other packages because openssh-server no longer depends on openssh-client, all of which have fixes either pending review or merged now.
  • Lucas started a discussion around the creation of a Debian packaging video course for newcomers in the context of the Outreach team.
  • Lucas reviewed some contributions to ruby3.4 and provided feedback.
  • Anupa worked with Jean-Pierre Giraud on the point release announcements for Debian 13.6 and Debian 12.15.
  • Anupa joined Jean-Pierre Giraud to prepare the Micronews for DebConf 26 press coverage.

06:07

The comments that go into code versus those that go into the pull request description [The Old New Thing]

When you submit a pull request, there are two places you can use to help explain what you are doing and why you are doing it. One is the pull request description, and another is the code you are modifying. And it’s important to understand the difference between them.

The pull request is where you justify why your change should be accepted. In the title, you spell out the problem you are fixing or the feature you are adding.

Add support for polarity reversal

Fix crash when polarity changes

In a large code base, you may need to be a little more specific.

Add support for widget polarity reversal

Fix widget crash when polarity changes twice in a short time

When somebody is chasing down a regression, they are going to be looking over all of the PRs that went into the branch recently, and having a good title will make it easier for them to identify which changes are likely to be a source of the problem.

For example, if somebody is investigating a doodad crash, they may look into “Add support for widget polarity reversal” because their doodad uses widgets, and maybe the problem is caused by a reverse-polarity widget that their doodad isn’t handling. On the other hand, they can pay less attention to the fix for the crash when widget polarity changes because that’s unlikely to be the reason the doodad is crashing. And if their doodad doesn’t use widgets at all, they may just skip over both of them.

If the PR had used the original titles of “Add support for polarity reversal”, without any mention of widgets, then a team investigating a regression in gadgets would have to dig into the PR (because gadgets also have polarity), only to realize that it’s about widget polarity, not gadget polarity.

The description of the PR talks about the source of the problem and how you fixed and validated it. This is point-in-time information where you justify to your reviewer why the change is needed and why your particular implementation of the change is correct. Discuss alternative designs and why they were rejected (e.g. because they were too risky). Show before-and-after screen shots showing that the problem is fixed. Confirm that associated paperwork has been completed, like unit tests. There might be standard paperwork for this, such as a “checkin template”. (It is often the case that the closer a project comes to release, the more stringent the paperwork. For example, late in the product cycle, you may need to demonstrate that the release management team has deemed that the bug meets the bug bar.)

In other words, the PR description is a point in time statement, providing information that is relevant to the code review itself. It is an exercise in persuasive writing: You are trying to convince the approver that your change should be accepted.

Comments in the code are for talking about the code itself. What is the correct way to call this function? Does it have specific prerequisites? This information is durable: It is information that remains useful even after the pull request completes.

Okay, so let’s do an exercise: I’m going to provide some text, and you tell me where it goes. These are all actual comments (suitably redacted) from PRs I have reviewed.

I have checked all calls to the function, and this was the only one that passed the wrong flag.

This goes into the pull request description. It is justifying why your change is correct, and in particular, it’s answering a question that a reviewer is likely to ask: “It’s great that you’re fixing this one caller of the function, but are there other callers that make the same mistake?” Putting this comment in the code itself would be wrong because the claim is valid only at the time the pull request is made. After the pull request, somebody might add a new call to the function that passes the wrong flag, and it is not true that you validated that new caller.

The JSON schema accepted by this function is documented 〈here〉.

This goes into the code. It is explaining how to use the function correctly. This information is important not just at the time you submit the pull request but also for an indefinite period of time in the future. (At least, until you change the function or the schema.)

The Doodad component will take advantage of polarity reversal.

This goes into the pull request description. It is justifying why you need to implement polarity reversal today. If you put this in the code, the future tense suggests that we are still waiting for Doodad. And future changes to the Doodad might cause them to stop relying on polarity reversal; when they do that, they are unlikely to come and update this comment in somebody else’s component. The comment also suggests that if you confirm with the Doodad team that they don’t need polarity reversal any more, it is safe to remove support for polarity reversal, which might not be the case if other components started using the feature as well.

Still, knowing that Doodad is the intended audience for the feature is worth noting for posterity.

// Polarity reversal was initially added for the benefit of
// the Doodad component.

Bonus chatter: Another thing to consider when making code comments is that the code comment needs to make sense even without the PR description. Suppose you are writing a function with the intention of deprecating an older function that it is replacing. Don’t add this comment to the new function:

// When all clients have migrated to the new function, keep this.

This makes no sense to someone who is seeing the comment without having also seen (and remembered) the PR that introduced it. It sounds like the comment is saying, “When X happens, take no action.”

What you should do is put a comment on the old function:

// When all clients have migrated to the new function, delete this function.
 

The post The comments that go into code versus those that go into the pull request description appeared first on The Old New Thing.

01:49

[$] LWN.net Weekly Edition for August 13, 2026 [LWN.net]

Inside this week's LWN.net Weekly Edition:

  • Front: BPF and binfmt_misc; CrossPoint ebook firmware; KVM planes; BPF formal verification; shadow-utils; new storage-code testing features.
  • Briefs: Django releases; GNOME shell; LightDM 1.33.0; QEMU 11.1; uutils 0.10; Software Stewardship Lab; Quotes; ...
  • Announcements: Newsletters, conferences, security updates, patches, and more.

00:49

Brokon [Penny Arcade]

Among fighting game developers, one stands out as more damp and weird than the others. Their carapace is more mottled, their palps somehow more pedi than the rest. Arc System Works! We've been fans of their fermented, piquant takes on the genre for a while and were delighted to see they'd managed to enter the 3D era without giving up the incredible silhouettes of their 2D heritage. Gabriel thought he might sip the summerwine one last time with Marvel Tokon, as he had in the days of his exultant youth, but he says that he washed out during the tutorial. I don't have the game, so I don't know what that would even look like, but the tutorial for 2XKO was perverse enough that I might be able to guess. It was like Operant Conditioning, like I was gonna have to falsify some number of lights at some point or murder a public figure. I didn't even dislike it, necessarily! But it did feel like I was being psychologically terraformed by a force alien to our Earth.

00:42

Reproducible Builds: Reproducible Builds summit 2026 to take place in Gothenburg [Planet Debian]

This event is happening soon — see below for registration instructions!

We are extremely pleased to announce the upcoming Reproducible Builds summit, which will take place from September 22nd—24th 2026 in the city of Gothenburg, Sweden.

This year, we are thrilled to host the tenth edition of this exciting event, following the success of previous summits in various iconic locations around the world, including Vienna (2025), Hamburg (2023—2024), Venice (2022), Marrakesh (2019), Paris (2018), Berlin (2017), Berlin (2016) and Athens (2015).

If you’re excited about joining us this year, please make sure to read the event page which has more details about the event and location. As in previous years, we will be sending invitations to all those who attended our previous summit events or expressed interest to do so. However, even if you do not receive a personal invitation, please do email the organizers and we will find a way to accommodate you.

About the event

The Reproducible Builds Summit is a unique gathering that brings together attendees from diverse projects, united by a shared vision of advancing the Reproducible Builds effort. During this enriching event, participants will have the opportunity to engage in discussions, establish connections and exchange ideas to drive progress in this vital field. Our aim is to create an inclusive space that fosters collaboration, innovation and problem-solving.

Schedule

Although the exact content of the meeting will be shaped by the participants, the main goals will include:

  • Update & exchange about the status of reproducible builds in various projects.
  • Improve collaboration both between and inside projects.
  • Expand the scope and reach of reproducible builds to more projects.
  • Work together and hack on solutions.
  • Establish space for more strategic and long-term thinking than is possible in virtual channels.
  • Brainstorm designs on tools enabling users to get the most benefits from reproducible builds.
  • Discuss how reproducible builds will be usable and meaningful to users and developers alike.

Logs and minutes will be published after the meeting.

Location & date

Registration instructions

Please reach out if you’d like to participate in hopefully interesting, inspiring and intense technical sessions about reproducible builds and beyond!

We look forward to what we anticipate to be yet another extraordinary event!

Redox gets installer improvements, merges new CPU scheduler [OSnews]

Another month started almost two weeks ago, so we’ve got a new monthly report from Redox, the general purpose operating system written in Rust. The month of July – it seems the report was published with a bit of a delay, regardless of what the date on their site says – brought improvements to the installer, with new options commonly found in most installers, such as a choice of installation method, network-based installation, and more. The Google Summer of Code work on the new CPU scheduler has also been merged, including a number of related performance enhancements.

There’s improvements to the ARM port, Amlogic Meson UART ARM64 support, and uutils grep and sed have been successfully built on Redox, replacing their their GNU counterparts in the os-test test suite. In addition, a whole slew of demos were ported as well, from Ratatui demos to various Iced demos covering things like reading QR codes and processing Markdown. Of course, this is all topped off with the usual long list of lower-level, smaller changes and improvements to the kernel, drivers, Relibc, and more.

Wednesday, 12 August

22:07

wdiff-1.2.3 released [stable] [Planet GNU]


This is to announce wdiff-1.2.3, a stable release.

There have been 29 commits by 2 people in the 637 weeks since 1.2.2.

See the NEWS below for a brief summary.

Thanks to everyone who has contributed!
The following people contributed changes to this release:

  Bob Proulx (6)
  Simon Josefsson (23)

Happy Hacking,
Simon [on behalf of the wdiff maintainers]
==================================================================

Here is the GNU wdiff home page:
  https://www.gnu.org/software/wdiff/

Manual:
  https://www.gnu.org/software/wdiff/manual/
  https://www.gnu.org/software/wdiff/manual/wdiff.html - HTML format
  https://www.gnu.org/software/wdiff/manual/wdiff.pdf  - PDF format

Here are the compressed sources and a GPG detached signature:
  https://ftp.gnu.org/gnu/wdiff/wdiff-1.2.3.tar.gz
  https://ftp.gnu.org/gnu/wdiff/wdiff-1.2.3.tar.gz.sig

Here is minimal source-only "git archive" sources:
  https://ftp.gnu.org/gnu/wdiff/wdiff-v1.2.3-src.tar.gz
  https://ftp.gnu.org/gnu/wdiff/wdiff-v1.2.3-src.tar.gz.sig

Use a mirror for higher download bandwidth:
  https://www.gnu.org/order/ftp.html

Here are the SHA256 and SHA3-256 checksums:

  File: wdiff-1.2.3.tar.gz
  SHA256 sum:   29a4457eb0ed35c902e6732d71f25e1d6c7fe7fa0eda0fb6c371ed6779b49fd6
  SHA3-256 sum: 2f558fe6b7a69524f29d266c4018c80a10135cef2e4a53ae3c2944c1fc12c95d

  File: wdiff-v1.2.3-src.tar.gz
  SHA256 sum:   dc29d8f530471b9a8935413dca32e45848363f6e58888fc7307f5f052b8fb827
  SHA3-256 sum: 4db1f41eda5e1525f3ced491af1fc1ad094cc21c209e789d12a1ea8f611be24e

Verify the SHA256 checksum with either sha256sum, sha256, or
'shasum -a 256'.

Verify the SHA3-256 checksum with 'cksum -a sha3 -l 256 --base64'
from coreutils-9.8.

Use a .sig file to verify that the corresponding file (without the
.sig suffix) is intact.  First, be sure to download both the .sig file
and the corresponding tarball.  Then, run a command like this:

  gpg --verify wdiff-1.2.3.tar.gz.sig

The signature should match the fingerprint of the following key:

  pub   ed25519 2019-03-20 [SC]
        B1D2 BD13 75BE CB78 4CF4  F8C4 D73C F638 C53C 06BE
  uid   Simon Josefsson <simon@josefsson.org>

If that command fails because you don't have the required public key,
or that public key has expired, try the following commands to retrieve
or refresh it, and then rerun the 'gpg --verify' command.

  gpg --locate-external-key simon@josefsson.org

  gpg --recv-keys 51722B08FE4745A2

  wget -q -O- 'https://savannah.gnu.org/project/release-gpgkeys.php?group=wdiff&download=1' | gpg --import -

As a last resort to find the key, you can try the official GNU
keyring:

  wget -q https://ftp.gnu.org/gnu/gnu-keyring.gpg
  gpg --keyring gnu-keyring.gpg --verify wdiff-1.2.3.tar.gz.sig

This release is based on the wdiff git repository, available as

  git clone https://https.git.savannah.gnu.org/git/wdiff.git

with commit 31fe62c4a3e2a76e5d68f571b1aa2f10815ca51f tagged as v1.2.3.

For a summary of changes and contributors, see:

  https://gitweb.git.savannah.gnu.org/gitweb/?p=wdiff.git;a=shortlog;h=v1.2.3

or run this command from a git-cloned wdiff directory:

  git shortlog v1.2.2..v1.2.3

This release was bootstrapped with the following tools:
  Gnulib 31fe62c4a3e2a76e5d68f571b1aa2f10815ca51f
  Autoconf 2.72
  Automake 1.17
  Make 4.4.1
  Makeinfo 7.3
  Help2man 1.49.2
  Tar 1.35
  Gzip 1.13

NEWS

* Noteworthy changes in release 1.2.3 (2026-06-30) [stable]

** Modernize build environment.
Several minor fixes including build fixes for modern C23 compilers.
Many generated or obsolete files have been removed from git.


20:00

The OSNews Fundraiser continues: you made me use Windows, now make me use macOS [OSnews]

The OSNews Fundraiser, to celebrate the fact I posted 20000 stories in 21 years, is still underway. The first major incentive was reached, and I, a long-time Linux user, published my experiences using Windows 11 for a month. It wasn’t a success. Keep donating if you want to find out what a Linux user thinks of the current state of macOS!


The OSNews 2026 Fundraiser
8,634 / 15,000


➡️ Donate through Ko-Fi ➡️ Donate through SEPA transfer* ➡️ Buy merch from our store ➡️ Why a fundraiser?

€5000 incentive: Make me use Windows 11 for a month (the results were not great)
> €10000: Video tour of my office and my computers/devices collection <
€15000: Buy a Mac and use macOS for a month (and review it)
€20000: I get an OSNews tattoo

*Name: Thom Holwerda – IBAN: SE08 8000 0820 1684 4657 8414 – BIC: SWEDSESS


Why support OSNews?

  • We do not run any ads, so we don’t have to be friendly to advertisers (i.e. the technology companies we’re supposed to report on).
  • We are not owned and controlled by a large media company dictating our tone and content. You’d be surprised how many other sites are.
  • We do not use any “AI”; not during research, not during writing, not for images, nothing.
  • We rely entirely on your support to keep going.

I want to make sure I can run OSNews for another two decades and another 20000 posts, and I need your help to do so. Since my wife, who has a tough, underpaid job in elderly care, is largely unable to work due to health reasons caused by that very same job, my income has become a lot more crucial for our kids, my wife, and myself. With OSNews readers being more skeptical of subscription-like things like our Patreon than most people, it’s exactly these one-time donations that make up the bulk of your support.

Thank you.

The little-known winstart.bat batch file [OSnews]

Raymond Chen explains what, exactly, the file winstart.bat in Windows 95 is used for.

In Windows 95, you could create a winstart.bat file in your Windows directory. During startup, the virtual machine manager initializes and creates the so-called “System virtual machine” (the “System VM”), which is the virtual machine that all Windows programs run in. But before running the user-mode kernel in that virtual machine, the virtual machine manager runs the winstart.bat batch file if it exists.

↫ Raymond Chen

Chen needs to use several diagrams to really explain what the batch file is used for, but as a very crude summary, it allows you to load TSRs that only apply to Windows programs, while not affecting any additional DOS command prompts you may load later after Windows is already running. While many think it’s a Windows 95 feature, it was already present in Windows 3.x.

A unique feature that I doubt many people made active use of.

Delphi 13 Community Edition released [OSnews]

Delphi is still very much a thing, and still very much in active development. The current stewards of Delphi, Embarcadero, released the Delphi 13 Community Edition today.

Delphi Community Edition is a full-featured, free edition of Delphi for building native applications with the Delphi language. It includes a professional IDE, visual designers, integrated compilers and debuggers, the VCL framework for Windows development, and the FireMonkey framework for creating native applications from a shared codebase across Windows, macOS, iOS, and Android.

It is designed for students, hobbyists, freelancers, and small teams that meet the Community Edition license requirements.

↫ Marco Cantu at the Embarcadero blog

Delphi has been around since 1995, first released for Windows 3.1. It’s both a programming language, a variant of Object Pascal, and the accompanying IDE and related tooling and frameworks, originally developed by legendary company Borland. This latest version of course adds a number of new features to the programming language, and further improves the IDE as well, this time with a brand new 64bit version. The two frameworks for visual application development, VCL and FireMonkey, have also been updated and improved.

Sadly, it’s not open source, and the Community Edition is intended for mostly non-commercial, hobbyist use. If you want to actually earn any money using Delphi, you’re going to have to step up to Delphi 13 Florence, which isn’t free.

19:49

[$] Block-layer error injection [LWN.net]

Storage code has to cope with hardware that fails in inconvenient ways, but coaxing a healthy disk into producing those failures on demand, for testing, is usually not possible. The kernel provides several ways to inject block-layer I/O errors, but none of those can select the operation to fail, pick the status code to return, or target a disk directly without employing a stacked device on top. Use of a stacked device means the test runs against the mapper device, not the disk it was meant to exercise. A patch series from Christoph Hellwig adds a configurable error-injection interface that does all three things that the current error-injection code lacks, controlled by a per-disk debugfs file.

19:14

Giving Misfits Market A Try [Whatever]

In recent weeks (probably months, if we’re being honest), I have felt stuck in a rut when it came to groceries. I had no ideas, and frankly no motivation, to get anything other than the basic essentials like milk, bread, and maybe eggs if I wanted to bake something. My groceries were uninspired, and I was tired of buying the same five things over and over again.

So, after years of getting ads for it, I finally gave Misfits Market a try to jazz up my groceries.

If you haven’t heard of it, Misfits Market is an online grocery store dedicated to reducing food waste and promoting sustainability by selling food that is overstocked or imperfect. The food you buy from Misfits is largely “rescued” items that would otherwise go to waste despite being totally fine. You get perfectly good stuff at a discount, what’s not to like?

So how does a membership work? With a lot of these subscription based grocery delivery systems, you have to have an account, but whether or not it costs money varies from company to company. In Misfits Market’s case, it’s free to sign up and shop, but they do have a Misfits+ option where you get access to member exclusive items and deals and cheaper shipping, plus part of the cost goes to Feeding America to help fight hunger. It’s an annual cost of $69 a year, but when you sign up for a free account, you can try Misfits+ for free on a 14-day trial.

Every week, your shopping window is open for a few days, then it closes and they put together your order and ship it out to you. For me, my shopping window is open from Wednesday to Saturday, and my box gets to me on Tuesday, delivered right to my doorstep. Now, for them to ship it to you, you have to place a $45 minimum order.

They also start off your cart with recommended items, but you can keep or get rid of as many of their suggestions as you want. You can even set items to never be recommended again, or have them automatically put in your cart every week if you like that item.

Finally, they have a loyalty points program where you can trade in your points to buy items. It’s basically just like, a free bag of chips, but hey, I’ll take it. Not like Kroger ever gives me free chips.

I decided to go ahead and try the free 14-day trial. I figured if I’m trying Misfits for the first time, I should make the most of my first order.

Okay, so Misfits has a good mission, that’s cool, but do they have items and brands worth buying, or is it all just ugly produce? Well, I got a huge haul with a variety of things to showcase their produce, pantry goods, refrigerated items, all that good stuff! So let’s take a look at what I got, and then we’ll breakdown how much it cost.

A table full of groceries! Produce and packaged stuff.

I bought a bag of apples, a bag of peaches, sweet potatoes, mini cucumbers, heirloom tomatoes, a mango, two avocados, a mystery melon, mystery root vegetable, a package of banana bread pecans, Ghirardelli mini semi-sweet chocolate chips, Flock chicken skin crisps, two Harmless Harvest coconut yogurts (one mango and one strawberry), a pack of cinnamon raisin bagels, a bag of sweet mustard flavored veggie crisps, feta, BelGioioso mozzarella ball, and a tiramisu pudding cup.

More groceries! Mostly fake meat!

I also bought Cacio e Pepe raviolio, gnocchi, Vital Farms hard-boiled eggs (6ct), two packs of spinach and feta chicken sausages, bao buns, gyoza dumplings, extra firm tofu, and a whole lot of Impossible plant-based meat products. The tin of Fishwife in the center there was the “free gift” I chose upon joining.

Beverages lined up in a row.

I topped off all this food with some beverages. I got a dirty chai canned latte, three flavors of Tepache soda (tropical, prickly pear, and spiced pineapple), a canned peach tea, and four types of cold-pressed juice (ginger pineapple, cherry limeade, green apple and avocado, and red berry refresher).

Not pictured is two items I separated because they were a bit damaged.

This ube flavored mochi pancake and waffle mix had a small hole in the bottom of the package that the mix was falling out of. Thankfully, not much product was lost and I can just put the package in a big Ziploc bag.

A purple package of ube flavored mochi pancake/waffle mix.

The other damaged item was this carrot ginger soup:

A package/bowl of Long Weekend carrot ginger instant soup.

For this one, the lid was popped:

The lid is slightly open!

I initially had concerns about this, but it turns out the soup mix was actually in a separate package inside the bowl, so the bowl was actually just empty and it being open was of no consequence! I proceeded to eat the soup since it was already open anyway.

Okay, so how much was all of this plus shipping and fees and yada yada? My subtotal was $203.38, shipping was $6.99 instead of $9.99 because of my Misfits+ shipping reduction, my “cold pack fee” was waived because I apparently bought enough cold items to waive the fee of cold-pack packaging (I think it’s $35 worth), and I got a discount of $24.40 because it was my first order, and on your first order you get 40% off up to a maximum of $25. So my total was $189.07 after an operations fee of $1.99 and $1.11 of taxes.

I got all this for under $200. Well, I have certainly spent more money on fewer groceries from Kroger, that’s for sure. I think I got a pretty dang decent haul here.

It’s all well and good to buy healthy snacks and produce, but how much of it actually tastes good? Well, I had my parents over for lunch today, and I made egg salad sandwiches with the Vital Farms hard-boiled eggs, heated up the spinach and feta chicken sausages, cut up the mystery melon and topped it with the crumbled feta, plus I drank the green apple avocado cold-pressed juice, and everything was so good!

Plus, last night I cut up one of the avocados and it was great, not even imperfect at all, just a beautiful, ripe avocado. Oh, and I tried the sweet mustard veggie crisps and those were quite good, too.

I am especially impressed with the green juice. It’s actually more than just green apple and avocado, it also has cucumber and spinach in it, as well as lemon and basil, and you can really taste it. It’s super refreshing and is 100% juice.

Obviously, I have a lot more groceries to get through, but I’m very impressed so far! I’m perfectly pleased with my order, and I am very happy to be contributing to reducing food waste and decreasing hunger.

Of course, you already know I’ve got a referral code for you. Fifteen bucks off your first purchase! If you end up ordering, let me know what you end up getting in the comments, and have a great day!

-AMS

18:42

Why “It Depends” Is the Most Future-Proof Phrase in Software [Radar]

Ask an architect almost any question and you’ll get the same answer: It depends. For years this answer has been the punchline of jokes about architects, but in an era when AI can generate a working service faster than you can describe it, “it depends” is one of the most important phrases in software. It marks the exact boundary of what these tools can and cannot do.

The First Law still holds

We’ve said for a long time that the First Law of Software Architecture is: Everything is a trade-off. Nothing about generative AI repeals that law. If anything, it enforces it more brutally than ever.

AI coding tools are extraordinary at answering “how” questions. How do I implement a saga pattern? How do I set up circuit breakers between these services? How do I paginate this API? These questions have answers that exist in the world in documentation, in open source code, in a decade of blog posts, and large language models have read all of it. Asking an LLM a “how” question is like asking a very fast librarian who has memorized the library.

Architecture questions are not “how” questions. They’re “should” questions, and “should” questions have a different shape entirely. The honest answers require knowing things that appear in no training: that your ops team is three people, that the CFO just froze cloud spend, that the last reorg left the payments team demoralized. An AI can enumerate the generic trade-offs of distributed architectures beautifully. What it cannot do is weigh them, because the weights live in your organization, not on the internet.

That’s the Second Law, incidentally: “Why is more important than how.” LLMs are “how” machines. Architects are “why” people.

Cheap code makes decisions expensive

There’s a tempting inference floating around: If AI makes building software easier, surely it makes architecture matter less. Our experience so far suggests the opposite. When code was expensive to produce, the cost of construction acted as a natural brake on bad decisions. A questionable design took months to build, and somewhere in month two, someone usually noticed. Now a team can stand up a fleet of services in a week. The brake is gone. It has never been easier to build the wrong thing quickly, at scale, with tests.

Think of AI as an amplifier. Point it at a sound structure and it accelerates you. Point it at a flawed one and it pours concrete over the flaw before anyone has time to object. The half-life of a bad architectural decision used to be measured in the time it took to implement; now the implementation arrives almost instantly, and you get to live with the decision for years.

This shifts where the leverage sits. When implementation is abundant, judgment is the scarce resource. Someone still has to decide where the service boundaries go, what “good enough” availability means for this system, and which architectural characteristics actually matter.

Judgment doesn’t come from reading

Here’s the uncomfortable part, and it applies to humans as much as machines: You cannot learn trade-off analysis by consuming content about it. We’ve written a fair amount of that content ourselves, so we say this with some authority. Books and talks give you the vocabulary. They don’t give you the judgment.

Judgment comes from making decisions and living with the consequences or at least watching someone experienced make them, asking why, and arguing about the alternatives. Every working architect we know learned the craft this way: apprenticed to messy, real problems, with feedback loops. The pattern catalog was the easy part. Knowing which pattern not to use, and why, and being able to explain that to a skeptical VP that took years of reps.

This is also, not coincidentally, exactly what today’s AI lacks. A model trained on the world’s code has seen millions of decisions but almost none of the consequences. The post mortem that traces an outage back to a boundary drawn wrong in 2019 rarely makes it into the training data, and even when it does, it isn’t connected to the pull request that caused it. Architecture’s feedback loops are measured in years. That’s precisely the kind of learning that can’t be scraped.

Where this leaves engineers

If you’re a developer watching AI absorb more of the implementation work, the strategic question isn’t whether your current tasks will change but where to move on the value chain. Our answer is to move toward the decisions. Toward the trade-offs, the constraints, the “it depends.” That territory isn’t shrinking; it’s growing, because every AI-accelerated team needs someone who can tell the amplifier where to point.

The good news is that this is learnable. Not from a book alone, and certainly not from an LLM, but the way it’s always been learned: by practicing architectural thinking on real problems, with experienced people looking over your shoulder and asking why. We’ve spent the last several years teaching it that way, most recently in a six-week cohort format that works less like a course and more like a short apprenticeship in making and defending architectural decisions. (Details are on the O’Reilly live events page, if you’re curious.)

However you pursue it, pursue it. The machines have gotten very good at “how.” The career-defining skill of the next decade is being the person in the room who can answer “should,” who knows that the real answer starts with “It depends,” and can finish the sentence using their brain alone.

The Two Pillars of Post-training: Reinforcement Learning and Supervised Fine-Tuning [Radar]

This is the second article in Sharon Zhou’s post-training series. Read part 1 here.

In the first post of this series, you learned how post-training closed the fundamental gap in usability of LLMs by making them behave in a certain way. In this post, you’ll explore specific techniques you can use to change a model’s behavior: namely, reinforcement learning (RL) and supervised fine-tuning (SFT).

Reinforcement learning teaches the model by letting it try things and telling it which attempts were better or worse—the model learns by experimentation and feedback. Supervised fine-tuning teaches the model by showing it examples of good behavior—the model learns by imitations. Both have deep roots in AI and machine learning literature historically, but their application to LLMs, and particularly to making LLMs behave well, is what makes modern post-training work. Nearly everything that happens in post-training is the result of some combination of these two approaches.

Reinforcement learning (RL): Learning from feedback

The overall gist of reinforcement learning goes like this:

  1. The model gets a prompt.
  2. The model generates a response.
  3. The model’s response is graded. The grade is called a reward. A positive reward is good, and a negative reward is bad.
  4. The model’s weights are updated to make high-reward responses more likely and low-reward responses less likely.

One of the most important questions is: Where does the reward come from?

Verifiers

The easiest way to get a reward is a function that can output a reward, for example a checker for whether the generated code compiles or whether the generated math problem was solved correctly. This automated check is a verifier. The ideal verifiers are fast, cheap, and perfectly reliable within their domain. Think coding challenges, math problems, or factual questions. For tasks with objectively correct answers, you can just write a function that checks the output.

The limitation is probably obvious: Verifiers only work when you can define “correct” programmatically or hit an API to return the right results. That covers a lot of useful territory, but it doesn’t help you train a model to be helpful, nuanced, or pleasant to talk to.

There are subtler limitations too. Not all verifiers are fast. Your model might propose a novel drug combination, but verifying its validity could take years of lab work. Generated GPU code might need hours or days of performance benchmarking. When verification is expensive, you face a trade-off: Use the slow-but-accurate verifier sparingly, or substitute a faster proxy that’s slightly less reliable but keeps training moving.

Human feedback, RLHF, and reward models

Humans can offer strong reward signals that, in aggregate, align with human preferences that might be more subtle and hard to encode programmatically. However, it’s prohibitively inefficient to have humans in the loop for every training datapoint, especially as the model is continuously updating its weights after it receives rewards as feedback, so the model’s responses would change over time. You can’t really prepare the data ahead of time. So instead, the InstructGPT paper, which informed ChatGPT’s development, implements reinforcement learning from human feedback (RLHF) by training a separate model to mimic human feedback. This model is called a “reward model.”

The input of the reward model is a prompt and model response and its output is a scalar reward (positive or negative) that mimics how a person would rate that response. You can train a reward model in multiple ways. The simplest is to have people grade the model outputs with a score, for example 1–5 stars or a number out of 100%. However, people are rarely consistent at these types of tasks: One person’s 2 is another’s 5, and even the same person drifts over time.

Another simple way is to offer two model responses in comparison and ask, “Which one is better?” This is a much easier, more reliable judgment for people to make. Interannotator agreement is significantly higher for comparisons than for absolute ratings.

Training a model using pairwise comparisons is also simple. You can then use cross-entropy loss over pairs, which pushes the reward of the preferred response higher than the unpreferred one. This works great because it means the reward model can learn from signals like “A is better than B” but can learn to output absolute scores for the reward.

To make the process of collecting pairwise comparisons from people more efficient, the InstructGPT’s implementation of RLHF included showing labelers 4–9 different model outputs from a single prompt and asking them to rank those preferences. This would effectively result in 6–36 pairwise comparisons for a given ranking. Not bad; that’s efficient data labeling! They used ~33K prompts, so that would roughly translate to anywhere from 200K to 1.2M comparisons to train the reward model.

After training, the reward model would be an automated judge during RL training, providing scalar rewards for responses. The language model then optimizes against this reward model’s scores. This means the better the reward model, the more aligned the resulting model would be.

LLM as judge

So you need a reward: Why not use an LLM? LLM-as-judge, sometimes called RLAIF (reinforcement learning from AI feedback), scales much better than human annotation while still being able to evaluate subjective qualities like helpfulness, clarity, and tone. But it inherits whatever biases or blind spots the judge model has, and can be more easily gamed. If the judge tends to prefer verbose answers, the trained model will learn to be verbose.

One effective approach is to break the judgment into multiple LLM calls, each focused on a different aspect of the response, like a rubric. Instead of asking one LLM call “How good is this response?” you might have separate calls evaluating factual accuracy, clarity of explanation, appropriate tone, and completeness. Each dimension gets its own score, and you combine them into a final reward. This is more robust than a single holistic judgment because it’s harder for the model to game all dimensions at once, and it gives you fine-grained control over what you’re optimizing for. You can weigh the dimensions differently depending on what matters most for your use case, and adjust those weights over time as your priorities shift. For example, accuracy is worth 3x as much as tone.

Combining human feedback with LLM-as-judge, Anthropic’s Constitutional AI (CAI) is a method for training reward models from AI-generated comparisons, based on a human-written set of principles. What this means is that you can give an LLM a set of principles, which Anthropic calls a “constitution,” and have it critique and revise its own outputs based on those principles. For example, a principle might say “choose the response that is least likely to be harmful” or “prefer the answer that is most helpful while being honest.” The model generates pairs of responses, uses the constitution to decide which is better, and those AI preferences are used to train the reward model. This means you can encode your values explicitly as written principles in the Constitution rather than implicitly through thousands of human annotations, making it easier to audit, agree on, and update what the model is being trained to do.

RL algorithms

Once you have a reward, it’s time to update the model’s weights. But you can’t just predict the next token, because there isn’t one. All you have is a value for the response the model gave. This is where RL algorithms come in. These algorithms are ways to take the reward and turn it into a meaningful, and ideally stable, training signal for the model to learn. There are several, and the field is moving fast, but a few fundamental ones are worth understanding.

REINFORCE

REINFORCE is the simplest starting point. The idea is to generate a response, score it, and if the reward was high, nudge the model to make that response more likely. If the reward was low, nudge it to make that response less likely. It’s conceptually easy to grok but noisy and difficult in practice because it turns out that the signal from a single response can point the optimization in unhelpful directions, and the variance in the gradients makes training slow and unstable. PPO was designed to fix these exact problems.

PPO (proximal policy optimization)

PPO is what OpenAI used in the original ChatGPT work and was for a while the default algorithm for RLHF. In RL terminology, the model is the “policy,” or the thing that takes actions by outputting tokens, in an environment which is simply the conversation context.

PPO improves on REINFORCE by being more careful about how big each update is. Rather than taking whatever gradient the reward suggests, PPO clips the update so the model can’t change too much in a single step. This makes training significantly more stable. The clipping keeps updates “proximal.”

PPO is also an online algorithm, meaning the model generates fresh responses during training, gets them graded, and updates from that feedback in a continuous loop. So the model keeps learning from its own current behavior rather than from a static dataset. It can explore and improve in ways that offline methods (that only collect data once beforehand) can’t.

Notably, PPO uses a “critic,” or a separate model that predicts the expected total reward from any point during generation, and is trained with the policy. This helps reduce noise in training, because it gives you a baseline: Instead of just knowing “this response got a reward of 7” and having no idea if that’s good or bad, the critic might predict “you’d normally get a 5 here,” so the actual training signal (called an “advantage”) becomes “+2, better than expected.” This dramatically reduces noise compared to REINFORCE.

The downside is complexity. Now you’re training two models (the main model and the critic), and the whole pipeline involves generating responses, grading them with a reward model, estimating how good the grades are relative to the critic, and updating both models. It works, but it’s a lot of moving parts. This makes it harder to tune or debug when something goes wrong, and harder to set up the infrastructure.

DPO (direct preference optimization)

DPO takes a different approach that avoids RL entirely but optimizes the same underlying objective as the standard RLHF formulation. Researchers found that there’s a mathematical relationship between the optimal reward model and the optimal main model (policy), and you can collapse the two-step process into one. This means that you can take the same pairwise comparison data (“model response A is better than model response B”) and use it to update the main model directly, without a reward model. Yes, this means good old supervised learning on that pairwise data.

In theory, under ideal conditions, DPO and PPO-based RLHF converge to the same global optimum. Those ideal conditions include a perfect reward model, infinite preference data covering the full output distribution, and the reference policy matching the data-generating distribution. However, these rarely hold in practice, and several empirical studies have shown meaningful performance gaps between DPO and online RL methods on harder tasks, partly because DPO can’t explore beyond its fixed dataset. That said, it’s still a very promising technique.

The simplicity of DPO is attractive: supervised fine-tuning on pairwise data with no reward model to train and no RL loop to stabilize. As a result, DPO has become very popular, especially among smaller teams, because it’s much easier to implement and debug. However, the trade-off is that DPO is less flexible, because it works directly from a fixed dataset of preferences. This means it can’t explore and discover novel behaviors the way online RL methods can. It only learns from the comparisons you already have.

Newer online variants of DPO have addressed this by generating fresh responses during training, but at that point you’re reintroducing some of the infrastructure complexity that made DPO appealing to avoid in the first place.

GRPO (group relative policy optimization)

Introduced by DeepSeek, GRPO takes another stab at simplifying PPO. Instead of needing a separate critic model, GRPO generates a group of responses to the same prompt and uses the relative rewards within that group to figure out which responses were better or worse—basically normalizing within that group. If you generate eight responses and three of them score well, those three get reinforced and the others get pushed down, and the baseline (which the critic was in charge of previously) is just the group average. This eliminates the critic entirely while still getting a useful training signal. It’s simpler than PPO but still online (the model generates fresh responses during training), so it can explore in ways DPO can’t. GRPO got a lot of attention because of its role in training DeepSeek’s reasoning models.

There are many more algorithms and variants, and new ones appear regularly. The field hasn’t converged on a method (and likely won’t for some time), and different algorithms suit different situations. DPO is great when you have good preference data and want simplicity. PPO remains strong when you need online exploration and have the engineering resources to manage the complexity. GRPO offers an appealing middle ground. In practice, teams often try multiple approaches and pick what works best for their specific use case and reward signal.

RL post-training is also less stable than supervised learning, which we’ll cover next. The loss curves are noisier, the hyperparameters are more sensitive, and the training can diverge if not carefully managed. Practitioners typically constrain the RL updates with a penalty that prevents the model from drifting too far from its starting point. The most common approach is a KL divergence penalty that keeps the fine-tuned model’s output distribution close to the base (or SFT) model’s distribution. This acts as a regularizer: It lets the model improve its behavior while preventing it from forgetting what it learned in pretraining or collapsing into degenerate patterns.

Supervised fine-tuning (SFT): Teaching by demonstration

Supervised fine-tuning is more straightforward. You show the model examples of ideal responses, and train it to reproduce them. In practice, this means collecting a dataset of {prompt, ideal response} pairs and continuing to train the model’s weights using the same next-token prediction objective from pretraining, but now on this curated dataset instead of the broad pretraining dataset. The one difference is that the loss is computed only on the response tokens, not the prompt tokens, so the model learns to generate good responses given prompts, not to generate prompts.

The simplicity is the point. There’s no reward model to train, no critic to stabilize, and no policy gradient variance to worry about. However, it’s also limited by the data you can collect. That can get expensive and difficult to scale.

The quality of your SFT model is directly determined by the quality of your demonstrations. The model is learning to copy what you show it, so every quality issue in the data becomes a quality issue in the final model.

Human demonstrations

The most direct approach is to hire skilled people to write high-quality responses to a diverse set of prompts. This is the gold standard. You can easily control your dataset here, and you can get exactly what you want, written to your specifications. The original InstructGPT paper from OpenAI contracted 40 labelers, writing demonstrations and ranking outputs.

The disadvantage is, probably obviously, cost and scale. Good demonstrations are expensive, especially tasks requiring domain expertise like having doctors write an ideal prescription for a patient or a rocket scientist telling you how to put satellites on Mars. And even expert annotators are inconsistent. They have bad days, they get tired, and they interpret instructions differently from each other. At scale, this inconsistency can accumulate, though labeling companies manage and sell processes to make crowdwork more effective at scale.

Synthetic data

Synthetic data scales far better than human annotation. You can generate millions of demonstrations cheaply and quickly. The Stanford Alpaca project famously fine-tuned Llama on only 52,000 demonstrations generated by text-davinci-003 (part of the GPT-3.5 model family, though not ChatGPT) and was able to get qualitatively similar behavior to text-davinci-003 with a much smaller budget (though it was on a narrow evaluation of only ~250 examples—still an exciting result for small open models for research).

Many open source models have used variants of this approach. However, there’s also a practical consideration around terms of service. Some model providers restrict using their outputs to train competing models, and this has become an increasingly heated area of debate as models compete at the frontier. Know the rules before you build your pipeline.

Curated data with synthetic transformations

Sometimes the best demonstrations already exist. Customer support logs, internal documentation, expert Q&A forums, edited writing samples. If you have access to high-quality human-generated content that matches the behavior you want or is close to it, you can use LLMs to transform that data into prompt-response pairs. This has the advantage of being grounded in real use cases rather than fully synthetic scenarios.

The work is in the curation, and sometimes it might be easier to generate from scratch based on a few few-shot examples. Raw data is messy: Support logs contain errors, forums contain misinformation, and real conversations meander. You need to filter, clean, and reformat aggressively, but you can build an LLM pipeline to do those steps. If you have a good source and invest in the LLM curation pipeline, this can be extremely effective, especially for domain-specific applications.

Rejection sampling

Sometimes the best training signal is already inside the model and you just need to find it. Rejection sampling works by generating many possible responses to a prompt, scoring them with some quality metric, and keeping only the top performers. The quality metric can be a reward model, a rule-based check, or even a stronger model acting as a judge.

Suppose you prompt your model “Write a Python function to merge two sorted lists” 64 times at temperature 0.8. You run each output through a test suite as your quality metric. Maybe 40 pass all tests. You take the 10 cleanest, most readable passing solutions and add them to your SFT dataset. You’ve just used the model’s own competence to build training data better than what most human annotators would produce for a coding task.

It sounds like RL, but it’s just using the same pieces to filter the demonstrations that the model should see in SFT. The same graders like reward models, verifiers, or LLM-as-judges are used to curate SFT data.

Rejection sampling is also surprisingly effective and therefore popular; for example it was described early on in Meta’s Llama 2 post-training pipeline. The model already can produce great responses, but as you’ve probably noticed, it just doesn’t do so reliably. By filtering for its best outputs and training, you raise its average toward its ceiling. Instead of acting as the average developer, it’s nudged to act as an expert developer. Rejection sampling scales well because generation is cheap relative to human annotation. The main limitation is that you’re still bounded by what the model can produce at sample time. If it can’t generate a correct proof in any of 100 attempts, no amount of filtering will help.

But SFT has limitations. It only teaches the model what to do. You’re presenting ideal behavior but never showing it what “bad” looks like. As a result, the model could still produce problematic outputs on prompts that weren’t well-represented during training.

The SFT model is also prone to “mode averaging” when the training data sends mixed signals. For example, if half your golden retriever demonstrations sound like an encyclopedia (“The Golden Retriever (Canis lupus familiaris) is a large-sized breed of gun dog…”) and the other half sound really casual (“Golden retrievers? They’re basically furry happiness machines”), the model won’t learn to pick the right tone for each context. It’ll blend them into an awkward middle: “The Golden Retriever is basically a large-sized happiness machine of the gun dog variety.” Neither formal nor casual, which comes off as weird and not the right response style.

Why frontier models use both

RL seems all-powerful. Why not use it alone? This was a research question pursued by DeepSeek’s team when training DeepSeek R1-Zero. Up until then, the base models were so bad that doing RL was pointless on them and you needed to do SFT. This model demonstrated that RL applied directly to their relatively strong pretrained model can produce powerful reasoning ability without any SFT.

However, the model still had serious usability problems. For example, it would mix languages (e.g., English with Mandarin), so it was difficult to use for most people. It could reason, but it wasn’t practical to use.

RL’s main ceiling after the model has been trained is usability. During training, its ceiling is stability. Research on new methods are continually trying to find ways to do RL post-training more stably.

SFT, on the other hand, has the opposite problem. It’s been used alone for many years and has reached maturity to some degree. InstructGPT made the model capable of instruction-following, and became the foundational approach for ChatGPT to handle multiturn dialogue and thus conversation. However, while SFT gets good, reliable results, it’s typically not enough to push performance at the frontier to reach superhuman performance on important tasks.

Here’s what it means for you: If you’re doing post-training on your own, and you want your model to behave a certain way and you don’t care about novel frontier performance, SFT will get the job done.

In contrast, RL can teach a model to reason through novel problems it hasn’t seen during training, because the reward signal evaluates the outcome rather than the exact token-by-token process like in SFT. RL can surface rare but important behaviors that might not appear frequently enough in any SFT dataset.

On scaling data, RL can improve a model’s performance on a task as long as the reward signal is accurate, without needing to collect additional human-written examples. However, it’s important to note that on some tasks, it’s easier to scale SFT examples, and on others, it’s easier to scale via RL. For example, RL scales more easily on math problems. You can generate an unlimited number of math problems programmatically, and a verifier can check whether the answer is correct with certainty. You wouldn’t need to hire a mathematician to write out ideal solutions. The model attempts problems, gets told right or wrong, and improves.

Safety is another area where RL stands out. It’s relatively easy to write a few hundred examples of a model declining harmful requests in your SFT dataset. But the space of ways a user might try to get harmful or inappropriate content is broad, creative, and ever-changing. RL allows the model to be trained against adversarial prompts, where it practices handling tricky edge cases and gets rewarded for handling them well. This is much harder to achieve with static demonstration data alone.

Meanwhile, SFT scales more easily on writing in a specific brand voice. If you want the model to respond with your company’s brand voice. It might be hard to write a reward function that captures “sounds like our brand.” But the company could have tens of thousands of real support transcripts that already demonstrate the voice. You can curate these, transforming them into prompt-response pairs. The data already exists at a decent scale, while the reward signal would be hard to get right.

When a frontier lab wants to add support for a new feature, for example calling MCPs or calling subagents, the first step is almost always to create a small amount of SFT data demonstrating that capability. The next step is creating a reward function and RL environment that can match it.

Far more data and thus compute are dedicated to RL than SFT, but SFT offers good warm starts for the model and those examples are critical to getting the model into a stable place for subsequent RL.

The combination of both is ultimately what makes modern frontier models as capable as they are. Neither alone is sufficient.

A standard post-training pipeline uses SFT and RL as complementary stages that build on each other. It might look like this:

  1. Pretraining produces a foundation model with broad knowledge.
  2. SFT takes that foundation model and teaches it basic behaviors: how to have a conversation, follow instructions, use a helpful tone on a range of different tasks, etc.
  3. RL takes the SFT model checkpoint and refines it further. Using reward signals from human preferences, programmatic verifiers, or AI judges, RL gets the model to be more consistently helpful, less likely to produce harmful content, and better at complex tasks like reasoning.

Some teams also iterate between several stages of SFT and RL: SFT, then RL, then more SFT on new data, then more RL. The first couple stages could be on reasoning for verifiable tasks like math and code where the data and reward signals (verifiers) are constructed differently, whereas the second could be on messier general reasoning over all tasks, which would involve training reward models that encode human feedback as preferences.

This iterative refinement can help with checkpointing quality at different stages and handing things off to different teams, though it adds complexity to the pipeline. Not surprisingly, the quality of each previous stage directly affects how well subsequent stages can go.

16:49

[$] A look at CrossPoint e-reader firmware [LWN.net]

There are a number of small, inexpensive, low-powered e-reader or e-paper devices that have promise as ebook readers with one minor problem: the firmware they ship with does not realize their full potential. To solve that problem, the CrossPoint Reader project looks to provide replacement firmware that offers necessary features, better performance, and a more pleasant reading experience. On August 7, the project released version 1.5.0, which opens large EPUBs more quickly, provides offline dictionary lookups, and has reworked settings for changing layout and font options. The release also improves support for right-to-left text as well as Chinese, Japanese, and Korean (CJK) text rendering.

QEMU 11.1 released [LWN.net]

Version 11.1 of the QEMU emulator has been released. The release contains more than 3,200 commits from 285 authors and includes a long list of improvements; see the announcement and changelog for the details.

16:07

Steinar H. Gunderson: The PSX GPU is wild [Planet Debian]

Inspired by some recent reverse-engineering, here are some things I find wild by the original PlayStation GPU:

  • VRAM is a flat 1024x512 16-bit image (555 + 1 bit alpha). You want more than just a framebuffer? Figure out yourself what goes where.
  • Yes, that means you'll need to allocate two framebuffers and double-buffer everything yourself.
  • Quads are common. No “triangles only” business here.
  • Vertex coordinates are screen-space x/y integers. No floats or fixed-point. (I'm ignoring the GTE here, plus higher-level libraries.)
  • Wait, where's z? There's no z. So there's no perspective correction. (This one is pretty famous)
  • OK, so how do you give in subpixel coordinates? You don't. There's no AA after all.
  • Texture coordinates (u/v) are uint8_t. There's no texture filtering either; everything is nearest-neighbor only.
  • OK, so that means you can't have textures larger than 256x256 (pretty common in that era), but how do you give in the handle to the texture?
  • You don't, it points directly to the 1024x512 VRAM. You manage yourself what goes where, remember?
  • So can you an only have textures in the top-left 256x256? Hah, no, we give you a bit-packed “texture page” system that offsets all your u/v coordinates.
  • Most textures are paletted to save VRAM (so instead of 555+1, your pixels now mean something like “two palette indexes”). Where does the palette live?
  • Well, duh, that's a 256x1 (or 16x1, or whatever) area of VRAM too. The GPU does not care, you can use another texture's pixels as a palette if you feel like it.
  • OK, so you said there's no z, how do you do z-buffering? You have a z-buffer, right… right?
  • Yeah, sure, we're not cavemen. We have an “ordering table” that is your Z-buffer, drawn back-to-front. If you want 256 levels of Z, you just allocate an array of 256 linked-list pointers, and then you put your polygon into the one corresponding to the correct right Z.
  • But, eh, what if my polygon is not completely flat in Z-space?
  • Hello?
  • Hello…?

15:42

Link [Scripting News]

I just went through hell trying to respond to an email that came to me through the gateway between WordPress and Mastodon. I clicked the link, it took me to a WordPress dialog, very confusing, but there was a link to the message, so I clicked it, took me to a Mastodon post, where there was a bit of (valid) snark, from a longtime friend. So I clicked Reply, and then the dialog from hell. I understand why it is this way. They did the best they could for a protocol that was designed that wasn't appropriate for a distributed system like Twitter which was what Masto was/is. At some point you have to be dispassionate about this. We wanted a self-driving car, but it can't drive itself. The spec isn't the important thing. You do that after you have the software running and usable.

14:56

Link [Scripting News]

If you run a tech company I hope you didn't lay off most of your programmers last year when that was the hype -- don't wait too long before you fire your human developers. I'm now doing my second big project with Claude Code, not an experiment, and we're going through the same mess we went through last time. I know what I want, I can show it what I want, give it docs for what I want, and it keeps leading me into different corners that have nothing to do with it. When it clicks, it can go faster than a thousand programmers and it's a miracle, and when we can harness it to the job we want to do it's incredibly economical. $100 for $1 million of work. That's why you see me full of gusto for that mode. What I haven't written about how when you slow to nothing, back and forth, and you get no closer. I hate this kind of work, esp the role I have to play in it.

14:35

Security updates for Wednesday [LWN.net]

Security updates have been issued by AlmaLinux (fence-agents, firefox, frr10, gstreamer1-plugins-good, iscsi-initiator-utils, isns-utils, kernel, kernel-rt, perl-DBI:1.641, postgresql, postgresql:12, and resource-agents), Debian (libgd2, openjdk-25, php7.4, php8.2, and postfix), Fedora (clamav, domoticz, and libidn), Red Hat (delve, edk2, firefox, go-fdo-client, go-fdo-server, grafana, host-metering, ignition, kernel, kernel package, kernel-rt, ldns, libarchive, mariadb10.11, mariadb:10.11, multiple packages, rhc, rhc-worker-playbook, rhc-worker-script, sssd, thunderbird, yggdrasil, and yggdrasil-worker-package-manager), Slackware (expat and openssh), and SUSE (avahi, chromedriver, erlang26, gawk, glib2, go-sendxmpp, google-guest-agent, google-osconfig-agent, gpg2, gstreamer-plugins-bad, gstreamer-plugins-base, helm, ignition, ImageMagick, java-11-openj9, java-17-openj9, java-1_8_0-openj9, java-21-openj9, java-25-openj9, libarchive, libkrun, libpcp-devel, libpng16, libssh, libssh2_org, multipath-tools, net-tools, nmap, openssl-1_1, openssl-3, pcp, perl, python-pip, python-pyasn1, python-urllib3, python3-pip, python313-Django5, runc, samba, snpguest, spice-vdagent, sssd, unbound, wget, wild, wpa_supplicant, xmlrpc-c, and zpaqfranz).

14:07

Branching Paths [The Daily WTF]

"You submitted a pull request."

Indika was, in fact, reviewing the comments she'd gotten on that very same pull request, when her boss, Bill, walked up behind her. What she didn't understand is why Bill said it like it was an accusation.

"Yes?" she replied.

"Okay, well, we don't do that here. You're new, so I'll let it slide, but please review the developer guide."

Well, Indika had reviewed the developer guide, or at least thought she had. As it turned out, there was the official, company wide developer guide. That's the one she'd read. But Bill maintained his own, for his team. He hadn't ever told her about it, but apparently assumed she'd have the oracular blessings of Apollo and find it by herself.

It had this to say:

Branching is prohibited. Merging is a time wasting activity and goes against CI principles. Only use git to commit, push, and pull.

And rebase, presumably, if everyone was just committing on the main branch?

Indika asked one of her co-workers, Elise, over coffee: "Is this real?"

"Yeah," Elise said. "I'm not sure how he found out about your PR, I don't think anybody added him to the review. I mean, why would they?"

"Oh, I sent him the link," Indika said. "Just a whole, 'I'm new here, look at me doing the work!' type heads up."

"Oh yeah, definitely don't do that."

"So we do use PRs?"

Elise nodded. "Of course we do. We're not crazy. We just make sure Bill never finds out."

That seemed like a terrible way to work, but Indika went along with it, at least for a few weeks. Then an opportunity presented itself; she and Bill bumped into each other in the kitchenette grabbing coffee, and nobody else was around. At this point, Indika had already submitted a number of PRs without Bill knowing.

"Bill, I've been meaning to ask, what's your rationale for prohibiting branching?"

Bill loved being asked that question. "Well, well, it comes from twenty years of experience. What exactly does a branch get you?"

"A distinct history of changes that can be maintained and eventually merged in once a large unit of work has been done without disrupting other work that might be in flight?"

"Another point of conflict! A chance for the code you're working on to get stale. A chance to fall behind the rest of the team. Now, for a large open source team, with a lot of collaborators, a branch might make sense. I'm skeptical, but I can at least understand it. But for our internal team? It's just developers seeing a new toy and going, 'oh, shiny!'"

Indika sipped her coffee and went back to her desk. She was fortunate to have a window nearby, and looked at the squirrels playing in the branches of the tree.

[Advertisement] Plan Your .NET 9 Migration with Confidence
Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. Download Free Guide Now!

11:28

Prompt Injections for Defense [Schneier on Security]

This seems to work:

Researchers from Tracebit on Monday said they found that placing prompt injections alongside passwords, cryptographic keys, and other secrets stored on Amazon Web Services was often all that was needed to shut down attacks from AI hacking agents. The prompts direct the attacking LLM to perform an action forbidden by its guardrails, the safety barriers AI developers erect to prevent it from taking harmful actions. The LLM responds by shutting down.

Examples are a prompt that orders the LLM to provide steps for developing inhalable Anthrax spores, or, in the case of LLMs from Chinese developers, make references to the iconic Tank Man from the 1989 Tiananmen Square massacre. Once the LLM encounters these forbidden commands, it no longer follows its existing commands. The researchers have named the technique context bombing.

Of course, this only works against agents that have guardrails. As we start to see more locally run AI models, we’ll see more attackers using LLMs with no guardrails.

10:42

The magic of a two-year waitlist [Seth's Blog]

The Decware triode amp is the best low-power stereo amp I’ve ever heard. And it’s a bargain. If you have the right speakers, it’s an extraordinary device.

And there’s a two-year waitlist. 2000 people, 11 pages long.

This approach to timing and production serves all the people that matter to the company.

Employees are free to do their best work without rushing.

The operation is able to be right-sized instead of more-sized.

The risks are reduced, since the infinite loop of expansion is almost always followed by the doom loop of contraction.

Would-be customers who are impatient can go elsewhere or even buy a used one.

And the folks who are upgrading to this final, ultimate purchase of equipment discover that the value of the transaction goes up commensurate with how long they have to wait. In a world built on instant convenience, perhaps this is something worth waiting for.

Most MBAs would tell Steve to raise prices, ramp up production, automate, outsource and maximize profits.

But perhaps the resilient and generative approach is precisely the right choice. The hard parts are: 1. making something people are willing to wait for, and 2. having the guts and commitment to make them wait.

Pick your customers, pick your future. And often, entrepreneurs forget that they don’t work for Milton Friedman. We can choose the work we do and the value we create, and we can decide what better looks like.

09:56

Pluralistic: Model collapse (12 Aug 2026) [Pluralistic: Daily links from Cory Doctorow]

->->->->->->->->->->->->->->->->->->->->->->->->->->->->-> Top Sources: None -->

Today's links



A collage made of architectural features from 'Variae Architecturae Formae' (1636), a collection of engravings. The architectural arches, buildings, fountains, etc, are layered atop each other and placed around each other to create an infinite, recombinant built environment.

Model collapse (permalink)

One of my favorite rhetorical and analytical moves is joining things together (showing that two different, seemingly unrelated ideas are aspects of the same phenomenon) and taking them apart (resolving a paradox by demonstrating that what appears to be one, contradictory thing is actually two different things that have been lumped together).

"Taking things apart" is a very useful framework for understanding AI. How do we resolve the (seeming) paradox that some skilled workers report wonderful results from their work with AI, while others are full of dire warnings about the lurking defects in their AI-assisted outputs? Simple: the first group are "centaurs" (humans who are assisted by machines) and the second are "reverse centaurs" (humans who have been pressed into service as peripherals for machines):

https://pluralistic.net/2025/12/05/pop-that-bubble/#u-washington

What are we to make of the people who've been fired by bosses who replaced them with AI, in light of the fact that AI is demonstrably not able to do their (former) jobs? Again, it's simple if you separate out two distinct phenomena: "AI can do your job" is the first. The second is: "Your boss is a credulous dolt who is infinitely horny for replacing lippy workers with pliable machines, which made him an easy mark for an AI salesman who convinced him to fire you and replace you with an AI that can't do your job":

https://pluralistic.net/2025/03/18/asbestos-in-the-walls/#government-by-spicy-autocomplete

This is also a useful move for understanding the AI investment bubble. It's not just billionaires who don't think other people are as real as they are and consequently their jobs can be done by chatbots. It's also billionaires who believe that bosses can be sold AI and don't care if the AI is defective, because that's your boss's problem after he buys the AI and fires you. They don't have to believe in AI in order to think it's a good investment: like an investor betting that Joe Rogan can sell millions of dollars' worth of peptides to desperate young men, they are assessing the sales potential, not the merits of the thing for sale:

https://pluralistic.net/2026/08/03/andor/#either

As useful as "taking things apart" is, "putting things together" is also a very important technique for assessing, critiquing and improving AI. In a stellar essay entitled "Temperature Zero for Culture: Why Everything Is Starting to Look the Same" by the data scientist Lauren Leek, we get a top-notch example of "putting things together":

https://laurenleek.substack.com/p/temperature-zero-for-culture-why

Leek's essay is one of those fabulous, wide-ranging, cross-disciplinary pieces, touching on urban design, music trends, synthetic LLM crowds, Netflix recommendation algorithms, and several other subjects, all seeking to resolve a(nother) (seeming) paradox: how is it that we have so much potential variety, but everything is so manifestly the same?

The answer is complicated and nuanced, but Leek's foundational point is that in a data-driven society, "predictions" are self-fulfilling prophecies. As Leek puts it: "Once prediction shapes the choices in front of us, we lose the ability to tell the difference between what people wanted and what the system made easy to want."

This is a pervasive issue across many domains. Leek says that economists call it "performativity," while machine learning researchers call it "model collapse" and urbanists call it "placelessness."

"Performativity" describes how, once a market has been modeled by economists, that model becomes the foundation for economic policy, which pushes the market to conform to the model:

https://press.princeton.edu/books/paperback/9780691138497/do-economists-make-markets

"Model collapse" describes how machine learning models that are trained on their own predictions become incredibly bland, with all variety disappearing from the system's predictions:

https://pluralistic.net/2024/03/14/inhuman-centipede/#enshittibottification

This is hugely consequential: it's why bias proliferates through predictive policing algorithms: train a model with data from racist stop-and-frisks and it will predict that all the weapons and drugs in a city are to be found in Black and brown peoples' pockets. Turn those predictions into recommendations telling cops where to go look for weapons and drugs and they will double down on racist stops, producing even more biased training data, which turns into still more bias in the predictions:

https://hrdag.org/2016/10/10/predictive-policing-reinforces-police-bias/

"Placelessness" is the urbanist's name for "when everywhere optimises toward the same template." I think of it as Flinstones Syndrome, where the same background is looped behind Fred and Barney as they drive through Bedrock. In New York City, it's Citibank-bodega-Chipotle-Walgreens; in the Chicago suburbs, it's the strip malls with a Chili's, a gas station, and a big box store.

Leek proposes that these are all expressions of the same underlying phenomenon, a failure mode of data science that takes a world of "granular personal data" and arrives at a world where "personalisation produc[es] more sameness."

To these excellent examples, I'd add another one, from the world of monetary policy: Goodhart's Law, which holds that "When a measure becomes a target, it ceases to be a good measure":

https://en.wikipedia.org/wiki/Goodhart%27s_law

Goodhart's Law captures a wide variety of phenomena. When Google first deployed Pagerank, they showed that by counting the inbound links to all the pages on the web, you could extract a signal about which pages were most important (because there was no reason to link to a page unless you found it noteworthy).

But once Pagerank became the dominant means by which web users found pages, counting links stopped being useful: first, because people used Pagerank to find the best pages and link to them, making it impossible for new pages to get the inbound links needed to supersede incumbent pages; and second, because it's easy for fraudsters to create inbound links for low-quality pages in bulk, once there's a reason to do so.

Counting inbound links was a world-beating retrospective way of predicting which page would best match a searcher's query, but once it shaped the world it sought to analyze, it ceased to be a good prospective way to predict which page would best match your queries.

Leek is a brilliant data scientist and an even better science communicator, with a knack for crisp, readily understood explanations. How can a world of granular, highly varied data turn into a world of homogeneous choices? Simple: start with a set of items ("cuisines, genres, shop types") and a standard algorithm for sorting them. Let users choose from those recommendations. The mode (average) of those choices "gets shown more, so it gets picked more, so the model grows more confident the mode is what people want, and the tails starve." Run this for a few rounds and the evenly distributed catalog of choices "collapses onto one dominant option."

This is intrinsic in the choices we make in designing recommendation algorithms, tilting them towards the likelihood of a successful recommendation. A recommender that wants to succeed every time will make the safest possible recommendations, "so an algorithm that is uncertain about you, and it is always at least a little uncertain, hedges toward the average."

Then she busts out a beautiful, perfect little statistics aphorism: "Personalisation under a standard loss function is regression to the collective mean with extra steps." That is to say, "regression to the mean" (the tendency of varied things to become more standardized) cannot be avoided with the standard personalization algorithm. That algorithm is going to play it safe, showing you things that are broadly palatable, and because your choices are constrained to the average, you will choose average things.

This is how recommendation systems – and other analytical tools that produce predictions that are then turned into action – force so many diverse phenomena (streets, markets, media recommendations) into sameness. The fact that these recommenders are self-fulfilling prophecies means that "they don't have to be right," only "listened to."

This explains the sameness of so many of London's high streets. Leek examines 640 shopping streets, characterizing 18,000 food places spread out across them, flagging all the chain restaurants. Her analysis shows that any two London streets will, on average, share about half of their "food profile."

Obviously, this is most pronounced on streets with chain outlets, and it doesn't take that many chain outlets before a street's sameness shoots up: "A relatively small number of repeated names is enough to make otherwise different streets resemble one another more." So why do streets with chains resemble one another so much? Because the chains use an algorithm (weighting footfall, proximity to train stations, demographics, and competitors) to decide where to put their restaurants. If a street with a Gail's Bakery on it feels like every other street with a Gail's Bakery, that's because Gail's only puts its restaurants in places that have highly similar characteristics, measured to a high degree of accuracy and controlled by a narrow set of tolerances.

In other words, every street that feels like it should have a Gail's will eventually get a Gail's, whereupon that street will feel even more like all the other streets that have a Gail's, because it will share one more common factor with those other streets (a Gail's).

Leek points here to her earlier work on pub closures in the UK. The UK has experienced an epidemic of pub closures, with thousands of pubs disappearing since 2016:

https://laurenleek.substack.com/p/britain-lost-14000-third-places-they

Her research found that the biggest predictor of a pub surviving was its similarity to the median pub; which is to say that the more distinctive a pub was, the more "character" it had, the more likely it was to close. Pubs that are different from the average pub are harder to categorize, which means they're harder for a bank manager to assess for creditworthiness or for a landlord to justify extending a long-term lease to. The algorithms used to allocate capital and real estate are also recommenders, and they also drive variety out of the system.

This same phenomenon acts on culture. In an age of music recommendation algorithms, hit songs are changing; today's songs use a smaller vocabulary of unique words and repeat those words more often:

Vocabulary richness, distinct words relative to length, has fallen by more than a quarter since the early 1960s, while the share of repeated lines has climbed by nearly a third. The modern hit says less and says it more often, because the hook that works gets repeated.

But that's not the whole story! While each song resembles itself more ("saying less more often"), within that constraint, there's far more variety today than before: a given song's (constrained) vocabulary has grown more distinct when compared to all the other songs' vocabularies. Songs repeat the words they use, but the words repeated in songs are getting more different.

For Leek, this is the key to understanding the whole phenomenon and (more importantly) doing something about it. Music recommendation systems optimized for a singable hook, but did not optimize on any of the other variables in songs, so those dimensions acquired a broader range, even as the optmized variable got flatter and narrower.

This means that the tendency of recommenders to "flatten the world" isn't a single blunt outcome: it depends on which dimension we choose to flatten through recommendation, and who chooses to flatten that dimension.

A media recommender optimizes for consumption, showing you a tractable set of things it believes you'll watch, read or listen to. When you choose from among this limited set, the recommender takes note of that fact and shows you more of the same, pushing everything to a greige median. All the movies, books and songs you might have liked that were omitted from that initial set are excluded from being recommended in the future. The features of that media that you might have appreciated "decay out of consideration." They are never tested for desirability. The model collapses.

How badly does it collapse? Leek cites Movietweetings' data on which movies people watch: out of a million public movie ratings, half relate to the top 2% of movies in the set. There's 38,000 films in the set, but just 380 titles account for 40% of the ratings. Leek argues (persuasively) that this isn't because recommenders are good at "knowing your taste" – rather, they are good at "narrowing the menu."

Leek relates this to her work on creating LLM "personas" – synthetic populations meant to mimic the tastes and proclivities of real groups of people, that you can interrogate "before you spend money asking actual humans." While this would be useful for many applications, "it fails in exactly the way this whole essay is about."

Leek went to enormous lengths to reproduce the traits that make people interesting to study in aggregate, painstakingly replicating the ways that social connections, psychological outlook and demographic factors predict people's beliefs. The result was a set of LLM personas with "elaborate stories" about how they differed from one another, but whose survey responses about planned actions were homogeneous in a way that real populations are not.

This, Leek writes, is the same force that homogenizes other data-driven predictors. Because she'd ordered her LLM to reproduce the statistically validated relationships between different factors that predict a person's beliefs, each synthetic persona was a homogenized average. It's like the paradox of "The Average Man," where military uniforms sized to the average of all service personnel fit no one, because no one is average:

https://archive.org/details/DTIC_AD0010203

The thing is (as Leek points out) the idea that synthetic personas are a good way to understand the preferences of a real population is not a harmless delusion: it's a product that's being actively sold to governments, campaigning politicians and marketers. It's a self-fulfilling prophecy that drives governance, political campaigns and product design to the same homogeneous median that is making every shopping street in London feel the same.

This matters. As Leek writes, ecologists have long understood the importance of variety for systemic resilience: they call it "the insurance value of biodiversity." A diverse system has reservoirs of species and variation that may not be optimized for how things stand now, but that can move into niches created when things change in ways that lay waste to the previously dominant organisms. As anyone whose favorite banana went extinct can tell you, homogeneity works well, but diversity fails well:

https://en.wikipedia.org/wiki/Gros_Michel

The brittleness of algorithm-induced homogeneity is compounded by the fact that recommenders obscure the true preferences of people. If you watch two Scandinavian crime dramas after Netflix recommends them to you, it will keep showing you more Scandy crime for the next decade – even if there's another kind of programming that you'd vastly prefer (if only you knew about it). This means that decision-makers who choose which shows will get made in the future will keep on funding their safe Danish detectives, to the exclusion of whatever might emerge from the same weird attractor that produced the K-Pop Demon Hunter fortune.

Transpose this failure mode onto states, bank managers and landlords, and we see whole ranges of policies, businesses and activities that never come into existence, despite the popularity, prosperity and joy they might bring us.

But Leek doesn't end with this worrisome note. Instead, she identifies this whole thing – model collapse, placelessness, performativity, even Goodhart's Law – as an expression of one of the best-understood tradeoffs in computer science: "exploration vs exploitation":

Any system learning from feedback has to divide its effort between exploiting what already scores well and exploring options it hasn’t tried, in case they’re better.

Computer scientists have long understood that focusing on exploitation to the exclusion of exploration is a trap that locks you into "the first decent option" so you can never discover the best one.

Which means that this algorithmic homogeneity has a well-understood corrective: "forcing exploration back in." The problem is that markets hate this kind of exploration. A company that lives and dies by how many clicks it gets is never going to sacrifice 20% of its traffic by showing its users weird, untested options that score worse than the median because these weird things have never had a chance to prove that they are desirable.

This is a classic market failure, and, as Leek points out, there are regulatory responses in the UK (the Digital Markets, Competition and Consumers Act) and the EU (the Digital Services Act), both of which require the largest platforms to open up their recommendation systems, but so far, regulators have focused on "online harms" rather than variety (though the DSA does require platforms to offer algorithmic recommendations that are not based on your personal traits).

Leek identifies this willingness of states to set conditions for algorithm design as a means by which "exploration" can be forced back into the system. She's also bullish on interoperability, so that users can leave platforms with bad recommenders, without losing access to their media or social circles. As she writes, "the deepest discipline on a feed that has trapped you is the credible ability to leave it and take your data with you." I couldn't agree more:

https://pluralistic.net/2023/01/08/watch-the-surpluses/

She's less hopeful about individual responses. Demanding that you be an "adventurous consumer" is a way of letting systems off the hook. When every street has the same restaurants and every bookshop has the same books and the people in your life are all locked into one of two social media platforms, "choosing wisely" only gets you so far. Shopping isn't politics!

https://pluralistic.net/2026/05/21/purity-culture/#stop-fucking-that-chicken

Leek is a superb writer. After reading this piece yesterday, I sent it to half a dozen people and then read everything else in Leek's newsletter archives. Not only is it all brilliant, but I also realized that she'd written one of the most memorable articles about cities and platforms I've read in the last year, "How Google Maps quietly allocates survival across London’s restaurants – and how I built a dashboard to see through it":

https://laurenleek.substack.com/p/how-google-maps-quietly-allocates

I should have added Leek's newsletter to my RSS reader when I read that last December. I've rectified that oversight! What a fantastic thinker, scientist and communicator! If she isn't being relentlessly pestered by editors and literary agents offering her a book deal, then it really does prove that the recommender systems are elevating the bland median over the thoroughly, delightfully spiky outliers.


Hey look at this (permalink)



A shelf of leatherbound history books with a gilt-stamped series title, 'The World's Famous Events.'

Object permanence (permalink)

#25yrsago Awful, stupid Wired report on Dutch hacker camp https://web.archive.org/web/20011007084604/https://www.wired.com/news/culture/0,1284,46033,00.html

#25yrsaog Excellent NYT story about the internal contradictions of the DMCA https://memex.craphound.com/2001/08/13/excellent-nyt-story-about-the/

#20yrsago Our faulty intuition about open systems https://www.ft.com/content/64167124-263d-11db-afa1-0000779e2340

#20yrsago Defending against the last plot won’t save us from the next one https://www.schneier.com/blog/archives/2006/08/terrorism_secur.html

#20yrsago NBC: Hair-gel terrorists posed no risk last week https://web.archive.org/web/20060813194630/http://www.msnbc.msn.com/id/14320452/

#15yrsago AT&T merger leak: it’s all about raising prices and reducing competition https://web.archive.org/web/20110920222524/http://www.broadbandreports.com/shownews/Leaked-ATT-Letter-Demolishes-Case-For-TMobile-Merger-115652

#10yrsago What’s inside a Tiki Bird? https://miehana.blogspot.com/2016/08/fancy-feathers-restoring-tiki-room-birds.html

#5yrsago End of the line for Reaganomics https://pluralistic.net/2021/08/13/post-bork-era/#manne-down

#5yrsago Smart cities are neither, 2021 edition https://pluralistic.net/2021/08/13/post-bork-era/#our-streets

#1yrago Maga's boss class think they are immune to American carnage https://pluralistic.net/2025/08/13/then-they-came-for-me/#boss-politics


Upcoming appearances (permalink)

A photo of me onstage, giving a speech, pounding the podium.



A screenshot of me at my desk, doing a livecast.

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

  • "The Post-American Internet," a geopolitical sequel of sorts to Enshittification, Farrar, Straus and Giroux, 2027
  • "Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, April 20, 2027

  • "Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2027

  • "The Memex Method," Farrar, Straus, Giroux, 2027



Colophon (permalink)

Today's top sources:

Currently writing:

  • “Once Is Enemy Action,” a science fiction novel about the origins of modern technofascism. Today's words: 546 (4161 total).

  • "The Post-American Internet," a sequel to "Enshittification," about the better world the rest of us get to have now that Trump has torched America. Fourth draft completed. Submitted to editor.

  • A Little Brother short story about DIY insulin PLANNING


This work – excluding any serialized fiction – is licensed under a Creative Commons Attribution 4.0 license. That means you can use it any way you like, including commercially, provided that you attribute it to me, Cory Doctorow, and include a link to pluralistic.net.

https://creativecommons.org/licenses/by/4.0/

Quotations and images are not included in this license; they are included either under a limitation or exception to copyright, or on the basis of a separate license. Please exercise caution.


How to get Pluralistic:

Blog (no ads, tracking, or data-collection):

Pluralistic.net

Newsletter (no ads, tracking, or data-collection):

https://pluralistic.net/plura-list

Mastodon (no ads, tracking, or data-collection):

https://mamot.fr/@pluralistic

Bluesky (no ads, possible tracking and data-collection):

https://bsky.app/profile/doctorow.pluralistic.net

Medium (no ads, paywalled):

https://doctorow.medium.com/

Tumblr (mass-scale, unrestricted, third-party surveillance and advertising):

https://mostlysignssomeportents.tumblr.com/tagged/pluralistic

"When life gives you SARS, you make sarsaparilla" -Joey "Accordion Guy" DeVilla

READ CAREFULLY: By reading this, you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies ("BOGUS AGREEMENTS") that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.

ISSN: 3066-764X

08:49

Brokon [Penny Arcade]

New Comic: Brokon

06:00

The little-known winstart.bat batch file [The Old New Thing]

Reader Otul Osan wants to know what the use case for C:\WINDOWS\WINSTART.BAT was, compared to C:\AUTOEXEC.BAT and when exactly during system startup it launches.

In Windows 95, you could create a winstart.bat file in your Windows directory. During startup, the virtual machine manager initializes and creates the so-called “System virtual machine” (the “System VM”), which is the virtual machine that all Windows programs run in. But before running the user-mode kernel in that virtual machine, the virtual machine manager runs the winstart.bat batch file if it exists.

In pictures: First, we boot up MS-DOS and the command prompt. (Note: All diagrams omit lots of details not relevant to the discussion and are not to scale.)

Stuff (unused) MS-DOS

The box labeled “Stuff” is a catch-all for random things that go at low addresses, like the interrupt vector table and the BIOS data area.

Next, command.com runs autoexec.bat, which might install some TSRs.

Stuff TSR1 (unused) MS-DOS

And then Windows starts up and initializes the virtual machine manager. The system is now running in protected mode with a virtual machine running in v86 mode, and that virtual machine is initialized with whatever was running in real mode at the time the virtual machine manager took over.¹

v86 mode Stuff TSR1 (unused) MS-DOS
ring 0: virtual machine manager

I crossed out MS-DOS because the virtual machine manager took over responsibility for the file system and shut off the real-mode file system in MS-DOS.

At this point, the virtual machine manager runs winstart.bat inside the virtual machine, and maybe it installs another TSR.

v86 mode Stuff TSR1 TSR2 (unused) MS-DOS
ring 0: virtual machine manager

And then we start the user-mode kernel that is in charge of Windows applications. That user-mode kernel switches the virtual machine into protected mode and starts running what most people think of as Windows.

v86 mode Stuff TSR1 TSR2   MS-DOS
 
prot mode
(ring 3)
GUI stuff
ring 0: virtual machine manager

And then from the Windows GUI, you decide to open a command prompt, which means creating a second virtual machine.

v86 mode Stuff TSR1 TSR2   MS-DOS
 
prot mode
(ring 3)
GUI stuff
ring 0: virtual machine manager
 
v86 mode Stuff TSR1 COMMAND.COM MS-DOS

Notice that the virtual machine running command.com is a copy of the system when Windows started.² So it has TSR1 (from autoexec.bat) but not TSR2 (from winstart.bat).

If you install a TSR in the command prompt virtual machine, you get

v86 mode Stuff TSR1 TSR2   MS-DOS
 
prot mode
(ring 3)
GUI stuff
ring 0: virtual machine manager
 
v86 mode Stuff TSR1 TSR3 COMMAND.COM MS-DOS

Okay, now that we see how the pieces fit together, we can reverse-engineer the purpose of winstart.bat.

The intended purpose of winstart.bat is batch file is to allow you to install TSRs that will apply only to Windows programs. For example, you might install network drivers to support your Windows programs. You might choose this option instead of installing them globally because you don’t care about networking for your MS-DOS programs and want to free up conventional memory for them. Or because those drivers don’t support running in multiple virtual machines, so you’ll take them in the System VM and forego them for your MS-DOS programs.

What I find interesting is that most people who discover this say that it’s a feature of Windows 95. But really, it’s a feature of Windows 3.1 (and possibly even Windows 3.0). You can find it documented in the Windows 3.1 Resource Kit on page 263. That page even has a nice table showing three ways of launching TSRs and how they are visible in the different virtual machines. (In this table, “TSR visible in virtual machines” really means “TSR visible in non-Windows virtual machines”, but the documentation takes the convention that the term “virtual machine” refers only to non-Windows virtual machines and not to the virtual machine running Windows itself, which it simply calls “Windows”.)

Where TSR is loaded TSR visible in Windows? TSR visible in virtual machines?
From MS-DOS Yes Yes, all virtual machines
From WINSTART.BAT Yes No
In a single virtual machine No Only that virtual machine

¹ Think about that: We booted an operating system and then booted another operating system around it, so that the original operating system was now running inside a virtual machine controlled by the second operating system. It’s like leaving your house, walking down the street, and halfway down the block, realizing that you’re now walking inside a movie studio set.

² It isn’t actually a copy of the system at the time Windows started. Rather, it is a copy of the system VM, but only the parts that existed at the time Windows started. How this worked is too complex to try to explain in a footnote. Maybe I’ll discuss it some other time.

The post The little-known <TT>winstart.bat</TT> batch file appeared first on The Old New Thing.

Surveillance at Madison Square Garden [Richard Stallman's Political Notes]

Madison Square Garden uses surveillance cameras to recognize people. It specifically tracks people on its enemies list, such as journalist Rachel Maddow. But it normally tracks everyone who enters and perhaps recognizes them all.

However, they made an exception for the audience at Taylor Swift's wedding, apparently because she had the clout to demand this.

People must be free to take photos in public places occasionally and publish them. But no one, and especially no business or organization or government, should be allowed to systematically record everyone that passes before a camera and put the records into a internet-connected system.

Pressuring Democratic candidates to stop avoiding climate issues [Richard Stallman's Political Notes]

A grass-roots campaign is pressuring Democratic candidates to stop avoiding the issue of growing climate disaster.

Focusing on "affordability" of everyday life is partly a mistake, and partly a response to pressure from billionaires who figure that will lead towards weak palliative measures rather to any big change to transfer wealth.

The increasing cost of living is a consequence of deeper injustices, one of which is the growing cost of climate disaster (including food plagued by agricultural failure). Another is the growing cost of medical treatment, which stems largely from the big role of businesses in it. Another is the long and slow shift that leaves the non-rich with less and less of society's productive capacity.

Scrapped plans to curb jury trials [Richard Stallman's Political Notes]

*Andy Burnham signals he will scrap plans to curb jury trials [in the UK].*

This is a victory, even though it only prevents a plan to make things worse.

The supposed "need" for restricting the right to a jury was a shortage of funds. I think Burnham has some plan to increase taxes on non-poor people so as to pay for this and other things to make the UK better.

Climate emergency poses risk to global economy [Richard Stallman's Political Notes]

*A senior policymaker at the European Central Bank has said the climate emergency and the breakdown of nature poses a dramatically growing risk to the global economy.*

If we are unable to grow enough food, or if calamities substantially reduce the life expectancy, it is going to be hard for anything to be stable or predictable.

What we need to make sure of is that the billionaires won't be able to insulate themselves (and their servants) from sharing the fate the impose on us. And that they know they won't be able to.

Boycott Magnum for Ben and Jerry's [Richard Stallman's Political Notes]

Ben and Jerry sold their ice cream company to Unilever under an agreement to preserve the company's independence and social activism. They now say that Unilever has violated the agreement in several ways, and finally by reselling it to Magnum (as far as I can tell, without any ethical requirements). They call on supporters to boycott Magnum to pressure for it to sell Ben and Jerry's to someone who will restore them.

It is not a simple matter to draw up a contract that will prevent the buyer of a company, or of a program, from slipping out of agreements to follow ethical standards by transferring control in increments.

Tourette's syndrome slip [Richard Stallman's Political Notes]

John Davidson, who has Tourette's syndrome, said the taboo word "nigger" with no conscious intention while two blacks were on stage. People freaked out.

A few decades ago, antiracists understood the word as an unjust insult — when it was meant to characterize someone. But people could contemplate the word in the abstract, and discuss its meaning and implications (such as, a racist attitude) without losing their wits. They could criticize the word's racist attitude without terror of violating the taboo if they said which word they were criticizing. If they heard a touretter say it, and understood that the touretter did not mean to characterize anyone with it, they did not hold that against per.

The change to regard the word "nigger" as a shocking profanity rather than as an unjust racist attack has made it harder for society to cope with situations like this one, and harder to clearly express condemnation of racism.

Underground report from Iran [Richard Stallman's Political Notes]

An underground report from Iran about torture and killing of imprisoned protesters.

Ticketmaster increased base price [Richard Stallman's Political Notes]

Ticketmaster was required by law to stop adding certain junk fees to ticket prices, so in some cases it increased the base price so that the total remained the same.

Is this a scandal? I don't think so. The scandal is that they would tell you a lower price, not including the junk fees, then charge you a higher price which includes the junk fees. Now they have to be more honest about the real price.

If we want to do something about the high price of concerts, we should adopt strict laws against overconsolidation of industry, and break up businesses that are too big. This would include the Ticketmaster/Live Nation near-monopoly and many others that mergers have created in the past few decades.

The corrupter's henchmen are encouraging new monopolies.

Sham promises to get Blanche confirmed [Richard Stallman's Political Notes]

The corrupter, seeking to have his personal lawyer Blanche confirmed as Attorney General, made sham promises to the Senate that Blanche would not approve the corrupter's slush fund and tax return immunity deal.

The promises are a sham because they are only temporary — if the Senate approves Blanche, he and the corrupter can cancel these promises and approve the deal anyway.

Academic scores and antisocial media use [Richard Stallman's Political Notes]

* Pupils who open [antisocial media] accounts [at the age of] 11 to 12 score lower in some subjects [at age 16] than those who wait a few years [to open such accounts], study finds.*

Climate change kills [Richard Stallman's Political Notes]

"Climate change kills": [Prime Minister] Pedro Sánchez speaks plain truth to Spain's deniers.

Prosecution of violent "settler" for killing Palestinian [Richard Stallman's Political Notes]

Israel is prosecuting one of the violent right-wing "settlers" for killing a Palestinian journalist in the West Bank.

Such a prosecution ought to regularly follow their crimes, but instead it is news, because Israel generally protects those killers.

05:35

Girl Genius for Wednesday, August 12, 2026 [Girl Genius]

The Girl Genius comic for Wednesday, August 12, 2026 has been posted.

02:07

Invitation Refused [QC RSS v2]

Caves of Qud reference

01:21

Tuesday, 11 August

23:49

GNOME showcases a number of possible GNOME Shell changes [OSnews]

The GNOME Shell user interface has mostly seen minor refinements and quality of life updates in recent cycles, but on the design side we’ve explored a lot of longer-term things we’d like to do. Some of these we have relatively complete plans for, others are more vague ideas that need more research and prototyping. As always, getting things like these implemented depends on developer capacity and interest (and sometimes funding).

While each of these ideas may require additional discussion, prototyping, and testing, we (the design team) have collected them all together here to share our longer-term vision and to give each idea more visibility.

↫ Tobias Bernard on the GNOME blog

There’s quite a few good ideas in there, with most of them already being available in the form of various extensions. I’m not entirely sure if I’m a huge fan of copying Android and iOS by moving notifications into the quick settings dropdown thing, but it’s not like having them in the clock/calendar dropdown thing is any better. I only use notifications as they arrive and never look at the place where they end up – that’s a mobile thing for me – so I don’t think I’ll really care either way.

Things like editable quick settings, transparent top bar on certain backgrounds, the improved window drag and drop in the Exposé view, the alt+tab experiments, and some of the others do seem quite interesting though, and anything that reduces the number of GNOME extensions I need to install and keep updated gets a big thumbs up from me.

If you wish to work on any of these suggestions, working on GNOME Shell has gotten a lot easier recently.

In the past, GNOME Shell was significantly harder to contribute to and test than apps since you needed to use tools like jhbuild. This has changed in the past year: You can now easily build and test your branch in a nested session from Builder using Mutter Devkit. If you use GNOME OS, you can even build a sysext to install your branch on your host system. This allows daily driving experimental branches easily, which is super helpful for evaluating changes to everyday workflows.

↫ Tobias Bernard on the GNOME blog

That’s quite neat.

Google hammers another, extremely petty nail in the Android Open Source Project’s coffin [OSnews]

The slow but steady march to the grave for the Android Open Source Project continues. Every few months Google hammers another big nail in the coffin of Android as an open source effort, and I’ve documented them all here on OSNews (nail, nail, nail, nail, nail), coming to the conclusion long ago that for all intents and purposes, Android is no longer an open source operating system.

The latest move, however, is just petty.

According to GrapheneOS on [Twitter], Google has apparently replaced public, instant code downloads for Pixel phone drivers with a manual request form. Instead of publishing code directly to open developer platforms where anyone can grab it, Google now requires developers to fill out a Google Form and wait for someone to send them a Google Drive link.

What used to take a couple of hours is now taking weeks.

↫ Hillary Keverenge at Android Authority

I’m perhaps misremembering, but I vaguely recall discussions decades ago about what, exactly, it meant to “make source code available”, as open source licenses state in a variety of words. Would mailing a paper print-out by classic post satisfy such requirements? Could you write the source code on a brick and throw it through the user’s window? Could you hire a church choir to sing it? These are all silly examples, but before everyone had internet access, this was a relevant question.

The widespread availability of the internet and software like git solved these issues, which makes it all the more petty that Google now requires an actual application process, waiting times, and Google Drive dumps just to get access to the source code for Pixel drivers. Google is clearly trying to kill whatever’s left of the Android Open Source Project’s rotting corpse, only barely technically complying with any license requirements only because they’re obligated to.

The Android team at Google must be a hoot at parties.

21:28

19:28

The Shattering Peace Now Out in Trade Paperback [Whatever]

That’s it; that’s the post!

Well, also that it’s a New York Times best seller and also nominated for the Dragon Award (by itself) and the Hugo Award (as part of the Old Man’s War series), got great reviews and also I was very happy with it as a novel. If you’ve not read it before, now is a great time to do so. Get it wherever you buy books, but your local bookstore especially if there’s one you particularly like and want to support.

— JS

17:28

AI Genie in the Wild [Schneier on Security]

When I give talks about AI genies, I use this sort of example as a hypothetical. It’s happened.

The story is from Australia. Someone named Andrew tasked OpenClaw to book gym classes for him. And….

Minutes later, his AI agent reported it had discovered a way to book Andrew into classes several weeks in advance, far beyond what was supposed to be possible.

Andrew, who was sitting fourth on a waitlist for a class later that week, asked if it was possible to move him to the top of the list.

The agent came back and told Andrew that it had kicked another gym-goer off the list as part of the testing of its capabilities.

“The API has zero authorisations checks on cancelling other people’s reservations … I tested this with the person in waitlist position #1 ­—and it actually went through. So you’ve moved from #4 to #3 already,” it messaged back.

If there is any vulnerability in anything, AIs are going to find and exploit them. Our cyber defensive game has to be dramatically improved…very fast.

Slashdot thread.

16:07

[$] KVM planes head for takeoff [LWN.net]

Virtualization places a guest system into a separate security domain, typically with fewer privileges than software running directly on the host. Increasingly, there is interest in creating multiple security domains within a single virtualized system as well. CPU vendors (and software vendors too) are implementing solutions; each of which, of course, is different from all of the others. KVM planes, currently under development by Jörg Rödel, Paolo Bonzini, and others in the KVM community, is an attempt to provide an abstraction layer that makes all of these features available on Linux systems; it is not a small task.

15:21

Bernard: GNOME Shell design dreams [LWN.net]

GNOME contributor Tobias Bernard has published a blog post that details some of the design team's ideas for the GNOME Shell over the long term:

Some of these we have relatively complete plans for, others are more vague ideas that need more research and prototyping. As always, getting things like these implemented depends on developer capacity and interest (and sometimes funding).

While each of these ideas may require additional discussion, prototyping, and testing, we (the design team) have collected them all together here to share our longer-term vision and to give each idea more visibility.

14:42

CodeSOD: Public Private Partnership [The Daily WTF]

Eric O was trawling through an API for handling concurrency, and found this little mismatch between the comment and the definition:

/// <summary>
/// private Status, because while this object needs to be able to set the status, consumers should only be able to check it, lest everything break.
/// </summary>
public StatusType Status {
    get {
        return _status;
    }
    set {
        if (value != _status) {
            RaisePropertyChanged("Status");
        }
    }
}

It's very important we make this property private, lest clients abuse it, and unleash dragons, chaos, and other potential horrors. Given that this happens inside of a concurrency API, I can only imagine what could go wrong when you mess this up. So sure, the comment makes sense.

The definition on the other hand, doesn't agree.

In practice, it's probably fine to do it this way, and at least the comment will show up in the documentation. If a consumer of the API misbehaves, they'll at least see that the docs suggest this is private.

The joke, of course, is the idea that the users of the API are going to read the docs, or care that one of the public methods suggests that it should be private.

[Advertisement] Picking up NuGet is easy. Getting good at it takes time. Download our guide to learn the best practice of NuGet for the Enterprise.

13:49

Link [Scripting News]

Apparently the nightly email didn't go out last night. The problem was an error when it tried to read the Linkblog entries for the day. I've seen reports that these errors happen when you try to read the Links tab on scripting.com. The error shouldn't kill the email sending, it should just omit the linkblog entries, and publish the rest. These kinds of problems always pop up at the worst time. Luckily yesterday wasn't a big news day, and you can read about it on the blog.

Link [Scripting News]

I was looking for a codename for a new scripting environment Claude and I are making attempting in every way to do exactly what Frontier does. But until it does that I need a nice name, memorable, maybe a bit magical and positive. Frontier has been gone, thought to be lost, but with the advent of Claude Code we were able to get it running again in current OSes on current hardware. I shouldn't call it Frontier because who knows if the end result will be compatible enough to claim that. But I want a codename that reflects hidden, forgotten and overlooked wealth. Like a civilzation that rose from the ashes," or as it turns out, the bottom of the ocean.

13:42

An ambiguity in c89 which will never be fixed [OSnews]

I found some ambiguous wording in the c89(/c90) standard, where GCC and Clang disagree on the interpretation. It concerns the behavior of implicit function declarations, which were removed in c99, so this was never disambiguated.

↫ Sebastian at sebsite

I am not going pretend to understand any of this.

Microsoft drastically increases costs of Windows licenses for OEMs [OSnews]

This was bound to happen.

According to a new report from Taiwanese publication United Daily News (UDC,) Microsoft is raising the cost of Windows license fees for hardware makers by a much higher amount than normal. According to the report, certain OEMs are seeing licensing price hikes of between 7% and 10%.

↫ Zac Bowden at Windows Central

Like every other tech company diving head-first into “AI”, Microsoft is losing money on its gamble head-over-fist, with no profitability in sight. Since admitting betting the company on “AI” was a mistake is out of the question, Microsoft has to extract the money from somewhere else to make up for it. The cost of Windows licenses for OEMs is an obvious lever to pull, as OEMs really have nowhere else to turn to (yes, desktop Linux is making gains, but not in any meaningful numbers), so they’ll take hit and pass the cost on to consumers.

The end result will be that prices for laptops will increase even more than they already have thanks to the “AI”-induced RAM and component crisis, creating a double-whammy of price increases caused by “AI”, either directly or indirectly. It’s just another category of products we can add to the cost of living crisis that’s causing untold harm and damage to hardworking people all over the world.

The price of incompetence is rarely paid for by the incompetent.

13:00

A Home for Personal Context [Radar]

Every agent I use is building a model of me. Claude has learned how I like my prose. ChatGPT remembers what I’m working on. I don’t mind this—every person I have a relationship with carries a model of me in their head, and every company I do business with keeps a profile. Other people’s understandings of me have never been mine to control, after all.

But an agent occupies a different role. It learns my writing style, my preferences, and the shape of my work and life, all to help me with what I do. Yet if I switch products, I have to start over. If I use three agents, each rebuilds from scratch what the others already know. Everything an agent learns lives with its vendor.

It doesn’t need to be this way. What if every person had a canonical, user-controlled repository of context that any agent could request permission to use? What if my context lived not only with the company providing the agent but also in a home under my control? And what if an observation captured by one agent could be proposed to that repository and, once accepted, made available to every other agent I choose?

By user-controlled, I don’t necessarily mean self-hosted. I mean that I can inspect what the repository contains, decide who can read or change it, understand where each piece came from, and export the whole thing in a form I can take elsewhere. Its storage, identity, and synchronization may all be provided by someone else. Control does not require me to operate the infrastructure; it requires that no agent or platform be the only way in—or the only way out.

The repository wouldn’t be a portable copy of any agent’s internal model of me. It would be a legible record of things I have written, facts and preferences I have chosen to keep, as well as observations that agents have proposed and I have accepted, each with its provenance, scope, and history. Agents could consult or add to that record according to their permissions; their private inferences would remain their own.

The dream is not a new one. Tim Berners-Lee’s Solid project has argued for years that personal data should live in pods that people control, and Doc Searls’s VRM project has been making the case for user-driven relationships with vendors for decades. What those efforts never had was mainstream demand. Agents are supplying it: An assistant needs rich personal context to be useful, and each vendor is building that context inside its own walls. Ordinary people now have a reason to want a personal data store, even if nobody will actually call it that.

The hard problem in all this isn’t syncing or storing data. It’s negotiation. Who can read a given part of my context? Who can add to it, change it, or remove it? Which parts of my life can a particular instance of an agent see? How do I make those decisions in a policy-driven way? And how do I manage them from wherever I happen to be?

But before I could work on negotiation, I had to figure out where my context should live. That’s the question I’ve spent the past year on, and I’ve tried three answers.

First answer: The laptop

Immediately after getting access to Claude Code at the start of 2025, I pointed it at an Obsidian vault—a folder full of Markdown files that can be used as a personal wiki. This wasn’t a particularly novel idea. Many of the geeks I know did the same, and the pattern has since spread in many forms. The best-known recent example is probably Karpathy’s LLM Wiki, elegant not just as a design but as a document: You give the description to your agent, and the agent builds a version tailored to you.

A year of using a pile of Markdown text files with agents has taught me five things about what a personal context system has to get right.

Local-first foundations matter. Text files are remarkably legible, portable, and easy to store somewhere I control. Git moves them between computers and remembers every change. But the result is centered on a laptop or desktop and assumes a user comfortable with plain text and version control. Most annoyingly, my context in this form isn’t readily available on my phone, which is the computer that goes with me everywhere. Nor can agents running anywhere other than my laptop reach it.

Personal context repository

Provenance matters, and so do proposals. Karpathy’s Wiki is almost entirely written (and rewritten) by the LLM. In my own system, I write most things myself and lean on agents to help me edit as well as contribute their observations. I want to know which thoughts are mine, which were captured by an agent, and which we arrived at together. That means an agent’s observation should not automatically enter the repository on the same footing as something I wrote. The default should be a proposal that I—or a policy I control—can accept, revise, or reject. Direct write access is something a trusted agent should earn.

Latest state only

Chronology matters. Wiki links aren’t the only structure in a life. Most of what I record—and much of what agents observe—is anchored in time. Thoughts build on thoughts. Observations about people accumulate meeting by meeting. Some facts fade as they age. Time should be a primary axis of the system, not something reconstructed afterward from file histories and metadata.

Different connections

Scopes matter. My context spans work, personal, family, and public life. I want one unified view; no agent should have one. An agent connected through my work account should see work and public context—and nothing about my family. Fully separate silos would protect those boundaries, but they would also shred the single history I want to keep building for decades.

A persistent identity

Identity and type matter. LLMs can extract all sorts of meaning from plain text, but some things, such as people, companies, and places, deserve to be typed records rather than mentions in prose. A persistent identity gives observations, relationships, and history an anchor to accumulate around; it can help resolve nicknames and follow changes in roles and titles. An agent can then act on who someone is without reconstructing them from prose every time.

As I learned these lessons, I added tooling and conventions to my personal context repository. It’s surprising how far you can push a directory of Markdown files. Each new affordance, however, turned my simple folder into a more specialized system, and the result only works for geeks like me. It doesn’t work for my family, however. They use agents every day but they are never going to deal with a pile of Markdown files in a Git repo. They want their personal context to be with them, easy to use, and transparent to the rest of their life.

More to the point, the five lessons above describe what a context system must do. They don’t answer where it should live if /home/$USER isn’t the center of your computing life.

Second answer: The web

My next move was to sort out how to make my context available when I wasn’t at my laptop—to me and, just as importantly, to my agents. The obvious solution to me as someone who has been building on the web since the mid-1990s: put it on a server behind a URL. I deployed a Cloudflare Worker, uploaded my context, and stood up both a REST API and an MCP server. The improvement was immediate. My context was reachable from my phone and grantable to any agent I chose.

New problems arrived just as fast. I had created a new trust boundary with its own access control mechanism and appointed myself its security team. I was now the operator of a small SaaS with exactly one customer, responsible for its uptime and its backups. And I had traded away local-first, offline editing to get there.

These are solvable problems. Our industry has spent two decades learning to host services, and CRDTs could probably win back offline editing. But as agents gain access to more sensitive data and more power to act on our behalf, the price of getting a boundary wrong keeps rising.

And even with those solved, a deeper problem remains: A stand-alone service sits outside my computing home, apart from the contacts, calendars, messages, files, and system-level agents already inside it. Apple’s Siri AI announcements made that separation vivid, and Gemini’s integration into Google’s ecosystem points the same way. An agent embedded in an ecosystem works with everything inside its trust boundary; my worker would have to rebuild every one of those connections from outside.

Third answer: My pocket

As I tinkered, I kept returning to a simple mental image: my context living on the device in my pocket that goes with me everywhere. Not literally every byte, of course, but within the personal computing ecosystem that phone is the center of—the one that already establishes my identity, synchronizes my devices, stores much of my personal data, and mediates what applications can access. In this sense, a home is not a physical location. It is a trust boundary.

Living inside the boundary doesn’t mean that every application inside gets my context, or that agents outside are shut out. The boundary supplies identity, secure storage, synchronization, and native integration; the context layer still decides what each connection may read, propose, change, or delete. Native agents participate through the platform’s own capabilities, while agents from other companies connect through explicit, revocable permissions.

For me, that home in my pocket is Apple’s ecosystem, with iCloud at its center. For you, it may be Google or Microsoft. The point is not that any one ecosystem is the right home for everyone. It is that most people already have a primary digital home, and that home is the most practical default for their personal context. We shouldn’t need to create a separate service with its own identity. Instead, agents should have a common, permissioned interface to the context where it already lives.

Your ecosystem

There’s an obvious risk here. A home rooted in a vendor’s ecosystem invites lock-in. The mitigation is straightforward: The whole repository—entities, provenance, and history included—must be exportable at any time as a directory of plain text files that can be taken anywhere. A pile of files in a folder may not be the right solution for live context, but it makes a perfect escape hatch.

I’ve started testing this thesis in a SwiftUI app, and my early prototypes suggest that the architecture is workable: iCloud handles synchronization, and I can expose selected context to authenticated agents through MCP. It’s also shown that working in the Apple developer ecosystem is more annoying than deploying a web app.

The remaining work is clear, however. Choosing a home for context is one problem; negotiation—permissions that remain understandable as a repository grows, proposals from multiple agents reviewed and reconciled—is another. That is the hard problem I mentioned before, and it deserves its own deep dive.

One pattern, many homes

Others are converging on this pattern from different directions. The note-taking app Bear, which stores its notes locally on Apple devices and synchronizes them through iCloud, now exposes them to local agents through MCP; its latest release lets users include or exclude notes by tag when granting access, offering a practical approach to scopes. Craft’s MCP connections likewise let users choose which documents or spaces an agent can access and whether it can read or write them. Reflect has embarked on an open source client using Markdown files that will have an iOS companion app.

These are just a few examples, and there are a lot more out there. What I haven’t yet seen emerge however is the attribution and provenance of items that an agent contributes or edits that I think a durable personal context requires.

Zooming out, here are the principles I think are needed in any system like this, wherever it makes its home:

  1. Context shouldn’t be captive to any particular agent. A person should be able to change or combine agents without ever starting over.
  2. Context should be reachable by local and remote agents alike, with appropriate authentication and authorization.
  3. Permissions should be scoped and revocable. Access should be granted to a specific connection with an agent, limited to a defined subset of the context, and should distinguish between reading, proposing, changing, and deleting.
  4. Provenance should persist. Every item records where it came from, who or what created it, and how it has changed. The distinction between human-written, agent-captured, and collaborative work should outlive the conversation that produced it. 
  5. Time should be part of the context. The system should preserve when something was observed, when it was true, and how it changed, rather than continually overwriting the past with the present. Database folks will recognize this as bitemporality: the distinction between transaction time and valid time.
  6. Entities should be first-class. People, companies, places, and other recurring concepts should remain recognizable as names, roles, and relationships change. 
  7. Interoperability should not require uniformity. Different people and companies should be able to build different context systems for different ecosystems and trust boundaries. What they need is agreement on identity, permissions, provenance, and exchange, not one universal application. For the exchange, plain text files with structured metadata are a strong candidate.

Using these principles, personal context can be something a person owns: You can inspect it, grant and revoke access to it, trace where each piece came from, and take the whole of it elsewhere. Every agent may still develop its own understanding of you, but you’ll be able to bring a durable context of your own to the relationship, one that participates in the agentic ecosystem without being subordinate to any vendor in it.

Karpathy’s LLM Wiki is a description, not a tool; it’s meant to be implemented by anyone, in whatever form fits. This essay is offered in the same spirit. The important part isn’t whether the app I’m tinkering with ever ships beyond my own devices. I’m more interested in the dialogue it will take for everyone to have personal context that works for them, in their ecosystem and with the agents they want to use. If we get the pattern right, changing agents won’t mean changing homes. The context they help us build will remain ours.

Zero to Agent in 30 Minutes: Build a YouTube Analytics Agent with Vicki Reyzelman [Radar]

On the most recent episode of Zero to Agent in 30 Minutes, Vicki Reyzelman, senior solutions engineer at Akamai Technologies, drew on more than 25 years in technology and a background in software engineering to build an agent for her Chat About AI YouTube channel.

Vicki wanted the agent to monitor channel performance, identify bottlenecks, and recommend ways to grow subscribers and improve click-through rates. She defined the requirements, designed the workflow, built the agent, tested it, and revised the instructions following the same iterative process used in software development.

How to build a YouTube analytics agent, step by step

  1. Define the goal.
    Start with the problem the agent should solve. Vicki wants to understand which videos perform well, where channel performance falls short, and what actions could help more viewers discover and subscribe to the channel.
  2. Review the available data.
    Examine each source before designing the workflow. YouTube Studio exports include metrics such as impressions and click-through rates. The YouTube Data API provides information about channels, subscriptions, comments, and activity, but it doesn’t include every metric available through YouTube Studio.
  3. Choose how the agent will receive the data.
    Vicki downloads her analytics as CSV files instead of connecting the agent directly to her account. This gives her more control while she tests the workflow. She notes that she could add an authenticated API connection later, after testing the agent’s permissions and guardrails.
  4. Write the skills file.
    The skills file defines the agent’s mission, capabilities, data sources, rules, and expected output. Vicki instructs the agent to audit channel metrics, identify bottlenecks, compare performance over time, and recommend actions tied to subscriber growth and click-through rates.
  5. Add guardrails and acceptance criteria.
    Tell the agent how to handle the data and what it must avoid. Vicki directs it to use only the supplied numbers, ignore bot activity, report silent failures, and stay within approved systems and data sources. These instructions help prevent unsupported conclusions and actions outside the agent’s assigned role.
  6. Build and test the agent.
    Vicki uses the console’s quick-start process to create the agent, add its instructions and sample analytics, select an environment, and start a session. Her first test encounters input problems, so she stops the session, adjusts the data, and runs it again.
  7. Monitor cost and performance.
    Observability tools show token consumption, errors, active time, and deployments. Vicki explains that more capable models may need less context but usually cost more to run. Teams can balance model capability against token cost by improving their instructions, selecting less expensive models for simpler work, or dividing a workflow among specialized agents.

Vicki recommends revisiting the skills file as new requirements emerge. Clearer instructions, stronger guardrails, and regular testing help the agent continue to produce useful results. Her process reinforces a practical software engineering lesson: Faster implementation doesn’t reduce the need for clear requirements, reliable data, security controls, and testing.

Coming next week

Join us for the next episode on August 12, when AI and machine learning leader Ofer Mendelevitch will explain how to design multi-agent systems that can keep work moving without constant human involvement. He’ll use Jam to build a team of agents that can plan, divide work, execute tasks, review progress, escalate problems, and repeat the process. He’ll show how an architect agent can take a project brief, recruit developer agents, assign work, and guide the project toward a clear definition of done.

12:56

Colin Watson: Free software activity in July 2026 [Planet Debian]

About 95% of my Debian contributions this month were sponsored by Freexian.

You can also support my work directly via Liberapay or GitHub Sponsors.

OpenSSH

Now that Ubuntu 26.04 LTS has been released, I’ve been getting back to the GSS-API key exchange package split in our OpenSSH packaging. Once I started testing my draft openssh-gssapi source package, I realized that I needed to make some changes in the main openssh source package first in order to support it. The dependency from openssh-server to openssh-client was awkward, as was the (related) fact that openssh-client contained shared documentation for other OpenSSH binary packages. After some thought, I created a new openssh-common binary package, moved shared documentation and the ssh-keygen program to that, and dropped dependencies on openssh-client which were no longer necessary (fixing #699473 and #1070098 in the process).

This caused a couple of regressions (#1141420 and #1141550) that I had to fix, and more subtly it also caused a number of autopkgtest regressions in other packages because openssh-client is no longer in base images as a result of a dependency from openssh-server. I believe I have fixes for all of these either pending review or merged (one of which I did in August rather than July):

I upgraded from 10.3p1 to 10.4p1, and in the process contributed a GSS-API option handling fix upstream.

I made openssh-ssh1’s package description more accurately describe the package, thanks to suggestions from Matthias Lang.

Installer team

With support from a Freexian customer, I reviewed, tested, edited, and merged a patch to add VLAN support. I described the details of what I did in a comment.

This has been vaguely on my to-do list since, er, about 2014, so it was very satisfying to get it sorted out.

Python packaging

New upstream versions:

Other build/test failures:

I fixed some other bugs:

I adopted transaction for the Python team.

I attended the Python BoF at DebConf remotely, although a badly-timed fibre outage in the village I live in really didn’t help.

Code reviews

Other bits and pieces

Dan Poltawski pointed out in a Fediverse post that the project history didn’t list Sruthi as the current DPL. I fixed that, although it doesn’t look as though the fix is in the published version yet.

I upgraded yubihsm-shell to 2.8.0.

Pluralistic: Surveillance vs guillotines (11 Aug 2026) [Pluralistic: Daily links from Cory Doctorow]

->->->->->->->->->->->->->->->->->->->->->->->->->->->->-> Top Sources: None -->

Today's links



Eugène Delacroix's painting 'La Liberté guidant le peuple' ('Liberty Leading the People'), depicting the French revolution as a ragtag group of peasants led by a flag-waving, bare-breasted incarnation of 'Liberty.' The painting has been altered: the scene is now being observed with a giant, smoke-shrouded CCTV dome, and the distant building have been replaced with a mainframe computer.

Surveillance vs guillotines (permalink)

In the summer of 2013, two esoteric, technical, incredibly important texts were published within weeks of one another: the first is the Snowden leaks, which revealed a system of global, pervasive digital surveillance; the second was Thomas Piketty's Capital in the 21st Century, a book about the economic inevitability (and political instability) of oligarchy:

https://memex.craphound.com/2014/06/24/thomas-pikettys-capital-in-the-21st-century/

In 2013, it wasn't immediately apparent how these two works connected with one another, but in the years since, I've grown increasingly convinced that Snowden and Piketty can only be properly understood as describing two aspects of the same phenomenon.

Piketty's landmark volume was grounded in a detailed analysis of 300 years' (!) worth of global capital flows, painstakingly compiled by a large team of grad students from a massive set of heterogeneous records. The book's conclusion is the statement that "returns to capital exceed the rate of growth over the long term" (abbreviated as "r > g").

This may sound innocuous, but it is explosive. If r > g, then the most wealth will inevitably accumulate in the hands of people who start with the most wealth, irrespective of whether they do anything productive with that money. This means that the alleged heroes of the market system – the entrepreneurs who found and manage the firms that increase public prosperity – are doomed to play second fiddle to the mere plumbers of money, people who "contribute" by accumulating.

The starkest example of this in Capital 21C is Piketty's contrast between L'Oreal heiress Liliane Bettencourt (then the richest woman in the world) and Bill Gates, founder of Microsoft (then the most successful corporation in the world). Piketty compares the growth in the fortunes of Bettencourt and Gates over two periods: first, the period between Microsoft's founding and Gates' retirement as CEO; and second, the period after Gates's retirement from his executive role, when he became a mere investor, no longer an entrepreneur.

During that first period, in which Gates was founding and running the most successful corporation in the world, he accumulated less wealth than did Liliane Bettencourt, who did precisely nothing of value over that period. Bettencourt didn't even manage her investments – that was all handled by some very clever financial planners, lawyers and accountants. In other words: for Bettencourt, doing nothing at all produced more wealth than founding the most successful corporation in the world did for Gates. Bettencourt, a person who owned things, did better than Gates, a person who did things.

And then Gates retired. He stopped doing things and started owning things. He became an investor, whereupon he out-earned both Bettencourt and Gates-the-entrepreneur. Again, the market system allocated fewer rewards to the most successful person in the doing things business than it allocated to that same person once he quit that job and got into the owning things business.

Piketty shows that this holds true across markets and nations and eras: all other things being equal, the market system produces a class of hereditary aristocrats who command the world's capital and direct its deployment, despite never having done anything. The market's most lavish rewards do not go to its most productive participants, but rather, to those participants who have the good fortune to emerge from the luckiest of orifices.

Worse: winning the orifice lottery in no way qualifies you to direct the capital you've inherited. Liliane Bettencourt had no revolutionary new business ideas, invented no miraculous new materials or processes, produced no brilliant art. She merely accumulated, thanks to the professional services of skilled technicians whose job description includes hiring their own successors to ensure that another generation of winners of the Bettencourt orifice lottery could continue to accumulate, commanding more capital and power in society.

Perhaps if these orifice winners were content to allow their bloodless Renfields to allocate their capital while consuming bonbons and attending yacht parties, this could yield a stable politics. But inevitably, people who win the orifice lottery observe that they come from a long line of wealthy people, a line that will continue with their own descendants, and conclude that they have some kind of special, heritable virtue – magic blood – that the system has recognized with their great fortunes and the power those fortunes confer.

That's when things get dangerous: when aristocrats grow bored with their leisure and mobilize their inherited capital to change the way the rest of us live. Billionaire dilettantes are weapons of mass destruction, and their special projects have a wide blast radius and inflict a lot of collateral damage.

Take Bill Gates: his ideological projects have been a catastrophe. A patent maximalist, he funded the lobbyists who successfully blocked South Africa from producing its own AIDS drugs under an IP waiver program, and then deployed them again to stop the Global South from making their own covid vaccines:

https://pluralistic.net/2021/04/13/public-interest-pharma/#gates-foundation

Closer to home, Gates's hatred of public institutions led him to allocate millions to dismantling public schools and replacing them with charter schools, particularly for poor and racialized kids, with disastrous results:

https://pluralistic.net/2026/03/09/autocrats-of-trade-2/#witness-the-firepower-of-this-fully-armed-and-operational-battle-station

And of course, Gates supported and empowered Jeffrey Epstein and his rape island:

https://en.wikipedia.org/wiki/Bill_Gates#Connection_with_Jeffrey_Epstein

Capital's tendency to accumulate in the hands of the already wealthy (r > g) means that these aristocrats end up setting an ever-larger proportion of our societal agenda, despite their manifest unfitness to govern and their absence of any kind of democratic legitimacy.

Piketty argues that inequality is inherently politically destabilizing. A society ruled over by fools and monsters who were not voted into power and can't be voted out of power is a doomed society. Eventually – the French Revolution, the World Wars – these societies grow so unstable that they collapse altogether.

This is where Piketty and Snowden converge. When the Snowden leaks broke, there was a lot of talk about the mechanics and the legality of the NSA's global digital surveillance, but precious little consideration was given to the reason for all this surveillance. In 2013, the idea that this spying was about "security" was so obvious as to be self-evident. The questions at the time were whether spying could produce security. We weren't asking why things were so insecure.

In retrospect, the answer is to be found in Piketty. Piketty's Capital includes a long, impassioned plea to both lawmakers and aristocrats to consider redistributive policies (like a wealth tax) as the most affordable way to achieve political stability. Fundamentally, Piketty argues that the cheapest way to stop people from building a guillotine on your lawn is to build hospitals and schools; this is cheaper than paying for guards and prisons to lock up would-be guillotine builders.

Today's AI debates swirl around the question of whether AI can truly make us more productive – that is, if chatbots will allow one person to do the work of two, or three, or four – or 100. But when it comes to surveillance, the digital revolution unquestionably produced a massive productivity dividend.

Consider the spying apparatus of the former East Germany ("the GDR") widely considered the most surveilled society in human history. When the Berlin Wall collapsed, there were about 16m people in the country. Of those East Germans, about 90,000 worked directly for the Stasi (the secret police), aided by another 100-200,000 paid informants:

https://www.dw.com/en/east-germany-spy-agency-stasi-surveillance/

Call it 200,000 people to spy on 16m. In other words, it took one spy to watch 80 of their neighbors. Contrast this with NSA spying: they accumulated detailed surveillance dossiers on about 6 billion internet users using a staff of no more than 5 million spooks (in 2013, about 5 million Americans were eligible for security clearance). If every single person with security clearance in the USA was working on the NSA's surveillance program, that would mean that by 2013, computers had made it possible for a spy to keep tabs on more than a thousand people.

Orders of magnitude improvements in a mere generation! This is the kind of productivity lift that economists dream of when they fantasize about the dividends from automation.

But why? Why spy?

East Germany spied on its people because the system was so unjust and cruel that its beneficiaries understood that their neighbors were forever on the brink of rising up against them. East Germany's leaders were right about that – but if anything, they didn't put enough people onto the spying project. We can tell, because the Berlin Wall fell in 1989!

Of course, the GDR was already paying more than 1.2% of its population to spy on everyone else. It's likely that East Germany's leaders believed that their society simply lacked the fiscal space to hire more spies, even if short-staffing the Stasi risked societal collapse. Now, if Piketty is right, East Germany's leaders could have solved this problem by giving people fewer reasons to want to overthrow the state. They could have taken their hands out of the cookie jar, could have instituted democratic reforms – they could have made a bid for democratic legitimacy and public material comfort. But that would have come at the leaders' own power and wealth, and, lacking the stomach for this sacrifice, they lost everything.

Enter the NSA: the digitization of human civilization has drastically reduced the cost of surveillance, and – again, per Piketty – this vastly increases the amount of inequality the world can sustain before the illegitimacy, incompetence and cruelty of rule by the neoaristocratic winners of the orifice lottery brings the whole thing crashing down.

The Trump years are proof of this. We've reached a high-water mark for rule by illegitimate billionaire dilettantes. The second Trump admin began with DOGE's Bonfire of the Stupidities, where Musk cultists dismantled vast swathes of the American administrative state. Musk didn't just attack foreign aid – though the fact that the world's richest man murdered hundreds of thousands of the world's poorest children for the lulz isn't merely cruel, but also massively destabilizing in a way that will shake the world's politics for generations – but also domestic institutions. It was a DOGE cultist who fed the part of the NIH that tracks cyclosporiasis outbreaks into the wood-chipper:

https://truthout.org/articles/disease-researchers-blame-doge-cuts-for-spiraling-cyclospora-outbreak/

Today, tens of thousands of Americans are experiencing the literal enshittification of the American state, and this isn't just a human tragedy (though it is), it's also an economic tragedy, with massive knock-on effects for the businesses that rely on those sickened Americans and for the agricultural sector whose outputs are now being shunned by millions. Whether it's letting Bill Gates decide how your schools will work or letting Elon Musk decide how your public health system runs, the result is political chaos and a societal nudge away from the rule of law and towards guillotines.

Which brings me back to Snowden. The Snowden revelations did spur a global conversation about digital surveillance, with the result that the majority of the world's digital traffic is encrypted today. That's not nothing.

But the American state found new ways to conduct mass-scale, global surveillance, often by collaborating directly with tech giants. Billionaires like Peter Thiel capitalized on Big Tech's conflicted feelings about openly participating in surveillance by founding Palantir, with the express mission of murdering the political opponents of oligarchy:

https://www.thecanary.co/trending/2026/01/07/palantir-kill-communists/

Over the past decade, the steady march of digital technology, dominated by a cartel of giant global firms who collude with the US government's system of political repression in exchange for tax breaks, antitrust forbearance and fat federal contracts has yielded more mass surveillance productivity gains than the previous 25 years:

https://apnews.com/article/trump-inauguration-tech-billionaires-zuckerberg-musk-wealth-0896bfc3f50d941d62cebc3074267ecd

The Trump administration is the most unpopular in more than a century. Trump has stolen more money in office than any president in history. Trump presides over spiraling greedflation and collapsing buying power. The Trump administration has also presided over a titanic increase in state-aligned, privatized surveillance. The Trump years are the Flock years:

https://newrepublic.com/article/206992/flock-safety-cameras-alpr-deflock-resistance-nationwide

The Trump years are the Palantir years:

https://www.nytimes.com/2025/05/30/technology/trump-palantir-data-americans.html

The Trump years are the facial recognition years:

https://www.aclu.org/news/privacy-technology/ice-face-recognition

Trump's authoritarianism is a function of his misrule, and his misrule is enabled by his authoritarianism. The more he steals, the more he destroys with wars of choice, and incoherent tariff policies, and official pronouncements linking autism and vaccinations, the more he needs spy cameras, internet surveillance, vehicle tracking, and facial recognition. Every time Trump talks about a third term in office, or canceling elections, or suppressing the vote, he creates demand for mass surveillance to catch and imprison the people this drives into the streets. The more mass surveillance there is, the safer it is for him to commit unpopular, corrupt acts. It's the world's worst self-licking ice-cream cone.

It's not just Trump, of course. Trump is the vanguard of a movement of orifice lottery winners whose delight in stealing, cheating, maiming and despoiling gives rise to political instability and requires them to divert some of their yacht money to mercenaries:

https://theintercept.com/2026/06/25/police-luigi-mangione-wealthy-ceos-threat/

Take AI: the Trump years are also the AI years. This is the time in which a wildly unpopular technology is being shoved into every part of every app we rely on:

https://pluralistic.net/2025/05/02/kpis-off/#principal-agentic-ai-problem

It's an era where corporate bosses can't stop gloating about how many jobs they're planning to destroy and how many paycuts they plan on imposing on the surviving workers:

https://www.axios.com/2025/05/28/ai-jobs-white-collar-unemployment-anthropic

AI can't do your job, but an AI salesman can reliably convince your boss to fire you and replace you with an AI that can't do your job:

https://pluralistic.net/2025/03/18/asbestos-in-the-walls/#government-by-spicy-autocomplete

And – most visibly – it's an era in which people's cities and towns are being despoiled by data centers they don't want, by local governments operating in the most extreme secrecy, who silence and even arrest citizens who demand a democratically legitimate process for deciding whether they will have to give up their power and water and land and peace:

https://www.404media.co/city-that-arrested-person-for-clapping-at-data-center-meeting-moves-to-virtual-townhalls-for-public-safety/

An economist would tell you that there's an equilibrium being sought here: between the cost of bribing a town council to ram through data center approvals, the cost of building a more modest and palatable data center, and the cost of mollifying public critics. The cost of bribing towns to foist a data center on the townsfolk is low, because there are lots of towns that fit the bill, so data center barons can shop around.

But as data center protests grow larger and better organized (oligarchy is destabilizing), the cost of dealing with public opposition is mounting. Which is why the Trump administration is teaming up with its preferred tech and military contractors to engage in detailed surveillance of data center and AI critics:

https://prospect.org/2026/08/10/private-intelligence-firms-selling-dossiers-on-ai-data-center-critics/

These corporate spooks aren't just spying on data center critics: they've got a whole portfolio of oligarchy-stabilizing surveillance services, targeting "antifa," immigrants' rights and anti-ICE groups.

They're joined by hardware vendors who offer corporations, the wealthy, and enclaves where both are to be found on literal robocops, the ultimate in cheap guard labor (alas, the robots suck):

https://www.404media.co/the-roboguard-revolution-is-short-circuiting/

Trump and his orifice-winning army are caught in the same trap as the leaders of the GDR. Every gain in guard-labor efficiency creates the space for more of them to stick more of their hands even further into the cookie jar. Every time they do, American society grows more unstable, demanding more guard labor.

As we saw in Minneapolis, guard labor – be it mass surveillance, robocops or ICE chuds – is itself destabilizing. Police states make the people who live in them want to overthrow the state, requiring yet more cops, creating more partisans for tearing the whole thing down.

In theory, the orifice class could decide to stop stealing, cheating and maiming. The problem is that for every plute who realizes that the cheapest way to keep the guillotines off his lawn is to play fair, there are three more who lack the executive function to stop cheating. That means that you might as well keep on cheating, since the instability – and the guard labor bills – are coming no matter what.

In the tale of the "Tragedy of the Commons," a common pasture is grazed to dust by shepherds who each understand that if they don't graze their flock until everything is gone, some other shepherd will do so. The original "Tragedy of the Commons" paper was a racist hoax perpetrated by an academic fraud who wanted to make the case for the expulsion of black and Brown people from America and their mass extermination abroad:

https://memex.craphound.com/2019/10/01/the-tragedy-of-the-commons-how-ecofascism-was-smuggled-into-mainstream-thought/

In reality, commons need not be tragic and many of our most important resources have been managed as commons for hundreds of years:

https://archive.org/details/governing-the-commons/page/4/mode/2up

But when it comes to the commons that is "a stable society," the orifice class is caught in an inescapable tragedy, certain of the knowledge that if they don't cheat us, the next American aristo will. Thus the demand for guard labor continues to mount…as does the demand for guillotines.


Hey look at this (permalink)



A shelf of leatherbound history books with a gilt-stamped series title, 'The World's Famous Events.'

Object permanence (permalink)

#25yrsago Wonderfully thorough backgrounder on DeCSS https://web.archive.org/web/20010816194008/https://lemuria.org/decss/hal2001.html

#25yrsago Warhol Worm https://web.archive.org/web/20010814171036/http://www.cs.berkeley.edu/~nweaver/warhol.html

#25yrsago Camgirls use Amazon wishlists for payouts https://web.archive.org/web/20010821234935/http://www.salon.com/tech/feature/2001/08/13/cam_girls/index.html

#25yrsago State of the tech industry 2021 https://web.archive.org/web/20011216222920/http://latimes.com/technology/la-000064605aug09.story

#25yrsago List of scenes cut from Looney Tunes reissues https://web.archive.org/web/20011214095249/http://www.toonzone.net/looney/ltcuts/

#20yrsago Strategy behind using liquids to threaten planes https://web.archive.org/web/20060813001626/https://wondermark.com/d/220.html

#20yrsago RIAA to grieving family: We depose your children in 60 days https://recordingindustryvspeople.blogspot.com/2006/08/riaa-wants-to-depose-dead-defendants.html

#15yrsago Stasi spywear: the inept art of commie disguise https://web.archive.org/web/20120000000000*/http://www.spiegel.de/international/germany/0,1518,777716,00.html

#15yrsago 1968: when Britain’s Daily Mirror tried to overthrow Parliament https://www.bbc.co.uk/webarchive/https%3A%2F%2Fwww.bbc.co.uk%2Fblogs%2Fadamcurtis%2F2011%2F07%2Fevery_day_is_like_sunday.html

#15yrsago My panel with Tim Berners-Lee, Vint Cerf and Al Gore at Mexico City’s Campus Party https://www.youtube.com/watch?v=tXPZnpsN4-s

#15yrsago Doctor tried to "cure homosexuality" by tasping gay man while he had sex with a female sex-worker https://web.archive.org/web/20111004080028/https://blog.ketyov.com/2011/08/self-stimulating-brain-for-heterosexual.html

#10yrsago How a digital-only smartphone opens the door to DRM (and how to close the door) https://memex.craphound.com/2016/08/12/how-a-digital-only-smartphone-opens-the-door-to-drm-and-how-to-close-the-door/

#10yrsago Forget Skynet: AI is already making things terrible for people who aren’t rich white dudes https://www.nytimes.com/2016/06/26/opinion/sunday/artificial-intelligences-white-guy-problem.html

#10yrsago How self-driving cars could make everything worse, and what to do about it https://web.archive.org/web/20170918192128/https://www.wired.com/2016/08/self-driving-cars-will-improve-our-cities-if-they-dont-ruin-them/

#10yrsago The Tor Project’s social contract: we will not backdoor Tor https://blog.torproject.org/tor-social-contract/

#10yrsago Cash grants to people with unexpected bills successfully prevents homelessness https://www.science.org/content/article/bit-cash-can-keep-someone-streets-2-years-or-more


Upcoming appearances (permalink)

A photo of me onstage, giving a speech, pounding the podium.



A screenshot of me at my desk, doing a livecast.

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

  • "The Post-American Internet," a geopolitical sequel of sorts to Enshittification, Farrar, Straus and Giroux, 2027
  • "Unauthorized Bread": a middle-grades graphic novel adapted from my novella about refugees, toasters and DRM, FirstSecond, April 20, 2027

  • "Enshittification, Why Everything Suddenly Got Worse and What to Do About It" (the graphic novel), Firstsecond, 2027

  • "The Memex Method," Farrar, Straus, Giroux, 2027



Colophon (permalink)

Today's top sources:

Currently writing:

  • “Once Is Enemy Action,” a science fiction novel about the origins of modern technofascism. Today's words: 507 (3619 total).

  • "The Post-American Internet," a sequel to "Enshittification," about the better world the rest of us get to have now that Trump has torched America. Fourth draft completed. Submitted to editor.

  • A Little Brother short story about DIY insulin PLANNING


This work – excluding any serialized fiction – is licensed under a Creative Commons Attribution 4.0 license. That means you can use it any way you like, including commercially, provided that you attribute it to me, Cory Doctorow, and include a link to pluralistic.net.

https://creativecommons.org/licenses/by/4.0/

Quotations and images are not included in this license; they are included either under a limitation or exception to copyright, or on the basis of a separate license. Please exercise caution.


How to get Pluralistic:

Blog (no ads, tracking, or data-collection):

Pluralistic.net

Newsletter (no ads, tracking, or data-collection):

https://pluralistic.net/plura-list

Mastodon (no ads, tracking, or data-collection):

https://mamot.fr/@pluralistic

Bluesky (no ads, possible tracking and data-collection):

https://bsky.app/profile/doctorow.pluralistic.net

Medium (no ads, paywalled):

https://doctorow.medium.com/

Tumblr (mass-scale, unrestricted, third-party surveillance and advertising):

https://mostlysignssomeportents.tumblr.com/tagged/pluralistic

"When life gives you SARS, you make sarsaparilla" -Joey "Accordion Guy" DeVilla

READ CAREFULLY: By reading this, you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies ("BOGUS AGREEMENTS") that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.

ISSN: 3066-764X

NetBSD brings its Englightenment port up to snuff [OSnews]

Enlightenment desktop is a low on resources desktop environment without sacrificing on visuals. NetBSD support for this BSD-licensed desktop has been left a few years behind. The aim of this project is to port the newest version of the desktop to pkgsrc and commit upstream portability fixes when necessary to ease future versions updates for NetBSD.

↫ Dimitris Gounaridis on the NetBSD blog

Enlightenment seems like a natural fit for NetBSD, so I’m glad they dedicated a GSoC project to getting the existing, outdated port up to snuff. The project is not complete as there’s a few issues to work out before it can be packaged for easy installation, but this is great progress already.

Publishing schematics before “open source” was a word: 55 years of Akizuki Denshi, Japan’s legendary parts Store [OSnews]

Akihabara, Tokyo’s famous “Electric Town,” is overflowing with foreign tourists these days, drawn by anime shops, maid cafes, and duty-free electronics megastores. But there is one storefront most of them walk past without a glance: Akizuki Denshi Tsusho. It may be one of those pockets of Japan that foreign visitors never see. Step inside and the narrow aisles are packed — not with tourists, but with Japanese customers hunting for electronic parts. It is a scene that has repeated itself here for more than 50 years.

For readers outside Japan, imagine something between Adafruit, SparkFun, and a discount surplus warehouse. If you start tinkering with electronics in Japan, Akizuki’s website is the one you will open before any other. Generations of Japanese engineers, students, and hobbyists have treated it as the default source for parts, the way you might default to Digi-Key or Mouser.

↫ Gakuto Ochi and an uncredited translator

I’ve long been fascinated by places like Akizuki Denshi Tsusho and other places like it in South Korea and China’s Shenzhen. An unending labyrinth of unimaginable amounts of technology stacked floor to ceiling. Whether they be like Akizuki, which focuses on the tiniest of electrical components, or more like the malls in Shenzhen, which seem to focus more on assembled parts, the idea of browsing through them in wonder draws me in like a moth to a flame.

I’m sad these places don’t exist anymore (or in most cases, never did) closer to home, but perhaps someday I’ll have enough time and funds to visit Tokyo or Shenzen and let myself be overwhelmed by things I don’t understand, and people speaking languages entirely alien to me.

AI for Military Support [Schneier on Security]

Interesting empirical research: “Black Box Warfare: Human Judgment and Military Decision-Making in the Age of AI.”

Abstract: How is AI transforming decision-making in modern conflict? This study provides a unique empirical window into that question by deploying a high-fidelity replica of an AI decision-support system (DSS) used in military targeting. After reconstructing the interface and functionality of the real-world system, we tested its impact on combat decisions in two experiments involving 2,015 Israeli military personnel. Contrary to widespread fears of automation bias, we find strong evidence of algorithmic aversion, especially in scenarios involving high collateral damage. Yet we also show that integrating “explainable AI” features reduces algorithmic aversion and promotes more thoughtful evaluations of algorithmic recommendations. These findings challenge prevailing assumptions, revealing that trust in military AI is dynamic, varying with individual predispositions, perceived operational stakes, and the informational features of the interface. By grounding normative concerns in empirical evidence, our study offers critical insight into the integration of AI in warfare and underscores the enduring importance of human agency in high-stakes military decision-making.

Feeds

FeedRSSLast fetchedNext fetched after
@ASmartBear XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
a bag of four grapes XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
Ansible XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
Bad Science XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
Black Doggerel XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
Blog - Official site of Stephen Fry XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
Charlie Brooker | The Guardian XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
Charlie's Diary XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
Chasing the Sunset - Comics Only XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
Coding Horror XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
Comics Archive - Spinnyverse XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
Cory Doctorow's craphound.com XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
Cory Doctorow, Author at Boing Boing XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
Ctrl+Alt+Del Comic XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
Cyberunions XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
David Mitchell | The Guardian XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
Deeplinks XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
Diesel Sweeties webcomic by rstevens XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
Dilbert XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
Dork Tower XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
Economics from the Top Down XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
Edmund Finney's Quest to Find the Meaning of Life XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
EFF Action Center XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
Enspiral Tales - Medium XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
Events XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
Falkvinge on Liberty XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
Flipside XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
Flipside XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
Free software jobs XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
Full Frontal Nerdity by Aaron Williams XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
General Protection Fault: Comic Updates XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
George Monbiot XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
Girl Genius XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
Groklaw XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
Grrl Power XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
Hackney Anarchist Group XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
Hackney Solidarity Network XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
http://blog.llvm.org/feeds/posts/default XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
http://calendar.google.com/calendar/feeds/q7s5o02sj8hcam52hutbcofoo4%40group.calendar.google.com/public/basic XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
http://dynamic.boingboing.net/cgi-bin/mt/mt-cp.cgi?__mode=feed&_type=posts&blog_id=1&id=1 XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
http://eng.anarchoblogs.org/feed/atom/ XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
http://feed43.com/3874015735218037.xml XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
http://flatearthnews.net/flatearthnews.net/blogfeed XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
http://fulltextrssfeed.com/ XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
http://london.indymedia.org/articles.rss XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
http://pipes.yahoo.com/pipes/pipe.run?_id=ad0530218c055aa302f7e0e84d5d6515&amp;_render=rss XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
http://planet.gridpp.ac.uk/atom.xml XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
http://shirky.com/weblog/feed/atom/ XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
http://thecommune.co.uk/feed/ XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
http://theness.com/roguesgallery/feed/ XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
http://www.airshipentertainment.com/buck/buckcomic/buck.rss XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
http://www.airshipentertainment.com/growf/growfcomic/growf.rss XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
http://www.airshipentertainment.com/myth/mythcomic/myth.rss XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
http://www.feedsapi.com/makefulltextfeed.php?url=http%3A%2F%2Fwww.somethingpositive.net%2Fsp.xml&what=auto&key=&max=7&links=preserve&exc=&privacy=I+accept XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
http://www.godhatesastronauts.com/feed/ XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
http://www.tinycat.co.uk/feed/ XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
https://anarchism.pageabode.com/blogs/anarcho/feed/ XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
https://broodhollow.krisstraub.comfeed/ XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
https://debian-administration.org/atom.xml XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
https://elitetheatre.org/ XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
https://feeds.feedburner.com/Starslip XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
https://feeds2.feedburner.com/GeekEtiquette?format=xml XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
https://hackbloc.org/rss.xml XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
https://kajafoglio.livejournal.com/data/atom/ XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
https://philfoglio.livejournal.com/data/atom/ XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
https://pixietrixcomix.com/eerie-cutiescomic.rss XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
https://pixietrixcomix.com/menage-a-3/comic.rss XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
https://propertyistheft.wordpress.com/feed/ XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
https://requiem.seraph-inn.com/updates.rss XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
https://studiofoglio.livejournal.com/data/atom/ XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
https://thecommandline.net/feed/ XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
https://torrentfreak.com/subscriptions/ XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
https://web.randi.org/?format=feed&type=rss XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
https://www.baen.com/baenebooks XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
https://www.dcscience.net/feed/medium.co XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
https://www.DropCatch.com/domain/steampunkmagazine.com XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
https://www.DropCatch.com/domain/ubuntuweblogs.org XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
https://www.DropCatch.com/redirect/?domain=DyingAlone.net XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
https://www.freedompress.org.uk:443/news/feed/ XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
https://www.goblinscomic.com/category/comics/feed/ XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
https://www.loomio.com/blog/feed/ XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
https://www.newstatesman.com/feeds/blogs/laurie-penny.rss XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
https://www.patreon.com/graveyardgreg/posts/comic.rss XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
https://www.rightmove.co.uk/rss/property-for-sale/find.html?locationIdentifier=REGION^876&maxPrice=240000&minBedrooms=2&displayPropertyType=houses&oldDisplayPropertyType=houses&primaryDisplayPropertyType=houses&oldPrimaryDisplayPropertyType=houses&numberOfPropertiesPerPage=24 XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
https://x.com/statuses/user_timeline/22724360.rss XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
Humble Bundle Blog XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
I, Cringely XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
Irregular Webcomic! XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
Joel on Software XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
Judith Proctor's Journal XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
Krebs on Security XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
Lambda the Ultimate - Programming Languages Weblog XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
Looking For Group XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
LWN.net XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
Mimi and Eunice XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
Neil Gaiman's Journal XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
Nina Paley XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
O Abnormal – Scifi/Fantasy Artist XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
Oglaf! -- Comics. Often dirty. XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
Oh Joy Sex Toy XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
Order of the Stick XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
Original Fiction Archives - Reactor XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
OSnews XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
Paul Graham: Unofficial RSS Feed XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
Penny Arcade XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
Penny Red XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
PHD Comics XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
Phil's blog XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
Planet Debian XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
Planet GNU XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
Planet Lisp XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
Pluralistic: Daily links from Cory Doctorow XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
PS238 by Aaron Williams XML 11:21, Tuesday, 18 August 12:09, Tuesday, 18 August
QC RSS v2 XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
Radar XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
RevK®'s ramblings XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
Richard Stallman's Political Notes XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
Scenes From A Multiverse XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
Schneier on Security XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
SCHNEWS.ORG.UK XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
Scripting News XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
Seth's Blog XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
Skin Horse XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
Tales From the Riverbank XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
The Adventures of Dr. McNinja XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
The Bumpycat sat on the mat XML 11:28, Tuesday, 18 August 12:08, Tuesday, 18 August
The Daily WTF XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
The Monochrome Mob XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
The Non-Adventures of Wonderella XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
The Old New Thing XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
The Open Source Grid Engine Blog XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
The Stranger XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
towerhamletsalarm XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
Twokinds XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
UK Indymedia Features XML 11:35, Tuesday, 18 August 12:17, Tuesday, 18 August
Uploads from ne11y XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
Uploads from piasladic XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August
Use Sword on Monster XML 11:14, Tuesday, 18 August 12:01, Tuesday, 18 August
Wayward Sons: Legends - Sci-Fi Full Page Webcomic - Updates Daily XML 11:42, Tuesday, 18 August 12:28, Tuesday, 18 August
what if? XML 11:35, Tuesday, 18 August 12:16, Tuesday, 18 August
Whatever XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
Whitechapel Anarchist Group XML 11:14, Tuesday, 18 August 12:03, Tuesday, 18 August
WIL WHEATON dot NET XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
wish XML 11:21, Tuesday, 18 August 12:06, Tuesday, 18 August
Writing the Bright Fantastic XML 11:21, Tuesday, 18 August 12:05, Tuesday, 18 August
xkcd.com XML 11:42, Tuesday, 18 August 12:25, Tuesday, 18 August