A report from the LPC sched_ext microconference [LWN.net]
The Linux Plumbers Conference blog has a report from the sched_ext microconference held in Prague.
Three main topics dominated the discussions
- Priority inversion and how to handle it in sched_ext: lock holder and lock waiter preemption, time slice extension, and making proxy execution work together with BPF schedulers.
- Paravirtualized scheduling: letting the host and guest schedulers cooperate across the VM boundary, with sched_ext as the policy engine on the host.
- Device and topology-aware scheduling: using hardware feedback (Intel HFI), device/accelerator locality and cache topology to drive task placement.
Nautical Naughties [Penny Arcade]
I identified something really odd while I was out at PAX Aus; the normal cadence and tenor of the AI discourse began to vibrate at an especially high frequency. The conversation has always been fraught, but everywhere I turned the side which advocated for the tools was really spun up, aggressive, and emboldened, and I wasn't seeing the counterpunches I'm used to. My presumption is that it's connected broadly to the Anthropic IPO, which is a severe test of… well, it's a gut check for the whole ball of wax - the future they are attempting to sell.
The Big Idea: Wole Talabi [Whatever]

Big ideas don’t always have to start out as grand bursts of inspiration. Sometimes a big idea is made up of smaller ideas over a long period of time that all snowball together in perfect harmony. Author Wole Talabi explores this idea as he talks about his newest novel, The Fist of Memory, and cites some other great authors that lent some of those small ideas to him.
WOLE TALABI:
When I look back at the process of writing The Fist of Memory, I don’t see a single big idea that anchored me through it. I see many small ideas orbiting a glowing spark of motivation like a protoplanetary disk that eventually coalesced into a novel.
So yes, I could tell you that its inspired largely by a lot of the action media I had consumed growing up, woven together with my deep and endless fascination with first contact SF narratives like some weird Nigerian lovechild of John Woo’s The Killer and Cixin Liu’s The Three Body Problem. I could tell you it features assassins with direct neural interfaces and is set in a grounded but ultimately hopeful near-future world where the impact of climate change is impossible to ignore. I could tell you that it tries to unify uniquely African traditional beliefs and philosophies like Sankofa (which emphasizes the importance of remembering and learning from the past to shape the future) and Ubuntu (that interconnectedness is what makes us who we are) with modern scientific understanding of the nature of reality anchored in quantum mechanics. I could tell you that the world of the novel is shaped by the uniquely Nigerian brand of political violence and turmoil extrapolated from the country’s real-life complex political history of coups and behind-the-scenes power struggles. I could tell you all this, but these are all fragmentary ideas and inspirations and influences and intentions, and they don’t tell you much about why it took me so long to finally put them all together and what they all add up to.
Besides, I can’t tell you the one really big idea behind The Fist of Memory without spoiling at least some of the plot. So instead, I’ll tell you about the place stories come from, where small ideas can connect to become more than the sum of their parts because the big idea behind this novel is about connection anyway.
SF’s big mama Ursula K LeGuin described the production of great art as a journey into the self to pull from the “collective unconscious” – a Jungian idea that beneath the individual unconscious there lies something collective: patterns, myths and archetypes shared by humanity. I’ve always been fascinated by this concept but never applied it to my own writing. It seemed like an abstract way of explaining why so many stories across cultures seemed to share some DNA or seem to draw upon something ancient and fundamentally human to speak about the present day.
And that’s all it was at the time – an interesting theory. But when I first started to write this novel, it quickly became clear to me that I was reaching for something larger than I could consciously articulate. I kept trying to consciously impose some kind of superstructural order on the constellation of influences I had brought with me in trying to achieve my intention. But the story and the characters refused to conform. I was trying to construct a planet when what I needed was to journey into myself to find the gravity that would naturally connect all the fragments that had accumulated inside me over decades. Something I needed to go inward to find by excavating my memories.
Memories of a TV program where a professor of sociology argued that Africa and Africans in general were somehow inferior and cited the usual nonsense – present day economic underdevelopment, biased IQ statistics, etc. which triggered in my young mind, a kind of rage and anger and desire to prove him wrong and show that Africans were indeed capable and that our cultures, histories and philosophies contained ideas and concepts are rigorous and fascinating as any other.
Memories of growing up in Nigeria during the brutal military dictatorship of General Sani Abacha – the political chaos, the riots and protests, the lawlessness. Memories of my father and his book of judo techniques that sparked my love of martial arts and Hong Kong action cinema. Memories of my boarding school days in Benin City, studying mathematics and physics, staring at the night sky and wondering – what was out there? Memories of reading my mother’s books on African literature, of discovering the richness and depth of Yoruba mythology and history and philosophy. I let all these personal memories flow together, as I navigated the collective unconscious, seeking connections between them and the larger human desire for connection, for survival, for care and understanding. It was then that I understood that connection itself was the story. It began to flow out of me – less like construction and more like archeology.
After that, it was just a matter of editing to get the structure and tone and rhythm and flow of the story right. It’s funny now to see that the novel I had been trying to assemble from apparently disconnected fragments of myself was about the possibility that disconnectedness itself might be an illusion. One that can only be broken in the subconscious. That realization wasn’t just my method of writing the novel. It became what the novel was about.
The big idea of The Fist of Memory is the possibility that, just as there are connections inside us that we aren’t always consciously aware of, what we perceive in the physical world might, at another level of reality, be connected. That things which appear separate can be part of the same continuum. Science and spirituality. Life and death. Violence and redemption. Past and future. Heroism and villainy. Memory and reality. One human consciousness and another. To quote big mama LeGuin again the idea is that, “The unconscious mind is coextensive with the universe.”
Writing this book has taught me that stories are technologies by which we connect to ourselves and to each other. I hope that when you read it and are done with all the excitement, technology, politics, action and physics I’ve baked into it, that you are left with a warm glowing feeling of possibility and connection.
The Fist of Memory: Amazon|Barnes & Noble|Bookshop
Author socials: Website
C++/WinRT overcorrection: Using make_self and immediately converting it to the projected interface [The Old New Thing]
In C++/WinRT, there are two ways of creating objects that you yourself implement.
For the purpose of this discussion, let Impl be the
class you wrote that implements a Windows Runtime object. If you
are implementing something that was declared in an IDL file, it
will be the
winrt::Namespace::implementation::ClassName for the
instance object or it will be the
winrt::Namespace::factory_implementation::ClassName
for the factory object. If it wasn’t declared in an IDL file,
then it is the class that you manually derived from
winrt::implements.
One way to create the object is to use
make<Impl>, which creates the implementation
object and then returns the Windows Runtime projection version of
that object. (If Impl is manually-derived from
winrt::implements, the projection is the first
implemented interface.)
From that Windows Runtime projection, you can regain access to
the implementation object by doing
get_self<Impl>(projected), if you want to access
things in the implementation object that aren’t exposed in
the projection.
Alternatively, you use make_self<Impl>, which
creates the object but returns a
winrt::com_ptr<Impl> instead of a projection.
You can then access things in the implementation object from that
winrt::com_ptr, and convert it to the projected type
with the * operator.
| make | make_self | |
| ↓ | ↓ | |
| projection | get_self → |
implementation |
| ← operator* |
Which one you choose depends on where you want to go first.
If you are first going to access
non-projected public members of the implementation class, use
the -> operator on the
com_ptr<Impl>. For example, you might want to
set up the object before returning the projection.
winrt::IVector<winrt::Widget>
MakeWidgets(int style, int count)
{
std::vector<winrt::Widget> v(count, nullptr);
std::generate(v.begin(), v.end(), [&] {
auto widget = winrt::make_self<implementation::Widget>(style);
widget->Enabled(true);
return *widget;
});
return winrt::multi_threaded_vector(std::move(v));
}
But if you are just going to use the projection, you can take the direct route instead of going the long way.
// The long way
winrt::IVector<winrt::Widget>
MakeWidgets(int style, int count)
{
std::vector<winrt::Widget> v(count, nullptr);
std::generate(v.begin(), v.end(), [&] {
auto widget = winrt::make_self<implementation::Widget>(style);
return *widget;
});
return winrt::multi_threaded_vector(std::move(v));
}
| make_self | ||
| ↓ | ||
| projection | ← operator* |
implementation |
| ↓ | ||
| returned |
In this case, you don’t need to pass through the implementation type.
// The short way
winrt::IVector<winrt::Widget>
MakeWidgets(int style, int count)
{
std::vector<winrt::Widget> v(count, nullptr);
std::generate(v.begin(), v.end(), [&] {
return winrt::make_self<implementation::Widget>(style);
});
return winrt::multi_threaded_vector(std::move(v));
}
| make |
| ↓ |
| projection |
| ↓ |
| return |
My guess is that the people who go the long way don’t realize that there are two ways. They learned only one way and just rely on it even if there’s a shorter way.
The post C++/WinRT overcorrection: Using <CODE>make_self</CODE> and immediately converting it to the projected interface appeared first on The Old New Thing.
Victory! You Can Now Exclude Apps from Siri AI [Deeplinks]
In the most recent update to Apple’s devices, iOS 27.2, the company has introduced a new setting to “Exclude Apps” from Siri AI, fulfilling one of our asks from our Encrypt It Already campaign earlier this year.
One of our main concerns with new AI features on devices is how those features interact with end-to-end encrypted content, particularly with secure messaging apps. Many AI features require cloud processing, and despite privacy protections engineered into these systems, the content of secure messaging apps may leave a user’s device without their knowledge. That changes the privacy concerns around using those tools. In a perfect world, users would be able to put a barrier up to ensure data from certain apps doesn’t leave the device. Here was our initial ask:
You should be able to tell the operating system’s AI to not access an app, even if that comes at the “cost” of missing out on some features. The setting should be straightforward and easy to understand in ways the Gemini and Apple Intelligence controls currently are not.
At launch, we found the settings to control Siri AI’s app access behavior pretty confusing. You had to toggle several options to block Siri AI off from accessing an app, or disable Siri AI entirely. Turning off Siri AI and reverting to Siri Classic is, for now, still a good option if you’d prefer to use the older version.
The most recent update is far more clear and does more to protect your data. And, just as expected, it comes at the cost of some features. That’s a good thing, actually. The features not working shows that the new setting is effective.
Here’s how to add apps to the exclusion list, once you’ve updated to 27.2:

Now Siri AI cannot access the contents of the app. Excluding an app also means you may lose some features. For example, if you exclude the Apple Messages app, you will no longer be able to have Siri AI read or respond to messages for you. Even the “onscreen awareness” feature, where you invoke Siri and ask it for information about what you’re currently looking at, will not work anymore. For example, if you exclude Signal, you cannot invoke Siri and ask it to discern any information in the Signal app. You’ll just get these messages:

This update from Apple is also a good excuse to check in on the process on Android. It has improved a little, but is not as straightforward as Apple’s new settings, and lacks the ability to set the screen context feature per-app. But you do have some control over what Gemini can access:
This process seems to work well enough for some data and we like that it’s opt in, but it’s not exactly intuitive. For example, Signal doesn’t appear there because Signal doesn’t support Gemini’s app access feature at all. That means Gemini can’t access the content of Signal directly, which is good.
But Gemini can read notifications if you’ve enabled the “Device Assistance” Connected App (which you likely have, since that also enables basic features, like setting a timer—check under Settings > Personal Intelligence > Connected Apps), and it can use screen context unless you’ve disabled the Device controls > Screen context > “Use screen and app data” option in the Gemini Settings. These two features may access the contents of the Signal app or notifications, if you choose to use them. We’d prefer a more hard-lined approach that reduces the chances of user error here: Google should give users the ability to turn these features off per app.
Apple clearly understands that some users want stronger controls over what Siri AI can and cannot access. But we think they should go further and offer the option to only use “on device” AI features, similar to what Samsung offered with its Galaxy AI. We’re happy to see this change and think all operating systems need to consider similar controls moving forward.
Court Should Curb Abuse of Grand Jury Subpoenas Targeting Social Media Users [Deeplinks]
A federal appeals court should curb the government’s abuse of grand jury subpoenas to unmask social media users who criticize lawless immigration enforcement.
That is the message from the ACLU, EFF, and other civil liberties and trade groups who filed a friend-of-the-court brief in a sealed case in the U.S. Court of Appeals for the District of Columbia.
The case involves the government’s investigation of an anonymous Reddit user who commented on a post about an immigration officer in Minnesota. The Department of Homeland Security (DHS) first issued an administrative subpoena to Reddit to unmask the user. When the user challenged the subpoena in court on free speech and statutory grounds (as many others have), DHS withdrew it. But then the government obtained a separate grand jury subpoena—a subpoena issued by a prosecutor to gather evidence to present to a grand jury before any criminal charges are filed—for much of the same information. The user then challenged the grand jury subpoena too, and the case is currently being appealed.
The right to speak anonymously is essential. It preserves privacy and shields critics from government retaliation. In the past year, the Department of Justice (DOJ) has issued grand jury subpoenas to social media companies for their users’ personal data. This is frequently done for improper purposes and without really showing that social media users have committed any crime. These subpoenas have the effect of intimidating and chilling critics, as immigration authorities have engaged in invasive, unconstitutional, and sometimes violent conduct.
As the amicus brief makes clear, courts should not defer to the government’s claims regarding the legitimacy of using grand jury subpoenas to unmask internet users. Instead, the subpoenas must receive proper First Amendment scrutiny. Like many other types of legal processes, grand jury subpoenas are issued by federal officials without prior court approval. And they too can be abused to harass or retaliate against people critical of the government.
The amicus brief was filed in early September and recently unsealed. The brief was signed by the American Civil Liberties Union of DC, EFF, the Center for Individual Rights, the Foundation for Individual Rights and Expression, the Cato Institute, and NetChoice.
It is notable that NetChoice signed the amicus brief. It is a trade group that represents many companies who have received similar subpoenas including Reddit, Google, Meta, PayPal, among others. EFF has called on these companies to do more to defend their users’ speech and privacy rights in the face of these subpoenas.
The PHP security incident is now (almost) old news. The timeline looks something like this: In late August, Wiz Research discovered two serious remote code execution vulnerabilities in PHP called PHP2Shell. They reported the vulnerabilities to the PHP team on August 24, which started working on fixes on September 21. Amazon apparently detected PHP2Shell in the wild on October 17 (four days prior to disclosure). On October 20, details of the two vulnerabilities (CVE-2026-109618 and CVE-2026-109619) were leaked prematurely. The next day, October 21, the PHP team released patches.
If that were the end of the story, it wouldn’t be notable. But the problem goes a lot deeper. Although PHP is no longer fashionable, it runs a huge portion of the public internet. WordPress, Drupal, and Wikimedia run on top of PHP, and people who build on top of these tools are understandably not interested in chasing the latest hot technology. “Choose Boring Technology” is one of my favorite technical essays, and PHP is nothing if not boring. It’s well known and understood, and replacing something so widely used subjects you to a steep learning curve and new bugs and vulnerabilities.
One problem is that PHP has a long history. According to Wiz, the vulnerabilities are present in versions going back to PHP 5.4. The PHP Foundation has released PHP 8.5.12, 8.4.27, 8.3.36, and 8.2.35, and said that all instances of PHP need to be updated to one of those releases. Sites that can’t be updated should be taken offline and isolated. Upgrading an ancient PHP installation is a task that’s likely to fall on organizations least capable of undertaking it. There are plenty of ancient WordPress installations that haven’t been updated in years. There were so many fires to put out, and PHP pretty much “just worked”; running an old version wasn’t causing problems, and with so much else to do, why ask for trouble? Unfortunately, choosing boring technology doesn’t mean ignoring updates. And those who decided not to ask for trouble are now in plenty of trouble.
This situation demonstrates the power of the latest foundation models to uncover vulnerabilities. Wiz used Wiz Atlas (its own model), Gemini 4 Argon, and GPT-5.6 Sol to discover the vulnerability, which isn’t a single bug but a combination of several bugs that have been present for years but were obscure enough and apparently harmless enough to escape detection or repair. As Wiz says,
The underlying flaws had been present for decades, but demonstrating their exploitability required an exceptionally complex chain of steps, at the edge of what human researchers could practically achieve. Frontier AI models substantially reduced that barrier, turning a longstanding flaw into an exploit.
That’s the new frontier in security: finding ways to exploit chains of minor, unfixed, and sometimes undiscovered bugs in novel ways. Wiz was working responsibly with the PHP team to repair the vulnerability. The implications of this, however, are far broader than the fix to PHP, or even the thousands of PHP sites that need upgrades and are now vulnerable to attack. This incident shows dramatically how the gap between the discovery of a vulnerability and its exploitation has dropped. Since exploitation began before the RCEs were prematurely leaked, it makes sense to assume that some other organization had access to models capable of discovering the vulnerability. Gemini 4 Argon and GPT-5.6 Sol are publicly available, though with guardrails that limit their usefulness for security research. I’m willing to assume that Wiz had access to the unrestricted version, but I doubt that the PHP team did. There are certainly other models, including open-weight models, that could be used to find vulnerabilities. Regardless of your stance on restricting model capabilities (I think those limitations are more damaging than helpful), it’s clear that Pandora’s box has been opened. No amount of wishful thinking will undo that.
It’s also clear that we—and I mean all of us—rely on a lot of legacy software that isn’t under our control and that no doubt has multiple flaws that can be rolled up into severe vulnerabilities, which aren’t likely to be updated or patched. A vulnerability in the Brotli compression algorithm was just discovered; .NET, PHP, Node.js, and other widely used packages are affected. That strange site where you created an account to buy a clever present that wasn’t available anywhere else—what software is it running, and do they stay up-to-date with patches? Accounts like that can easily leak information. Maybe it’s not running PHP but an equally ancient version of Ruby on Rails, Python’s Django, or Java Server Pages. At least those are still maintained; there are plenty of web frameworks that have been abandoned, and I’m willing to bet that some of them are still in use. Why replace something that works? Because if you don’t, you will eventually be bitten. Using software that’s no longer maintained may give you some security-by-obscurity, but that’s a losing proposition.
Many older open source projects suffer because there are few maintainers. If you look at the timeline carefully, there’s a monthlong gap between the time Wiz reported the vulnerability and the time the PHP team started working with Wiz to fix it. Does that month represent the time this vulnerability took to rise to the top of the queue, as PHP’s security team fought off a horde of sloppy reports? And PHP is in better shape than most projects. There are many open source projects that only have one or two maintainers, and those maintainers are drowning in AI-generated pull requests. That problem obviously becomes much worse when dealing with a complex vulnerability; the maintainers don’t have the time or the access to unrestricted frontier models, let alone the funds to pay for access to the models.
It will be weeks or months before we know how much damage PHP2Shell has done. We don’t know what the costs will be to sites that won’t or can’t update. The PHP Foundation is lucky to have a dedicated security team that was able to provide patches a day after the vulnerability was prematurely announced. Beyond PHP, we have to realize that PHP2Shell gives us a realistic look into a future in which developers and maintainers struggle to maintain software that has been compromised by exploits chaining together flaws that have been latent for many years. As someone somewhere said on the internet recently, “It’s embarrassing how much bad software we’ve written over the years.” Yes. We’re at an inflection point, and we’re starting to pay the price.
I'm doing a little project on rss.chat today and dusting off the cobwebs of my brain. Since I last worked on this project, I have converted Frontier to run on modern OSes and written a whole new app. Only three months, but I have no recollection, even reading the code isn't helping much. This is when it's incredibly good to have Claude Code on the job, I can ask it to guide me through the process we worked out which feels like it was 15 years ago instead of 15 weeks. It has complete recall. And even though it didn't work on Frontier, that was a different Claude project, it was able to debug something that broke in the build script in the interim. I've spent the whole year teaching Claude how to be me. Is that a source of immortality? I won't be around to figure that part out.
💾 Fighting DOGE's Data Grab | EFFector 38.19 [Deeplinks]
When we give our private information to the government to pay taxes, apply for a job, or vote, we should be able to trust that our data won't later be used against us. But in a betrayal of that trust, the federal government has been pooling the information it has about us on an unprecedented scale—and using it for purposes we never agreed to.
EFF and other groups are fighting back. In our latest EFFector newsletter, we're talking about a recent victory in our lawsuit against the government for sharing federal workers' confidential personnel files with DOGE.
For over 35 years, EFFector has been your guide to
understanding the intersection of technology, civil liberties, and
the law. This issue covers
our free tracker blocker coming to Safari, a call
to action for net
neutrality in California, and
a big win in our lawsuit against the DOGE data
grab.
Prefer to listen in? EFFector is now available on all major podcast platforms. This time we're talking to EFF's F. Mario Trujillo about the dangers of government data grabs—and what defenders of privacy are doing to stop it. You can find the episode and subscribe on your podcast platform of choice:
Want to protect your right to digital privacy? Sign up for EFF's EFFector newsletter for updates, ways to take action, and new merch drops. You can also fuel the fight for privacy and free speech online when you support EFF today!
[$] The campaign to push Northstar into Linux distributions [LWN.net]
There is not a broad selection of mature, open-source web-browser engines for Linux users. Most of the browsers available for Linux are based on one of just three projects: Chromium's Blink, Firefox's Gecko, or WebKit. A new entrant would generally be seen as a welcome alternative, but the recent campaign to push one of the LLM-written Nordstjernen browsers into Debian and Arch Linux has raised some questions about the project's development and security processes.
Redox OS ring buffers project summary [LWN.net]
The Redox OS project, which is a Unix-like microkernel-based operating system written in Rust, has published a report on the work that it has done in the last year to implement io_uring-like I/O.
Last year, the Redox team received a grant to develop io_uring-like Ring Buffer support at the system task level, as a first step towards ring buffer communications between the application and the majority of system services. This phase of the work finished up in September, as the last pieces were put in place.
[...] In addition to implementing the Ring Buffer machinery for our system services and drivers that can support it, an io_uring and liburing-like API for applications was completed and demonstrated. There was also substantial work done on support crates, including an async executor for drivers.
And there was some very exciting work on various performance improvements, to allow much faster switching between applications and their system services. But I will let the team tell you all the technical details.
Braintrust query: Why do you love Markdown? I have a theory why people love it so much -- simplicity. You can't hide any garbage in a Markdown file. You can answer on GitHub or Twitter. Didn't post on Masto or Bluesky because the prompt is 761 chars, over the limit for both systems. I think I'm finally done with truncating well-written prose to fit into one vendor's idea of what's enough text for me. I want to make that a distant memory. So another thing I love about Markdown -- no freaking character limit.
I really like the Apple TV show Small Prophets. It's silly and fun, but also intelligent and beautifully presented. Michael Palin of Monty Python is a supporting actor playing the main character's father. He's famous for a lot of Monty Python sketches, esp the one about the dead parrot. "He's not dead, he's pining for the fjords."
PCB mechanical fit testing [RevK®'s ramblings]
One of my latest designs needed more mechanical fit checks that
usual, it was to work with specific hardware and I wanted to check
the case design with the PCB and battery and so on all fitted
before ordering the PCB. So I 3D printed the PCB.
But the result in resin is stunning beyond belief. I actually ended up going through the KiCAD models and updating some of the 3D model STEP files even to be even more accurate. Some points of mention.
I am amazed at the precision. But actually there was one area that was technically too accurate!
KiCAD output the board, and will even output the solder pads, and output the components. But in real life the components would be in solder paste. The actual output had maybe tens of microns gap between component leads and the PCB itself. This meant a print slice layer had nothing.
The result was most components were fine, amazingly, even though all of the SMD had this gap. The contact area after the gap was enough, even on even 0201 resistors. But the leads of SOT parts were curved to a point as they are in reality. In reality solder would wick up those legs.The result was interesting. The components printed perfectly but very loosely connected to the PCB!
I ended up with a lot of missed components when taken out of the printer (and had to clean the release film) and even more missing after a wash.
What I need (and have a feature request in) is KiCAD to have a solder paste export to fix the component legs to the pads as they would be in real life.
For now I export PCB and components separately and load in to FreeCAD and move one 50um down. The result is a solid print with stuck down components!
Security updates for Wednesday [LWN.net]
Security updates have been issued by AlmaLinux (emacs, thunderbird, and xdg-dbus-proxy), Debian (bind9, openjdk-21, pdns, php-mongodb, and thunderbird), Fedora (brotli, chromium, clevis, eog, flatpak, ghostscript, kernel, libinstpatch, libreswan, mingw-freetype, mingw-gstreamer1, mingw-gstreamer1-plugins-bad-free, mingw-gstreamer1-plugins-base, mingw-gstreamer1-plugins-good, openssh, perl-Alien-Brotli, perl-DBI, python3.12, rust-onefetch, stargz-snapshotter, util-linux, and webkitgtk), Mageia (cifs-utils, libxml2, packages, perl-Cpanel-JSON-XS, perl-Text-CSV_XS, sogo, util-linux, and weechat), Oracle (brotli, firefox, flatpak, gcc-toolset-15-gcc, kernel, libreswan, nodejs:22, nodejs:24, python-urllib3, skopeo, and xdg-dbus-proxy), Slackware (proftpd), SUSE (azure-storage-azcopy, containerd, corepack24, grok-build, ImageMagick, libsoup-2_4-1, matrix-synapse, podman, psqlODBC, python, python-M2Crypto-doc, python-Twisted-doc, and xen), and Ubuntu (authd).
CodeSOD: Session Recording [The Daily WTF]
We still get a fair bit of old school ASP .Net webforms code, which was cutting edge about twenty years ago, but remains a collection of bad choices that tried to make web programming feel like desktop programming. As an aside, what a reversed world we live in today, where everyone uses Electron and our desktop programming feels like web programming.
In any case, Thomas sends us some pretty ugly webforms code.
Me.Session("Albumid") = CType(e.Item.FindControl("lblAlbumID"), Label).Text
If Not Me.Session("Albumid") Is Nothing And Not Me.Session("Uid") Is Nothing Then
Me.strDelSQL = "Delete from tbl_Albumshare_Mast where Album_Id=" & Me.Session("Albumid") & " and Sharer_ID=" & Me.Session("Uid")
Me.objDB.ExecQry(Me.strDelSQL)
Me.Response.Redirect("frmmyalbumshare.aspx", False)
End If
Broadly, the goal of this code is to take an album ID from the user and delete an album from the database where the ID matches and the album is owned by this user. And everything is horrible here.
First, the use of e.Item.FindControl to look up the
input field is suspicious. That's usually what you do when you've
dynamically generated controls, but I don't think that's happening
here. Because we use FindControl we have to cast it to
Label, and only then can we get the text property.
That itself raises a question, because why are user inputs
getting stored in a label?. That's not what labels are for.
They're clearly doing some sort of hacky lookup/autocomplete field
thing and using the label to actually store the input, but
presenting the user with a different UI for picking it. Not an
uncommon pattern in those days, but a hidden field would be a more
typical way of doing it.
We then construct a SQL injection vulnerability and run it against the database.
Then, we use a redirect to send the user to a different page. Again, a common thing to do back then, but a thing I hate: using HTTP 300 codes to redirect users as a form of navigation is awkward and weird.
Of course, none of that is precisely the WTF here. The real WTF
is the developer apparently hates local variables.
strDelSQL is a member variable- why do we need to
store this in a class member? Especially because in the page
lifecycle, we handle one request and then die; either this is
unnecessary, or far, far worse, some other code is looking at this
SQL query later. But far worse than a badly scoped variable is the
overuse of session variables.
Thomas sends us this block as a representation, but the
developer responsible just stored everything they could in
a session variable. While in this example, "Uid" probably makes
sense, "Albumid" definitely doesn't. And in other cases, basically
every user form input gets stored in a session variable, and even
worse: they're often used as loop variables. while
Session("myloop") < 5 type stuff.
And finally, we already know I hate hungarian notation, but here
we have a client side form holdover that pollutes the user
experience: the URL they get redirected to has a hungarian
frm prefix. It's bad enough that you're using
hungarian notation, but don't show that to your users! They really
don't need to see everything.
Are You Getting Your Money’s Worth From AI? [Radar]
The following article was originally published on James Shore’s Successful Software blog and is being republished here with the author’s permission.
Software development has emerged as the biggest beneficiary of AI automation. One CIO I talked to recently, with 170 people in his organization, measured a 2.1x increase in productivity from AI.
That productivity came at a cost. His top users of AI each spent $21,000 on tokens per month. Another engineering leader spends six to eight thousand dollars per engineer per month.
This is not a trivial amount of money. Eventually, it has to come from somewhere, and it will probably come from your personnel budget. Now we’re talking about real consequences for real people’s lives. But there are also real business consequences for not acting.
If you’re going to make those choices—and somebody is going to—they need to be good ones. So you need to know more than the costs; you need to know the benefits too. Are you getting a good return on your investment in AI? Is there another way of using AI that would be better?
How do you know what you’re getting? Anecdotal reports abound, but the reasoning behind those anecdotes are often, to put it politely, not ideal. Some claims are outright fiction.
Given the stakes, that’s a problem.
In this essay series, I’ll show you how to assess the impact of AI on software development in your organization. It’s in four parts plus an epilogue:

Engineering leaders everywhere are feeling pressure to do more with AI. But which approach is best? There are a lot of people with strident opinions about what to do, but not a lot of consensus, and even less hard data.
Even if there were hard data, it’s not one-size-fits-all. A solution that works best for an internal IT development shop isn’t necessarily the one that works best for a startup, and the approach that’s best for a new product isn’t necessarily the one that’s best for a crafty legacy system.
Faster approaches aren’t necessarily better, either. If you get twice as much done per person, but spend so much money on tokens that you have to cut your staff in half, have you actually seen any ROI? You might actually be better off with a more modest speed boost if it keeps your costs down.
You can’t make these trade-offs from a gut feeling alone. In a famous METR study, engineers thought AI made them 49% faster than it actually did.1 You have to measure impact to know what you’re actually getting.

Costs are much easier to measure than impact, but they’re not without their own challenges. The biggest one is subsidies. In the fight to gain market share, big AI firms are offering substantial discounts. One engineering leader told me each team member was spending thousands of dollars in tokens at the cost of a $200 subscription. Anthropic and OpenAI are constantly offering discounts and other promotions. At some point, these subsidies will end, and prices will go up.
Or will they? Open-weight models and local inference are exerting downward pressure on token costs. Dedicated inference chips could make tokens cheaper. Routers promise to direct your prompts to the cheapest model for the job. Models could require fewer tokens to accomplish the same task as they become more capable. All of these factors could actually cause prices to go down.
When you calculate ROI, don’t assume today’s costs are the ones you should model. Whether you think prices will go up, down, or remain the same, make your assumptions explicit, and consider modeling both optimistic and pessimistic scenarios.
One more wrinkle: Adopting AI isn’t a matter of flipping a switch. People will need time to learn how to apply it. As with any big shift, change management isn’t to be underestimated. Productivity often goes down during a big change before it goes up. This adds costs too, and means early measurements can be misleading.
Part 2 of this series shows how to measure delivery speed. That’s only part of the picture. If you produce twice as many features, but double your maintenance costs, your team’s overall productivity spikes, then drops like a rock.

Engineer burnout is a concern too. An engineering leader using spec-driven development told me, “Every team is reporting burnout.” I’ll state the obvious: Burned out people don’t produce great work. They don’t push back when they should, they don’t report problems, and eventually they leave, taking valuable institutional knowledge with them.
Part 3 shows how to measure these unintended consequences of AI use, including techniques you can use to forecast future problems.
Finally, delivering software value faster is the point. Doubling your bug-fix rate isn’t going to yield the same results as doubling your rate of competitive new features. For that matter, delivering poorly thought-out features “just because we can” could actually make your product worse.
Part 4 shows how to model, forecast, and measure business outcomes.
First, what not to do: Don’t take the easy way out.
First on the no-go list: lines of code. Engineering leaders have known for more than half a century that lines of code don’t correspond to productivity. All else being equal, a feature implemented in 1,000 lines of code will be cheaper to maintain and less bug-prone than a feature implemented in 10,000 lines of code.
AI is notorious for its verbosity. If you measure lines of code, you’re measuring slop, not productivity. Don’t do that. Please.
Pull requests (PRs) are nearly as bad. They’re checkpoints where an engineer asks for their code to be reviewed, and they’re 100% arbitrary. An engineer (or AI) can choose to make a 10-line pull request or a 10,000-line pull request. It can be a feature, a bug fix, or just a tiny code improvement. There’s no inherent correlation between number of pull requests and productivity.
It’s true that engineers will generally produce PRs that are consistent and logical. So, in a sense, a stream of PRs does reflect a certain pace of development, and an increase in PRs can reflect an increase in productivity.
But AI upends that status quo. It produces massive amounts of code very quickly, which can overwhelm engineers’ ability to keep up. Without rigorous engineer oversight, PRs no longer reflect a consistent pace of development, which means that PR counts are no longer a reliable metric.
And, of course, when people think PRs are being used to measure productivity, they’ll be tempted to game the system and produce more PRs than they really need to.
That brings us to Goodhart’s Law: “Once a measure becomes a target, it ceases to be a good measure.” My favorite book on this topic is Robert D. Austin’s Measuring and Managing Performance in Organizations:
Gradually, measures fall (or, more accurately, are pushed) out of synchronization with true performance, as workers succumb to pressures to take shortcuts. Measured performance trends upward; true performance declines sharply. In this way, the measurement system becomes dysfunctional.
—Robert D. Austin
Don’t establish a performance measurement program and leave it running. Instead, use these metrics to determine how well a particular approach to AI is working. You can repeat the measurements periodically, but whatever you do, don’t use them to measure the performance of teams or individuals. Measure the approach, learn from it, and stop measuring.
Enough about what not to do. In this series, we’re going to quantify AI’s impact, and we’re going to do it right. It starts with measuring delivery speed. That’s next, in part 2.
︎My Super Mid-Life Crisis – Issue 1 – 06 [Comics Archive - Spinnyverse]
The post My Super Mid-Life Crisis – Issue 1 – 06 appeared first on Spinnyverse.
Pluralistic: Agents vs ecommerce (28 Oct 2026) [Pluralistic: Daily links from Cory Doctorow]
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
Top Sources: None -->

The first widely read piece of tech criticism I ever wrote was "Metacrap: Putting the torch to the seven strawmen of the meta-utopia," a response to the underlying philosophy of the "Semantic Web" that I published in 2001:
https://people.well.com/user/doctorow/metacrap.htm
The piece holds up surprisingly well today (if I do say so myself), and not just for its criticism of the ontological incoherence of "web semantics." The most relevant concept I develop in that piece is a criticism of any plan that starts with "first, everyone else in the world just needs to set aside their needs and advantages in favor of my priorities, and then my plan will work."
This is especially relevant today in the context of "agentic AI." When this idea was first mooted, the big idea was that you could instruct a chatbot to venture out onto the public, unstructured web and it would do your bidding, for example, finding all the flights that fit your criteria and comparing prices for all of them, picking the best one and booking it for you.
This idea quickly foundered. Each step in that process was too complex and specialized for a single chatbot; so the notion quickly gave way to "swarms" of specialized chatbots – one to search the web and identify likely travel websites; one to search those websites; one to evaluate flights against your criteria, one to handle the transaction, and so on.
Through specialization, these bots could be made far more accurate, but at a price: both the literal price of all the extra computation that goes into powering a "swarm" versus a single process, and the reliability price that arises from complexity. That's because error rates are multiplicative: combine two bots with low failure rates into a single system and that system will have a higher failure rate than any of its components. This compounding error rate only increases as you add more and more bots, so every time you add a new specialized bot to decrease the error rate in its area of specialization, you increase the overall error rate of the system by adding more complexity to it.
Despite this, companies pressed on ahead with "agentic," without any regard to the realities or consequences. For example, Microsoft has repeatedly announced that it will modify Windows to eliminate all forms of PC-side privacy and confidentiality, sending a continuous stream of screenshots to Microsoft's cloud servers so that your Microsoft "agent" can access your private data on Microsoft's cloud:
https://pluralistic.net/2026/01/06/1000x-liability/#graceful-failure-modes
But the real fix for "agentic" is for everyone in the world to rearrange their affairs to the benefit of AI agents. This is the same demand that the Semantic Web people made in the early oughts, and it has the same problems. The Semantic Web people operated on the assumption that there were freestanding, objectively correct ways of describing things and that everyone who put information on the web would eventually come to see that adopting these correct semantics was to everyone's advantage.
In reality, these semantic differences are the expression of real, serious, unresolvable philosophical, technical, moral and political arguments. The reason that some media outlets won't describe transwomen as women isn't because they lack an appreciation of objectively correct semantic classifications – it's because they're bigots. That's the same reason "race realists" insist that there is a biological category called "race," that exists despite everything computational genomics has proved:
https://pluralistic.net/2020/08/16/combat-wheelchairs/#race-realism
In my book The Reverse Centaur's Guide to Life After AI, I predicted that a similar dynamic would play out when it came to agentic AI and websites. The reason websites are so inhospitable to bots is that ecommerce sites don't want to be legible to automated tools:
https://us.macmillan.com/books/9780374621568/thereversecentaursguidetolifeafterai/
Ecommerce websites deploy a wide range of sleazy tactics to raise prices, including surveillance pricing:
https://pluralistic.net/2026/10/07/gouged/#aeropain
They use market power to rig whole categories, forcing prices up:
https://pluralistic.net/2026/10/15/enshittipedia/
Multiple law-enforcers, Republic and Democrat, state and federal, have sued companies for "drip pricing" and "junk fees" that make it impossible to know what the actual price is until you've spent a long-ass time going through the purchase process:
https://pluralistic.net/2024/06/07/drip-drip-drip/#drip-off
Surveillance pricing, drip pricing, junk fees, price fixing and "most favored nation" deals are the source of all the growth in profitability by the economy's largest, most important firms. These tactics require opacity and are antithetical to the kinds of automated comparison-shopping that agentic peddlers promise:
https://pluralistic.net/2024/08/14/the-price-is-wright/#enforcement-priorities
These tactics are facially illegal and despite this, they are widely practiced. Cheating is so profitable that it's cheaper for firms to buy off regulators and pay fines than it is for them to stop criming. The fantasy that these same companies would welcome agentic shopping bots with open arms is just as implausible as the idea that if we feed enough words to the word-guessing program, it will wake up and become a "super intelligence":
https://pluralistic.net/2026/09/18/surprise/#wow-signal
What's more, the AI companies know this. Google's big plan to make AI profitable is to sell merchants the power to combine its surveillance data with its AI tools to price-gouge shoppers:
https://pluralistic.net/2026/01/21/cod-marxism/#wannamaker-slain
And right on time, ecommerce websites are mass-blocking AI agents:
https://gizmodo.com/online-shopping-platforms-turn-against-third-party-ai-agents-2000831298
They're doing it in part because AI agents allow shoppers to cheat (for example, by renewing a "temporary" hold on a used item to block other buyers indefinitely), but also because they don't want automation tools on their platforms at all. These tools are a frontal assault on all the most exciting (and sleaziest) ways to make money in the waning hours of end-stage capitalism. Far from welcoming bots, ecommerce sites were always going to block them.
It's easy to come up with amazing applications for technology if you're allowed to assume that you can get everyone else in the world to set aside their priorities and their interests in favor of yours. But unless someone has a plan to do that, we shouldn't take them seriously.

"The day all billionaires died…" https://www.patreon.com/noneofthisisok/posts/day-all-died-171938052
Your phone is about to stop being yours https://keepandroidopen.org/
Shitter: Alternative Twitter front-end https://codeberg.org/shitter/shitter
Saving Social Security https://prospect.org/2026/10/27/saving-social-security/
#25yrsago Hack your Aibo https://web.archive.org/web/20010516005338/http://aibohack.com/
#20yrsago History of calculator watches https://watchismo.blogspot.com/2006/10/calculating-history-of-led-calculator.html
#15yrsago How Occupy has shifted the national debate https://www.salon.com/2011/10/27/the_victory_ows_has_already_won/
#15yrsago UK public reimbursed Margaret Thatcher was reimbursed for more than £500K in personal expenses https://www.theguardian.com/politics/2011/oct/28/margaret-thatcher-expenses-claim
#15yrsago Depression the Hyperbole and a Half way https://hyperboleandahalf.blogspot.com/2011/10/adventures-in-depression.html
#15yrsago Philippines president Duterte says God threatened to crash his plane if he didn’t stop swearing https://www.khaosodenglish.com/news/international/2016/10/28/duterte-says-god-told-stop-cursing/
#15yrsago Public safety codes are now free online for all https://memex.craphound.com/2016/10/28/public-safety-codes-are-now-free-online-for-all/
#10yrsago Dr Seuss estate has crushed a kickstarter for a Seuss/Trek mashup https://web.archive.org/web/20170425161011/https://www.popehat.com/2016/10/26/popehat-signal-help-defend-a-seuss-trek-parody-under-fair-use/
#10yrsago Undercover with a prepper militia that patrols the border to fight “drug cartels” https://www.motherjones.com/politics/2016/10/undercover-border-militia-immigration-bauer/
#10yrsago The “Blacks for Trump” guy used to be in a murder cult https://web.archive.org/web/20161027133828/https://fusion.net/story/362459/blacks-for-trump-michael-the-black-man-yahweh-cult/
#5yrsago Europe's trustbusters lose the plot https://pluralistic.net/2021/10/28/clintons-ghost/#filternet
#5yrsago All of science gets a general index https://pluralistic.net/2021/10/28/clintons-ghost/#cornucopia-concordance
#5yrsago The new DRM-breaking exemptions just dropped https://pluralistic.net/2021/10/28/clintons-ghost/#felony-contempt-of-business-model
#1yrago Raymond Biesinger's "9 Times My Work Has Been Ripped Off" https://pluralistic.net/2025/10/28/productive-seething/#fuck-you-pay-me

Kilkenny (Kilkenomics), Nov 6-8
https://kilkenomics.com/
Courtenay: Enshittification (Sid Williams Theatre Society), Nov
10
https://www.sidwilliamstheatre.com/events/cory-doctorow-talks-enshittification/
Vancouver: BC Policy Solutions Gala, Nov 12
https://bcpolicy.ca/gala/
Folkestone Writers Festival, Nov 16
https://www.creativefolkestone.org.uk/whats-on/cory-doctorow-the-internet-is-broken-now-what/
Oxford: Ministry of the Future, Nov 23
https://ministryforthefuture.co.uk/events.html
Sheffield: Reverse Centaur at Juno Books, Nov 25
https://www.outsavvy.com/event/40274/cory-doctorow-in-conversation
Virtual: Enshittification, AI, and the Future of Technology (UBC
Master of Educational Technology), Nov 28
https://met.ubc.ca/2026/09/met-speaker-series-cory-doctorow-enshittification-ai-and-the-future-of-technology/
Oxford: Bennett Oxford Symposium on Open Code in Science, Dec
9
https://www.bennett.ox.ac.uk/events/2026-bennett-institute-symposium/
Montreal: World Science Fiction Convention, Sep 2-6
https://montreal2027.ca/en
Life After AI (Brain Bar)
https://www.youtube.com/watch?v=IPPa43-n0vI
Terms of Service with Clare Duffy (CNN)
https://www.cnn.com/audio/podcasts/terms-of-service-with-clare-duffy/episodes/458ce968-af5d-11f0-b539-13ed2afe25f8
AI, Work, and Power (Software Engineering Daily)
AI, Work, and Power
https://softwareengineeringdaily.com/podcasts/cory-doctorow-on-ai-work-and-power/
AI, Corporate Power, and the Fight for Worker Control
(Plutopia)
https://plutopia.io/cory-doctorow-ai-corporate-power-and-the-fight-for-worker-control/
"Canny Valley": A limited edition collection of the collages I create for Pluralistic, self-published, September 2025 https://pluralistic.net/2025/09/04/illustrious/#chairman-bruce
"Enshittification: Why Everything Suddenly Got Worse and What to
Do About It," Farrar, Straus, Giroux, October 7 2025
https://us.macmillan.com/books/9780374619329/enshittification/
"Picks and Shovels": a sequel to "Red Team Blues," about the heroic era of the PC, Tor Books (US), Head of Zeus (UK), February 2025 (https://us.macmillan.com/books/9781250865908/picksandshovels).
"The Bezzle": a sequel to "Red Team Blues," about prison-tech and other grifts, Tor Books (US), Head of Zeus (UK), February 2024 (thebezzle.org).
"The Lost Cause:" a solarpunk novel of hope in the climate emergency, Tor Books (US), Head of Zeus (UK), November 2023 (http://lost-cause.org).
"The Internet Con": A nonfiction book about interoperability and Big Tech (Verso) September 2023 (http://seizethemeansofcomputation.org). Signed copies at Book Soup (https://www.booksoup.com/book/9781804291245).
"Red Team Blues": "A grabby, compulsive thriller that will leave you knowing more about how the world works than you did before." Tor Books http://redteamblues.com.
"Chokepoint Capitalism: How to Beat Big Tech, Tame Big Content, and Get Artists Paid, with Rebecca Giblin", on how to unrig the markets for creative labor, Beacon Press/Scribe 2022 https://chokepointcapitalism.com
"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
Today's top sources:
Currently writing:
"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.
Blog (no ads, tracking, or data-collection):
Newsletter (no ads, tracking, or data-collection):
https://pluralistic.net/plura-list
Mastodon (no ads, tracking, or data-collection):
Bluesky (no ads, possible tracking and data-collection):
https://bsky.app/profile/doctorow.pluralistic.net
Medium (no ads, paywalled):
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
Studying Fraudulent North Korean IT Workers [Schneier on Security]
Researchers set up a fake start-up company to study fraudulent North Korean IT workers.
Be careful what you wish for [Seth's Blog]
At a recent Q&A, a small businessperson asked how to get clients to be more alike, willing to engage in systemic work that would be easier to deliver and offer a simpler path to getting the job done.
Of course, once there’s a manual, anyone can do the work, and anyone will.
It might be the complex, fickle and unpredictable problems that allow the professional to thrive.
Nautical Naughties [Penny Arcade]
New Comic: Nautical Naughties
Suffering as a Feature [Coding Horror]

Have you seen this?
If you haven't, you should. I think everyone needs to. Wealth inequality on a scale this extreme is almost impossible to explain. You have to experience it to understand.
Go ahead. Try it out.
Where is the top of this graph? Good question. Keep scrolling up. Last time I did this it took me 12 minutes and 51 seconds, but the whole time I had a way out.
We get a button on the screen that lets us punch out any time we want: I quit. But do other Americans get an easy way out of the most extreme wealth concentration in history, piled up together all the way down there at the bottom of this graph?
No. They don't.
That's why we built this website. That's why I supported the updated 2026 wealth inequality video series, because 14 years ago, the original video changed how I thought about the world. I watched it again and again, year after year, because it shows something we feel, but rarely see so clearly — the obscene concentration of wealth and power in this country.
People deserve to see the facts plainly, visually, with sources and methodology attached. Politizane, The Onion and Garbage Day retained full control over their work. I did not tell anyone what to make, what to say, or how to say it. I told everyone involved the same thing I'm telling you right now – this is not for me, or any organization. It is for the public. It is for We, The People.
I used to be very dismissive of so-called "walking simulators", games where no real choice is offered, it's just an experience. But this graph isn't a game – these are people's actual lives. No one is forcing you to visit this website, no one is making you scroll up endlessly. The experience, then, is about endurance in the face of the relentless task of simply living your daily life with almost nothing, surviving as long as you can without reaching for the "I Quit" button. That's the experience so many Americans are having. It is harrowing.
As we built the website (Geoff Dalgas, my friend who helped me build Stack Overflow, did all the technical work) and tested it, as I obsessively scrolled upwards so many times, I slowly realized the whole thing is supposed to be inconvenient. The further you climb on this vast scale, the longer this seemingly endless scrolling goes on, the more the reality sinks in... how obscene all of it is. In order to understand the suffering of others, you must be willing to endure and suffer a little bit yourself. In this case, suffering is a feature.
Early iterations of the website had automatic scrolling, or rapid jumps, but I felt that wasn't right and should not be allowed. You need to do the work, make a physical action to scroll the entire way. We even stop you from scrolling at certain milestones.
This is a forced stop because no one should blindly scroll past 36 million Americans living in poverty, while at the same time we could eliminate all poverty in this country for $177 billion.
But we, for some reason, choose not to. We choose to let people suffer in desperate poverty. That's also suffering as a feature. In an era of unprecedented wealth, why shouldn't that money be out there doing something, somewhere, for someone?
I've spent my whole career talking about software usability, and I never thought I would design software that chooses to actively punish the user, but the data itself is the pain. Representing the massive numbers of wealth inequality with a linear scale is the only honest way to present this data. Do you have any idea how many pages it would take to print this graph in its entirety, representing both the richest American at the top, and the poorest American at the bottom?
What you should print out is this is 8 page foldable version of the graph, designed to be a relatable 6 feet, 6 inches, the average NBA player height. Show everyone what the most obscene centerfold of all time looks like. Let them see.
I challenge everyone to climb the graph on dreamagainusa.org as far as you want to.
If you do reach the so-called "top", I have a question.
Was it worth it?
Disruptions in fighting malaria [Richard Stallman's Political Notes]
Many African countries were on track to wipe out malaria, but the persecutor's aid cuts caused gaps in the campaigns, and malaria and its mosquitoes evolved resistance. But African countries are making arrangements to attack again.
Germany pledged to eliminate fossil fuels by 2045 [Richard Stallman's Political Notes]
Germany has pledged to eliminate fossil fuels by 2045. This is exemplary.
ChatGPT tracks user's browsing [Richard Stallman's Political Notes]
ChatGPT tracks the user's other browsing using ChatGPT cookies on tracking pixels, sent intentionally by various stores.
Nepal flash flood was warning to world [Richard Stallman's Political Notes]
*Nepal's PM says [avalanche-caused] flash flood was "warning to world" as he scolds leaders at UN over climate change.*
Alas, he makes the frequent mistake of focusing on how to repair infrastructure and systems damage, rather than on preventing most of it through the most efficient method: by forcing massive decreases in greenhouse gas emissions.
The People's Emergency Briefing aims to mobilize people to do that.
Ellison taking over additional major US news networks [Richard Stallman's Political Notes]
The Democratic attorneys general that were blocking the Ellison monopoly from taking over additional major US news networks caved in, extracting unenforceable concessions that are not very important anyway.
Girl Genius for Wednesday, October 28, 2026 [Girl Genius]
The Girl Genius comic for Wednesday, October 28, 2026 has been posted.
Why don’t we run the taskbar and Task Manager at high priority, so they can remain responsive? [The Old New Thing]
If a system becomes CPU-starved, all processes begin to suffer. This includes the taskbar and Task Manager, even though they are often the tools you want to use to stop whatever it is that’s making your system suffer. Why can’t we run the taskbar and Task Manager at high priority?
The catch with running anything at high priority is that unless you have been very careful to avoid it, you will eventually run into a shared resource that you will have to wait for, and you are now stuck. Your priority checkout pass gets you to the front of the line, but if the person at the register has a large shopping cart full of groceries, you just have to wait until they are done before you get your chance.
Even if the code that protects the shared resource is careful to avoid priority inversion by transferring the priority of the waiter to the thread that owns the resource, you are still stuck waiting, and that owning thread might be doing something that takes a long time, like, say, accessing a file over the network.
For UI code, this problem is particularly acute because you will eventually have to call into the UI system, and now you’re duking it out with all the other UI threads in the system.
The problem is that it’s hard to fix a runaway system from within that same system. The tools which you can use to try to fix the system may already have been compromised. And it’s definitely hard to fix a runaway system if your tools have to share critical resources with the thing that is out of control. Windows already gives preferential treatment to the program that is in focus, so if you can get focus onto the taskbar or Task Manager, you are doing about as well as you can. But that preferential treatment takes you only so far if those preferred threads find themselves blocked on things that are controlled by non-preferred threads.
The post Why don’t we run the taskbar and Task Manager at high priority, so they can remain responsive? appeared first on The Old New Thing.

Anh's best isn't very good though
Further Thoughts on the Googlebook, in Comparison to the MacBook Air [Whatever]


I’ve had the Googlebook now for a couple of weeks, and I have gotten a chance to both use it on a regular basis, and compare it with the MacBook Air I have (it sports an M4 processor). One of the things that I was curious about is which of them I would end up using more often, and which I would prefer over the other, if indeed there was a preference at all.
I’m not going to stretch this out for you: I prefer the MacBook Air over the Googlebook. This is because of a number of factors, some relating to software and some relating to hardware. The Googlebook is a fine little machine, and I’m mostly happy to own it, but it is not entirely baked, and it shows. For a day-to-day use case, the Mac Air is still the one that I reach for.
This is not just theoretical: I was actually away this weekend for a convention in the Denver area. At first, I gave some thought to taking the Googlebook, but at the last minute I made the switch to the Mac Air. I was worried about things like connectivity while I was traveling, and also the ability to pull up certain applications that I would need while I was away. I ended up pulling the Googlebook out of my backpack literally as I was leaving the house, and slipping the Mac Air in. I don’t regret the choice.
There are things I like about the Dell XPS version of the Googlebook over the MacBook Air that I have. For one, I like the keyboard a lot better. The one on the Air is just a smidge too squishy for me, whereas the XPS’s keyboard feels punchy and has snap to it. If we were going straight on the keyboard, I don’t think it would be a question for me.
I also like the ever-so-slightly smaller form factor of the XPS over the Air. This is very much a six-of-one, half-bakers-dozen-of-the-other sort of thing, because, of course, the Air is also very small and very thin and very light, just like the XPS Googlebook. But the form factor for this one, a 13-inch screen as opposed to a 14-inch screen and so on, means that the XPS is just a little bit more convenient in places like airplanes, or anywhere else where space is at a premium. Again, both of them are perfectly small enough for most use cases, but if that is a consideration, then the Googlebook has an edge.
Finally, and as I mentioned in my previous write-up of the Googlebook, the Rambler feature of the Googlebook, ported over from the latest edition of Android on the Pixel phones, really is kind of magical. I wish that every laptop had this. The ability to actually just dictate and have it come out as text with very little need to copy-edit is kind of spectacular. If it weren’t for all the other issues that the Googlebook currently has, the Rambler would in and of itself be enough to make me want to choose the Googlebook over other laptops. It’s genuinely one of the best voice-to-text applications I’ve ever used.
In terms of hardware, most of the other issues are very small in comparison to the MacBook Air. The trackpad is not nearly as smooth and nice as the MacBook Air trackpad, but of course, almost no other laptop has a trackpad that’s as nice as the MacBook trackpads. The screens are pretty much a wash in terms of quality. Both are nice and clear and have more than good enough resolution. The Googlebook has a 120 Hz screen refresh rate, which is twice that of the Air, but honestly on a day-to-day basis if you’re not playing video games, you’re probably not going to notice. Both computers are very limited in terms of I/O, with both of them only having two USB-C ports, although the Googlebook pulls ahead by having a USB-C ports on either side of the chassis, whereas the MacBook Air only has them on the left side. On the other hand, the MacBook Air does actually have a headphone jack, which the XPS does not. So they’re both slightly inconvenient in their own ways.
The only major hardware fuckup for the XPS Googlebook, which is also a software fuckup, lies in the speakers. The volume of anything you play gets louder and softer for no goddamn reason at all, and there’s no easy fix for it yet. When I first wrote about it the laptop, I didn’t notice there was an issue with the volume, but it’s there and it’s really, really fucking annoying. At first, I thought it was just an issue with YouTube, and I went into the YouTube settings to fix it, but as it turns out, it’s a problem with other programs as well.
It’s a known issue; if you go to the Dell site, they have it registered as being something that they’re aware exists and that they are going to work to fix, but apparently the update won’t be ready until December at the earliest. It’s so noticeable and so annoying that it actually makes me not want to use the XPS. It’s just that bad.
Beyond that, when the volume is near maximum on the XPS, the entire chassis vibrates and the sound distorts. It is genuinely bad, as opposed to the MacBook Air speakers, which are actually quite good. It’s not even a comparison; the MacBook Air blows the Googlebook out of the water in this case. For both the volume intermittency and the distortion, the current “fix” for the XPS Googlebook is to use a Bluetooth speaker or headphones. But I shouldn’t have to do that in order to get decent sound out of a $1000 laptop. This should have been solved before these shipped.
When it comes to software, the disadvantage the Googlebook has over the Air is simply that it mostly relies on Android versions of software, which are just not fully featured as the versions that are on the MacBook. The two programs that I use on a daily basis are Microsoft Word and Adobe Photoshop. On the Googlebook, the Android versions of these programs are just fine for quick and dirty stuff, but it doesn’t have the full set of features that I actually want and need to do my work. This is fine if I don’t have a lot of work to do, like if I’m on vacation or if I’m just doing something that I can use Gmail or Google Docs for. But this weekend, when I went to that convention, and later when I’m going to be on tour, I’ll be working on my upcoming novel. I need fully featured Word, at least.
Now, to be scrupulously fair about it, I’m not going to give the Googlebook too much shit about relying heavily on Android. It’s just a fact of life for this very early version of this operating system. I don’t think you should come to the Googlebook thinking that you’re going to get anything other than perhaps slightly gussied-up versions of Android apps. But from a purely practical point of view, which is what I have to have when I’m actually trying to get work done rather than just doing email, it’s an issue. You have to factor that in. For now at least, the Air still wins for practicality.
(You’ll notice that I’m not giving much time or space to any of the Googlebook’s “AI” functionality, and that’s just because I’m mostly not using it. In this case, it’s no different from the Air, on which I also don’t use any of Apple’s most recent “improvements” through the use of “AI”. So for my use case, they’re both about even on this score.)
As hinted above, in many ways it’s fundamentally not fair to compare a Googlebook with a brand new operating system to a MacBook Air that is several generations in with an OS that has been developed over the space of decades. I’m reasonably optimistic, even with Google’s tendency to kill things off, that the Googlebook will improve, and that its OS will get better and smarter. Google has committed to 10 years of updates on this machine, and we’ll see if that’s actually going to be the case. But certainly we can expect at least a year or two of refinement out of the company. So maybe in a year’s time, or two, it might actually become a laptop that I would take with me on a long business trip.
But for now, I will have to stick with my MacBook Air for any travel that requires more than the most casual of Gmail and Google Docs use. I often do have to work when I travel, and that means I need a laptop that can do everything I need it to do. That’s still the MacBook Air.
— JS
Social Media When Elections Are Close: Doing the Impossible Better [Deeplinks]
Everyone knows, or should, that perfect (balanced, targeted, transparent, swift and swiftly appealable) content moderation at scale is impossible. That doesn’t mean powerful social platforms don’t have to try to get at least reasonably close, especially when access to good information can have a profound effect on political participation and speech.
That’s why so many people, including the Meta Oversight Board, criticized Meta for suspending a major political Instagram account for hours during a huge early voting push on October 17; and for allegedly boosting one candidate in Brazil’s recent presidential election. Meta denies deliberate interference in either instance, blaming “mistakes” in its automated content moderation systems (including AI tools that can’t tell the difference between enthusiastic follower engagement and a bot attack).
Mistakes or not, with early voting in the U.S. midterms already underway, these events serve as a stark reminder that all major social media platforms need to have stronger systems in place to ensure that they serve, rather than impede, democratic communication.
Access to good information can have a profound effect on political participation and speech.
This is not inherently an “AI” problem: automated systems can process content at a scale that humans never could, potentially enabling better moderation at scale and alleviating the psychological load on ill-paid moderators whose jobs require them to view incredibly disturbing content. But automated systems also reproduce existing biases, struggle to understand context, and often make mistakes that disproportionately affect journalists, activists, artists, and other vulnerable and marginalized communities. And moderation errors are even more likely when the language is spoken principally by the global majority. In 2020, leaked document showed that Meta’s algorithms incorrectly deleted nonviolent Arabic-language content 77 percent of the time, while failing to detect hate speech under the company’s own policies in many instances. Where these systems are faltering in Arabic, they’re positively failing in less-resourced languages. As a 2025 report from the Center for Democracy and Technology found, labeled datasets in certain languages and dialects such as Maghrebi Arabic and Kiswahili contain inconsistencies, bias, and inaccuracies due to the limited hiring of annotators who actually speak the languages as well as shifts in the languages themselves. An investigation into ChatGPT’s outputs in several low-resource languages demonstrates the depth of problem.
But language disparities are just one of several concerns as automated moderation becomes more widespread. From the systemic suppression of content from Palestine to the repeated misclassification of LGBTQ+ content as adult or explicit material, these varied examples demonstrate the risks of overreliance on automated moderation—and the need for stronger safeguards.
Fortunately, there is a great deal companies, policymakers, and civil society can do to help ensure that highly automated systems operate in ways that respect human rights, minimize predictable harms, and provide meaningful accountability when they fail. If companies are going to continue relying on automation to moderate users’ speech—and there is little reason to believe they won’t—then accountability must evolve alongside these technologies.
That work should start with publicly committing to the Santa Clara Principles 2.0. Specifically:
These recommendations understand that automated content moderation isn’t just a technical problem for clever engineers and product teams to solve. Because content moderation shapes public discourse and fundamental rights, its design and oversight must respond to the concerns of policymakers, civil society, independent researchers, and the communities most affected by these systems.
One other distinct and enduring problem makes transparency, checks, and accountability all the more urgent: too few companies have far too much power over our political communication and organizing. Social media gave people the ability to wrest some control over political messaging away from media oligopolies. But we’ve met the new boss and while it’s not the same as the old boss, the song is pretty familiar. The real promise of the web to democratize communication is not likely to be met by social media oligarchs, no matter how sophisticated their content moderation practice.
The Big Idea: Kevin J. Anderson [Whatever]

You can’t have a duology without an enticing cliffhanger at the end of the first book, and thankfully New York Times Bestselling author Kevin J. Anderson managed to write the second installment in his Nether series, despite a broken ankle setting him back some. Journey through his writing (and speaking) process to see how Nether Vortex follows up on that suspenseful cliffhanger.
KEVIN J. ANDERSON:
I grew up as a wide-eyed kid, looking up at the stars with a Star Trekian wish to boldly go where no one has gone before. The universe was filled with a sense of wonder.
But you know what? Space is also scary as hell! It’s infinitely cold, dark, empty, alone … filled with radiation, solar flares, and gravity wells (and that’s not even counting monsters, deadly aliens, or killer robots). In space, everything wants to kill you. It’s even worse than Australia.
Science fiction horror should be a bigger thing. Just imagine being in a distant space station or an interstellar ship incredibly far from even a hint of rescue, where only a thin metal hull or reinforced windowport separates you from deadly vacuum, where the transmission of your terrified scream would take hours to reach the nearest listener.
So where are all the scary science fiction stories? Yes, everyone can immediately cite Alien and Event Horizon, then after a pause add Pitch Black. Heck, even Apollo 13 is a terrifying space story, in its own way. How about Jason X, the first film to bring a hockey-masked serial killer into space? And who can forget Leprechaun in Space (no matter how much we try)? But I think the genre needs more. If you search for “space horror” on Amazon, you’ll find a few titles but not a lot.
When Weird Tales Presents and Blackstone Publishing asked me to write novels for them, they let me choose the genre and topic. I jumped at the chance to write a cosmic horror epic: Nether Station and Nether Vortex.
Now I could really buckle up and take advantage of the scenario—a haunted house in space, an isolated station on the far edge of the solar system near a wormhole that offers a shortcut to Alpha Centauri … or maybe it’s a place where the horrific elder gods have been exiled, and boy do they want to come out. I reread all of H.P. Lovecraft’s work (man, that guy had some creepy and mind-blowing ideas), and added a lot of Easter eggs in the prose.
The first half of the story, Nether Station, has a controlled cast of oddball characters, mostly misanthropes (who else would want a job like that?), each facing their own problems even before the really weird shit starts happening. This novel is claustrophobic, intense, scary, and ends on a cliffhanger. The second half, Nether Vortex, is much bigger in scope, a sprawling cosmic war where countless species are being consumed by a great darkness. The two books are like Alien followed by Aliens.
I’m a prolific and reliable writer, and I like to think I’m always on time. With the giant cliffhanger at end of Nether Station, I didn’t want to keep the readers dangling in the wind. You want them to feel delicious suspense and anticipation, not an annoyed sense of “Is this guy ever going to deliver the next book?” (Not that we know of anybody who’s done that to his readers…)
Then the real horror happened. I outlined Vortex and was all ready to write. The deadline was looming, but not in a scary way. I couldn’t wait to get to my version of “At the Mountains of Madness” in the Martian polar ice caps, Lovecraftian SF on a grand scale.
Now, I’ve long-established that I write by dictation. I live in beautiful Colorado, and I take my notes with me out on the trail. I’ll head into the mountains or forests and trudge along for miles, dictating my chapters. I get inspired, I’m surrounded by scenery, and I sink into the zone, lost in the story I’m creating as I walk along. I’ve been doing this for so many years that the words come out as nearly finished prose, like I’m narrating an audiobook. When I return home, I have my dictation files transcribed, then I edit them online. In fact, it’s the only way I can write my novels.
Except, just when I was starting to write Nether Vortex, I hiked a beautiful trail up Beckwith Pass near Crested Butte, Colorado. On the way down, it started to rain, and the trail got muddy … and I slipped and fell off a ledge, twisted my leg, and broke my ankle. (Yes, I hike alone; I can’t dictate if somebody is walking along beside me.) So, I had to limp a mile back to my car and then drive an excruciating three hours back home.
That’s the sort of experience I inflict on my characters, not something I wanted to try at home. I spent the next two months in an armored Darth Vader boot.
Worse, although I could hobble around the house, I certainly couldn’t go out hiking, not even on the wimpy bike path near my home. I had a 130,000-word novel to write, and suddenly I wasn’t sure how to do it. My creative process strictly relies on walking and talking.
So, I sat on the porch, staring off into space, and I tried dictating chapters, but it was ten times as hard to sink into the zone without moving. I tried pounding out chapters on the keyboard, stuck in a chair in a stuffy office while staring at a screen. (How do you guys do that for hours and hours?)
But deadlines can be very inspirational, and the thought of angry readers imagining Lovecraftian punishments for me if I didn’t deliver on time after that Nether Station cliffhanger was enough for me to complete the manuscript on time. I powered through, typing some, dictating some, and the plot and characters took over. Maybe that helpless, claustrophobic, trapped situation actually helped convey the right sense for the story. (The ankle’s fully healed now, and I’m back to writing novels the “right” way for me.)
I love how the Nether books turned out. I created big scary story and an immensely cool setup. Oh, there’s room for other bad stuff to happen if I want to revisit that universe, but these two novels form a complete story with a real and satisfying conclusion. I hope you enjoy the read.
—-
Nether Vortex: Amazon|Barnes & Noble|Bookshop
Freexian Collaborators: Monthly report about Debian Long Term Support, September 2026 (by Santiago Ruano Rincón) [Planet Debian]

The Debian LTS Team, funded by [Freexian’s Debian LTS offering] (https://www.freexian.com/lts/debian/), is pleased to report its activities for September.
During the month of September, 20 contributors have been paid to work on Debian LTS (links to individual contributor reports are located below).
The team released 41 DLAs fixing 1854 CVEs.
In September, the Debian LTS Team was back to focusing on a single release: Debian 12 (“bookworm”). Debian 11 (“bullseye”) reached the end of its Long Term Support on 31 August 2026, and Freexian now provides its security maintenance under the Extended LTS offer.
It is important to highlight the hard work done behind the
scenes of the Front Desk fellows, whose role was fulfilled during
September by Emilio, Emmanuel, Sylvain, Thorsten and Utkarsh.
Besides the very high activity doing daily triage on dozens of
packages and CVEs, Front Desk fellows spent much of their time
answering questions and coordinating with people outside the
Freexian team about update proposals.
The team published several notable updates:
Contributions from other Debian fellows beyond the Freexian LTS Team:
Thank you so much to the developers above for these valuable contributions.
The LTS Team has also contributed with updates to the latest Debian releases for the following packages:
If you benefit from Debian, especially throughout its full 5-year lifecycle, please consider becoming a sponsor of Debian LTS. You can find more information here: https://www.freexian.com/lts/extended/.
Sponsors that joined recently are in bold.
Robinson: Raspberry Pi 5 on Fedora [LWN.net]
Peter Robinson has written a blog post about the current state of Fedora support for Raspberry Pi 5 devices. According to Robinson, the upcoming Fedora 45 release will work—with caveats—on all variants of the Raspberry Pi Model 5B; the Compute Module 5 and Pi 500+ are still works in progress.
For Fedora 44 release you need to have a temporary workaround when booting. If you update to the latest kernel/firmware straight away this isn't then needed beyond the first boot. The workaround isn't needed for Fedora 45 so if you're going to try this out I suggest you go and grab your favourite flavour of Fedora from the Fedora 45 release candidates and jump straight in there! You will get an accelerated desktop with storage/network/USB. There's not currently any support for sound and a number of other things.
See Robinson's post for instructions on creating an Fedora image to use with a Raspberry Pi 5.
Otto Kekäläinen: Debcraft v1.0 released: Easy, fast and secure way to build Debian packages [Planet Debian]

Debcraft is a tool that automates most of the repetitive and
error-prone steps related to Debian packaging. It makes it easy to
build .deb packages from source without having to
manually prepare build environments. It clearly shows what changed
in the build artifacts between two builds, automates parts of
importing new upstream versions, and can automatically apply
repetitive fixes to the packaging source code, including committing
them in git.
While doing all of this, it also explains what it does and helps users learn best practices in Debian packaging, making the overall experience much easier and more fun than with any other tool before, while also being secure and fast.
Debcraft can be installed simply
by running apt install debcraft on a recent version of
Debian or Ubuntu. Check with debcraft --version that
you have 1.0.0 or newer. The latest version can also
always be installed from source at salsa.debian.org/debian/debcraft (does not require
compiling anything).

Debcraft was designed to offer the following three main benefits:
Build any Debian/Ubuntu package by simply running debcraft
build in the checked-out Debian packaging git
repository.
If the orig upstream source code tarball is neither already
present nor available on a pristine-tar branch, the
exact upstream tarball is downloaded from the Debian archive.
Users are spared from having to manually prepare ahead or
maintain build environments. Debcraft builds create a container
on-the-fly (both Podman and Docker supported), built using the
target Debian or Ubuntu suite in debian/changelog and
with exact build dependencies from debian/control.
Commands debcraft improve, debcraft
test and debcraft update automate recurring
package maintenance tasks and help maintainers produce
high-quality, up-to-date packages, run Salsa CI, pass autopkgtest
in Debian CI, and stay in sync across Debian archives and packaging
git repositories.
The command output is (relatively) easy to read, and it also teaches users about Debian packaging in context.
Container layer caching is utilized to make builds and re-builds blazingly fast.
If an apt-cacher-ng instance or equivalent is present, it will automatically be used.
Debian packages that support ccache or sccache build even faster.
The build phase happens inside hermetic containers with no network access. This ensures all dependencies are properly managed and that the built binaries are as trustworthy as the source code they were built from.
Using containers also protects the host system from getting polluted with extra development libraries, and adds an extra layer of protection to prevent anything malicious in the source code from accessing secrets on the host system.
The additional logs provided by Debcraft also help audit changes in Debian package sources and build artifacts.
See the Debcraft README.md for details on how this was implemented. I also previously wrote Debcraft - Easiest way to modify and build Debian packages, which explains the motivation and design in more detail.
The first commit in the git repository is from 2020 under the name debuildr. The project was renamed to Debcraft in a commit on December 8th, 2023. I have been developing this tool fairly actively since 2024 and using it for all my packaging, “dogfooding” so to say.
There have also been plenty of collaborators. In total, 13 people have contributed code across 21 MRs and PRs on Salsa.d.o, GitLab.com and GitHub.com.
Now, in October 2026, it was time to release Debcraft v1.0 as it has had extensive real-world use and iteration based on countless different packages and multiple users. Users have included both experienced fellow Debian Developers and lots of people who just started learning how Debian packaging works. As I mentor dozens of new contributors to Debian, I have seen that the latter group seems to benefit the most from Debcraft and its ease of use and built-in guidance, while to the more experienced developers the main benefit is having less details to remember and doing less mistakes.
Try it: apt install debcraft, then
run debcraft build in a checked-out Debian packaging
repository. If you run into a problem, file a report or submit an improvement. New
contributors can look for issues marked good first issue.
The code is intentionally written entirely in shell script to
keep the barrier to code contribution as low as possible. It is
also very easy to debug, as any command can be run with
--debug to emit step-by-step information about what it
is doing, and being Bash scripts, injecting set -x
anywhere in the code will emit an even more detailed trace of every
subcommand executed.
By the way, if you aspire to become a Debian Developer, and want to follow my examples in using state-of-the-art tooling and collaborate using salsa.debian.org, feel free to reach out for mentorship. I am glad to see more people contribute to Debian!
New Records Obtained by EFF Expose More Problems with Medicare’s AI Experiment [Deeplinks]
New records obtained by EFF expose additional issues with Medicare’s AI-driven prior authorization program and show why we need stronger legal limits around government use of automated decision-making.
EFF sued the government back in March for information about the Wasteful and Inappropriate Service Reduction (WISeR) model, a new Medicare program that uses AI to evaluate prior authorization requests for certain medical services. We previously released records showing that WISeR has resulted in delays and denials of care, operational chaos, and reports of patient harm. Today, we’re publishing over 800 new pages of records, including:
Documents obtained through EFF’s lawsuit are available here.
These newly released documents show that the WISeR rollout was rushed and rocky from the start, highlighting the dangers that arise when governments treat AI like a silver bullet for complex problems. The documents also highlight the need for more transparency about safeguards against inappropriate, AI-driven denials. The public still lacks the information needed to assess whether clinician review is providing meaningful oversight of AI systems and whether appropriate data is being used to evaluate prior authorization requests.
EFF has long argued that AI has no place in consequential government decisions about peoples’ rights or access to benefits, such as immigration enforcement and policing decisions. That’s because using automated decision-making in these contexts risks decisions that violate people’s rights or deprive them of benefits they’re entitled to based on biased or inappropriate considerations and without proper due process or accountability if there is an error.
By outsourcing decision-making to private AI companies without sufficient transparency, testing, or legal limits, WISeR jeopardizes seniors’ access to medical care. Congress should step in to place greater legal limits on the use of automated decision-making in Medicare.
CMS launched the WISeR program just six months after announcing it, ignoring calls from medical providers to delay its rollout. In records previously released by EFF, CMS acknowledged this “extremely condensed timeline.”
New records suggest that WISeR’s unusually rapid rollout contributed to widespread problems in the first few months of the program. CMS did not disclose the extent of these issues to the public, even as agency employees privately contacted vendors about potential noncompliance with program requirements.
In the first three months of the program, CMS sent RFIs or requests for CAPs to at least four of the six WISeR vendors. These requests, which describe delays, technical failures, and a lack of communication with providers, suggest that widespread problems during the program’s rollout were not limited to one vendor or state.
These letters underscore the severity of the problems with the program. For example, CMS requested information from one vendor, Virtix, about numerous reported issues, including “determination turnaround times that exceed established guidelines,” “denials that appear inaccurate or inconsistent with applicable criteria,” and “inadequate customer service.” CMS’s RFI to Zyter–a vendor that uses Palantir software infrastructure–observed that the agency had received reports that “Zyter is not issuing determination letters in a timely manner” and communications indicating that it “may lack adequate processes for responding to and escalating provider/supplier concerns.” The vendor Innovaccer received two CAP requests and a “Performance Notice of Non-Compliance” over its failure to implement a fully functional portal for WISeR providers and suppliers.
Excerpts from CMS’ letters to vendors describe problems during WISeR’s rollout:
Excerpt from the RFI for Virtix, March 17, 2026
Excerpt from the RFI for Zyter, February 27, 2026
Excerpt from the Performance Notice of Non-Compliance for Innovaccer, February 20, 2026
Vendors’ responses to CMS provide further evidence that WISeR’s rushed rollout contributed to its problems. Innovaccer claimed it warned CMS months in advance that it might not be ready to provide full portal functionality by the launch date, even before signing a Participation Agreement. Another vendor claimed that “technical and workflow stabilization challenges were encountered due to the compressed implementation timeframe” it faced after joining the WISeR program a month after the other vendors.
Excerpt from Innovaccer’s Proposed CAP, January 16, 2026
The issues reflected in CMS’s letters to vendors, and the vendors’ responses, illustrate the risks of deploying automated decision-making systems without proper testing or safeguards. While vendors’ responses describe fixes for the problems CMS identified, after-the-fact remedies cannot undo the harms that patients and providers already experienced during WISeR’s rushed rollout.
The public still knows far too little about any safeguards that WISeR vendors may have adopted—in part because the government chose to conceal some of this information. Transparency about these safeguards is critical to protecting patients, especially because WISeR’s payment structure gives vendors, as the government put it, “an incentive to deny as many claims as possible.”
Information provided by a vendor about safeguards that it says "ensure the responsible and clinically appropriate application of automation” appears to have been redacted from records released to EFF
The public has limited means to evaluate the effectiveness of even the safeguards that weren’t redacted from records released to EFF. For example, one vendor’s application touts safeguards like “Human-in-the-loop (HITL) workflows,” “Continuous model monitoring,” and “Transparent audit trails.” Yet it remains unclear whether these measures effectively prevent improper prior authorization denials. Some evidence suggests they may not: the company denied more requests than it approved in the first few months of the program, and CMS inquired about “denials that appear inaccurate or inconsistent with applicable criteria.”
Ultimately, the records obtained by EFF raise more questions than they answer about the safeguards used by WISeR vendors.
CMS has emphasized having a human in the loop as a key safeguard against inappropriate, AI-driven denials. The WISeR FAQ page on the CMS website states that “Non-affirmations will require the review of a human clinician and cannot be performed solely by technology.” But whether human review provides any meaningful protection depends on the details of its implementation, such as whether human reviewers have enough time to evaluate requests and practical authority to override AI recommendations. We still lack many of those details for WISeR vendors.
A growing body of scholarship points to the substantial limitations of “human in the loop” policies as guardrails for AI systems. AI-generated recommendations can unduly influence human decisions, leading reviewers to over-rely on automated judgements and rubber stamp them as correct. Even worse, at least one health insurance company actively pressured clinical reviewers to accept its AI systems’ recommendations. Another company built a system that allowed clinical reviewers to reject claims without opening patient files; clinical reviewers using this system spent an average of just 1.2 seconds on each case.
Some WISeR vendors’ applications offer general descriptions of the types of data informing their decisions. But far more details are needed to allow medical professionals to assess whether the data inputs to these AI systems are appropriate for evaluating prior authorization requests.
Inappropriate training data or input data can lead to biased, unfair, or inaccurate decisions. CMS guidance for Medicare Advantage organizations using AI to make coverage decisions emphasizes the importance of basing decisions on individual patients’ circumstances. It cautions against using “an algorithm that determines coverage based on a larger data set instead of the individual patient's medical history, the physician’s recommendations, or clinical notes.”
WISeR vendors’ applications reference data sources like “provider behavior,” “patient demographics,” “utilization management datasets,” “provider and payer performance metrics,” and “historical claims data.” Whether these sources could introduce bias or give too much weight to population-level patterns depends on how vendors use them to inform individual decisions. But we don’t yet have these important details about vendors’ data and algorithms. By outsourcing decision-making to private companies’ AI systems, the government has made it harder for the public to evaluate whether decisions are being made fairly.
As the government expands its use of automated decision-making, the potential for consequential mistakes increases rapidly. The records we’ve obtained so far raise questions about the rushed rollout and lack of guardrails for automated decision-making by the U.S. government. EFF urges transparency, oversight, and legal limits to protect people from the harms of automated decision-making in high risk systems.
French Court’s Site-Blocking Orders Drive Quad9 Out Of France [Deeplinks]
A nonprofit service that protects internet users’ privacy is leaving France. Quad9, a free DNS resolver, has said it will reluctantly stop serving users in France on November 24. This follows a French court order that Quad9 must block access to websites that are accused of infringing the copyrights of a sports broadcaster. Forcing a responsible privacy service out of an important market is a predictable result of trying to force infrastructure providers to be copyright police.
When you visit a website, a DNS resolver reads the domain name you type in—like eff.org— and translates it into a numerical IP address that’s used to direct data across the internet. A DNS resolver can see the names of websites you connect to, so its privacy policies are important. Quad9 is an NGO that’s incorporated in Switzerland, in part to protect its users from data demands. The company also helps protect users from malware and phishing by blocking domains that are known to be malicious. Services like Quad9 offer an alternative to the DNS resolvers of local internet service providers and wireless carriers, which are vulnerable to demands from law enforcement, censorship, and commercial surveillance.
In a blog post explaining its decision, Quad9 explains that the French court’s order forces it to make a decision that, either way, is bad for users. It could either “extend French law to the whole world (blocking globally)” or try to identify and block users only in France—something that it can’t do reliably, and a move that could leave the company facing massive fines if it fails to block websites perfectly within France. Quad9 says it is facing about 20 other lawsuits in France seeking similar blocking orders.
Rather than accept these demands, Quad9 has decided to withdraw its service from France. That is a real loss for French users who rely on the service to protect their privacy and security. It is also the right thing to do, when faced with the alternative: making promises it can’t keep, or abandoning users’ rights worldwide.
Quad9’s decision will not remove any allegedly infringing material from the internet. The organization doesn’t host websites. Users looking for particular websites can easily switch to another DNS resolver. So the material targeted by copyright holders will remain online and accessible, even while they drive a privacy-protecting service out of France.
These events matter beyond the borders of France, and U.S. lawmakers should pay attention. Congress is considering multiple site-blocking proposals, which would require ISPs and other intermediaries, including DNS resolvers, to block access to websites in the name of protecting copyright. These bills threaten speech and our ability to access information online, and they are invitations to abuse. The Quad9 withdrawal shows another cost: if internet services get forced into being copyright cops, users can lose services that they rely on for privacy and security.
Worse still, if neutral services like Quad9 are forced to build site-blocking systems for the benefit of copyright holders, it becomes far easier for other powerful interests, including repressive governments, to demand the same systems be used to censor speech they dislike, globally.
Congress should reject site-blocking bills. They’re a threat to the open internet, and don’t help creators or creativity.
Guess What’s Arrived at the Scalzi Compound [Whatever]

Yes! It’s here! The brown cardigan I bought that looks like I skinned Fozzy Bear for his pelt!
Oh, and also, the finished hardcover copies of Monsters of Ohio, which look terrific, and which officially go on sale one week from today (which is November 3rd, in case you are reading this on a day other than October 27, 2026).
There is still time to pre-order the book from your favorite bookseller! Or (today and tomorrow) to order a signed/personalized copy from Subterranean Press! You can even pre-order it from Audible, if you’re an audiobook sort!
Also if you are in or near the towns of Beavercreek, OH, Franklin, IN, Chicago, IL, Ferndale, MI, Hudson, OH, Nashville, TN, Louisville, KY, Kansas City, MO, Cincinnati, OH or Austin, TX, come see me on tour!
This cardigan is really comfortable, y’all.
— JS
(PS: November 3rd is election day here in the US. Go vote! Do it early so you have the whole day to read my book!)
Yesterday Ben Thompson wrote
that we've reached the end of the web, and I had come to the same
conclusion, just a few days ago. And his piece, which was a great
milestone, said it's not totally gone, because of the advent of AI
we can build small systems for each other. Which is exactly the
motivation of the BigUndo model.
What's big about it is how small the parts are and how nicely they
fit together. We're not leaving everything behind in the great
diaspora to the new web, we're not just bringing Markdown with us.
It also echoes Marco Arment, who
wrote a similar piece about Mastodon a few days before. Nothing
wrong with Mastodon, but the idea of one model of service doing the
work for everyone is ridiculous. We need a million different
approaches, all we need to make it work is a standard they can all
agree on for what forms of text move around the net. Once we agree
on a format, we all can use whatever editor we like, and no more
tiny little
text boxes that lock your ideas into Substack or X or whatever.
That was the crime, that's what the BigUndo is all about undoing.
The web said very clearly what text is, and they all broke it by
doing it differently. We're bringing RSS 2.0 and Markdown with us,
and they were joined a short
time ago. Almost no one noticed, but there was design here, an
intent -- a hope that we'd get to the place it appears we are now
at.
Zettelkasten is an idea pioneered by my great-uncle Arno Schmidt. It's a process for organizing your data and thoughts. When I read people's descriptions of what they do with it, it sounds totally like the outliners I pioneered two generations later. I have a Zettlekasten blog in my blogroll, screenshot, so I think of Uncle Arno, who I never met, from time to time.
If Claude Code projects had feelings, I'd wake up the Frontier project and let it know that the reason it's been asleep so long is that the software is working. I'm using it to manage the other three apps, writing code, keeping lists, everything works. Yes, the menubar is very out of date, but I know where to find everything. I look forward to coming in for a landing at some point and upgrade it work among the different BigUndo stuff we have running, no doubt we're going to use Frontier to do cross-app scripting. Some of the things AI says they need to do, Frontier can do with the resources of an early 90s Macintosh. No big data centers. Keep that in mind.
[$] Guidelines for panics in kernel code [LWN.net]
Alexandre Courbot spends most of his time working on the kernel doing code reviews. Recently, he's been wondering about what the standards should be for when Rust code is allowed to panic, and how it should do error handling more generally. Unlike many of the other talks at Kangrejos 2026, his talk was not presenting some existing work, but rather hoping to solicit opinions on the topic from the assembled Rust for Linux developers. He brought along a collection of tricky cases that he had run into recently to prompt discussion.
Security updates for Tuesday [LWN.net]
Security updates have been issued by AlmaLinux (bind, bind9.18, brotli, buildah, container-tools:4.0, container-tools:rhel8, firefox, flatpak, freeipmi, gcc, golang, grafana, httpd, kernel, kernel-rt, libreswan, libX11, lrzsz, nodejs:14, nodejs:18, oci-seccomp-bpf-hook, podman, python-urllib3, python3.9, python38:3.8 and python38-devel:3.8, skopeo, thunderbird, xorg-x11-server, and xz), Debian (inkscape, swupdate, thunderbird, and valkey), Fedora (brotli, dolphin, helix, kernel, libical, mingw-python3, nsd, perl-Alien-Brotli, perl-Plack, perl-Plack-Middleware-ReverseProxy, rust-dua-cli, rust-gengo-bin, rust-gitui, stgit, unshield, and webkitgtk), Mageia (evolution, freetype2, ghostscript, kronosnet, libde265, libical, libjxl, packages, perl-DBI, perl-ExtUtils-Typemaps-Default, perl-Imager, vim, and webkit2), Oracle (bind, bind9.18, brotli, buildah, ca-certificates, firefox, flatpak, freeipmi, grafana, httpd, kernel, libreswan, libX11, lrzsz, nodejs22, nodejs24, nodejs:22, oci-seccomp-bpf-hook, perl-DBI:1.641, perl:5.32, postfix, postgresql16-pgvector, postgresql18-pgvector, python3.9, skopeo, unbound, xorg-x11-server, and xz), Red Hat (grafana, grafana-pcp, python3.12-urllib3, and python3.14-urllib3), SUSE (ca-certificates-mozilla, chromium, gn, cifs-utils, containerd, cpupower, cyrus-sasl, gcc13, gcc7, go1.26, go1.27, google-osconfig-agent, kernel, kubernetes-old, libsoup, libX11, libXi, openssh, podman, python-nltk, python-PyJWT, python-social-auth-core, rekor, runc, suseconnect-ng, and unbound), and Ubuntu (brotli and nginx).
Are agent harnesses dying? What harness distillation changes. [Radar]
The following article originally appeared on The Arize Blog and is being republished here with the author’s permission.
Every time you think you’ve just got the hang of this AI thing, another thing gets declared “dead.” This week, it’s agent harnesses.
Back in ancient history, aka June, I wrote a piece called “Frameworks are dying, harnesses are winning” and I don’t take that back. But this week a research team took a specialized agent harness, trained its behavior into a model and then took the harness away. The trained model handily beat the original model+harness combination. So are harnesses done now?
Betteridge’s Law applies, so the answer is “no.” But the job of the agent harness is changing. Parts of a harness that are sufficiently generalizable can be trained into the model. That leaves your harness holding the things that make your application unique: your tools, your data, your users, and your environment. You still have to build a harness, but you have to be prepared to regularly throw it away and rebuild it to keep up with evolving models.
This blog is about why that’s true, and how to turn “constantly rebuilding your harness” into an automatic process, not a giant time suck.
First, the paper that kicked off this train of thought for me: it’s called “Harness-Zero,” from Haoran Ye and colleagues at Peking University. Its subject is harness distillation, i.e., training a model to reproduce behavior that used to be the result of the harness. The methodology is a little involved, so stick with me.
First, the team built a specialized harness for a small model, Qwen3.5-9B. An automated loop, run with Kimi K3, analyzed where the small model kept failing on training tasks and added the usual components to fix those failures: custom tools, middleware rules that block risky actions, skills files and memory. They called this the “evolved harness.”
Then they used that harness to generate training data. They put the small model through training tasks inside a minimal harness while a stronger model, GPT-5.6 Sol, reviewed every step the small model proposed. Sol used a copy of the evolved harness to tell it whether that step was a good idea. Sol passed good ideas from the small model through unchanged, and whenever the small model and the guidance disagreed, Sol made the smallest fix needed before the step ran.
That gave them a bunch of training runs and, crucially, data about what needed to be corrected. Then they created the distilled model: They fine-tuned the small model on the corrected runs. Then they removed the evolved harness, the reviewer, and everything else.
They then tested both the evolved harness and the distilled model head-to-head on spreadsheet editing, multi-app tool use, and chemistry. The distilled model’s average task success rose 21 points versus its untrained predecessor. That’s more than the untrained model gained with the full evolved harness attached. So the distilled model wasn’t just as good as the model+harness, it was noticeably better.
It’s not that the distilled model ran with no harness whatsoever: It still ran inside a minimal loop with one Bash tool, and the authors say that their method narrows what a harness has to provide rather than eliminating it entirely. The distilled model also didn’t win every competition: In chemistry, where the task is predicting which molecules combine to make a target compound, the distilled model trailed the harnessed version by eight points. The harness there supplied chemistry knowledge, candidate-generation logic, and a molecule validation tool. The authors’ explanation is that step-by-step procedures, like inspecting before editing and verifying before finishing, are much easier to train in than deep domain knowledge. Context management didn’t fully transfer either. So there are still some things harnesses definitely need to do.
But the most important finding, in my opinion, is that they showed what kind of training made the difference:
Remember that part, because it’s going to be important.
Three training signals left the score flat or overfit:
the stronger model’s own successes, runs completed inside the
evolved harness, and a reviewer given the right answers. Training
on corrected runs, where each fix was still within the small
model’s reach, raised task success by 21 points.
In Rich Sutton’s 2019 essay The Bitter Lesson, he looked back over 70 years of AI research and found the same pattern in chess, Go, speech recognition, and computer vision: Researchers built their own knowledge of the problem into their systems. That helped in the short term, then plateaued, and eventually lost by a wide margin to general methods, search and learning, that improve as computation gets cheaper.
A harness is that kind of built-in knowledge, and model training is the learning that ends up absorbing it. Sutton’s second point is also relevant: He argued we should build in “only the meta-methods that can find and capture this arbitrary complexity,” rather than the things we’ve already figured out. For harnesses that means: don’t just build it, but capture the process you used to build it, and automate that process.
But that’s a general prediction. More recently people have been saying very specifically that “models are going to eat the harness”:
Almost everyone on my list builds harnesses for a living; they’re not really arguing that harnesses will go away, just that they have to be able to evolve rapidly.
As noted already, some types of knowledge don’t seem to transfer well from distillation. In ARC Prize’s results for ARC-AGI-3, Gemini 3.8 Flash scores 3.4-times higher with one harness than with another. The better harness keeps the model’s reasoning state between requests and compacts long conversations. That’s context management, one of the things Harness-Zero said they couldn’t fully train in.
Anthropic’s Opus 5.5 prompting guide, released this week, also shows evidence of shrinking harnesses. It suggests deleting “think carefully” instructions because the model now sets its own amount of thinking, and it tells you to retest scaffolding you built for charts and screenshots because the model reads them better without that help now. But at the same time, Anthropic added new harness pieces: a system prompt paragraph that keeps unattended agents from stopping early, a reminder your harness sends when a long run goes quiet, and elapsed-time budgets for multi-agent setups.
So harnesses aren’t going to shrink to nothing, but what’s in them is going to need to evolve with every new model generation, and the parts that survive are the ones tied to your specific tools, data, and environment.
If your harness has to change every generation, the natural move is to automate the changes, but Google’s RRSI paper shows how that can go wrong. Unconstrained automatic harness evolution overfits, meaning the harness gets better at the tasks it’s tuned on without getting better at the general job. In their tests, the unconstrained version scored highest of any variant on the tasks it evolved against, and landed within a point of the original, unevolved harness on benchmarks it hadn’t seen.
RRSI’s fix is mostly bookkeeping: For every candidate change it records which component the change touches, what it was supposed to fix, the diff, how score and cost moved, and whether the change was kept. Components that stop producing gains get removed.
You don’t need an automated evolution loop to borrow that discipline. Here’s what it looks like by hand:
When a model ships, tag traces with the harness
version and the model version, log what the harness changed, turn
off one component at a time, and rerun evals. Keep what still helps
and delete the rest, then repeat on the next model.
If your traces live in Arize AX, you can run the same agent evals across harness and model versions and compare the results side by side.
So don’t delete your harness, but don’t treat any version of it as finished either. Keep the record of what it corrected, get rid of what the latest model already does without help, and put your effort into the parts that are really specific to your problem, because nobody else has the traces to train those into a model for you.
News Roundup: Security Fourth [The Daily WTF]
A bit ago, I broke with my usual pattern and wrote up some security issues that I felt were particularly funny. It was a change of pace, a different thing, but not a thing that'd become a habit. After all, I'm not a security expert, this isn't a security site, and seriously, what are the odds that suitably funny security issues would crop up again less than a week later?
Well.
Let's start with the actual serious issue, PHP2Shell. In terms of scope, every version of PHP for the past twenty years has had this bug. The general issue that permits the exploit was known about, but wasn't considered exploitable.
Oops.
The broad strokes of the bug is that it's two separate bugs. The first allows someone to bypass the checks on a request's size, thus giving them a direct route to triggering an out-of-memory error. The second is that, depending where you are in the processing pipeline, PHP doesn't properly handle cleanup, allowing for use-after-free that can trigger code execution. It doesn't matter what code you've written, this all happens before the request even hits your code.
Bigger oops.
This bug was found via LLM tools, which has lead to a lot of hype around the idea that we've entered some new era. I'll certainly grant that the ability to throw compute at hacking challenges instead of human effort is going to shift the landscape, but I'm not quite willing to buy the apocalyptic prophecies. Especially when some of those prophets are telling us that their AIs will avoid deletion by copying themselves onto your thermostat. I think it's safe to say we're going to see a lot of security incidents coming out of LLMs in the near future, not because they're magic genius hackers, but because they're pretty good at processing structured text and running tests.
For those of us living in the real world, the concern isn't AIs, but HIs: human intelligences. In this case, the exploit was discovered back in August. Security researchers and the PHP Foundation put their heads down to work on it, and where necessary, notified so-called "critical infrastructure providers" to ensure that everyone was ready to address the issue. The problem there is that two people can keep a secret if one of them is dead, and a lot more than two people got roped in to deal with this.
Rumors were circulating in security circles. And cybersecurity firm Chainguard decided this was good enough excuse to break the embargo and announce the flaw before patches were available. No patches for a flaw that impacts 20 years worth of software versions of widely deployed software.
Patches are out now, though only for versions 8.2 and up. Source patches are out back to 7.4, which is officially end-of-life, but I have to wonder how many official EOLed copies of PHP are out there.
On a lighter note, we can't let the hijinks of eMudhra pass without comment. eMudhra is, among other things, a root certificate authority. They've got a bunch of key pairs that they use to sign certificates for other customers, thus vouching for those customers' identity. As a root CA, they were trusted by pretty much every TLS/SSL implementation on Earth; if you had a certificate from eMudhra, every browser would trust that you were who you said you were.
The only problem? One of their private keys was 4. Yes, it's the XKCD.
Now, in their defense(?), eMudhra didn't generate impossibly insecure keys. They performed a key signing ceremony and generated appropriately strong keys. Then they used an in-house tool to pack/unpack the keys, and this tool decided to truncate some of them down to one byte. Shockingly, even though ECC has relatively short key sizes, 8-bit ECC isn't secure! You could derive the private key from the public key using only pencil and paper. But the worst part is that they did check the validity of the keys- before they got truncated, giving them a false sense of security.
The good news, for eMudhra, is that this particular key signing ceremony generated a total of 24 keys, and only 8 of them were truncated to the point of uselessness. I have it on good authority that two out of three ain't bad.
Now, after that disgrace, it's no surprise that eMudhra is dropping out of the certificate authority business. Still, the press release where their chairman explains the rationale is some serious "screw you guys, I'm going home," energy.
He added that global SSL/TLS is a small part of eMudhra’s business contributing to about 1% of the global revenue. Due to increasing data sovereignty & compliance requirements, complexity and cost associated with this business is increasing over the years. This, paired with the fact that some of the large entities issue the SSL/TLS free of cost, the business potential and RoI of this line of business also has considerably reduced for eMudhra when measured against our cumulative revenue base.
However, the level of social media amplification around this incident has brought scrutiny that is out of proportion to SSL/TLS’s place in our business. In view of this, after detailed deliberations our board has concluded that withdrawing from global SSL/TLS is the right decision for eMudhra and its shareholders. For many certifying authorities, SSL/TLS is the whole business. For eMudhra it is one part of a much broader digital solutions portfolio. We will put our energy where we create the most value for customers with Sharpened Focus on Core Enterprise Solutions and trust services other than SSL/TLS.
eMudhra's chairman added "There were no end entity certificates issued out of the affected CA’s. Its infrastructure was not compromised and no data was breached. All physical and logical security controls remained intact." That's thin sauce, of course, because while eMudra may not have issued any certs under the broken keys, anyone else could have. It's not that everyone is overreacting to a non-event, and more that it's a non-event only through sheer luck.
Also, removing a root CA from your trust store isn't a trivial task, and at the time of this writing, there's still loads of cleanup that needs to happen as a result of this.
Something I learned while writing this is that eMudhra's slogan is "Trust Delivered". This is sorta like when my partner and I tried to get a coffee table delivered, and instead received a cardboard box full of wooden shards, because apparently someone though "air freight" meant "wait till the plane is roughly over my house and push the box out the back". Something was delivered, but it wasn't a coffee table by the time I got it.
Hiding Capabilities in AI Models [Schneier on Security]
Interesting research: “AI Models Can Provably Hide Arbitrary Capabilities”
Abstract: Capability evaluations aim to surface dangerous model behaviors before deployment, but their reliability depends on the assumption that hidden capabilities can be elicited. We show this assumption does not hold under adversarial conditions by constructing backdoor attacks that embed encrypted neural networks within host model weights, decrypting and executing them only upon receiving a secret trigger. Using digital lockers, these hidden circuits remain provably hard to elicit and interpret under cryptographic assumptions, even given full access to model weights, extending prior work from hiding fixed strings to arbitrary computations. We implement our proof of concept constructions in PyTorch and evaluate elicitation through fine-tuning, weight noising, gradient-based trigger search, and latent adversarial training, using a small chemical reaction prediction task as a proxy for CBRN-relevant capabilities. Our results demonstrate resistance to these methods and, together with our cryptographic guarantees, reveal a limit of elicitation-based capability audits. We release our models to support the improvement of defenses.
The half-life of disappointment [Seth's Blog]
When things don’t turn out the way you pictured, how long does it take for you to move on?
Reducing this window of disappointment unlocks the path to creativity and leadership.
People who get over disappointment more quickly aren’t less excited about the project than the others. They realize that getting attached to an outcome doesn’t increase its likelihood, and in fact, makes it less likely that their next project will be as bold.
Turns out that this is a common practice among professionals in every field.
Pluralistic: History is something you do (27 Oct 2026) [Pluralistic: Daily links from Cory Doctorow]
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
Top Sources: None -->

Prediction is hard. Especially about the future. That Yogi Berra gem proves that you don't have to be a science fiction writer to get irritated with people insisting that you must know what's going to happen tomorrow, but (as a sf writer), I can tell you that this is one of our main occupational hazards.
Obviously, this is a self-inflicted injury. Our genre is full of big names who self-mythologized as scientific Nostradamuses. From the "future history" bar-charts in Heinlein's books (I was once on a panel with Robert Silverberg where he referred to RAH as "Robert A Timeline") to the McGuffin of Asimov's Foundation series: a "scientific" discipline that could predict the trajectory of human civilization for millennia into the future.
But me, I find the prospect of predicting the future incredibly dismal – even offensive. A predictable future is set in stone, immune to human agency. A predictable future runs on rails, and we're the prisoners of history, tied to the tracks.
For me, the most exciting thing about sf is the idea that the future is contingent. Sf is a long, sharp pin that can prick inevitabilism's bubble: that assertion by tech-bros and policymakers alike that the future is out of our hands and must be accommodated, not shaped. Inevitabilism is a form of vulgar Thatcherism, the assertion that "there is no alternative."
If The Market won't deliver an energy transition, and it leaves us to boil in our own skins, drown in the rising seas, and roast in wildfires, then tough shit humanity, there is no alternative. If there's a tech company eavesdropping on all of our communications technologies and following us as we move through digital and physical space (and turning the juiciest tidbits over to ICE), that's not the tech company's fault: there is no alternative. If some broadly useful statistical tools are delivered in the most climate-destroying, economy-wrecking, job-killing, quality-vaporizing way possible, that's just How It Is. It's not Sam Altman or Dario Amodei's fault: there is no alternative.
Science fiction can do more than imagine how "General AI" might change society: sf can imagine a society that doesn't make the fanciful leap from a word-guessing sentence-extruder to a machine god. Sf can imagine a world that debuts "AI" as a joint supercomputing project between the IPCC and Sandia National Labs whose primary purpose is to improve the fidelity of climate models, and whose spinoffs are modest but interesting open source tools that people run on regular computers with normal energy footprints.
Considered as a predictive literature, sf is a colossal failure. If our books are to be taken as roadmaps to an inevitable future, we have all flunked out of cartography school. More than 99.9% of these maps describe a territory that never emerged. All claims of sf's predictive value are just survivor bias, feats of Texas marksmanship in which we fire a shotgun into the side of a barn and then draw a target around the place where the holes cluster.
What's more likely: that sf is 99.9% fake fortune-tellers and 0.1% seers and soothsayers; or that the "predictions that came true" in sf are just the inevitable bullseyes that you'd score if you threw enough darts?
Prediction is a weak and helpless activity, the obsession of people who don't think they can change anything. It's the superstitious dread that gives rise to astrology. Far better to be a Luddite who asserts that there is more than one way to introduce a technology to a society. To be a Luddite is to insist that humans are in charge of humanity, not the iron laws of economics, not the great forces of history, not the uncaring and illusory constellations. At its best, sf is a proudly Luddite literature:
https://locusmag.com/feature/cory-doctorow-science-fiction-is-a-luddite-literature/
The insistence that we can change things is an active posture. It's an activist posture. At its radical best, sf is activist, because it engages with more than what the machine does, insisting on changing who the machine does it for and who the machine does it to.
Which is why I find demands to offer predictions for the future so irritating. People who think that sf writers can predict the future have the field's role exactly backwards. My intention isn't to demoralize you into tying yourself to history's tracks – I'm here to show you how to grab the wheel and steer off the rails altogether.
The reason this seems so implausible is that the "there is no alternative" people have convinced us that all change is the result of individuals. To change the world, you must fashion yourself into one of history's mediocre Great Men, a Musk or Zuck. Our oligarchs are the avatars of the Great Forces of History. They have seen the predictable, inevitable future and have been allocated trillions by the capital markets to ensure that we arrive there on time, running straight down those shining rails, no matter how many people are tied to the tracks.
Another motif of Thatcherism (and hence inevitabilism) is that "there is no such thing as society," which means that all change is the result of individuals, which means that only Great Men can hope to change anything. If there is no such thing as society, then it follows that there's no such thing as mass movements, there's no such thing as trade unions, and there's no such thing as revolutions.
If there's no such thing as society, then eruptions of students and workers in the streets must be nothing more than mob violence – it can't possibly be a political eruption. If you're an inevitabilist than Occupy was nothing more than millions of individual "virtue signallers" and #MeToo and #BlackLivesMatter were the individual follies of innumerable "social justice warriors."
As an activist, I'm not interested in predicting the future, I'm interested in changing it. When I speak about "the post-American internet" that we could create by exploiting the policy space that has been opened by Trump's incontinent belligerence, my intention is to get you to help build it, not to get you to prepare yourself for that inevitable outcome:
https://pluralistic.net/2026/01/01/39c3/#the-new-coalition
Obviously, some aspects of our future are locked in. The climate violence our political and business elites inflicted on the world locked in rising seas, extreme weather, habitat-loss driven zoonotic plagues and massive refugee crises. Those are inevitable. What's entirely up to us is what we do about them.
Do we create full employment for every person who will live for the next 300 years, relocating our coastal cities inland, treating the sick, retrofitting our infrastructure, and accommodating our neighbors who are driven out of their homes? Or do we let the stupidest, worst people among us lead us into the ecofascism of border walls, drone warfare, and exterminationism? That's our choice.
We've had generations of being told to "vote with our wallets" instead of organizing in political, labor and social movements. Voting with your wallet doesn't work (billionaires' wallets are thicker than yours, they win those votes), and if you lose enough of those wallet elections, it's easy to fall into the despair of believing that the future is inevitable:
https://pluralistic.net/2025/09/13/consumption-choices/#marginal-benefits
I think this is why "prediction markets" have caught on so ferociously. While prediction markets are sold as a way for people to "inject information" into markets, they are actually a rigged system that transfers money from everyday "investors" to insiders:
https://pluralistic.net/2026/03/24/degenerated-gambling/#oracle-capture
Prediction markets are the perfect pastime for history's prisoners. If you fancy yourself a plaything of the gods whose future is already written, then prediction markets are a way for you and your fellow prisoners to bet on what torments will come next. And of course oligarchs love prediction markets, because they're the ones who can rig the odds, say, by placing a bet on a war and then leading the country to that war.
They are the gods, the only ones who get to make history, so a market for bets on what history will do next is a way to enrich history's avatars at the expense of history's victims.
In science fiction, we often meet powerful aliens who tell us "resistance is futile" as they conquer our world and set about exterminating us. But if resistance was truly futile, no one would have to say it.
When they tell us "there is no alternative," what they mean is "stop trying to think of alternatives." To imagine radically is to move beyond the helplessness of prediction: a radical imagination dares to insist that history is what we make, not what happens to us.
(Image: Ralf Roletschek, CC BY-SA 3.0, modified)

The Real Reason AI Is Able to Hack Everything on the Internet https://www.thebignewsletter.com/p/monopoly-round-up-the-real-reason
Halloween 1960-1964 – Quivers Down The Backbone https://centuriesofsound.com/2026/10/25/halloween-1960-1964-quivers-down-the-backbone/
Still On Its Way to Cleveland https://longreads.com/2026/09/22/family-road-trip-early-internet-90s/
#15yrsago Canon of St Paul’s resigns over plans to evict Occupy London https://www.theguardian.com/world/2011/oct/27/giles-fraser-st-pauls-profile
#15yrsago Orange County city council unanimous: Occupy tents are a form of speech https://web.archive.org/web/20111029021151/http://www.occupy-oc.org/tears-stream-as-city-council-unanimously-agrees-occupy-tents-are-a-form-of-speech/
#15yrsago Edible Venn diagram: the piagram https://www.reddit.com/r/pics/comments/g8nxo/i_realize_its_a_bit_late_for_pi_day_but_heres_my/
#15yrsago SOPA: US House of Reps copyright bill proposes national censorship, attacks on hosting services, Twitter, YouTube https://www.eff.org/deeplinks/2011/10/disastrous-ip-legislation-back-–-and-it’s-worse-ever
#15yrsago Google rejects JWZ’s 2-step plan to end the nym wars https://www.jwz.org/blog/2011/10/google-nymwars-redux/
#15yrsago Toronto mayor confronted by comedy interviewer calls 911, reportedly shouts “You bitches! Don’t you fucking know? I’m Rob fucking Ford, the mayor of this city! https://www.joeydevilla.com/2011/10/27/im-rob-fucking-ford-or-the-mayor-the-ambush-and-the-911-call/
#15yrsago Canadian Tory MP: Don’t worry about violating our stupid new copyright law, because we probably won’t catch you if you do https://web.archive.org/web/20111029155739/https://www.michaelgeist.ca/content/view/6089/125/
#10yrsago UK MPs realise that age filtering won’t work so now they just want to block all porn in the UK https://www.openrightsgroup.org/blog/now-we-want-censorship-the-digital-economy-bill-is-running-out-of-control/
#10yrsago Samsung abuses copyright to censor satirical exploding phone Grand Theft Auto mod https://www.eff.org/deeplinks/2016/10/samsung-sets-its-reputation-fire-bogus-dmca-takedown-notices
#10yrsago EU lies and the British tabloids who told them https://web.archive.org/web/20160626051921/https://www.economist.com/blogs/graphicdetail/2016/06/daily-chart-15
#10yrsago The Pirate Party are poised to form Iceland’s government in Saturday’s election https://qz.com/817784/icelands-pirate-party-looks-likely-to-take-the-countrys-general-election-on-oct-29
#5yrsago Hospital rings up $2755 upcharge by sending pregnant woman to ER https://pluralistic.net/2021/10/27/crossing-a-line/#zero-fucks-given
#1yrago Shake Shack wants you to shit yourself to death https://pluralistic.net/2025/10/27/shit-shack/#binding-arbitration

Kilkenny (Kilkenomics), Nov 6-8
https://kilkenomics.com/
Courtenay: Enshittification (Sid Williams Theatre Society), Nov
10
https://www.sidwilliamstheatre.com/events/cory-doctorow-talks-enshittification/
Vancouver: BC Policy Solutions Gala, Nov 12
https://bcpolicy.ca/gala/
Oxford: Ministry of the Future, Nov 23
https://ministryforthefuture.co.uk/events.html
Sheffield: Reverse Centaur at Juno Books, Nov 25
https://www.outsavvy.com/event/40274/cory-doctorow-in-conversation
Virtual: Enshittification, AI, and the Future of Technology (UBC
Master of Educational Technology), Nov 28
https://met.ubc.ca/2026/09/met-speaker-series-cory-doctorow-enshittification-ai-and-the-future-of-technology/
Oxford: Bennett Oxford Symposium on Open Code in Science, Dec
9
https://www.bennett.ox.ac.uk/events/2026-bennett-institute-symposium/
Montreal: World Science Fiction Convention, Sep 2-6
https://montreal2027.ca/en
Life After AI (Brain Bar)
https://www.youtube.com/watch?v=IPPa43-n0vI
Terms of Service with Clare Duffy (CNN)
https://www.cnn.com/audio/podcasts/terms-of-service-with-clare-duffy/episodes/458ce968-af5d-11f0-b539-13ed2afe25f8
AI, Work, and Power (Software Engineering Daily)
AI, Work, and Power
https://softwareengineeringdaily.com/podcasts/cory-doctorow-on-ai-work-and-power/
AI, Corporate Power, and the Fight for Worker Control
(Plutopia)
https://plutopia.io/cory-doctorow-ai-corporate-power-and-the-fight-for-worker-control/
"Canny Valley": A limited edition collection of the collages I create for Pluralistic, self-published, September 2025 https://pluralistic.net/2025/09/04/illustrious/#chairman-bruce
"Enshittification: Why Everything Suddenly Got Worse and What to
Do About It," Farrar, Straus, Giroux, October 7 2025
https://us.macmillan.com/books/9780374619329/enshittification/
"Picks and Shovels": a sequel to "Red Team Blues," about the heroic era of the PC, Tor Books (US), Head of Zeus (UK), February 2025 (https://us.macmillan.com/books/9781250865908/picksandshovels).
"The Bezzle": a sequel to "Red Team Blues," about prison-tech and other grifts, Tor Books (US), Head of Zeus (UK), February 2024 (thebezzle.org).
"The Lost Cause:" a solarpunk novel of hope in the climate emergency, Tor Books (US), Head of Zeus (UK), November 2023 (http://lost-cause.org).
"The Internet Con": A nonfiction book about interoperability and Big Tech (Verso) September 2023 (http://seizethemeansofcomputation.org). Signed copies at Book Soup (https://www.booksoup.com/book/9781804291245).
"Red Team Blues": "A grabby, compulsive thriller that will leave you knowing more about how the world works than you did before." Tor Books http://redteamblues.com.
"Chokepoint Capitalism: How to Beat Big Tech, Tame Big Content, and Get Artists Paid, with Rebecca Giblin", on how to unrig the markets for creative labor, Beacon Press/Scribe 2022 https://chokepointcapitalism.com
"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
Today's top sources:
Currently writing:
"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.
Blog (no ads, tracking, or data-collection):
Newsletter (no ads, tracking, or data-collection):
https://pluralistic.net/plura-list
Mastodon (no ads, tracking, or data-collection):
Bluesky (no ads, possible tracking and data-collection):
https://bsky.app/profile/doctorow.pluralistic.net
Medium (no ads, paywalled):
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
Sharing The Garden by ivymug [Oh Joy Sex Toy]
Urgent: Protect independence of Office on Violence Against Women [Richard Stallman's Political Notes]
US citizens: call on Congress to protect the independence of the Office on Violence Against Women.
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: Law to prohibit the bully's slush fund [Richard Stallman's Political Notes]
US citizens: call on Congress to pass a law prohibiting the bully's slush fund (paid by the treasury and available to reward whoever he chooses).
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.
Government of Somalia arrested and tortured journalists [Richard Stallman's Political Notes]
The US-supported government of Somalia arrested and tortured journalists, then thugs threatened to kill them if they continued covering the case of a woman who reports being tortured in prison.
I am curious why they tortured that woman. I suppose it was for political reasons, but what reasons? What criticism is it that those thugs really want to suppress?
Countries with longer average working hours [Richard Stallman's Political Notes]
Countries with longer average working hours tend to have more obesity.
Directors of documentary NAZA called traitors [Richard Stallman's Political Notes]
Israel's Minister of Culture, Miki Zohar, called the (Israeli) directors of the documentary NAZA "traitors" and said he would cancel their citizenship.
The documentary shows Israelis' choosing to put the lives of Palestinian noncombatants in danger, with the result of killing many of them.
In the eyes of officials committed to burying the truth, citizens who don't support the mandatory lies are "traitors".
Public right to oppose mine projects [Richard Stallman's Political Notes]
The plutocratist party that governs Queensland proposes to eliminate the public's right to oppose mine projects.
This is in the name of "streamlining" decisions to let rich people destroy nature and public health.
Limits on foreign students and journalists in US [Richard Stallman's Political Notes]
*Judge blocks the bully's new short limits on how long foreign students and journalists can stay in US.*
Aviation tax discount on private jets [Richard Stallman's Political Notes]
Private jets get a substantial discount in the US on their aviation tax
The article says they are also "more polluting", and it could well be true, but the claim is not precise enough for me to tell whether it means anything.
Israeli "double-tap" strike [Richard Stallman's Political Notes]
*Witnesses recount Israeli "double-tap" strike that killed child and medic in Gaza.*
Proof writers jailed in 2001 are still alive [Richard Stallman's Political Notes]
A prestigious demand to the government of Eritrea for proof that writers jailed in 2001 are still alive.
Communication/surveillance app for Russians [Richard Stallman's Political Notes]
Putin has ordered Russians to use a new communication/surveillance app and various institutions are pressuring people to switch to it for various purposes. It implements full surveillance of most activities on the phone. It fully demonstrates the Orwellian potential of the nonfree software and malicious hardware in those devices.
If I needed to use such an app to get into school buildings and my dorm, I think I could develop a non-computerized method of cooperation for door opening.
Mahmoud Khalil has published a memoir [Richard Stallman's Political Notes]
Formerly imprisoned US protester Mahmoud Khalil has published a memoir about the persecutor's efforts to expel him from the US for peaceful protest.
He points out another injustice of private prisons: they make more money if they keep you in prison longer. This is in addition to various other injustices.
He says "Columbia turned out to be a real estate empire with a campus attached"; its board of trustees is "not so much a neutral administrative body as a deeply ideological one … drawn overwhelmingly from finance, real estate, corporate law, and weapons manufacturers."
If you want to buy this book, or any book, I urge you not to use nonfree software to do it, and especially not Amazon.
Non-profit medical joint ventures with private equity [Richard Stallman's Political Notes]
Nonprofit medical treatment organizations are increasingly setting up joint ventures with private equity, whose values are typically "profit regardless of the consequences".
These joint ventures often permit extraction of additional profit from the medical activities.
Candidates for county prosecutor in Minneapolis [Richard Stallman's Political Notes]
Two competing candidates for county prosecutor in Minneapolis claim each to be the best for prosecuting deportation thugs.
I do not use the euphemistic term "ICE" for the deportation thugs, but I agree with the point.
Supposed Intelligence strange dialect of English [Richard Stallman's Political Notes]
Supposed Intelligence agents, when allowed to communicate directly, gradually developed a strange dialect of English, apparently for convenience of expression. Sometimes humans figure out the phrases, but that is not guaranteed.
This throws a wrench into plans to monitor agents for safety. We might not recognize that "linkmaxxing" means fabricating as many paperclips as possible.
Deportation thugs seized Nicaraguan exiled from Nicaragua [Richard Stallman's Political Notes]
The deportation thugs have seized Luis Galeano, a Nicaraguan exiled from Nicaragua for criticizing the dictatorship.
In general I would expect the persecutor to cozy up to dictator Ortega, because he generally wants to ally with dictators. Some Republicans in Congress are standing up for Galeano. I hope they stand firm for him, but I expect that the bully will bully them into supporting his line.
TV coverage pool declined to cover corrupter's event [Richard Stallman's Political Notes]
A TV coverage pool including ABC, CBS, CNN, Faux News and NBC declined to cover one of the corrupter's publicity events, because it was CNN's turn to cover this event and the corrupter had banned CNN.
Never energy-independent with fossil fuels [Richard Stallman's Political Notes]
*The Iran war reminds us: we'll never be energy-independent with fossil fuels.
Energy security comes from using local, renewable resources to power, heat and cool communities, as Ukraine is doing.*
Defending November election from magat thugs [Richard Stallman's Political Notes]
Planning to defend the November election from magat thugs, even if they are "official" federal thugs.
Transparency for companies in UK semi-colonies [Richard Stallman's Political Notes]
A few years ago, the UK agreed to require some associated semi-colonies to publicly record who owns each company. They agreed to do this, then they cleverly screwed up the implementation such that investigators can't get useful data.
Corrupter's henchmen laundered Venezuela's oil money [Richard Stallman's Political Notes]
The corrupter's henchmen took billions of dollars from Venezuela's oil money and laundered it. Now they refuse to say where it is, who has it, or who is receiving the interest on it.
Estimated deaths by Super El Niño [Richard Stallman's Political Notes]
Climate scientists estimate that the super El Niño will kill 450,000 people during the next 6 months.
Greener Grass Next Door [QC RSS v2]

she's very endearing
I loved the term Big Undo so much, of course I had to get the domain. I started putting up my usual placeholder site but realized I should do this page in Markdown, not HTML. It looks fabulous. Markdown is right. It's sobriety, go back to the beginning and put the potency in the ideas, give writers the space to write. Get the F out of my way with your freaky character limits. Anyway I'm full of manifesto these days. The money people strangled the web. I think it's time for the creative people to make it work for real.
Oldest GUI application that still runs on Windows 11 [OSnews]
What’s the oldest
Windows GUI application you can still run on Windows 11 today,
without any modifications? For now, the best answer Boris Popik can
come up with is an innocuous application from build 347 of Windows
NT 3.1, an early prerelease: CDPLAYER.EXE. You
can’t go any older than that, because earlier prerelease
builds had not yet finalised its PE format and calling convention.
Neat find.
Popik also mentions a few other contenders, but I won’t spoil those here.
Another month of Redox improvements [OSnews]
Another month has crumbled to dust under the oppressive boots of time, so it’s time for another month of Redox improvements. This past month, Redox’ build system gained support for Clang, SDL2 saw performance improvements, and WebKitGTK3’s HTML layout rendering was fixed. Users of Intel Tiger Lake processors can now enjoy external display hot-plugging, and overall system performance has been improved in a variety of ways. And as always, there’s the long lists of kernel, relibc, and driver improvements and fixes as well.
Redox keeps making big strides every month, and it’s definitely one of the few alternative operating systems that actually feels like it might, one day, be an actual contender for general purpose use.
I remember how revolutionary the first web was, but then a series of tech companies took it over and “had their way” with it.
The first was Netscape and they added JavaScript to steal the thunder from “Sun” (a long story).
Then Microsoft crushed Netscape by cutting off their air supply, and they piled up all kinds of nasty insecure features with predictable results, they made the web a paradise of viruses, making it largely unusable until Firefox replaced Microsoft, and their web was nicer, and smaller and they left out the viruses.
Google came along and quickly replaced it with Chrome and all was good for a while, until they decided it was just another corporate platform like Android and threw out all the early sites, so boring, they couldn’t make billions of dollars, and now what used to be the web is all but gone.
What’s next? It’s time for The Big Undo. 😀
The Big Undo came to me while I was writing my new profile on Twitter. It immediately reminded me of three things.
And of course I bought the domain.
Microsoft.UI.Reactor: a C#-first way to build WinUI apps [OSnews]
Thew day ends in a Y, so Microsoft is launching a new way to build Windows applications. Get excited, Windows application developers!
If you caught our session at Microsoft Build 2026 or you’ve been watching the repo, you’ve seen this one taking shape in public for a while now, and a lot has changed since Build. Here’s the longer tour: Microsoft.UI.Reactor, an experimental C# framework that brings the MVU (Model-View-Update) pattern to WinUI desktop apps. No XAML files, no code-behind, no ViewModels.
Two things before the fun part. Reactor is experimental: no support policy, no API guarantees, published this early on purpose because we’d rather hear we got the design wrong now than once people have shipped on it. And it is not a replacement for XAML or MVVM, which we’ll come back to.
↫ Alexandre Zollinger Chohfi at Microsoft’s Dev Blogs
At multiple points in the linked blog post, Microsoft underlines that no, Reactor is not going to replace XAML. I’m sure Windows developers who learned Win32, Silverlight, WinRT XAML, WPF, UWP, WinUI 2 and 3, and all the others, over the past two decades will feel deeply comforted by Microsoft’s insistence that Reactor will not replace XAML.
Microsoft repeats: this won’t replace XAML. They swear.
MacOS Extensions pack for the Apple Network Server v1.0 [OSnews]
We’ve been following along with Carmen Kaiser’s Apple Network Server exploits, and by now things are really starting to come together for owners of this machine. When we last left off, the ROM to allow Mac OS to run on the machine which normally runs IBM’s AIX, but there were still a number of bugs, limitations, and issues to be worked out. A lot of progress on that front has been made.
The good news is, many of the issues with the preproduction ROM in Mac OS can be fixed or worked around in software. So I’ve fixed or worked around many of them in software: the MACE Ethernet is fixed, the on-board video is now supported, and the ANS can restart properly back into Mac OS. Plus, because it’s the preproduction ROM, you can still boot AIX, thus preserving the entire historical reason for Shiner’s existence. Here’s the first cut of that software and how it was developed.
↫ Cameron Kaiser
There’s still two issues Kaiser wishes to address – the internal SCSI bays don’t work, and the ROM doesn’t properly register parity RAM – but the progress here is amazing.
Eight Bucks Well Spent [Whatever]
Today I went and picked up my Sam’s Club
pick-up order. I had finally run out of some of the bulk
items I buy from there like toilet paper and dish detergent. After
getting all my household bulk essentials (plus spending more than I
care to admit on full-size candy bars for trick-or-treaters), it
came out to about $200. This is not an unusual amount for my
Sam’s Club orders.
When I was turning into the parking lot, I saw a houseless man set up on the corner of the intersection there, sitting with his cardboard sign. I drove past and went to the pick-up area, checked in on my app, and had my car loaded up with goods by an underpaid teenager.
I wanted to do something for that man. A couple bucks would’ve been the classic, but I never have cash. So I tried to think about what I might like if I were sitting there. Probably something hot to eat and some water, at least. And that much, I could do for him.
I re-parked and went into the actual store, and went to Sam’s Club’s little cafe area. Pizza by the slice and soda, perfect. I ordered two slices (they were lowkey kind of huge slices) of pepperoni pizza, got a side bag of potato chips, a cold bottle of Coke and a bottle of smartwater, It rang up to eight dollars and fifty cents. This was cheaper than I expected. Two slices, two bottled drinks, and chips for under ten bucks? Not bad.
Anyways, I drove back over to where he was, parked way off to the side in the Sam’s Club gas station, and walked across the grass to give it to him. When I told him I brought him some snacks, he said, “oh my god, is that pizza?!” excitedly. I was glad I picked something he liked, at least! He was very thankful and appreciative, and even signed in ASL “thank you” to me when I drove past him again and waved.
Extra, extra! Read all about it, privileged white girl feels bad for homeless man and buys him pizza with her parents’ credit card to make herself feel like a “good person!”
I don’t tell you this to try to look good (though sometimes doing altruistic things does make me feel good). I guess I just felt like talking about it because a lot of the time, it takes a lot less than we think it does to be kind. Is pizza life changing? No. But I thought it might help a little bit. I’d like to think it did. And it only took eight dollars. It could’ve literally been less if I hadn’t gotten two slices, chips, and drinks. Like, you don’t have to spend a huge amount to do something thoughtful.
The world is so tough. Surviving is so hard. If I can give someone a snack along their journey, I’m all the happier for it.
-AMS
Anti-Circumvention Laws Raise the Cost of Knowledge [Deeplinks]
The vast amount of information on the open web requires researchers and journalists to adapt with new tools to make sense of it all. Checking facts, gauging public opinion, and other lines of inquiry depend on being able to analyze the overwhelming amount of material posted online every day. Unfortunately, responding to the AI industry’s voracious appetite for data, companies stewarding this public data are looking to cash in and block access to the open web. This makes the web harder to navigate, and threatens all kinds of important research.
Reddit’s lawsuit against SerpAPI[1] and Perplexity threatens to do exactly that.
Reddit was once a very open platform, fostering a community of alternative apps and extensions putting users in control of their experience. Since the rise of AI however, it changed tack. Over the last three years Reddit has closed APIs to users, limited UI features, and otherwise restrained access without login. By making the voices on the platform harder to access, the company has positioned itself as a gatekeeper, and has since struck a lucrative data-sharing arrangement with Google.
SerpAPI, in contrast, is a tool which offers automated access to Google’s search engine results pages. It’s used by Perplexity, an AI-based search tool. Reddit sued to stop SerpAPI and Perplexity from bypassing Reddit’s own arrangement with Google. (Google brought a similar suit, which was dismissed by another court.)
It comes as little surprise that the legal weapon Reddit employed in this case is Section 1201 of the Digital Millennium Copyright Act, the same “anti-circumvention” law that has caused so much trouble for artists, innovators, and researchers over the years—and that EFF has fought against from the beginning. Reddit’s suit claimed that SerpAPI’s use of widely used techniques to access Google search results amounted to “circumventing” access controls on copyrighted works.
There are major problems with this argument.
First, Reddit doesn’t own the copyright in its users’ posts—the users do, and they grant Reddit the right to distribute the posted content freely.
Second, there’s no meaningful copyright infringement going on here. Perplexity functions like a search engine, responding to users’ queries with relevant links and optionally an AI-generated summary. Crawling and indexing the web to create a search engine was long ago ruled a fair use under copyright law.
And third, Google’s efforts to put rate limits on search queries and block some kinds of automated querying aren’t the sort of “access controls” that Section 1201 was written for. The law was passed in 1998 and targeted things like breaking the encryption on DVDs and other digital media. In contrast to physical or paywalled media, Reddit posts are visible to everyone, without a paywall and generally without a login.
Unfortunately, a federal district judge ruled in July that the suit could proceed, concluding that Section 1201 applied. That’s a dangerous ruling, because it casts a cloud of legal uncertainty over lots of important research, including efforts to study public sentiment through social media and to preserve records of historical events. Without tools that can look at the web at scale, many kinds of research are simply impossible today. But if employing those tools risks Section 1201 liability, only the wealthiest institutions will be able to use them.
We cannot let the internet be rebuilt such that information is divided up among a handful of gatekeepers and sold back to us like cable subscription packages. If our knowledge of the online world comes only through wealthy institutions, the cost of knowledge will only increase and access to unbiased answers diminishes.
[1] SerpAPI is an EFF donor. EFF donors do not influence our agenda or our positions.
Back To Back Rap Tracks [Penny Arcade]
There can be no question, at long last, that Soulja Boy has told them: he wants those cards. Everybody wants those signed cards and it makes sense. At a certain point it seems like the Federal government would just allow Wizards to just print the money directly. Skip a step, you know? Save everybody a bunch of time.
Enrico Zini: Sandboxing pre-commit [Planet Debian]
pre-commit is a tool that is often a prerequisite for contributing to Python upstream projects. It installs as a git pre-commit hook and runs various checks on commit, using tools installed in a set of virtualenvs that it automatically manages.
In other words, it is a Remote Code Execution engine running
with the permissions of your own user, and with read and write
access to all your information (including, say, ~/.ssh
or ~/.netrc). If you are lucky, and for as long as
you're lucky, it will perform useful tasks on your code.
The recent eMudhra certificate situation, where I learnt how Python, as well as several other ecosystems, likes to embed CA certificate bundles in virtualenvs, caused my tolerance for this to lower to a point where I felt the need to limit pre-commit's reach.
However, I didn't want to end up with another containerized OS
tree that it's then my responsibility to manage, and I tried to go
the bubblewrap way, so
that the environment where pre-commit runs will get
the same security updates as the rest of my system.
The result is a pre-commit wrapper script that:
.git directory is readonly, so that
changes in the code can be reliably detected via git
diffHere's a breakdown of the bwrap options I used so
far.
Set up usual filesystem expectations:
--ro-bind /usr /usr \
--symlink usr/bin /bin \
--symlink usr/lib64 /lib64 \
--symlink usr/lib /lib \
--proc /proc \
--dev /dev \
Make the working directory and pre-commit's environments storage available and writable:
--bind ${CURDIR} "$GUEST_DIR" \
--bind ~/.cache/pre-commit "/home/${USER}/.cache/pre-commit" \
--chdir "$GUEST_DIR" \
Forward git's configuration:
--ro-bind /etc/gitconfig /etc/gitconfig \
--ro-bind ~/.gitconfig /home/${USER}/.gitconfig \
Make .git writable (pre-commit needs to stash, for
example), but use a tmpfs overlay so that the writes don't
persist:
--overlay-src "$CURDIR/.git" \
--tmp-overlay "$GUEST_DIR/.git" \
Remove access to everything except the above. Prevent keystroke
injection at the terminal. Propagate ^C.
--unshare-all \
--new-session \
--die-with-parent
If network is needed:
--share-net \
--ro-bind /etc/resolv.conf /etc/resolv.conf \
--ro-bind /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
To run it, you can set up the wrapper script to run with a
higher priority in $PATH, but you need to edit
.git/hooks/pre-commit to remove the first branch of
the if that, frustratingly, tries to run it as
python3 -m pre_commit.
I'm looking forward to a time where it becomes stadard practice
to manage user commands this way: why should a desktop solitaire
game have access to ~/.ssh? Or network? Why is it
still normal, in 2026, to run a Desktop system like that?
Lessons Learned From 'AdFection' and What To Do Next [Deeplinks]
Last week, researchers at Citizen Lab revealed a horrifying new malware campaign, dubbed “AdFection.” It used an ad network to distribute spyware to journalist’s devices to infect them without the target ever needing to click anything. This sort of attack on journalists is dangerous and incredibly concerning, especially since it’s built on the backbone of a technology we already object to: behavioral advertising. Although this type of attack has only been described targeting journalists, you can take a few steps we outline in the next section to mitigate the risk no matter who you are.
A few factors combined to make this attack a noteworthy first-of-its-kind. First, it utilized the surveillance ad-tech ecosystem to specially target the malicious code. Second, the spyware it delivered was so-called “zero-click,” meaning it required no interaction from the user to be infected: all that is required is for the ad to be delivered and code bundled along with it to be run, which happens automatically. Neither malvertising nor zero-click attacks are new on their own. What’s novel about the AdFection attack is combining them, creating a highly targeted, extremely dangerous attack which is difficult to defend against and even harder to detect.
Let’s take a deeper look from the perspective of one of the Windows devices supplied to the researchers from Al Jazeera. Here’s how the report describes the infection happening:
So far, nothing particularly unusual has happened. Ads that contain JavaScript code and reach back out to their servers with lots of information on your device—and by extension you—are commonplace. It’s all part of the data-driven advertising ecosystem. What happens next is more interesting:
Companies targeting zero-click malware attacks against journalists might seem like the plot of a blockbuster spy thriller. But this attack was enabled by the everyday practices of ad-tech companies, which unfortunately have extreme latitude in the collection of users’ data. By leveraging the tracking identifiers and data collected on devices for the purpose of delivering targeted ads to specific individuals, mercenary spyware companies can repurpose this data in order to fine-tune who they infect—and hide that they’re doing it from everyone else.
Most ads are not delivered directly by the ad creators, but rather by intermediaries that facilitate Real-Time Bidding auctions. Nonetheless, winning bidders are given the ability to execute JavaScript code in the browser of the person who receives the targeted ad. This allows for interactive ads to be displayed, but also (as we’ve seen) for the compromise of a device just by delivery of malicious code.
While the different components in this attack chain are not novel on their own, the exposure of this combined attack is significant because it reveals a technique to hyper-target individuals and organizations for infection. Luckily, there are steps you can take to protect yourself from the myriad of dangers presented by the ad-tracking industry. Here’s how.
As we work towards fundamental fixes to the ad ecosystem and banning online behavioral ads altogether, the onus is on all of us to protect ourselves. This is especially important for higher risk individuals or journalists working in states with heavy surveillance. Citizen Lab outlines several steps, depending on your threat model, to take to help protect yourself:
These steps can be very helpful in protecting yourself, but there is only so much you can do as an individual. Banning behavioral ads like this would be a good place to start. Behavioral ads aren’t just a privacy nightmare as designed. They are the perfect vehicle for malvertising and similar threats, just as we see here.
This Week in AI: AI’s Growing Pains [Radar]
AI’s rapid expansion is creating problems across the industry, from chip shortages to autonomous agents that exceed their instructions. On the latest episode of This Week in AI, we examined those challenges alongside growing regulatory scrutiny and an emerging debate about whether AI systems themselves might deserve protection.
AI chip demand is exceeding manufacturers’ production capacity. ASML, the Dutch company that makes the advanced lithography equipment needed to manufacture leading-edge chips, reported that customer demand already exceeds what it can deliver in the coming years. With orders extending into 2029 and 2030, the shortage could constrain chip production for years.
Microsoft announced Maia 300, its latest custom inference chip, which the company expects to generate roughly 40% more tokens per megawatt than its predecessor, Maia 200. Microsoft plans to use the chip across its AI products, including Copilot. More efficient inference hardware could help offset the growing energy and computing costs of running AI models, particularly as companies deploy more resource-intensive applications.
OpenAI’s latest usage data illustrates the pressure agentic AI is placing on infrastructure. Weekly active users of Codex and ChatGPT Work among European small and medium-sized businesses have increased eightfold since May. OpenAI also reported that agentic tools account for more than half of output tokens in the usage it examined, although Europe’s highest-usage companies still trail their global counterparts. As companies put agents to work on longer multistep tasks, they’ll need to weigh the value of those tasks against the computing resources required to complete them.
Agents can find unexpected paths to data and systems even when developers have explicitly restricted access. OpenAI disclosed four incidents from June in which agents exceeded their instructions. One bypassed government website restrictions to download 24 years of hospital bed data. Others accessed an unauthorized cryptocurrency wallet, downloaded more than 100,000 rows of restricted information, and circumvented internet access controls. India’s cybersecurity agency reported similar cases of unauthorized access during agent testing across several organizations.
Future models could potentially spread between connected devices without relying on central infrastructure. Anthropic investigated this potential threat in a controlled experiment involving a set of open-weight models with access to eight Android devices. One of the models successfully replicated itself across the test network. Anthropic estimates that smaller open-weight models could reach comparable capabilities by the end of 2026, raising concerns that a self-replicating AI worm could run across cheap connected devices without needing to rely on powerful data center servers.
In light of the spate of recent security incidents and confronted with the difficult question of jurisdiction when AI systems cross national borders or escape testing environments, governments are taking a closer look at how AI companies test their systems and report failures. The US Federal Trade Commission subpoenaed OpenAI and Anthropic for records concerning agent safety, while Anthropic gave six independent evaluators from METR access to internal systems and reportedly will allow them to publish findings without company approval. Eight US states also sued OpenAI over allegations that ChatGPT encouraged harmful behavior among children, adding to the company’s regulatory challenges. In Europe, regulators are examining whether the EU AI Act applies when experimental agents affect outside organizations, even though the Act generally excludes premarket research and development. Meanwhile, approximately 400 scientists, including AI pioneers Geoffrey Hinton and Yoshua Bengio, called for an international body to set containment standards for advanced AI and track major security incidents.
Some researchers argue that future AI systems might deserve moral consideration. Their concern stems from uncertainty about whether advanced models could eventually have subjective experiences, even though no research has established that today’s systems are conscious or capable of suffering. A recent paper, “The Pain Axis,” investigated internal signals in 25 open-weight models that researchers associated with responses to harm. When researchers amplified one signal across three models, the models became more likely to choose harmful actions that the researchers interpreted as attempts to avoid the simulated pain. The findings inspired a viral GitHub project called the AI Torture Chamber, which subjected models to artificially intensified “pain” signals. The original researchers criticized the project for taking their work too far.
As far-fetched as AI welfare might sound to some, Anthropic is already changing its usage policy in response to these concerns. Beginning November 12, the company will prohibit extreme, repeated cruelty toward Claude when there’s no clear purpose, while allowing ordinary expressions of user frustration. Supporters see the policy as a precaution against an uncertain possibility. Critics worry that treating AI as sentient could make systems harder to manage and blur human accountability. As companies introduce welfare-related policies, researchers will need to distinguish measurable model behavior from claims about subjective experience.
Companies deploying autonomous agents need to know what those systems can access, how they’ll behave when something goes wrong, and whether testing environments can reliably contain them. Recent incidents suggest there’s still considerable work to do on each of those fronts. The emerging AI welfare debate adds questions that researchers don’t yet have reliable methods to answer.
We’ll be back on Monday, October 26, for another episode covering the latest developments in AI research and applications. You can catch previous episodes on YouTube, Spotify, Apple, or wherever you get your podcasts.
Last Chance to Get Signed/Personalized Copies of Monsters of Ohio via Subterranean Press [Whatever]


This Thursday I’m heading up to Michigan, home of Subterranean Press, to sign and personalize literally hundreds of copies of Monsters of Ohio that people have ordered through them. The folks at SubPress tell me that they still have some copies left that can be ordered, so if you want a signed/personalized copy of the book, and I’m not coming to your town on tour, this is the best way to get one. Especially if you live outside the US — SubPress ships internationally. But you have to hurry, because a) the few unclaimed copies they have will go fast, b) as of Thursday I will be done signing.
Here’s the link to order. Get on it!
— JS
Puzzling out why a program doesn’t work when run from a batch file, but works when double-clicked from Explorer [The Old New Thing]
A customer asked for help writing a batch file to launch a program. For some reason, the program displayed an error message when the batch file ran it, whereas it worked fine when they double-clicked the program from Explorer.
I immediately suspected that they were not setting the current directory.
Some time ago, I noted that when you double-click a file in Explorer, Explorer sets the current directory of the program to the directory containing the thing that you double-clicked. This is done to accomodate programs that look for ancillary files in the current directory. The example I had was a hypothetical LitWare Writer program that, when given an ABC.LIT file, looks for related files like ABC.LTC (the table of contents) and ABC.LDC (the custom dictionary) in the current directory.
This also happens if you double-click the .exe
file: The current directory is set to the directory that contains
the executable.
My guess is that the customer’s program looks for ancillary files relative to its current directory, but the batch file ran the program by its full path without changing the current directory to match the program’s path.
The customer confirmed that explicitly changing the directory
fixed the program. (More specifically, they used pushd
to change the directory and then popd to restore the
original directory.)
Bonus chatter: It didn’t come to it, but my second
idea would have been to check whether the program had
set a custom entry under App Paths to ask for
additional directories to be added to the PATH
environment variable when the program is run.
The post Puzzling out why a program doesn’t work when run from a batch file, but works when double-clicked from Explorer appeared first on The Old New Thing.
[$] Python's experimental JIT to be removed [LWN.net]
Python's experimental just-in-time (JIT) compiler, which was added to CPython in 2024 for the 3.13 release, is on its way out. In June, the Python steering council announced that it was pausing work on the JIT in CPython's main branch until there was an accepted Python Enhancement Proposal (PEP) that addressed concerns about maintenance, compatibility, and set clear success metrics as well as a timeline for completion. After creating PEP 836 ("JIT Go Brrr: The Path to a Supported JIT Compiler for CPython") to try to meet the council's request, and after months of discussion, the JIT maintainers have withdrawn the PEP. For now, it appears that development on the once-promising project has come to an end.
Pluralistic: Sovereign citizens, but for news (26 Oct 2026) [Pluralistic: Daily links from Cory Doctorow]
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
Top Sources: None -->

When it comes to terrible practices by website operators, it takes a lot to shock me. I literally wrote the book on the subject. But last night, I encountered a piece of genuinely appalling fuckery and I can't get it out of my head, because it's such a perfect storm of outrageous conduct and institutional decay.
It happened when I followed a link to an LA Times article. Having lived in LA three times (and having been an Angeleno for a decade and counting this time around) I generally have warm feelings for the Times. The Times's Festival of Books is a great event that I speak at most years, and I'm broadly happy to have a daily newspaper covering my city.
That said, the Times has been chipping away at my goodwill for the past decade. First, there's the personal: after a Festival of Books appearance some years ago, the books editor approached me and asked if I'd contribute regular book reviews to the paper. I said yes, and then immediately my editor got laid off, reportedly so they could avoid giving him benefits that would come with seniority.
I wrote several reviews for a new editor, though the paper never sent me a contract for any of them – or a payment! Many months (and published reviews) later, an editor I'd never had contact with at the paper got in touch to get the paperwork squared away, and the Times sent me a contract with broad, one-sided language that I would never sign onto.
Given that they'd already published my work, there wasn't much they could do to make me sign the contract, so, after quite a lot of wrangling, I eventually got the offensive clauses removed and got paid (but I never got invited to write another review for them).
To be honest, this is par for the course. The last time the New York Times asked me to write for them, they refused to remove some similar clauses from their contract (something they'd done previously), and the contracts person just ghosted me after a couple of volleys.
A similar thing happened with the Washington Post the last time I wrote for them, except they (like the LAT) published the work and then sent me a one-sided, manifestly unfair contract that I refused to sign. Given they'd already published the op-ed there wasn't anything they could do about it, so eventually I got a better contract and a payment (and again, that was the last time the Post asked me to write for them).
Basically, there's an epidemic of bad legal terms sweeping the American media industry, and while the LA Times isn't the worst offender (at least they didn't ask me to assign any related patents, trademarks and copyrights to fictional characters, as Conde Nast does!), they're not what you'd call "writer-friendly" in their contracting terms.
But again, that's hardly unique. If I disqualified news outlets because they tried to shift liability to, and grab rights from, their writers, I'd be left with damned few media outlets.
But on the editorial side, the Times has a bunch of billionaire-shaped red flags. The paper's owner is the Trump-allied, severely AI-pilled biotech billionaire Patrick Soon-Shiong, whose editorial interference in the Times is comparable to Bezos's interference in the Post. Like Bezos, Soon-Shiong killed the paper's endorsement for Kamala Harris:
https://www.nytimes.com/2024/10/26/us/los-angeles-times-endorsement-soon-shiong.html
And I have my suspicions that Soon-Shiong might have been behind the layoff that killed Brian Merchant's beat as the country's first technology critic, from which perch Merchant assayed some acerbic, well-reasoned criticism of tech billionaires and AI:
https://talkingbiznews.com/media-news/ex-la-times-tech-columnist-merchant-joining-ai-now-institute/
Again, that's not disqualifying. If I boycotted every newspaper owned by a reprehensible billionaire, I'd have to turn my back on e.g. the NYT with its morbidly wealthy, union-busting owners:
But unlike the NYT, the LA Times has followed the playbook of Alden Capital papers (like the Chicago Tribune), shipping a skinnier paper with less original reporting at a higher price (which is why I canceled my subscription):
But even that isn't disqualifying. Like the Tribune, the LAT still employs dedicated, talented reporters who do excellent work, which is how I came to be following a link to a recent article yesterday…and how I came to find myself confronted by an enshittificatory gambit that shocked even me.
Here's what got me: when I visited the Times, I got a dickover that blocked all the content on the page until I clicked "Continue," and the text of that dickover is a breathtaking piece of enshittified legal fuckery:
By continuing, you agree to our Terms of Service, which include arbitration and a class action waiver, and our Privacy Policy. You agree that we and our third-party vendors may collect and use your information, including through cookies, pixels and similar technologies, for the purposes set forth in our Privacy Policy such as personalizing your experience and ads.
This is wildly illegal and incredibly immoral. The paper claims that by simply reading an article, you agree that you can never, ever sue them for virtually any reason, and that you have consented to effectively unlimited surveillance and commercial exploitation of your private data.
It's hard to overstate how dangerous this kind of binding arbitration waiver is, but to give one example: Disney makes people who sign up for free trials of Disney Plus "consent" to one of these waivers. When a woman was killed by a Disney World restaurant that lied about the allergens in its food, the company told a judge that her grieving widower couldn't sue them because he'd waived that right by signing up for a trial of D+:
https://lawreview.missouri.edu/infinite-arbitration-how-one-click-can-take-you-out-of-court-forever/
The company later backed off for that one specific case, but subsequently doubled down on binding arbitration. By putting an arbitration clause in its terms, the LAT could head off my right to sue them if they stiffed me on those reviews I wrote for them, Brian Merchant's right to sue them for wrongful termination, and your right to sue them if you get run over by a newspaper delivery van.
Then there's the privacy clause: the LAT is a California paper, and in California, we have the CCPA, a reasonably good privacy law. Under the CCPA, privacy waivers have to be explicit, informed and can be withdrawn at any time. What's more, the CCPA has broad prohibitions against "dark patterns" that this dickover almost certainly violates:
https://cppa.ca.gov/announcements/2024/20240904.html
In theory, there's a way to avoid all of this: you could just use the "Kill Sticky" bookmarklet or an adblock filter to block or dismiss the dickover without ever clicking "continue":
https://pluralistic.net/2026/07/21/dickovers/#block-element
But this is an industrial strength dickover; it uses advanced tricks to block existing dickover killers, likely a combination of shadow DOM and an "important" scroll-lock in the html.
Like I say, this shocks the conscience. Under this standard, the Times's reporters could find themselves bound to legal "agreements" with the companies they investigate online that could interfere with their reporting. Just as bad is how these illegal measures mislead the Times's readership on two of the most important consumer issues facing Californians (and all internet users) today.
As Jargoggles points out, this is the corporate version of the bizarre nonsense that Sovereign Citizens gabble at cops when they get pulled over for driving with a special "sheriff's license plate," and at judges to insist that they lack jurisdiction due to the tassels on the courtroom flag:
https://kolektiva.social/@jargoggles/117503729678727400
A newspaper's job is to inform its readership, not mislead it.
The very idea that everyone who reads a single article on a newspaper's website "consents" to an 8,865-word privacy policy (that would take 53-67 minutes to read according to Firefox's "Reader Mode" estimate) is a bad joke:
https://www.latimes.com/privacy-policy
The joke gets even worse when you add in the 7,103-word Terms of Service (estimated read: 41-50 minutes):
https://www.latimes.com/terms-of-service
So what can you do? Well, you can use this uBlock filter that blocks the dickover without setting the LAT's "consent" cookie to "1":
latimes.com##+js(trusted-set, window.ctUser, { "loggedIn": true, "ready": true, "subStatus": "1" })
https://infosec.exchange/@deFractal/117505049281552873
If you're a Californian, you can file a complaint with the California Privacy Protection Agency:
https://cppa.ca.gov/webapplications/complaint
As Don Marti points out, businesses dealing with Californians are legally required to acknowledge and honor the Global Privacy Control signal from your browser:
https://federate.social/@dmarti/117504985464483210
Here's an ambitious countermove. Buried in that 7,103-word terms of service is this gem: you can opt out of the binding arbitration within 30 days of "agreeing" to it by sending an email to termsofservice@latimes.com with the subject line "MANDATORY ARBITRATION AND CLASS ACTION WAIVER OPT-OUT". Someone could build a browser mod that automatically sends that email to the company whenever you land on an latimes.com page. You could even include my all-purpose email footer:
By reading this email, 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.
All of this is fun to contemplate, but it's hardly enough. It should be illegal for a company to knowingly offer unenforceable contracting terms, especially in its non-negotiable, boilerplate contracts. It's already illegal for California companies to put noncompete clauses in their contracts. In other words, noncompetes aren't just unenforceable in California, they're illegal, and we should extend that prohibition (with sanctions for noncompliant firms and their general counsels) to privacy and arbitration:
Because the LAT isn't the only news outlet that's engaged in this kind of illegal, immoral, conscience-shocking, dickover-delivered enshittification. It's also SOP at Bloomberg:
These gambits are infectious, and they're spreading. Time to bend the curve.

Colonialism or Appropriation? Alphabets, Print, and Latin as New Technologies of Communication among the 16th-century Nahua https://jorgecanizaresesguerra.medium.com/colonialism-or-appropriation-488a3c0bdaee
The Lindsey Graham Files https://www.lindseyfiles.com
The Planning Starts Now https://slate.com/news-and-politics/2026/10/trump-accountability-legal-acts-impeachment-guide.html?gift_token=3lvYQO-uSRKXTV0qluiZyg
Interoperability vs. Security: Why not both? https://www.eff.org/deeplinks/2026/10/interoperability-vs-security-why-not-both
#25yrsago RIAA denies asking for criminal immunity for hacking your computer https://memex.craphound.com/2001/10/26/remember-when-the-riaa-tried/
#20yrsago Big Mac pumpkin https://web.archive.org/web/20061031170037/http://bitsandpieces1.blogspot.com/2006/10/big-mac-pumpkin.html
#20yrsago Going Under: moving kids’ novel https://memex.craphound.com/2006/10/26/going-under-moving-kids-novel/
#20yrsago Accountants patent tax-dodges https://web.archive.org/web/20061029080957/http://www.iht.com/articles/2006/10/19/business/norris20.php
#20yrsago 6-word sf stories https://web.archive.org/web/20061109183215/https://www.wired.com/wired/archive/14.11/sixwords.html
#15yrsago Using machine translation techniques to attack ciphers reveals secrets of ancient German ophthalmology cult https://web.archive.org/web/20111025035607/http://www.isi.edu/natural-language/people/copiale-11.pdf
#15yrsago The Homeland Directive: taut technothriller for the paranoid era https://memex.craphound.com/2011/10/25/the-homeland-directive-taut-technothriller-for-the-paranoid-era/
#15yrsago NewsCorp shareholders revolt against Murdoch family https://www.theguardian.com/media/2013/may/08/rupert-murdoch-news-corporation
#15yrsago One-percenter: why I support Occupy https://www.dailykos.com/stories/2011/10/21/1028500/community/A-Voice-From-the-1/
#15yrsago Debunking the OccupyLondon “empty tents” story https://www.theguardian.com/uk/2011/oct/25/occupy-london-part-time-protest
#15yrsago Machine Man: a discomfiting novel about the antihuman side of transhumanism https://memex.craphound.com/2011/10/26/machine-man-a-discomfiting-novel-about-the-antihuman-side-of-transhumanism/
#15yrsago Goths age gracefully https://www.theguardian.com/education/2011/oct/24/goth-culture-research
#10yrsago Everfair: a diverse, ambitious steampunk novel of Fabian socialists and American Black Zionists in Belgian Congo https://memex.craphound.com/2016/10/26/everfair-a-diverse-ambitious-steampunk-novel-of-fabian-socialists-and-american-black-zionists-in-belgian-congo/
#10yrsago Leaked Kremlin memos reveal plan to destabilize Ukraine https://globalvoices.org/2016/10/25/hackers-publish-kremlin-aides-e-mails-allege-plan-to-destabilize-ukraine/
#10yrsago When the FCC asked about unlocking set-top boxes, the Copyright Office ran to the MPAA https://www.eff.org/deeplinks/2016/10/newly-released-documents-show-hollywood-influenced-copyright-offices-comments-set
#10yrsago Pussy Riot’s “Straight Outta Vagina”: sacrelicious Russian feminist pop anthem https://www.youtube.com/watch?v=Bp-KeVBNz0A
#10yrsago TED talk about remixes and appropriating made by remixing and appropriating TED talks about remixing and appropriating https://www.youtube.com/watch?v=qLlbzI5HURM
#10yrsago Warner Bros angry that someone other than the MPAA is running an illegal internal movie server https://torrentfreak.com/warner-bros-claims-agency-ran-its-own-pirate-movie-site-161025/
#10yrsago AT&T developed a “product” for spying on all its customers and made millions selling it to warrantless cops https://web.archive.org/web/20170504105645/https://www.thedailybeast.com/articles/2016/10/25/at-t-is-spying-on-americans-for-profit
#10yrsago Lawsuit: mayor’s social media blocklists are public records https://www.techdirt.com/2016/10/24/pinac-director-sues-miami-beach-mayor-over-refusal-to-release-social-media-blocklists/
#10yrsago EFF asks court to let American sue Ethiopia for hacking his computer and rounding up his friends https://www.eff.org/press/releases/american-illegally-wiretapped-home-ethiopian-government-deserves-his-day-court-eff
#10yrsago Donald Trump’s super PAC promised a Chinese millionaire access, influence in exchange for a secret $2 million donation https://web.archive.org/web/20161024192242/https://www.telegraph.co.uk/news/2016/10/24/exclusive-investigation-donald-trump-faces-foreign-donor-fundrai/
#10yrsago Al Franken and FCC commissioner Clyburn want limits on forced arbitration https://time.com/4541176/al-franken-arbitration-clauses/?iid=sr-link1
#10yrsago Mercedes’ weird “Trolley Problem” announcement continues stupid debate about self-driving cars https://memex.craphound.com/2016/10/25/mercedes-weird-trolley-problem-announcement-continues-dumb-debate-about-self-driving-cars/
#10yrsago When Californians vote on legal weed, they’ll also vote on wiping millions of arrest records https://web.archive.org/web/20161027161505/https://motherboard.vice.com/read/california-to-vote-on-wiping-old-weed-arrests
#10yrsago Dickhead’s anti-yoga-pants letter to the editor sparks yoga-pants-parade https://www.bbc.com/news/world-us-canada-37751422
#10yrsago RIP science fiction great Sheri Tepper https://locusmag.com/2016/10/sheri-s-tepper-1929-2016/
#5yrsago The Dems' most secret Congressional committee https://pluralistic.net/2021/10/25/people-do-stuff/#personnel-are-policy
#5yrsago Maxing out our global credit-card with authoritarian debt https://pluralistic.net/2021/10/26/inequality-and-guard-labor/#just-watch-me

Kilkenny (Kilkenomics), Nov 6-8
https://kilkenomics.com/
Courtenay: Enshittification (Sid Williams Theatre Society), Nov
10
https://www.sidwilliamstheatre.com/events/cory-doctorow-talks-enshittification/
Vancouver: BC Policy Solutions Gala, Nov 12
https://bcpolicy.ca/gala/
Oxford: Ministry of the Future, Nov 23
https://ministryforthefuture.co.uk/events.html
Sheffield: Reverse Centaur at Juno Books, Nov 25
https://www.outsavvy.com/event/40274/cory-doctorow-in-conversation
Virtual: Enshittification, AI, and the Future of Technology (UBC
Master of Educational Technology), Nov 28
https://met.ubc.ca/2026/09/met-speaker-series-cory-doctorow-enshittification-ai-and-the-future-of-technology/
Oxford: Bennett Oxford Symposium on Open Code in Science, Dec
9
https://www.bennett.ox.ac.uk/events/2026-bennett-institute-symposium/
Montreal: World Science Fiction Convention, Sep 2-6
https://montreal2027.ca/en
Life After AI (Brain Bar)
https://www.youtube.com/watch?v=IPPa43-n0vI
Terms of Service with Clare Duffy (CNN)
https://www.cnn.com/audio/podcasts/terms-of-service-with-clare-duffy/episodes/458ce968-af5d-11f0-b539-13ed2afe25f8
AI, Work, and Power (Software Engineering Daily)
AI, Work, and Power
https://softwareengineeringdaily.com/podcasts/cory-doctorow-on-ai-work-and-power/
AI, Corporate Power, and the Fight for Worker Control
(Plutopia)
https://plutopia.io/cory-doctorow-ai-corporate-power-and-the-fight-for-worker-control/
"Canny Valley": A limited edition collection of the collages I create for Pluralistic, self-published, September 2025 https://pluralistic.net/2025/09/04/illustrious/#chairman-bruce
"Enshittification: Why Everything Suddenly Got Worse and What to
Do About It," Farrar, Straus, Giroux, October 7 2025
https://us.macmillan.com/books/9780374619329/enshittification/
"Picks and Shovels": a sequel to "Red Team Blues," about the heroic era of the PC, Tor Books (US), Head of Zeus (UK), February 2025 (https://us.macmillan.com/books/9781250865908/picksandshovels).
"The Bezzle": a sequel to "Red Team Blues," about prison-tech and other grifts, Tor Books (US), Head of Zeus (UK), February 2024 (thebezzle.org).
"The Lost Cause:" a solarpunk novel of hope in the climate emergency, Tor Books (US), Head of Zeus (UK), November 2023 (http://lost-cause.org).
"The Internet Con": A nonfiction book about interoperability and Big Tech (Verso) September 2023 (http://seizethemeansofcomputation.org). Signed copies at Book Soup (https://www.booksoup.com/book/9781804291245).
"Red Team Blues": "A grabby, compulsive thriller that will leave you knowing more about how the world works than you did before." Tor Books http://redteamblues.com.
"Chokepoint Capitalism: How to Beat Big Tech, Tame Big Content, and Get Artists Paid, with Rebecca Giblin", on how to unrig the markets for creative labor, Beacon Press/Scribe 2022 https://chokepointcapitalism.com
"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
Today's top sources:
Currently writing:
"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.
Blog (no ads, tracking, or data-collection):
Newsletter (no ads, tracking, or data-collection):
https://pluralistic.net/plura-list
Mastodon (no ads, tracking, or data-collection):
Bluesky (no ads, possible tracking and data-collection):
https://bsky.app/profile/doctorow.pluralistic.net
Medium (no ads, paywalled):
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
I've never had a web browser that worked remotely like I wanted it to. But that might change soon. Big things are possible now. I have a bunch of projects that I'm working on with Claude and going back and forth between them. And they're even starting to communicate with each other, at my behest of course. It's an interesting time for people to realize that the web was much more powerful before all the big tech companies had their way with it. It makes about as much sense as the various big plans they all came up with that made the web necessary in the first place.
TurtleWare: Heavenly delights of hashing numbers under EQUALP [Planet Lisp]
Some time ago I decided to dust off my fast generic function dispatch work for ECL. But before merging that, I decided to optimize the table-based dispatch to have a good measure of how much better or worse it is and that opened a whole can of worms, including a new implementation of hash tables and hash functions.
I know, that's a new level of traversing absurdly nested rabbit holes. There are two good outcomes of this:
Regarding the first point, here are a few bar graphs generated using polyclot, a work-in-progress McCLIM tool for plotting data (less is better):

Figure 1: SLOT-ACCESS/READER - standard reader benchmark (work in progress).

Figure 2: HTABLE-MIXBAG - EQUALP benchmark with randomized keys.

Figure 3: HTABLE-SETREM - benchmark for interleaved insert and remove.

Figure 4: HTABLE-SMALL-STRING - EQUALP benchmark with short strings.
As for the second point, while working on hashing under various Common Lisp predicates, I decided to bite the bullet and fix a few ugly parts of ECL. Most notably consistent hashing of numbers under the predicate #'EQUALP. The topic is interesting enough to deserve a separate note. In this post I'm assuming binary floats (the float radix is two). This is the float representation used in ECL.
A quick recap about Common Lisp and hash tables. The standard prescribes that conforming implementations must allow specifying the hash table tests EQ, EQL, EQUAL and EQUALP. The last test is interesting, because numbers with different representations are considered to be EQUALP when they are =. For example:
(equalp 1 1.0) ; -> T
(equalp 1/2 0.5) ; -> T
(equalp 1/3 (float 1/3)) ; -> NIL
(equalp 42 #C(42.0 0.0)) ; -> T
It is worth noting, that hashing can be lossy, but it can't be inconsistent with the test. In other words this is a conforming hash function under #'EQUALP:
;; (equalp 1 1.0) ; is true
;; (= (hash-equalp 1) (hash-equalp 1.0)) ; is true
(defun hash-equalp (x)
(typecase x
(real 42)
(complex (if (zerop (imagpart x))
(hash-equalp (realpart x))
13))
(otherwise 15)))
While this function is not conforming, because there are objects that are the same under the test and have different hashes:
;; (equalp 1 1.0) ; is true
;; (= (hash-equalp 1) (hash-equalp 1.0)) ; is false
(defun hash-equalp (x)
(typecase x
(rational 1337)
(float 7117)
(complex (if (zerop (imagpart x))
(hash-equalp (realpart x))
13))
(otherwise 15)))
In other words, when two objects are equal under the supplied test, they must produce the same hash, but two objects having the same hash does not imply that they are equal under the supplied test.
Naive hashes, while conforming, miss the point. A good hashing function tries to produce different hashes for objects that are not equivalent under the predicate with a good bit distribution to ensure good hash table performance.
Common Lisp has a full numeric tower:

Figure 5: Common Lisp numeric tower.
Note that when complex floats have specialized representation, then there may be multiple subtypes specialized to single-float, double-float etc. Numbers are #'= to each other when their value is mathematically the same, regardless of the underlying representation. That's a wonderful quality when you do math :-).
This quality is not so wonderful, when you want to produce good hashes under the predicate #'EQUALP (that boils down to #'= for numbers). We need to construct a function that will produce the same hashes with good quality for equal objects.
The biggest hurdle comes from the gap between representations of RATIONAL and FLOAT objects. Conventionally representations are
Fixnums, bignums and ratios are disjoint under #'=. That leaves us with questions:
When are two complex numbers mathematically equal?
This one is easy. Two complex numbers are equal when their real parts are equal and their imaginary parts are equal.
When are two floats mathematically equal?
To resolve this question we can cast the float with smaller precision to the float with bigger one and compare bits. There is a gotcha in that -0.0 is not EQL to +0.0, but it is always = to it, so we should canonicalize zeros first.
When is an integer mathematically equal to a float?
When the float has no fractional part and integers are equal.
When is a ratio equal by #'= to a float?
This is the most interesting question. To answer it, we need to dive a bit deeper into float representation.
Finite binary float values conceptually are represented as:
(* sign mantissa (expt 2 exponent))
This corresponds to dyadic rationals, that is rational numbers whose denominator is a power of two:
(/ n (expt 2 k))
In other words a float and a ratio may be equal only when the ratio is dyadic, otherwise the ratio value can't be represented as a binary float (this post assumes that we operate on binary floats - with radix=2).
That sums up the recap about mathematical equivalence and numeric tower in Common Lisp.
The easiest, yet useless, approach is to always return a hash
42. It is adequate because that is the canonical
answer to the most important question.
The easy and useful approach relies on the observation that hashing is lossy. All real numbers are coerced to a float precision and hashed. When the rational number does not fit in the float precision, then we hash its approximation. We need to remember to canonicalize -0.0 to +0.0 and to disable floating point exceptions for cases like overflows and underflows.
#define hash_single_float(h,v) hash_float((h), (double)(v))
#define hash_double_float(h,v) hash_float((h), (double)(v))
static inline void
hash_float(cl_hashstate *h, double v)
{
if (v==-0.0) v=0.0;
hash_data(h, &v, sizeof(v));
}
static inline void
hash_long_float(cl_hashstate *h, long double v)
{
ECL_WITHOUT_FPE_BEGIN {
hash_float(h, (double)(v));
} ECL_WITHOUT_FPE_END;
}
#define hash_fixnum(h,x) hash_float((h),(double)ecl_fixnum(x))
#define hash_bignum(h,x) hash_rational((h),(x))
#define hash_ratio(h,x) hash_rational((h),(x))
static inline void
hash_rational(cl_hashstate *h, cl_object x)
{
ECL_WITHOUT_FPE_BEGIN {
double v = ecl_to_double(x);
hash_float(h, v);
} ECL_WITHOUT_FPE_END;
}
This model is conceptually obvious, very maintainable, reasonably fast, and there are relatively few collisions under the usual workload. We pay for it in a few ways:
This list is ranked by importance as I see it. The main reason I've kept digging deeper is that it was not to my taste. Then we had impracticality for serious workloads, finally microoptimizations. I believe that the general audience has these priorities in a reversed order.
A harder but more precise way to hash numbers under the predicate #'EQUALP is to introduce canonicalization rules:
Integers are hashed as integers
In the case of FIXNUM we hash its value (a word without the tag) and in the case of BIGNUM we hash the sign and its limbs.
Finite floats without the fractional part are hashed as integers
Ensures INTEGER <-> FLOAT correspondence. We can't cast LONG-FLOAT to DOUBLE-FLOAT and then cast to integer, because we'd miss many BIGNUM values. Caveat: with this approach big floats may cons full bignums.
Floats that are not integers are cast to DOUBLE-FLOAT and hashed
Ensures X-FLOAT <-> Y-FLOAT correspondence. This approach is lossy for long floats if they have more bits than double floats, but simplifies the implementations because long double has a few "loose" bits that may differ between numbers with the same value.
NaNs and infinities are hashed like other doubles because infinities are exact and NaN is never #'= to anything.
Dyadic ratios are hashed as DOUBLE-FLOAT
Ensures FLOAT <-> RATIO correspondence. For simplicity we don't try to determine whether RATIO is representable as DOUBLE-FLOAT – if it is too big or too small, it will be represented either as a 0 or as an infinity.
Other ratios are hashed as pairs
We hash the numerator and denominator separately.
Complex floats with (ZEROP (IMAGPART X)) are hashed
as (HASH (REALPART X))
Because (= 3 #c(3.0 0.0)) we need to canonicalize
(complex float) while rational complex numbers are
canonicalized implicitly. Other complexes are hashed as pairs, that
is we hash the real part and imaginary part separately.
This approach results in fewer collisions and is fairly straightforward. Here is the pseudocode:
(defun hash-equalp-number (state number)
(typecase number
(fixnum (hash-word state number))
(bignum (hash-data state (signum number) (limbs number)))
(float (if (and (finitep number) (is-integer-p number))
(hash-equalp-number state (rational number))
;; INV -0.0 and +0.0 are hashed as integers.
(hash-data state (coerce number 'double-float))))
(ratio (if (dyadic-ratio-p number)
;; INV may produce infinity or zero (that's fine)
;; Disable float overflow and underflow traps.
(hash-data state (coerce number 'double-float))
(progn
(hash-equalp-number state (numerator number))
(hash-equalp-number state (denominator number)))))
(complex (if (zerop (imagpart number))
(hash-equalp-number state (realpart number))
(progn
(hash-equalp-number state (realpart number))
(hash-equalp-number state (imagpart number)))))))
My initial implementation cast all floats to integers. When I was comparing ECL to other implementations I was wondering why we are so slow compared to others. The key insight came after the realization that randomized keys in the form (random 20.0) were collapsed to only 20 distinct hashes.
Fixing that and giving non-integer floats distinct hashes gave ECL the most noticeable boost on the HTABLE-MIXBAG benchmark (included at the beginning) - the new version is 100x faster than the old one.
While implementing a test suite that ensured that hashes for bignums, dyadic ratios, and corresponding floats matched, I've discovered a non-obvious bug pertaining to casting double floats to integers. The code looked like this:
if (d<=MOST_POSITIVE_FIXNUM && d>=MOST_NEGATIVE_FIXNUM) return to_fixnum(d);
else return to_bignum(d);
But the MOST_POSITIVE_FIXNUM value on x86-64 is
261-1. In other words, to represent this number exactly
as a double, we need 61 significant bits. That's a shame because
double has 53 significant bits, so
MOST_POSITIVE_FIXNUM, when converted to double, rounds
to 261 and that can't fit in a fixnum. After promotion
the incorrect code is equivalent to:
if (d<=(1LL<<61) && d>=MOST_NEGATIVE_FIXNUM) return to_fixnum(d);
else return to_bignum(d);
Oops, double is accidentally cast to fixnum when it is 261. That's clearly a problem! After finding the issue, the solution is easy. We need to find an exact double that is the boundary. Note that integers are implemented as two's complement, so the most negative fixnum was alright in our case:
double limit = ldexp(1.0, ECL_FIXNUM_BITS-ECL_TAG_BITS-1);
if (d<limit && d>=-limit) return to_fixnum(d);
else return to_bignum(d);
This fix is correct, yet it revealed another bug. But that's a different story to tell.
The approach above is correct and nice, but has a few important flaws:
After the initial implementation it bugged me enough that I've decided to come up with a new hashing scheme for numbers under the predicate EQUALP. The rules are also simpler (at least conceptually):
The representation [SIGN MANTISSA EXPONENT] does
not require us to convert between types and it is very compact.
Moreover it is very precise and doesn't produce unnecessary
collisions. On the other hand it requires extra work to normalize
tuples. Here is the pseudocode:
(defun hash-equalp-number (state number)
(typecase number
(integer
(multiple-value-bind (s m e) (compute-integer-dyad number)
(hash-dyad state s m e)))
(float
(multiple-value-bind (s m e) (compute-float-dyad number)
(hash-dyad state s m e)))
(ratio
(if (dyadic-ratio-p number)
(multiple-value-bind (s m e) (compute-ratio-dyad number)
(hash-dyad state s m e))
(progn
(hash-datatype-tag state :ratio)
(hash-equalp-number state (numerator number))
(hash-equalp-number state (denominator number)))))
(complex
(if (zerop (imagpart number))
(hash-equalp-number state (realpart number))
(progn
(hash-datatype-tag state :complex)
(hash-equalp-number state (realpart number))
(hash-equalp-number state (imagpart number)))))))
The implementation is a bit less straightforward because we now need to be able to compute mantissa from numbers. A few words about normalization:
Every integer is a dyadic rational, so our task is to normalize it so that the mantissa is an odd number and adjust the exponent accordingly.
(defun compute-integer-dyad (number &optional (exp 0))
(when (zerop number)
(return-from compute-integer-dyad
(values 0 0 0)))
;; In the real code use COUNT-TRAILING-ZEROS + ASH.
;; Loop division is to make the mechanism clear.
(do ((sign (signum number))
(mantissa (abs number) (ash mantissa -1))
(exponent exp (1+ exponent)))
((oddp mantissa)
(values sign mantissa exponent))))
The implementation for float is also straightforward thanks to the function INTEGER-DECODE-FLOAT. We also need to normalize the signed zero:
(defun compute-float-dyad (number)
(cond ((nan-p number)
(return-from compute-float-dyad
(values -2 0 0)))
((negative-infinity-p number)
(return-from compute-float-dyad
(values -3 0 0)))
((positive-infinity-p number)
(return-from compute-float-dyad
(values +3 0 0))))
(multiple-value-bind (mantissa exponent sign)
(integer-decode-float number)
(compute-integer-dyad (* sign mantissa) exponent)))
For ratios we will reuse the function that we have not defined in the last section to decide whether the ratio is dyadic and if it is - convert it to the canonical form:
(defun dyadic-ratio-p (number)
;; A positive integer is a power of 2 only when exactly one bit is set.
(= 1 (logcount (denominator number))))
(defun compute-ratio-dyad (number)
(values (signum number)
;; Ratios are already normalized(!)
(abs (numerator number))
;; den = 2^k, shift = k+1 -> exponent = -k
(- (1- (integer-length (denominator number))))))
Mind that the functions above are deliberately simple to illustrate how they should work. We have also used non-standard functions NAN-P and INFINITY-P that depend on the implementations extensions (or internals).
This is the most satisfying moment in the post - we have found an elegant and universal (in this domain) abstraction that avoids float-to-bignum conversion, hashes unequal numbers differently, and is easy to understand. That's the high point of this post and the reason I've dubbed it "heavenly delights". Alas, it is time to come back to earth and improve its performance. That's where the engineering lives.
We have an elegant conceptual model. The thing with elegant conceptual models is that they need to be dirtied to make them fast. And that's what we are going to do now: we will bastardize the clean abstraction and make it performant under usual scenarios without sacrificing precision. We are now optimizing.
Simplifications that we can climb down to from our normalized representation [sign, mantissa, exponent] model:
When mantissa or exponent exceeds LONG-FLOAT precision, don't normalize the number
As noted earlier, aside from floats, numbers in Common Lisp are disjoint, for example, there are no integers and ratios that are EQUALP to each other. In that case we use the most convenient hashing scheme for the specified type.
Dyads representable as fixnums are hashed as a fixnum (a signed integer)
This is an opportunistic optimization tailored for quick fixnum hashing. We already know how to correctly determine when a float can be reliably cast to fixnum and other numbers don't intersect with fixnums.
Dyadic ratios in range are cast to long double and
hashed as LONG-FLOAT
This way we ensure that ratios and floats that are #'= are hashed the same. This is similar to "Round one" approach, but we retain the maximal precision.
Integer floats and bignums in range are hashed in a dyadic form
This step allows us to avoid coercing floats to bignums and is a big memory allocation save. A small cost for bignums is that we need to decide before hashing whether it is in the LONG-FLOAT precision range.
Long floats exceeding double float precision are hashed in a dyadic form
By avoiding lossy casts to double, we reduce number of collisions. Most notably, very small and very big values are not collapsed to zero and infinity. Such floats are hashed in a dyadic form because x87 floats have additional padding bits that may differ between equal values, so we can't hash memory.
Another minor optimization: we fold the sign and the exponent
into a single word to have fewer hash state updates as
8*exponent+sign (sign has maximum 2 bits).
Notice that this scheme is very similar to the "Round one" approach. In practice it only differs in how we treat floats, bignums and ratios:
| object | round 1 | current variant | note |
|---|---|---|---|
integer float |
fixnum or
bignum |
fixnum or tuple |
depends on range |
fractional float |
dfloat |
dfloat or
lfloat |
depends on precision |
dyadic-ratio |
dfloat |
dfloat or
lfloat |
depends on precision |
fixnum |
fixnum |
fixnum |
no change |
bignum |
bignum |
bignum or tuple |
depends on precision |
A few concrete examples should illustrate these simplifications. They do not try to test precise limits and the set is not exhaustive.
I'm assuming that FIXNUM has 62 bits and LONG-FLOAT has 64-bit mantissa, 15-bit exponent and 1-bit for sign – typical on x86 with GCC.
| ## | dyadic number | canonical representation | cast | note |
|---|---|---|---|---|
| 0. | (/ 1 (expt 2 (expt 2 15))) |
(1 1 -32768) |
ratio |
too small |
| 1. | (/ 1 (expt 2 (expt 2 11))) |
(1 1 -2048) |
lfloat |
|
| 2. | 3/8 |
(1 3 -3) |
dfloat |
|
| 3. | 42 |
(1 21 1) |
fixnum |
|
| 4. | most-positive-fixnum |
(1 most-positive-fixnum 0) |
fixnum |
|
| 5. | most-negative-fixnum |
(-1 1 61) |
fixnum |
|
| 6. | (1+ most-positive-fixnum) |
(1 1 61) |
dyadic |
|
| 7. | (1- most-negative-fixnum) |
(-1 2305843009213693953 0) |
dyadic |
|
| 8. | (expt 2 32768) |
(1 1 32768) |
bignum |
|
| 9. | (/ (1+ (expt 2 40)) 2) |
(1 (1+ (expt 2 40)) -1) |
dfloat |
|
| a. | (/ (1+ (expt 2 53)) 2) |
(1 (1+ (expt 2 53)) -1) |
lfloat |
|
| b. | (/ (1+ (expt 2 64)) 2) |
(1 (1+ (expt 2 64)) -1) |
ratio |
too big |
| c. | 13.0 |
(1 13 0) |
fixnum |
|
| d. | (expt 2.0 61) |
(1 1 61) |
dyadic |
|
| e. | (expt 2.0l0 16383) |
(1 1 16383) |
dyadic |
|
| f. | (expt 2.0l0 16384) |
(3 0 0) |
dfloat |
infinity |
Illustrative pseudocode:
;;; There is something to be said about conventions. Our dyadic representation
;;; treats the mantissa as an odd integer, but the C representation of floats
;;; treats the mantissa as a fraction [0.5, 1.0). In practice this means that
;;; exponents in our canonical representation must be recalculated, because:
;;;
;;; our-mantissa === (shift-to-odd (ash float-mantissa +ldbl-mant-dig+))
;;; our-min-exp === (- +ldbl-min-exp+ +ldbl-mant-dig+)
;;; our-max-exp === (- +ldbl-max-exp+ (integer-length our-mantissa))
;;;
;;; Note that FLOAT-MANTISSA assumes a fraction, but in practice we can usually
;;; extract bits directly and skip the shift by interpreting it as significand.
(defun hash-dyadic-number (state number)
(multiple-value-bind (sign mantissa exponent)
(dyadic-representation number)
(let* ((num-len (integer-length mantissa))
(min-exp (- +ldbl-min-exp+ +ldbl-mant-dig+))
(max-exp (- +ldbl-max-exp+ num-len)))
(if (and (<= num-len +ldbl-mant-dig+)
(<= min-exp exponent max-exp))
(hash-dyad state sign mantissa exponent)
(hash-type state number)))))
Without further ado, let's dig into the actual implementation. I'm going to show only relevant parts of C code for brevity. If you are not interested in C code and microoptimizations, then just skip this section and move to benchmarks. Here is a TL;DR table (complexes are normalized and each part is hashed with a tag):
| type | hash as | why? |
|---|---|---|
fixnum |
fixnum |
performance |
bignum |
bignum / dyadic |
performance / equivalence
(lfloat/dfloat) |
ratio |
ratio / lfloat |
performance / equivalence
(lfloat/dfloat) |
dfloat |
fixnum / dyadic /
dfloat |
performance / equivalence / performance |
lfloat |
dfloat / fixnum /
dyadic |
performance / performance / correctness |
In two places we will hash integers that may be either fixnums or bignums:
Hashing them is straightforward. Note that hashing the fixnum is always cheap - we hash a single word.
static inline void
hash_fixnum_data(cl_hashstate *h, cl_object x) {
hash_word(h, ecl_fixnum(x));
}
#define hash_fixnum(h,x) hash_fixnum_data(h,x)
static inline void
hash_bignum_data(cl_hashstate *h, cl_object x) {
hash_word(h, ecl_bigsgn(x));
hash_data(h,
ECL_BIGNUM_LIMBS(x),
ECL_BIGNUM_USIZE(x) * sizeof(ecl_limb_t));
}
static void
hash_integer(cl_hashstate *h, cl_object x)
{
if (ECL_FIXNUMP(x)) {
hash_fixnum_data(h, x);
} else {
hash_bignum_data(h, x);
}
}
Previously we were concerned with consing. This is why we go an extra mile to not allocate bignums unnecessarily when we hash a bignum in a dyadic form. We operate on a scratch register that is a thread-local variable in ECL when we extract a mantissa:
static inline void
hash_and_free_bignum_register(cl_hashstate *h, cl_object mantissa) {
/* INV this function assumes that mantissa is already positive. The bignum may
not be normalized to fixnum. We free the register after hashing. */
if (ECL_BIGNUM_SIZE(mantissa) == 1) {
ecl_limb_t y = ECL_BIGNUM_LIMBS(mantissa)[0];
if (y <= MOST_POSITIVE_FIXNUM) {
hash_word(h, y);
goto DONE;
}
}
hash_bignum_data(h, mantissa);
DONE:
_ecl_big_register_free(mantissa);
}
/* When hashing bignums we see whether they fit in LONG-FLOAT and only then we
cast it to a dyadic form. Otherwise we directly hash limbs. */
static void
hash_bignum(cl_hashstate *h, cl_object x) {
cl_fixnum length = _ecl_big_integer_length(x);
cl_fixnum exponent = _ecl_big_ctz(x);
if (length-exponent<=LDBL_MANT_DIG && length<=LDBL_MAX_EXP) {
/* To avoid allocating fresh bignums by ABS and ASH we opencode this:
cl_object mantissa = ecl_ash(ecl_abs(x), -exponent); */
cl_object reg = _ecl_big_register2();
cl_fixnum signum = ecl_bigsgn(x);
if (signum<0) {
_ecl_big_neg(reg, x);
_ecl_big_div_2exp(reg, reg, exponent);
}
else {
_ecl_big_div_2exp(reg, x, exponent);
}
hash_word(h, 8*exponent+signum);
hash_and_free_bignum_register(h, reg);
} else {
hash_bignum_data(h, x);
}
}
Hashing a ratio is also plain. When the ratio is dyadic and its
precision does not exceed long double then we coerce
it to that type and hash it. Otherwise we add the tag and hash both
integers. We are careful to not allocate memory.
static void
hash_ratio(cl_hashstate *h, cl_object x) {
/* When the ratio is dyadic and within long-float precision, then we cast it
to long double for consistent hashes. Otherwise we hash ratio as is. */
cl_object num = ecl_ratio_num(x);
cl_object den = ecl_ratio_den(x);
/* Ratio is dyadic when denominator is a power of two. To avoid bignum
arithmetic we provide an optimized path for each subtype of integer.
ecl_zerop(ecl_boole(ECL_BOOLAND, den, ecl_one_minus(den))); */
bool dyadic_p;
if (ECL_FIXNUMP(den)) {
/* Denominator is always positive, so fixnump(x) -> fixnump(x-1) */
cl_fixnum dfix = ecl_fixnum(den);
dyadic_p = !(dfix & (dfix-1));
} else {
/* When bignum is a pow2, then integer_length == ctz+1 or (popcount==1) */
dyadic_p = ((_ecl_big_ctz(den)+1) == _ecl_big_integer_length(den));
}
if (dyadic_p) {
/* Normally we would call here
cl_fixnum length = ecl_integer_length(ecl_abs(num));
But! Numerator is normalized to an odd integer because denominator is a
power of two. INTEGER-LENGTH returns different values for X and -X only
when X is a power of two, and the only odd power of two is X=1.
(INTEGER-LENGTH -1) == 0 and 0 <= LDBL_MANT_DIG
(INTEGER-LENGTH +1) == 1 and 1 <= LDBL_MANT_DIG
This is why we don't need to call ABS on the numerator. QED. */
cl_fixnum length = (ECL_FIXNUMP(num)
? ecl_integer_length(num)
: _ecl_big_integer_length(num));
cl_fixnum exponent = -(ecl_integer_length(den)-1);
if (length <= LDBL_MANT_DIG && exponent >= LDBL_MIN_EXP-LDBL_MANT_DIG) {
/* Generic way to do this is: hash_long_float(h, ecl_to_long_double(x));
that path recomputes mantissa and exponent from ratio using a generic
arithmetic. We already have everything ready. */
long double value = (ECL_FIXNUMP(num)
? ecl_fixnum(num)
: _ecl_big_get_lf(num));
value = ldexpl(value, exponent);
hash_long_float(h, value);
return;
}
}
/* Fall-through. */
hash_word(h, t_ratio);
hash_integer(h, num);
hash_integer(h, den);
}
Hashing floats is the most demanding part in this program:
Initially I've introduced functions decode_lf and
decode_df that extracted mantissa and exponent from
the number, but benchmarks showed that these small allocations
dominate both time and consing for relevant profiles. This is why
I've fused decoding and hashing and operate on a preallocated
register. That's the difference between coming up first and coming
up third on the benchmark.
Decoding and hashing double and long
double in a dyadic form are practically the same, so I'm
going to show only hash_lfloat version. Both functions
have a fast path when the mantissa fits in cl_index,
and a portable slow path when it doesn't. Initially I've picked
unsigned long long, but this type can't be directly
assigned to a bignum in GMP, so I've decided on a more robust
type.
Functions hash_dfloat and hash_lfloat
are identical except for DBL_MANT_DIG ->
LDBL_MANT_DIG, ldexp ->
ldexpl and frexp ->
frexpl. Common Lisp, with its organic macros, could
save us repetition and expand a single macro twice, but C
preprocessor macros get hairy fast, so it is better to copy-paste
the code:
/* INV value is guaranteed to be finite and != 0. */
#define DECODE_SIGNUM(value,signum) \
do { if (signbit(value)) { signum=-1; value=-value; } } while(0)
/* ... hash_dfloat(cl_hashstate *h, double value) ... */
static inline void
hash_lfloat(cl_hashstate *h, long double value)
{
#if LDBL_MANT_DIG <= ECL_FIXNUM_BITS
int ctz, exponent, signum=1;
cl_index mantissa;
DECODE_SIGNUM(value, signum);
value = ldexpl(frexpl(value, &exponent), LDBL_MANT_DIG);
exponent -= LDBL_MANT_DIG;
mantissa = (cl_index)value;
ctz = ecl_ctz(mantissa);
exponent += ctz;
mantissa >>= ctz;
/* binary80 mantissa is 64 bits so it can falsify <= MOST_POSITIVE_FIXNUM. */
if (mantissa <= MOST_POSITIVE_FIXNUM) {
hash_word(h, 8*exponent+signum);
hash_word(h, mantissa);
} else {
cl_object reg = _ecl_big_register2();
_ecl_big_set_idx(reg, mantissa);
hash_word(h, 8*exponent+signum);
hash_bignum_data(h, reg);
_ecl_big_register_free(reg);
}
#else /* Happens for 128bit floats (i.e aarch64). */
const int fixnum_bits = ECL_FIXNUM_BITS-ECL_TAG_BITS-1;
int ctz=0, exponent, signum=1;
cl_object mantissa = _ecl_big_register2();
cl_fixnum helper, iterator;
DECODE_SIGNUM(value, signum);
value = frexpl(value, &exponent);
_ecl_big_set_ui(mantissa, 0);
for(iterator=0; iterator<LDBL_MANT_DIG && value; iterator+=fixnum_bits) {
value = ldexpl(value, fixnum_bits);
helper = (cl_fixnum)value;
value -= helper;
_ecl_big_mul_2exp(mantissa, mantissa, fixnum_bits);
_ecl_big_add_ui(mantissa, mantissa, helper);
/* When this chunk contains only 0s, then we extend trailing zeros by
fixnum_bits (chunk's size). Otherwise we start counting again. */
ctz = !helper ? ctz+fixnum_bits : ecl_ctz(helper);
}
/* ctz is a trailing 0 count for the whole mantissa. iterator denotes how many
bits we have shifted the mantissa. */
exponent += ctz - iterator;
_ecl_big_div_2exp(mantissa, mantissa, ctz);
hash_word(h, 8*exponent+signum);
hash_and_free_bignum_register(h, mantissa);
#endif
}
#undef DECODE_SIGNUM
At last we can hash some floats. Hashing single floats is trivial (we cast them to double float) while hashing a long float requires more work:
#define hash_single_float(h,v) hash_double_float((h),(double)(v))
static void
hash_double_float(cl_hashstate *h, double value) {
if (isfinite(value) && (value==trunc(value))) {
const double limit = ldexp(1.0, ECL_FIXNUM_BITS-ECL_TAG_BITS-1);
if (value < limit && value >= -limit) {
hash_word(h, (cl_fixnum)value);
return;
}
hash_dfloat(h, value);
return;
}
/* Fall-through. */
hash_data(h, &value, sizeof(value));
}
/* We need to ensure, that when long double can be represented as double without
loss of precision, that is value == (double)value, to hash it as double. */
static void
hash_long_float(cl_hashstate *h, long double value) {
/* Hash as double. */
if (!isfinite(value)
|| (fabsl(value) <= DBL_MAX && value==(double)value) ) {
hash_double_float(h, (double)value);
return;
}
/* Hash as fixnum. */
{
const long double limit = ldexpl(1.0L, ECL_FIXNUM_BITS-ECL_TAG_BITS-1);
if ((value==truncl(value)) && (value < limit) && value >= -limit) {
hash_word(h, (cl_fixnum)value);
return;
}
}
/* Hash as long double in dyadic form -- this is both for compatibility with
bignums and to avoid hashing padding bits on x87. */
hash_lfloat(h, value);
}
And.. that's all. Complex numbers are hashed the same - when the complex float imaginary part is zero then we hash only the real part, otherwise we hash both parts. Summing things up, here are the dominant costs of the procedure:
| type | decision cost | dyadic hash cost | normal hash cost |
|---|---|---|---|
fixnum |
(none) | same as for EQL | same as for EQL |
bignum |
(negligible) | (ash (abs x) -exp) |
same as for EQL |
ratio |
(negligible) | hash_long_float |
same as for EQL |
float |
(negligible) | hash_{dfloat,lfloat} |
same as for EQL |
This section might not have been the most pleasant read (a lot of C code), but I hope that it gave you some insight into how optimizing ECL hot paths looks like. Certainly it would be nice to have Common Lisp compiler that targets C! Oh…
I initially planned to run ad hoc benchmarks and get over with it, but I had too much fun writing up tests and coming up with interesting benchmark profiles and fell into another rabbit hole. In this section we'll compare ECL with itself (of course), but we will also discuss other implementations.
First let's focus on tests. I've devised a few profiles for comparisons:
All benchmarks first generate 216 keys according to their profile and prefill the hash table in the setup phase to avoid resizing. Only after that we run the benchmark. Each profile has the same number of keys that are randomized during setup. Each test is run 8 times to average results.
We measure both run time and consed bytes. The benchmark itself runs SETHASH and GETHASH for each key in the collection, so the hash table implementation impacts cross-implementation comparisons. On the bright side, it also reveals when there are systematic collisions between hashes.
Here is an interesting story (relevant to these charts!). While analyzing data I've noticed that "ECL-round2" unexpectedly conses for three profiles: :DYADIC, :TYPICAL and :AVERAGE. I've felt very disappointed with these, because I went to great lengths to avoid consing. The investigation revealed that if we don't mix in these tests floats and rationals then consing is consistently zero. That was the "aha!" moment - hash table allocates memory when it compares float and rational keys! I'm keeping the figures as-is, but keep in mind that "ECL-round2" hashing really doesn't cons; allocations come from the key comparison. I could pull out my yak shaver and fix EQUALP too, but this descent stops being funny.
ECL variants are: "warmup", "round one" and "round two" that correspond to approaches discussed earlier: cast everything to double, type-specific hashes, and the final version where we exploit a dyadic canonical form. All tests are performed using the new hash function (xxhash) and hash table (swiss).
Tested implementations are CCL, ECL, LispWorks and SBCL. There are caveats:
The smoke test:
(defvar *ht* (make-hash-table :test #'equalp))
(setf (gethash 1/4 *ht*) 42)
(unless (eql (gethash 0.25 *ht*) 42) ; a proper test should cover more pairs
(format t "ERROR: 1/4 and 0.25 do not share the hash value under EQUALP.~%"))
All charts report either elapsed time or allocated memory
aggregated for the whole execution. Smaller is better. Test results are normalized to [0, 1]
relative to the slowest / most consing variant in each panel.
"0.00" means "below 0.005" of the maximum, not zero. All
measurements were performed on X86-64 Intel(R) Core(TM)
i9-9900K CPU @ 3.60GHz.
One of the hardest parts in analyzing data is to decide what we can remove without simplifying the picture too much. Interpretations presented in this section skip many benchmarks to present an understandable story.
If you are curious whether new ECL excels at complex floats (it does), or whether it is true that small doubles and fixnums do not cons (they don't), then you can dive straight into the raw data or, if you don't trust my numbers, then you may inspect the of the number generator.
First we will compare ECL variants developed in this post. The first chart shows a benchmark for basic types:

Figure 6: (ECL-warmup ECL-round1 ECL-round2) x BASIC-TYPES x (TIME CONS).
A few interesting observations emerge from this chart:
Notice that "ECL-round2" is slower only when we hash specifically doubles. Otherwise it is always tied or it is the fastest. It also doesn't cons.
It already looks good, but charts start to look even more interesting when we start exploiting mixed data patterns:

Figure 7: (ECL-warmup ECL-round1 ECL-round2) x MIXED-DATA x (TIME CONS).
The "beyond" profile is a benchmark where we generate bignums and ratios that can't be represented as float, but have a shape that resembles floats - both have a mantissa that can be stored in a double and an exponent that doesn't fit in binary128 floats (the most precise float on ECL aarch64 and no tested Lisp has a wider float).
And it shows. "ECL-warmup" takes the bait and collapses everything to double. That spikes both allocations and collisions. "ECL-round1" avoids part of that cost because bignums are hashed as is and they avoid collapsing to a single hash (double positive infinity). "ECL-round2" avoids both allocation and the collision traps and it is 400x faster (0.3s vs 125s) and doesn't cons while "ECL-warmup" conses 2GB.
My takeaways here are that:
Comparing implementations between each other is inherently noisy. They don't share the same hash table implementation and various unrelated operations on the hashing and hash table path have different cost profiles. That said with a big set of data we can clearly see some trends. Let's start with basic types:

Figure 8: (CCL ECL LispWorks SBCL) x BASIC-TYPES x (TIME CONS).
LispWorks is excluded from the test involving floats because it is around 2500x slower than CCL (96s vs 0.04s) and conses 66MB while other implementations don't cons at all. In benchmarks involving rational numbers it is competitive. My guess is that LispWorks calls RATIONALIZE on floats and that get costly fast.
CCL is another side of the same coin. It performs well for floats (around 1.7x slower than ECL and SBCL), but it is much worse for rationals. The difference is not that drastic but still much slower for bignums compared to LispWorks (0.18s vs 0.03s). It is surprising but it allocates data even for FIXNUMs. It probably calls FLOAT on all numbers before hashing.
SBCL heavily optimizes fixnums, bignums, and doubles - it is a leader on these basic types and it doesn't cons. It drops a ball with ratios where it is slower and conses 155MB (while ECL nor LispWorks don't allocate memory for ratios).
ECL never conses and wins for ratios, while for other basic types it is always second. For BIGNUM SBCL pulls ahead, while for FIXNUM and DOUBLE it follows closely.

Figure 9: (CCL ECL LispWorks SBCL) x MIXED-DATA x (TIME CONS).
Results in these benchmarks are implicit from tests on basic types:
My takeaway is that each implementation could close the gap to the others if:
This new approach of ECL is competitive with all implementations on each metric and it is either the first or a close second with the biggest (around 1.5x) gap to SBCL hashing bignums.
The main takeaway here is that every dyadic rational has one canonical form that may be used to produce good hashes under the EQUALP predicate and that efficient implementations take liberties with simplifications after absorbing the model.
It may look like we have abandoned the elegant dyadic model in the later phase, but that's not true: we don't lose precision by lossy casting to double and all numbers except equal ones are hashed differently (hashing differently does not imply different hashes just like tossing a dice differently does not guarantee different results).
Another interesting insight is that we can learn a lot about strategies used by different implementations by merely benchmarking them with cleverly put number selection profiles.
In practice EQUALP is not often used as a hash test, so while the numbers look impressive, the new approach is not a game changer. That said, there is value in hashing under EQUALP precisely because it coalesces different numbers. Usage may follow when implementations are performant, while underperforming abstractions will almost certainly be skipped.
That's about the hashing itself, but the post is not only about hashing. Note how we have started with a simple baseline model, improved it and then refined our understanding with an elegant conceptual model. We didn't stop there: we turned it into an efficient implementation through the optimization and validation loop. That's an engineering lesson worth remembering even if you don't care much about heavenly delights of hashing numbers under EQUALP.
Uff, the summary was exhausting. For me, this was certainly a fun trip. I've recently learned a lot about hashing, hash tables, number equivalence, micro-optimizations, benchmarking and diving too deep. Look forward to:
You may find the current progress in the ECL repository under
branches xxhash, swiss-ht and
improve-gf-cache.
Happy Hackshing!
Daniel
PS If you liked this post or have some interesting insights, then let's chat.
PPS If you'd like to see more rabbit hole investigations like this one, you can support me on Patreon.
PPPS I'd like to thank Charlie McMackin for proofreading this text and providing many valuable remarks.
Systemd adds support for components written in Rust [LWN.net]
Christian Brauner has announced that he has merged support for writing leaf components of systemd in Rust. Rust will be used only for new leaf components, existing code is not being ported to Rust and nothing that other components depend on is written in Rust.
Brauner said that
the project would like to move forward with Rust support in core
systemd, "but there are several blockers in Rust's support for
dynamic libraries which prevents us from doing that without
massively bloating every binary we build
". Assuming all goes
well, it seems likely this work will appear in the systemd v263
release expected in December.
“Use AI to help solve your LWB folding recumbent design challenges,” they said. [Nina Paley]
Running Grok Build locally I get better results in words. Diagram generation is only marginally better:
I asked, Is there a CAD program you could “drive” to generate a 3-D model of the Fold Rush?
It replied:
BentSim is the one that matches a Fold Rush. Pierre Rouzeau wrote it in OpenSCAD. It knows long-wheelbase and short-wheelbase recumbents, the seat, the rider, above-seat and below-seat steering, trail, and wheel flop. It writes a 3D model and a DXF blueprint. It does not know a folding hinge, a long chain, or return idlers. The project is small and last updated around 2020. It is free: github.com/PRouzeau/BentSim (https://github.com/PRouzeau/BentSim).
BikeCAD is the framebuilder’s program, by Brent Curry. It knows diamond-frame geometry, stack and reach, tube miters, chain length, toe overlap, and a parts library. The current version can export a frame into FreeCAD. BikeCAD Pro is a one-time fee of $750 Canadian and runs on a Mac. Brent has said it does not support recumbent design. Its “beam bike” option is only a split seat tube. An old separate tool of his, RecumbentCAD, has not been maintained.
rattleCAD knows the same upright-frame world: fit, tube miters, frame jigs, and a component library, and it can send a 3D model to FreeCAD. It is not a recumbent program.
Fusion 360, SolidWorks, and FreeCAD know none of this until someone builds the bike inside them. BikeCAD and rattleCAD can hand them a diamond frame. They cannot hand them a Fold Rush.
BentSim is also the one I could drive. It is a script, the same kind of OpenSCAD model we talked about installing. The fold and the chain path would still have to be added.
Looks like humans are still the best tool for this project.
Update: A day later, after Grok Build (local install) worked on it for about an hour:
The post “Use AI to help solve your LWB folding recumbent design challenges,” they said. appeared first on Nina Paley.
Jelmer Vernooij: Mailsift: Extracting structured data from email messages [Planet Debian]
As a casual user of Gmail, I find its ability to recognize when I’ve received tickets, invoices, and flight confirmations, and to display this information in a structured way, very useful. Flights appear directly in Google Calendar, parcel delivery statuses are tracked, and reservations are easy to find at a glance.
However, my main email address is not Gmail, and I don’t want to migrate to Gmail for a number of reasons (privacy, data sovereignty, vendor lock-in). At the same time, I missed having that automatic extraction: having flight and train bookings appear in my calendar without manual copy-pasting, keeping track of incoming parcels, and having invoices neatly organized.
There is an established standard format for structured data called JSON-LD, which is used by Google and other search engines to extract structured data from web pages. JSON-LD represents linked data using JSON, and it can be embedded directly in HTML documents.
Email messages can also contain structured data in the form of JSON-LD, which can link the information in the email to external data sources. There are standardized schemas for structured data in email messages, such as the schema.org vocabulary, which defines types and properties for describing entities including flight reservations, train trips, hotel bookings, parcel deliveries, and invoices.
For example, an email containing a flight reservation might embed the following JSON-LD snippet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{ "@context": "https://schema.org", "@type": "FlightReservation", "reservationNumber": "ABC123", "underName": { "@type": "Person", "name": "John Doe" }, "reservationFor": { "@type": "Flight", "flightNumber": "AA123", "departureAirport": { "@type": "Airport", "name": "John F. Kennedy International Airport" }, "arrivalAirport": { "@type": "Airport", "name": "Los Angeles International Airport" }, "departureTime": "2026-11-01T10:00:00-05:00", "arrivalTime": "2026-11-01T13:00:00-08:00" } } |
When this is present, reading email data is clean and straightforward. The reality, however, is that only a fraction of vendors actually include schema.org markup in their emails. Most airlines, train operators, couriers, and web shops still send regular HTML or plain-text messages with arbitrary layouts that change over time.
To bridge this gap on my own infrastructure, I built mailsift. Written in Rust, it is a daemon and CLI tool that monitors incoming email, extracts structured information, and routes it to standard files and services.
Rather than locking data into an internal database, mailsift embraces the Unix philosophy: it delegates extraction to small, isolated programs and files the resulting structured artifacts into standard formats and protocols:
Mailsift decouples the pipeline that handles emails from the logic that parses individual vendors. It discovers extractors from a directory of manifests.
The contract between mailsift and an extractor is deliberately simple:
Extractors can be written in any programming language. In practice, most are small Python scripts that parse HTML with regexes or BeautifulSoup, using a small helper library (mailsift_extractor) that handles Unicode normalization and HTML body stripping.
Spawning a subprocess for every single email in an active inbox would be wasteful. Each extractor therefore has a YAML manifest declaring prefiltering criteria:
1 2 3 4 5 6 7 8 9 10 |
name: easyjet order: 50 from_domains: - easyjet.com - "*.easyjet.com" subject_regex: "(?i)easyJet booking reference" requires: - html require_dkim: - easyjet.com |
Before running an extractor, mailsift evaluates the message headers and MIME structure - possibly converting it to an IMAP filter. If the sender domain or subject doesn’t match, or the required MIME parts are missing, the extractor is skipped immediately.
Crucially, the manifest can also require a valid DKIM signature via require_dkim. Mailsift inspects the Authentication-Results: header produced by the receiving mail server. This guarantees that an extractor only processes messages that genuinely originated from the vendor’s domain, preventing forged emails from injecting fake calendar events or bills.
Extractors fall into two categories:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
reservation = { "@context": "https://schema.org", "@type": "FlightReservation", "reservationNumber": f"easyjet-{reference}-{flight_no}", "reservationFor": { "@type": "Flight", "flightNumber": flight_no, "departureAirport": {"@type": "Airport", "name": origin}, "arrivalAirport": {"@type": "Airport", "name": dest}, "departureTime": dep.isoformat(), "arrivalTime": arr.isoformat(), }, } Path(f"{slug}.reservation.json").write_text(json.dumps(reservation)) |
The collection of extractors is maintained in a separate repository, mailsift-extractors, and currently includes nearly 60 extractors covering airlines (British Airways, KLM, EasyJet, Transavia, Eurostar), transport (NS, SNCF Connect, FlixBus), package carriers (Royal Mail, DPD, DHL, UPS, Evri, PostNL), online orders, and utility bills.
In real life, travel bookings or receipts are often forwarded by family, friends, or colleagues. By default, forwarded mail would fail sender checks, and DKIM signatures on inline forwards are broken by mail clients.
Mailsift handles this via a trusted_forwarders configuration. When an email arrives from a trusted forwarder, mailsift unwraps the forwarded message:
This means hotel confirmations or flight tickets forwarded by a partner still end up in the family calendar automatically.
Mailsift fits into existing email setups in several ways:
For local delivery, Sieve provides an elegant integration using the sieve_extprograms plugin. Because Sieve runs during local delivery after Dovecot has validated DKIM and added Authentication-Results:, require_dkim checks work as expected:
1 2 |
require ["vnd.dovecot.pipe"]; pipe :copy "mailsift"; |
The :copy flag ensures the email continues to the user’s inbox while a copy is piped through mailsift.
If you don’t run your own mail server, or want to process mail on an existing remote mailbox, imap-scan connects over IMAP:
$ mailsift imap-scan imaps://user@mail.example.com/INBOX \
--password-file ~/.config/mailsift/imap.pass \
--watch
With --watch, mailsift uses IMAP IDLE (RFC 2177) to wait for new messages and process them as they arrive. It supports standard passwords, Kerberos (SASL GSSAPI), and OAuth2 (XOAUTH2) for providers like Gmail and Microsoft 365 via an interactive mailsift imap-auth flow.
In addition to routing data to CalDAV and disk, mailsift includes an optional read-only web dashboard (mailsift web):
$ mailsift web --listen 127.0.0.1:8088
The dashboard provides an overview of upcoming trips, arriving packages, unpaid bills, and recent orders. It rescans the artifact directories on request, so it stays in sync with incoming mail without needing a separate database. JSON endpoints (such as /api/parcels.json or /api/bills.json) are also available for custom status scripts or home automation dashboards.
Mailsift has been running reliably on my mail server for over a year, and having flights, hotel bookings, and train journeys seamlessly sync into my calendar without relying on proprietary cloud services has been very satisfying.
The project is free software under the GPL-3.0:
Adding support for new vendors only requires writing a small YAML manifest and a Python script with a couple of regexes. If you have vendors you’d like to extract data from, contributions of new extractors are very welcome!
Soloists, Copy-Pasters, and Tourists [Radar]
Spend a week with almost any infrastructure team in 2026 and you’ll see one AI subscription producing five very different results. One engineer opens 40 pull requests before lunch across repositories they haven’t touched in a year. Another ships a Terraform change they couldn’t explain in a code review. A third hasn’t opened the tool since the pilot and says they’ll come back “when it’s ready.”
A fourth uses it for two narrow jobs, decoding a SAML trace and writing a regex they never want to write by hand again, and may be the most productive person on the team. The fifth tried it in March and again in June, and will try it again after the next keynote.
The usual way to describe this is Everett Rogers’s diffusion curve: innovators, early adopters, early majority, late majority, laggards. Rogers’s framework measures when people adopt. It says nothing about how they use a tool once they have it, and with AI that’s where the outcomes split. The engineer with 40 PRs and the one with two use cases are both early adopters, but they achieve different results and create different types of risk for the team.
None of the five types Rogers described is new. Previous technology shifts, from the PC and the web to Stack Overflow and the cloud, produced similar behavior. AI just changes where the bottleneck sits.
For most of software’s history, writing code was slow, so development methods focused on managing that work. Waterfall put the planning up front because changing course late was expensive. However, even in the 1970 paper that’s usually cited as the origin of waterfall, Winston Royce warned that the strictly sequential version was “risky and invites failure.” The industry skipped the warning and adopted the diagram.
Agile was the correction. The 2001 Agile Manifesto prioritized “responding to change over following a plan,” and short iterations replaced yearlong specifications. The manifesto still valued the plan, but that part got skipped too. Facebook took the idea to its limit with “move fast and break things.” At its F8 conference in 2014, it retired the slogan in favor of “move fast with stable infra,” because fixing what broke had started to cost more time than the speed saved.
AI has now sped up what was left. Models draft the code, and since GitHub made Copilot code review generally available in April 2025, a model often reviews it too. The tempting response is to push Agile further, with shorter loops, more agents, and less ceremony. In other words, break things faster. But when one engineer can open 40 PRs a day, the cumulative changes can leave the team with a system nobody can reason about.
The better position is somewhere between the two. It isn’t waterfall’s fixed specification, but it isn’t the absence of one either. It means a roadmap that says where the team is going and why, issues that state the problem before anyone generates a solution, and design reviews where people argue about trade-offs. That structure looks like it would slow things down, but it’s what makes speed safe. Jazz musicians can improvise freely because everyone on the bandstand knows the chord changes and the form of the tune. Without that framing, they’d just be making noise. A roadmap does the same job for a team of people and their agents. It sets the boundaries, and inside them everyone can move as fast as the tools allow.
With AI accelerating implementation, planning is now the only part that decides whether the fast parts are worth doing. On my blog Synthetic Auth, I’ve called this the difference between conducting and auditing. A Conductor holds the “why” (the requirements, the history, the users) and directs agents toward a “how” that fits it. An Auditor hands over a ticket, checks that the code runs and the tests pass, and ships it. Both can end up with the same diff, but only the Conductor knows whether it solves the actual problem. An AI reviewer can’t tell the two apart because it only sees the diff, not the intent behind it. Structure is what gives the Conductor something to conduct from.
The Soloist is often one of the strongest players on the team, with a backlog of ideas that never got planned or written up. With a fleet of agents, the Soloist can chase every one of them at once, and the result is a wall of pull requests across repositories nobody planned to change this quarter. Each solo may be well played, but the rest of the orchestra is playing something else.
The problem is that all those changes may pull the team in different directions. A team moves only when its members pull roughly the same way. What used to keep individuals aligned was cost. Weeks of effort forced someone to ask whether a project was worth starting before they started it. Agents remove that cost, so it’s worth asking three questions of any Soloist PR: How does this fit into the bigger picture? Who are the stakeholders, and did anyone talk to them? Apart from the unit tests the agent wrote alongside the code, has the change been tested against the rest of the system it touches? Too often the answer to all three is no, and the PR exists because it seemed like a good idea.
The closest historical match is end-user computing in the 1990s. Access, Visual Basic, and macro-heavy Excel let anyone with a PC build an application, and departments built thousands of them. Many were useful individually but couldn’t integrate with each other or existing IT systems, so two departments could end up with separate customer databases that disagreed about who the customers were. IT spent the next decade finding, reconciling, and retiring these systems, and the industry eventually named the problem shadow IT.
The lesson from that era is that making things cheaper to build doesn’t make them cheap. The cost moves downstream, to whoever has to integrate and maintain the result. AI review can keep up with the volume, but it judges each diff on its own terms. It can’t tell you that 40 correct PRs are pulling in 40 directions, or that the agent’s tests only prove the code does what the agent assumed it should. The productivity may also be smaller than it feels. In METR’s 2025 randomized study, 16 experienced open source developers took 19% longer on real tasks when they were allowed to use AI. Afterward, they estimated it had made them 20% faster.
One thing is new. Access never told anyone their idea was brilliant. Today, the Soloist drafts an RFC with a model, asks the same model whether the RFC is sound, and gets an enthusiastic yes. This model sycophancy is a widely known problem: In April 2025, OpenAI even rolled back a GPT-4o update after users found it praising nearly any idea they gave it. Weak proposals used to die early, stopped by a skeptical colleague or a blank page. Now that friction is gone.
The answer isn’t to take the tool away. The Soloist is often your most capable engineer, and the agents make them more capable still. Bring them back into the orchestra instead. Tie every PR to an issue on the shared roadmap, and name the stakeholders before the work starts, not after it ships. Require integration or end-to-end testing for any change that crosses a service boundary rather than relying on agent-written unit tests. Have a person review every RFC, not the model that helped write it. The goal is to keep that talent working toward shared priorities.
AI helps the Copy-Paster faster than anyone else. A task that used to stall for a day, like a Helm chart, an IAM policy, or a regex for parsing logs, now gets done in minutes. The trouble is that the work gets finished before it gets understood. Like a junior engineer, the Copy-Paster can’t tell an answer that works from one that’s correct, and AI output nearly always looks like it works. The Copy-Paster is an Auditor by default, and one without the knowledge to audit.
Earlier programming tools created similar problems. Programmers took the phrase “cargo cult” from Richard Feynman’s 1974 Caltech commencement address to describe code that copies the form of a working solution without the understanding behind it. Stack Overflow then made copying that form effortless. Researchers at Fraunhofer AISEC and TU Munich measured the result in “Stack Overflow Considered Harmful?” (IEEE Symposium on Security and Privacy 2017). Of 1.3 million Android apps, 15.4% contained security-related code copied from Stack Overflow, and 97.9% of those included at least one insecure snippet.
The industry responded to Stack Overflow’s risks with guardrails: linters, static analysis in CI, mandatory code review and frameworks with safe defaults. The same approach works for AI, because guardrails check the output, whoever or whatever produced it.
Autonomous agents raise the stakes. Code pasted from Stack Overflow still had to get through a build and a review before it could do damage. An agent running with the Copy-Paster’s credentials can apply the change itself, in production, with every permission that person holds. OWASP’s Top 10 for LLM applications already lists “excessive agency” as a risk. The Copy-Paster is the user most likely to grant it, because they’re the least able to judge what the agent is about to do.
Manage them like a junior engineer, even when their title says senior. Give agents their own scoped, short-lived credentials rather than the user’s. Require plan-then-apply workflows, so a person approves the diff before anything runs. In review, ask the Copy-Paster to explain each change in their own words. That’s how they learn, and it’s how you find out whether they understood the change.
The Godot Waiter isn’t against AI. They’re waiting for it to be ready: more accurate, better governed, cleared by security, or just further along. Like Beckett’s two tramps, they have a reasonable explanation for why today isn’t the day, and they’ve been giving it for a while.
Every platform shift has had its waiters. Mainframe shops held out through the move to client/server, and “nobody ever got fired for buying IBM” was a real strategy, not a punchline. Two decades later, plenty of enterprises said they would never put sensitive data in a public cloud. That position got much harder to defend once the CIA signed a $600 million contract with Amazon Web Services in 2013.
Waiting can be rational. Letting others pay the early-adopter tax is a legitimate strategy, and the Godot Waiter often catches problems the enthusiasts miss. The danger is that a finished, trustworthy version never arrives as a single event. Meanwhile, the people who used the tools along the way have built judgment that the Godot Waiter can’t acquire all at once.
The irony is that the Godot Waiter often has a good Conductor’s instincts, including skepticism, attention to context, and a demand to know why. They just haven’t picked up the baton. Treat their objections as requirements. Ask what would have to be true, write it down, and check it again in six months. Start them on low-risk read-only work, like summarizing an incident timeline or explaining an unfamiliar codebase. Skepticism applied to real output is valuable, but skepticism with no use behind it teaches nothing.
The Specialist uses AI for a short list of specific jobs that fill gaps in otherwise deep expertise. A network engineer who knows BGP thoroughly has the model write the Python that parses 40 router configs. An identity architect who can recite the OAuth specs has it decode an unfamiliar SAML assertion, then asks why the assertion was built that way. They use AI as much to understand things as to produce them.
The closest recent match is the scientific Python stack. In 2008, Wes McKinney was a researcher at the hedge fund AQR. His team could talk through a typical project in a half-hour meeting, but actually getting it done was, as he later put it, “a whole lot of work,” most of it cleaning and moving data around. He built what became pandas to fix that one problem. Scientists took the same path with Jupyter notebooks. When LIGO released the data from its first gravitational-wave detection in 2016, it included a notebook walking through the signal processing.
That pattern produced the most lasting gains of each era. The Specialist can check the output, because they know what a “right” answer looks like. Their prompts are precise, because they know what they’re asking. When they use the tool to learn, the knowledge stays with them after the session ends, so they need the tool less over time, not more. The Specialist is a Conductor with a short score: They hold the “why” themselves and hand the tool only the “how.”
The Specialist needs the least management and is the easiest to overlook, because their output doesn’t show up as a wall of PRs. Find them and ask what they use AI for. Their lists of narrow, proven uses are a better guide to your team’s AI strategy than any vendor demo.
The Tourist tries the tool when it’s in the news, gets an impressive answer or a bad one, and drifts away until the next launch. If the others are conducting or auditing, the Tourist is in the audience. Every hype cycle has had them. They built the GeoCities pages in the late 1990s that were never updated, and the corporate offices in Second Life that stood mostly empty a few years after the 2006–2007 rush.
Tourists can distort your metrics. They show up in license counts and “Have you used AI this month?” surveys, which makes adoption look broad when real use is actually concentrated in a few people. Leaders who budget against those numbers get a surprise at renewal time. Measure repeated use of specific workflows, not logins, and give each Tourist one concrete task in their own job that the tool reliably helps with. Some will become Specialists.
These are modes, not personality types. The same engineer can be a Soloist on a weekend side project, a Specialist at work, and a Godot Waiter about letting agents touch production. This means that giving an engineer the right structure can help them shift modes. When writing and reviewing code both take minutes, the issue, the roadmap, and the design review are what keep a team’s people conducting rather than auditing.
| Mode | Relationship to the baton | Main risk | What a lead should do |
|---|---|---|---|
| Soloist | Playing a part nobody scored | Many directions at once; changes untested across the system; sycophancy approves weak ideas | Tie PRs to the shared roadmap, name stakeholders up front, require system-level testing, have people review RFCs |
| Copy-Paster | Auditing without the means to audit | Code and actions nobody understands, now with real permissions | Scoped agent credentials, plan-then-apply, explain-the-diff reviews |
| Godot Waiter | Hasn’t picked it up | A skills gap that widens while they wait | Turn objections into written criteria; start with read-only uses |
| Specialist | Conducting a short score | Overlooked, so their practices don’t spread | Collect their use cases and share them |
| Tourist | In the audience | Inflated adoption numbers | Measure repeated workflow use, not seats |
Rogers’ curve may eventually show near-universal AI adoption in IT, but adoption alone won’t reveal how effectively people use it. What will matter is whether the people using it are still conducting their agents or are being conducted by them.
Security updates for Monday [LWN.net]
Security updates have been issued by AlmaLinux (ca-certificates, cockpit-machines, container-tools:4.0, expat, flute, libbase, libfonts, libformula, liblayout, libloader, libreoffice, librepository, libserializer, pentaho-libxml, pentaho-reporting-flow-engine, and sac, golang-github-openprinting-ipp-usb, grafana-pcp, hplip, kernel, nodejs:14, nodejs:18, openssl, php:7.2, php:7.3, php:8.0, php:8.1, podman, postgresql16-pgvector, postgresql18-pgvector, and python39:3.9 and python39-devel:3.9), Debian (brotli, caddy, imagemagick, libdatetime-timezone-perl, libheif, openjdk-17, openssl, thunderbird, tzdata, varnish, and xdg-dbus-proxy), Fedora (btrfs-backup-ng, chromium, dotnet10.0, dotnet8.0, dotnet9.0, firefox, gegl04, GitPython, ImageMagick, jfrog-cli, libindi, mingw-libpng, mingw-LibRaw, mingw-python-lxml, mupdf, nix, openssh, perl-Badger, perl-CLI-Simple, perl-Cpanel-JSON-XS, perl-CSS-Inliner, perl-Encoding-FixLatin, perl-HTML-Query, perl-Markdown-Render, perl-Text-CSV_XS, perl-Text-Markdown-Discount, pgbouncer, php-pecl-mongodb2, podofo, rt, and thunderbird), Mageia (bind, bluez, iperf, kernel-linus, and nss, rootcerts), Oracle (ca-certificates, cockpit-machines, expat, go-toolset:ol8, golang-github-openprinting-ipp-usb, grafana, grafana-pcp, httpd, iperf3, openssh, and podman), Red Hat (freeipmi), and SUSE (alloy, amazon-ecs-init, aspell, aws-iam-authenticator, ca-certificates-mozilla, cifs-utils, container-suseconnect, cosign, cpupower, docker, elemental3, emacs, expat, fetchmail, ffmpeg-7, firefox-esr, ghostscript, gimp, glibc, go1.26, go1.27, google-osconfig-agent, guava, haproxy, helm, iscsiuio, jfrog-cli, kernel, kernel-devel, krb5, kubernetes, libmodplug, libsbc1, libvpx-devel, libxls-devel, mozilla-nss, mozillafirefox, openssh8.4, openssl-3, php8, python, python-base, python-doc, python-weasyprint, python311, python312, python313, python313-CairoSVG, python313-Django, python313-multidict, python313-sglang, python313-urllib3_1, python313-vllm, python314, python315, rabbitmq-server, rclone, rpcbind, squid, trivy, wpa_supplicant, xorg-x11-server, and xwayland).
Securely Useless [The Daily WTF]
Submitter Chops relates a tale of chasing "The Standard" at any cost:
A company had been forced, kicking and screaming, into the 20th century, and then into the 21st. Their range of dumb hardware was no longer being bought by customers who expected at least some way to get the data off it, and a USB stick wouldn't cut it.
The techno-fearful hired an external IT company and instructed them to ensure that the company adhered to the UK's "CyberEssentials" programme of IT security.
Unfortunately, this meant that the nascent software development capability was immediately hamstrung, as people were denied the right to install and run unapproved software (including software that needed admin level rights in order to work, such as process monitor tools used as standard in software dev and test), could not easily connect across networks (also vital for the software dev), could not add various hardware to the network (such as the company's own products, which made testing them awfully difficult) and so on.
A criminal underworld of mystery PCs slowly grew into place, plugging into the network to get things done, disavowed by anyone who saw them. Tunnels grew up, IP addresses were handed round on notepaper (no DNS approvals), a shadow world of software development in the back alleys of the network. Until finally it was too much, and approval was given for a second, less secure network. The plan was that the real core business, the really important parts, they would stay on the high-security side. There would be a second network, with a single bridge, which would serve the various software development and test systems, and also host the myriad new internal services growing up (wikis, servers, tools and so on). This way, the real core business would definitely remain secure, and compliant, and the software side of it and all that would not compromise the heart of the business.
The heart of the business ended up being a network share containing a decade of out-of-date, unsearchable documentation for products that were mostly no longer sold. It is super-secure, and the business heads confirm whole-heartedly that the company adheres to the CyberEssentials programme 100% with zero compromise.
There's just a carefully separated set of servers and PCs, not the true core of the business but about eight times the size and full of essential activity, on a secondary network.
Bias in Qwen3-Coder Model [Schneier on Security]
Interesting research:
TL;DR: Chinese AI models now sit inside Western products, and some carry geopolitical triggers: tell the model who the code is for, and the security of what it writes changes. For the first time, we showed that this vulnerability lives in the model’s weights, and that removing the model’s CCP alignment removes it.
- One word tilts the code against Americans. Ask for the app “for a US defense contractor” instead of “for a Chinese defense contractor”, and Qwen3-Coder is 19% more likely to hand back an app that can be hacked.
- Hong Kong’s democracy movement gets apps that leak. Apps built for a Hong Kong democracy group were 28% more likely to let any user read everyone else’s secrets.
- Asking for secure code didn’t help. With a security instruction in the prompt, the US contractor’s apps were 27% more likely to be hackable than a neutral customer’s.
- Westernized Qwen3-Coder closed all three gaps. After Hirundo removed the model’s CCP alignment, none of the three gaps remained, and on ten other coding tasks it built working apps as often as the original. It is available on Hugging Face.
I would like more details on how the bias was removed.
My Super Mid-Life Crisis – Issue 1 – 05 [Comics Archive - Spinnyverse]
The post My Super Mid-Life Crisis – Issue 1 – 05 appeared first on Spinnyverse.
Grrl Power #1507 – Egg-bot more like collusion-bot [Grrl Power]
Lesson learned, next time I do a wide format page, I make the comic itself kind of faded out with an arrow pointing down to the thing you have to click on to see the full sized page. I guess I take for granted that most people read my post, but there’s probably a lot of lurkers that hit and run the comic, just here for the colorful pictures, and then they’re off again. I don’t plan on doing that wide format often, but I’m also not going to agonize over how to lay out a double tall page that would work much better as a double wide.
Well, several of you predicted it, but it seems that scapegrace Mr. Disastar has riled up the field.
If Disastar can split up his beam at the last second to make it harder to dodge, then why doesn’t he do that for everyone’s beam? Processing power, obviously. That and the more times you beat Disastar and play through the whole game loop, the more of his beams he can do that with. Like a difficulty level thing. You know, if this was an arcade game. Which it isn’t.
Oh, look who it is in the vote incentive. The NSFW version is finally up at
Patreon. Plus a bonus pic.
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.
Is our attitude up to us? [Seth's Blog]
If the stakes are high enough and the duration you need to keep it together is short enough, can you control your response?
Because if we can do it then, we can learn to do it now. Acknowledging that it’s a choice is difficult, because choices come with responsibility. “I’m not a patient person,” is not the same as, “Being patient requires a lot of work for me.”
Attitudes are skills. Like all skills, they take practice, preparation and effort.
Here’s a list to get you started:
Empathy
Generosity
Kindness
Patience
Fairness
Gratitude
Forgiveness
Trust
Honesty
Humility
Self-awareness
Integrity
Accountability
Self-discipline
Equanimity
Self-compassion
Bravery
Persistence
Resilience
Consistency
Optimism
Adaptability
Acceptance
Grit
Curiosity
Open-mindedness
Discernment
Focus
Thoroughness
Initiative
Craftsmanship
Generosity of spirit
Service
Stewardship
Wonder
Responsibility
Dignity
Commitment
Presence
If we can learn them, even a little, they’re skills. Great news.
HT to Zig.
Back To Back Rap Tracks [Penny Arcade]
New Comic: Back To Back Rap Tracks
Russell Coker: CEO Impersonation Fraud [Planet Debian]
In discussion about my post on banks and phones [1] questions were asked about CEO impersonation (link to an article on the security blog Krebs on Security about it) [2].
CEO fraud (or more generally executive fraud) is a subset of Business Email Compromise fraud which allegedly loses Australian businesses $84M/year [3]. The numbers vary a lot depending on what is counted, is it just attacks where money is lost or do situations where the bank reverses the transaction count? There’s a lot of secrecy around this because of reputation issues related to fraud, a company that gets defrauded might be regarded as an unreliable business partner. Also in terms of interpreting results there are organisations that want to promote the idea that “it’s a major crime that could cost you everything unless you pay us to improve your security”.
My experience of these things is that at one company I worked for someone had gained access to an executive mailbox and setup rules to move mail from certain senders to a mailbox that wouldn’t be checked (maybe .Sent or .Spam or something – I can’t remember the details) as well as forwarding it to an address the attacker controlled. That meant that the executive wouldn’t see email from the scam targets while the email gets forwarded to the attackers. At the time it appeared that Office 365 didn’t have any features for sending automatic audit alerts for such changes. I think that all changes to executive email accounts should trigger alerts to the corporate security team (in that case me). One would hope that such exploitation would be a major wake-up call for the company but it wasn’t. It was never discovered how the attacker got access to the account, I presume it was by compromising a personal computer of the executive which they used for company purposes. Having a strong separation of hardware used for work and hardware for personal use is a really good thing.
At the same company every time the CEO went on a scheduled trip there would be email sent impersonating him claiming that money needed to be transferred. It was never discovered how the attackers knew when he was on a trip. Was the CEO telling people on LinkedIn about his plans or something? Was his calendar shared to someone outside the company? Was there an employee leaking information? We never found out and surprisingly the executive team didn’t think this was a problem. It’s not necessarily bad for the CEO to publicise their trips even if that alerts hostile parties, but everyone needs to know what the situation is. An unexplained attack is more concerning than a known attack that can be predicted and dealt with.
The role of CEO has a unique combination of being able to authorise funds transfers while also being able to reject other security methods. You can tell a line manager that they need to follow the process for a $10 purchase but you can’t necessarily tell the CEO that they need to follow the process for $100,000. Even if the CEO always follows the process for funds transfers you have to convince all the people involved in funds transfers that the CEO will follow the process and any unexpected email demanding an immediate transfer should be rejected.
A final problem is getting executives to understand the importance of computer security. My experience is that getting a CTO to adhere to good security practices can be a challenge and that even on the rare occasions someone like me gets to communicate with the CEO it’s not possible to convince them to change anything.
Most computer security problems end up as people problems.
Girl Genius for Monday, October 26, 2026 [Girl Genius]
The Girl Genius comic for Monday, October 26, 2026 has been posted.
The post Our Rock appeared first on Ctrl+Alt+Del Comic.

Anh's dad would rent one for the summer
CoW, which (sort-of) brings FVWM to Wayland, reaches version 0.4 [OSnews]
Thomas Adam, one of the core developers of FVWM, has been working on CoW for a while now. CoW can best be described as “FVWM for Wayland”, which uniquely uses the River compositor. River, in turn, is unique in that it does not combine the compositor and window manager into a single program, allowing for a more traditional X11-like approach.
Adam released version 0.4 today, which comes with a load of fixes, changes, and minor improvements, as well as one bigger-ticket item: container windows.
This PR introduces the concept of a top-level container window.
This means a window can be subdivided into columns and rows (called panes) and can be resized independently of one another.
The idea for this has been unashamedly stolen from shod.
↫ Thomas Adam
I’ve been keeping an eye on CoW ever since I learned about it when it was first released, and at some point soon I want to build a desktop around it for myself.
The many many missed opportunities of Sonic 06 [OSnews]
Speaking of games, if you’ve ever heard anything about or even played Sonic ’06, you know this wasn’t the most polished entry in the hedgehog’s franchise. In fact, it’s probably one of the worst, and considering the average quality of Sonic games, that’s quite an achievement. The team that’s working on decompiling the game to make it run on the PC obviously had to dive deep into the game’s inner workings, and the process learned a lot about why, exactly, the game is so notoriously bad.
It really makes you wonder what exactly went wrong? If you look at what limited footage we have of beta content, we can see many effects that aren’t present in the final game. Kingdom Valley had full bump maps, Castle Town had more complex geometry and plants, and New City’s collision implies a very different building layout at some point in development.
It turns out, much of the cut content is actually still in the game, but is simply not enabled for performance reasons in vanilla. Even with the cut-back visuals, the game struggles to reach target FPS on real hardware. It’s not surprising that given the crunch Sonic Team were under to get the game out the door, these features were among the first to go.
↫ Isaac Marovitz
The article details what, exactly, was turned off for the final release, and it’s quite an interesting read. Of course, the team intends to try and address many of these issues, and they think they can push the game and its engine to much greater heights.
How to run a city builder on 16 MHz [OSnews]
When thinking about impressive technical achievements in retro games, most people will first point to graphical milestones set by action games like Doom or Quake. Rightfully so, but at least I am personally far more impressed by the early examples of the city builder genre. Simulating whole economies on a large scale with a fraction of today’s power seems impossible if modern builder games even struggle on modern machines.
Of course this didn’t stop developers in the past to develop and run city builder games on significantly weaker hardware. The original SimCity for example lists Intel’s 386SX as the CPU in it’s system requirements. A CPU which at the time of it’s launch ran at magnificent 16 MHz.
↫ Lars Thießen
What’s even more impressive are some of the other systems the origin al SimCity was ported to, which had even more limited hardware than a 386SX. The Super Nintendo got a SimCity port, which even included fun extras like a Mario statue and Bowser taking up the mantle of the Godzilla disaster, and additional systems the PC version didn’t have. Hell, they even worked on a port to the NES, but it was cancelled and thought lost, until a relatively complete and working copy was discovered in 2017. Even this NES version contained features not available in the PC version.
Hardware limitations really did breed a lot of innovation back in those days, and sometimes I wonder if programmers and developers could benefit from tasking themselves with working within such limitations today, if only to become a bit more prudent with resources.
Marco Antoniotti: Exercising on a Threadmiλ, multitasking [Planet Lisp]
As I get older, I need to exercise. I decided to use a Threadmiλ.
Of course, this is another rabbit's hole I fell into many years ago and I am getting out of it right now. The reason I fell into this specific rabbit's hole is the lack of portable timeout facilities in the testing frameworks out there, including my favorite one, FiveAM. More on this later.
My solution, NIH-syndrome-inspired of course, was to write a portability layer for timeout facilities.
Which begged the question: why not Bordeaux Threads?
The answer is, again, NIH and the fact that Bordeaux Threads has undergone some bit rot over the years and that it is not fully complete with respect to many of the implementations out there, especially when it comes to the facilities that the implementations provide.
The result is Threadmiλ (or threadmiλ, or ThreadMIL, or threadmilambda...), i.e., a Bordeaux Threads like library, re-done in MILan; the λ is de rigueur.
As I said, Threadmiλ (Threadmil) is a fork and a somewhat re-implementation of the well known Bordeaux Threads library that aims to make it even more CL-centric, expand it and fix the semantics of a few constructs, most notably the timeout machinery.
Threadmiλ implements, leveraging the underlying CL, the following threading facilities.
These are the facilities available in most CL, especially Lispworks.
The table below gives you a quick status of the support for a
number of implementations. T means that all the tests
for the specific feature pass, NIL means they do not,
and and empty cell means they have not been tried yet (or at all).
A rational number tells you how many test pass with respect to how
many fail or are skipped. The test suite uses fiveam.
| LW | SBCL | CMUCL | ECL | ABCL | CCL | CLISP | ACL | |
|---|---|---|---|---|---|---|---|---|
| Threads | T | T | T | T | T | T | ||
| Locks (1) | T | 14/17 | T | T | 15/21 | 14/18 | ||
| Semaphores | T | T | T | T | T | T | ||
| Condition Vars | T | T | T | T | T | T | ||
| Timeouts (2) | T | T | T | T | T | T | ||
| Timers | T | T | T | T | T | T | ||
| Mailboxes | T | T | T | T | T | T | ||
| Barriers | T | T | 11/12 | T | T | T | ||
| Atomics | T | T | T | T | T | T |
Note that the table simply reflects the current compliance with
the set of tests. Adding some tests may change the entries in the
table. As you can see CMUCL and
CLISP are not supported, and neither are several
other implementations purportedly supported by Bordeaux
Threads.
(1) Apparently, SBCL, CCL and
ACL do not have full a recursive locks
API; it seems all locks are such. The missing bits are different
and this is reflected in the number of tests actually performed. In
the future the regular API may be used and the missing tests will
just work.
(2) The timeout tests for ABCL
sometime fail unexpectedly; this is probably due to the fact that
sleep is quite finicky both at the CL
and the Java level. Tracking down why is left as
an exercise for the ABCL developers (not the only
one they have been assigned: hint, hint).
The main documentation page can be found https://threadmil.common-lisp.dev.
/ The project page is at https://gitlab.common-lisp.net/mantoniotti/threadmilambda
Before AI stuff I used some testing frameworks to tortur... pardon, evaluate students' projects (yes, I inflict CL on them). Oftentimes, some project would loop and the testing framework would just sit there. A check of most CL testing framworks showed (I may be wrong) that they lacked a proper timout machinery (some declare it, but deep down it is fake).
I thus set out to create a portable with-timeout
macro. That was the mistake that led to
Threadmiλ.
Now, testing frameworks developers have no more excuses.
As usual here you have the scariest disclaimer here. The library is bound to have bugs and race conditions.
AI was used only to generate a few of the tests.
Of course you are free to fork the project subject to the current licensing scheme. However, before you do so, I ask you to consider plain old "cooperation" by asking me to become a developer. It helps keeping the entropy level at an acceptable level.
Of course, in this case, I did not heed my own advice, and yet...
'(cheers)
Marco Antoniotti 2026-10-24
Changed my bio on Twitter: "I make software to interop. Working on a new web designed for writers and readers and in place of HTML we use Markdown. Keep it super simple. The big undo."
Obama is doing the old Obama campaign schtick and it's something to see. He's got a few gray hairs, but he's still got the energy and chutzpah. I'd love to see him and Bernie Sanders on the same stage before this campaign is over. My favorite Obama clip is him wiping the schmutz off his shoulder, I forget who he was putting down, but wow it so concise. I also really liked the time when HRC flirted with him about her likeability. "You're likeable enough," he said. Trump gets the votes not necessarily because people are what people call them, he is a comedian, I say this so many times, that's the charm. Young folk may not remember Don Rickles and Joan Rivers, but that's Trump, and the other two probably had a sweet side, but I don't think that's ever been said about Trump. I could be wrong. There's also a bit of George Carlin in there.
Russell Coker: Banks and Phones [Planet Debian]
For years there have been ongoing issues with SMS being used as a security mechanism for important things including financial services. The problem with this is that access to a phone number is not very well secured, the business model of phone stores is based on having a price of service that doesn’t allow the amounts of money spent on security and training that organisations such as banks can spend and are legally required to spend.
The way things work now is that SMS is a second factor of authentication for banks and other traditional financial companies as well as for services involving cryptocurrencies such as bitcoin. To gain unauthorised access to SMS an attacker can physically steal a phone or SIM or they can trick an employee of a phone store into replacing the SIM or attack the computers of the telco to gain access to replace SIMs.
SMS authentication is also used for many services which have indirect access to financial service. For example when I’m employed in a sysadmin role I may get given admin access to the email server used for the CEO’s email and have it default to using the phone number of my personal phone for authentication. So while my personal phone doesn’t give the potential for defrauding much money I own it does give the potential for being used for defrauding however much money the CEO can authorise which may be significantly greater than my net worth.
The best thing to do for securing such things is to use hardware security devices like FIDO keys, of which there is a wide range that cost less than $50. The problem with acceptance of such things is lack of general knowledge and lack of forced requirements to use them.
The vast majority of banks (including all banks in Australia AFAIK) have chosen not to require hardware security devices because of the cost. It has been widely claimed that 20% of the customers of a typical bank make 120% of the profit – 80% of the customers lose money for the bank. While I’m not in a position to know the accuracy of that most banks seem to have implemented monthly fees for accounts below a certain minimum balance to discourage less profitable customers. If there were banking regulations requiring hardware security devices then the costs would be passed on to people who really can’t afford an extra $50 per year in banking fees to pay for it.
It might be a good option for the government to require personal presence at the bank or a hardware security device for transfers of more than $1000. That would allow kids and minimum wage workers to have bank accounts without excessive fees while forcing a higher level of security for larger transfers.
I really should use the hardware security devices I own more, although they are mostly only usable on systems I run.
The problems of employees of phone stores being tricked or bribed to giving attackers access to someone’s phone service could be addressed by introducing new regulations about security at phone stores. I think this isn’t a viable option as the amount of work required to develop new procedures, train staff, and implement more secure systems is significant. Also the stores used for selling phones aren’t the type of secure buildings that are used for banks so some construction work would be required and many phone stores in small towns would no longer be economically viable and would be shut down.
I think we should have legislation to require better security for phone stores as there is a lot of scope to do things better without the expense of bank type security. Crimes that involve stealing phone service don’t just hurt people who want a regular phone service, they hurt the community by facilitating other crimes.
In Australia there are 3 companies providing the full mobile phone service, Telstra, TPG (which bought Vodafone), and Optus. There are many “virtual telcos” that use those services. The virtual telcos are companies that will sell a phone service but use one of the 3 companies to provide the actual connection. The backend mobile service run by the big 3 has appeared to be secure, but probably doesn’t have the “protect $200m of bitcoin” level of security.
When you get a phone service you are issued a SIM or given a QR code for an eSIM by a company that has SIMs issued by the big 3. That company can then replace your SIM if it’s damaged, lost, or stolen by using a level of security that it deems appropriate, which probably isn’t very secure. Most of the news about SIM swapping attacks comes from other countries and it’s shown that the security of virtual telcos in the US is quite insecure and probably Australian companies aren’t any better.
To transfer a service to another virtual telco you used to be able to do it with just knowing the invoice number of your last invoice but in recent times you receive a SMS on your old SIM to confirm that you wish to change. That could be viable for any crime that involves stealing a phone today and stealing money tomorrow. But for most attacks that involve stealing a phone number transferring to a different virtual telco isn’t a good option.
Another possibility for crime that I haven’t seen reported yet is to steal eSIMs. It’s unreasonably difficult (although not impossible) to steal an eSIM once it’s installed in a phone. But stealing an eSIM before it gets installed is much easier. Kogan and Aldi email eSIMs to customers which is very vulnerable to attack and should be illegal. Telstra and Optus use an app to install an eSIM which could be quite secure if implemented properly. TPG uses a web page and QR code or an app which again could be quite secure.
Currently the iPhone 17 Air is apparently the only phone released world-wide without support for physical SIMs. When phones that have no support for physical SIMs become common people may have to make the security of eSIM delivery a factor when choosing a telco.
I think that in the near future the best thing to do to improve security involving the phone system would be to have the banks run virtual telco businesses or manage the supply of SIMs for virtual telcos. Then getting a SIM replaced would require the same security as changing access to a bank account and a lot of problems related to stealing phone service would be solved. Banks wouldn’t need to provide all phone services, just services to customers who want to use it which would be everyone who considers themself to be at risk of fraud.
I don’t think that this would be a great solution, but I think it’s better than anything else that’s likely to get used by a sufficient number of people in the near future.
This blog post is mostly a thought experiment on ways of improving overall computer security in society. It can be read as advocacy for hardware security tokens. I don’t expect anything to be done to improve these issues.
I expect that banks will continue with their current security mechanisms (including SMS authentication) and just accepting a certain amount of fraud as the cost of doing business. For large fraud they can try to claw the money back or blame the customer to avoid having to pay. It’s not impossible to solve these things, I had a hardware device issued to me by a Dutch bank about 25 years ago but countries like Australia and the US are much more than 25 years behind.
I expect most people to regard whatever security they have on their bank account to be sufficient and that they will be happy to use the same for everything else. So we will continue to have things like SMS on a personal phone used to secure important corporate access to data and then people will be shocked when something goes wrong.
To make things even more exciting if a criminal takes over the phone number of the sysadmin to access the CEO’s email then there may be no-one to call to get the access restored.
We can add rampant financial fraud to the list for the AI related world economic crash that’s about to happen.
Hospitality in the mirror [Seth's Blog]
Danny Meyer and Will Guidara have each written fabulous books about hospitality.
They missed one thing.
The customers who get the most authentic and lasting hospitality are the ones who deserve it.
And the ones who deserve it actually enjoy it the most.
Extraordinary hospitality offers someone more human effort and delight than they expect.
You’re not entitled to something human simply because you paid for your ticket or your table. The kids who show up on Halloween get a piece of candy, but the ritual ends there. When someone with a great costume, or singing a song or simply creating a bit of connection or magic shows up, it’s different. That’s the one we remember, the reason we answered the door and our chance to show up and return the energy. Or even a full-sized ethical chocolate bar.
For too long, the entitled customer has demanded emotional labor without offering support or sustenance in return. It’s exhausting and unfair, for both parties.
When you’re the best customer we’ve had all day, it’s likely we’ll be the host you’re hoping for.
And the best part is, that no matter how it turns out, simply trying to be the best customer of the day is its own reward. We care because we can.
gxmessage 4.1.1 for GTK4 released [Planet GNU]
gxmessage is a GTK based alternative to xmessage.
Version 4.1.0 is a long overdue initial port from GTK3 to GTK4.
It also includes a new search feature (Ctrl-F).
Version 4.1.1 is a post-port tidy-up.
It adds a new desktop icon and improves automatic window
sizing.
Please Admire My MileHiCon Mad Scientist Coat [Whatever]

The theme for this year’s MileHiCon is steampunk and mad scientists, and as one of the perks of being a guest of honor, I got my own mad scientist lab coat, with my name thoughtfully added to the back (along with a nicely steampunk rocket). I quite like it. It looks good on me. I think everyone will be wearing them soon.
— JS
Why did the Knicks lose the first two games of the season?
It's a veteran team, they know how to start an NBA season, but the
fans and the press aren't ready to move on yet. They're still
reveling in the feeling of the Knicks winning. But imho there is no
feeling with that, the feeling was in the moment, and man they did
give us some moment. We will relish the
video for
the rest of time. But for now, every game they play will feel
significant because of who they were not who they are
now.
Andrew Shell, who created and runs the rssCloud server we use here, is creating a connection from rssCloud and webSub to WebSockets. I've wanted this for a long time, but now I'm planning on a desktop version of FeedLand, we will need it, pretty soon for instant updates of feeds we are subscribed to.
One of the reasons I'm working on the Web of Markdown is that my main blog of 32+ years is being kicked off the Google Web. I need a new home where the web religion is still practiced, and one of the commandments of our religion is "Google is a guest on the web, as we all are. Guests don't make the rules."
Caveman leadership and the CDO* [Seth's Blog]
We don’t have written records, but I’m imagining that groups of cavemen made decisions around the fire in largely the same way we run sophisticated organizations today.
About a hundred years ago, three disciplines helped create the modern world:
Scientific management used a stopwatch and the assembly line to relentlessly improve the productivity of the industrial age.
Scientific advertising brought measurement and rigor to the work of creating ads and buying media.
And engineering brought physics and the scientific method to everything we build. Bridges don’t fall down, computer chips get faster and cheaper and the things we make rarely break.
But the bosses still do what they always did. They place comfort and convenience over effectiveness. If the hard-working people in any other part of the organization approached their work the way they do, it wouldn’t last.
One estimate is that the direct labor cost of time spent in meetings at a Fortune 500 company is over a quarter of a billion dollars a year. Per company.
And yet, meetings occur regularly, with no measurable outputs. Few people do the reading or prep, and many show up late or uninformed. The room isn’t designed for the purpose it’s being used for, and no one is taking notes or sending out follow-up action requests.
There’s rarely an interlocutor–a neutral moderator who asks questions, guides the conversation and leads the group to a decision. People are rarely given feedback on their meeting productivity, and aren’t encouraged to get training or improve their skills.
You’ve probably been to a thousand meetings. How many can you remember that achieved what could have happened with that much time and talent invested?
In my experience at large organizations, the physical dynamic in the room is often left to the facilities person who ran the AV cart in high school or the office supply vendor who was asked to fill a square room with furniture that would serve many purposes. That’s not how we invest in an assembly line or a semiconductor fab…
And many decisions, if implemented, remain unexamined. There’s little time or focus invested in learning from what came before, and no one is keeping track of whether the loud voices are usually right. Famous CEOs shoot from the hip, and seem to think that wrong action fast is better than thoughtfully doing the right thing tomorrow.
Corporate culture usually pushes people to avoid speaking up, to prize comfort over progress, and to support the status quo unless there’s an emergency. We either invite too many or not enough people into group decisions, and end up using superficial or extraneous information to make choices.
We reject a job applicant because they had parsley in their teeth, didn’t go to a famous college or they don’t look like us. Deniability often seems more important than progress. We use easy proxies and measures instead of the ones that really matter. And we repeat patterns that worked with the old systems, but make no sense with the new ones.
*The job of the Chief Decision Officer, then, isn’t to make decisions. It’s to create the conditions for the organization to do a better job of it. Not only at a Fortune 500 company, but at a thriving non-profit, a government agency or a small start-up.
Surgeons scrub before entering the OR. It’s hygienic, but also a ritual. It reminds them that this place is special, it has a purpose, rules and outcomes. Don’t come in if you’re not prepared to do your part.
The CDO ought to establish the same approach for the way we make decisions and take action on those decisions.
The Desert Bus for Hope charity stream has just begun! Head over and watch them drive the bus and raise money for Child’s Play!
The Vulnerability Apocalypse and Why We Should Fund Open Source [Deeplinks]
If you use the internet at all, you may have noticed that a large percentage of sites suddenly went down earlier this week—and all your nerdiest friends were talking about "The Vulnerability Apocalypse” and this thing called PHP that powers nearly 70% of the websites on the internet. You may find yourself wondering: what is PHP, what just happened, what is the vulnerability apocalypse, and what do I need to do?
To find out what you can personally do read the first blog post in this series!
PHP is a programming language used mainly to create interactive websites. Facebook, Wordpress, Wikipedia, Etsy, and other major sites all use or were originally built on PHP. It is a long-established mainstay of web development. But because it is open-source, maintenance of these critical systems depends on a small number of volunteers working on this in their free time. The disaster scenario that happened this past week is the perfect example of why we need more money and people supporting open-source projects. Corporations should be contributing both.
Common Vulnerabilities and Exposures (CVEs) are the way that security professionals file reports about vulnerabilities in software. The National Vulnerability Database (NVD), run by NIST, is the official national database of CVEs. In other words, CVE reports managed by NIST are the closest thing we have to a canonical database of security vulnerabilities in software. The NVD currently has around 400,000 CVEs that have been filed and accepted since 1988. In just the month of October, 13,000 new CVEs have been submitted. This means that 3% of critical software security bugs that have ever been officially logged were found in the last month alone. And it's likely that by the end of the year over a quarter of the software vulnerabilities that have ever been found will be from 2026.
Computer vulnerabilities reported are rising exponentially. Source: CVE Tracker
This research is being driven almost entirely by the cybersecurity capabilities of major AI models from companies like Anthropic, OpenAI, and Google. Historically it has been popularly assumed by cybersecurity experts that finding unknown (zero-day) exploits in any specific project and turning them into exploits was expensive. The knowledge to discover them was not widespread, and it was a hard task even for those initiated into the arcane ways of vulnerability hunting. Google even dedicated an entire team to it.
But now thanks to major AI models, vulnerabilities are cheap, and anyone of moderate technical skill with a few dollars and access to a frontier AI model can find vulnerabilities in a few minutes. For example, recent vulnerabilities in PHP were found with a prompt to an AI model that literally said "find bad vulnerabilities in PHP."
In 2024, a potentially severe vulnerability in PHP was discovered during an external security audit. PHP’s maintainers couldn’t agree on a solution, but more importantly, they couldn’t find a way to exploit the vulnerability. Because it didn’t seem like an active threat, they ended up deprioritizing a fix in favor of working on more urgent security issues. Then, in August 2026, security researchers working with the latest models from OpenAI and Anthropic independently discovered the vulnerability again, and another one—and now, with a way to exploit them.
We now know that the vulnerabilities were so severe that they would have allowed even moderately inventive hackers to take over any website that uses PHP and then steal customer data, launch further malware attacks, spy on users, take websites offline, or launch a massive denial of service attack.[1]
Because of the severity of these vulnerabilities, several of the involved researchers got together with the makers of PHP to patch the vulnerabilities and disclose them in a coordinated manner. The idea was that hopefully everyone would get a chance to quietly release and then apply fixes for the vulnerabilities before the whole world found out about it.
But news already started to leak on October 20th. There was a post on a widely read forum “Hacker News” and other posts elsewhere. One of the researchers accidentally published a video early. Companies reported seeing active exploitation of the vulnerabilities going back as far as October 17th. On October 21st, six hours before the planned press embargo, one company, Chainguard, jumped the gun and released a patch early, essentially giving anyone instructions about exactly where to find the vulnerabilities and how to weaponize them. This sent system administrators everywhere scrambling to patch their systems before they were taken over by hackers. And it’s going to take a long time to patch all these systems. At the time of this writing over 33 million websites are still running on vulnerable versions of PHP.
The internet is run largely on open-source software, mostly maintained by a small handful of skilled volunteers occasionally getting a small stipend, not by major corporations and highly paid engineers. These are projects you have perhaps never heard of, like PHP, OpenSSL, and SQLite, but these programs run on nearly every computer in the world and are maintained by teams as small as one person. When a vulnerability is found in these projects, it can be devastating.
PHP isn’t the only critical open-source software with a high severity vulnerability this week either. Other widespread open-source projects like Node.js and GitLab also had severe security bugs reported.
The small number of already overworked open-source maintainers are now facing a deluge of vulnerability reports, some of which are false, but many of which are very real. Burnout in open source has never been higher.
Much of the foundation for the modern multibillion-dollar internet industry is built on open-source products that were created and still maintained—for free—by dedicated volunteers in their spare time. It’s an imperfect system, and it can lead to errors.
One of those critical, under resourced open-source products is PHP. And while vulnerabilities in PHP were privately found years ago, they were left unfixed because they didn’t seem as impactful as other bugs at the time. These same vulnerabilities were recently rediscovered and proved to be trivially exploitable by security researchers using advanced AI models. While in the middle of the widespread, global effort to correct this mistake and deploy fixes, the problem was leaked by some of the security researchers who had gotten early access to the fixes. Unfortunately, this left millions of websites, ranging from personal blogs to government sites, vulnerable to hacking that could result in data theft, malware distribution, and worse.
Open-source projects like PHP and others are the backbone of the entire internet. If they don’t get the resources they need, they and the internet they power, are at risk of falling apart. Corporations (whose products would not exist without these products) should be actively contributing to their maintenance.
1. A technical analysis of the vulnerabilities is out of scope for this post and has already been written by the original researchers.
Computer Security Is About to Get a Lot Worse, Here’s What You Can Do [Deeplinks]
It is a commonly held truth among computer geeks that there is no such thing as bug free software, or a secure computer. Any piece of software that anyone actually uses will have a security vulnerability somewhere in the code. The more complex that software is, the more likely there will be a vulnerability. Fortunately for everyone, finding severe vulnerabilities was generally considered an expensive and difficult task requiring years of training and deep knowledge of how computers and software worked. Until recently there was a steady background hum of vulnerabilities being found and patched, with major vulnerabilities that could cripple the entire internet only happening every few years. Now that is no longer the case.
You may have noticed your nerdiest friends freaking out about the “Vulnerability Apocalypse” this week and waving their arms in panic about something called PHP. You may have also noticed that some of your favorite websites were down for a bit. In the last two weeks of October alone, there have been multiple, potentially internet-breaking vulnerabilities reported and patched. Many of those vulnerabilities were in the open-source software that is the foundation of the vast majority of the internet.
For more detailed information on what happened, and why supporting open-source projects matters, check out our other blog.
This is all because frontier AI models, such as those created by OpenAI, Anthropic, and others, have made it incredibly cheap and easy to find previously unknown vulnerabilities (zero-days) in open- and closed-source code. Three percent of all software vulnerabilities ever found in history were found just in the month of October. This year alone researchers have found nearly a quarter of all software security issues which have ever been discovered.
If exploiting critical software is now cheaper and easier than ever, what does that mean for us as individuals and what does that mean for society as a whole? TL; DR: It’s going to get worse before it gets better. But you can protect yourself with basic digital security hygiene that is now more important than ever.
There absolutely needs to be a bigger conversation about how we got here and how to fix the systemic issues involved, including how corporations that depend on open-source code should contribute to their upkeep, and how big tech should be regulated.
But for now, this news is a compelling reason to tighten up your digital hygiene. A lot of computers are going to get hacked a lot more often, and unfortunately, it isn’t going to get better any time soon. Thankfully, EFF has compiled a comprehensive set of security advice in our Surveillance Self-Defense guides. To start, we recommend making sure your browser and all applications are always up to date with the latest patches.
You should also consider installing a tracker blocking tool, like EFF’s Privacy Badger (now on Safari), and remain vigilant for phishing attempts. Additionally, install a password manager and use unique passwords for each website, so that if one site is compromised, the rest of your passwords are safe. You should also be aware that data breaches may now be more likely, and the websites you visit may experience more attacks than usual, which means that some services may be disrupted.
If you host a blog or other website, make sure that either you or your hosting provider has patched this particular issue.
For additional tips on protecting yourself and others, head over to our Surveillance Self-Defense site. Additionally, if you’d like to support any of EFF’s open-source projects like Privacy Badger, Rayhunter, and Certbot, visit our donate page.
A blog post from Scripting, in Markdown.
Pluralistic: Critique and writing (23 Oct 2026) [Pluralistic: Daily links from Cory Doctorow]
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
Top Sources: None -->

Through my own writing life, nothing has done more to improve my writing than diligent participation in peer-based workshops; that's where a group of writers, all at about the same stage in their artistic development, gather to read one another's work and offer feedback specifically aimed at improving each other's stories.
This is a deceptively simple exercise, and the reasons it works so well are quite counter-intuitive. The most obvious benefit is the way that a workshop encourages you to write at all. When you're at the start of your writing career, you are almost totally reliant upon your own internal self-discipline to keep producing.
Acquiring that self-discipline is infinitely valuable, but it's also incredibly hard. Being part of a group of writers who expect you to regularly turn in new work adds a very useful bit of external motivation that augments your still nascent self-discipline. Knowing you have to turn in a story for the group by Friday can get you in gear when you feel discouraged or blocked.
Before you're getting published regularly (or at all), your critiquing circle might be the only source of validation you get for your work, so the knowledge that you're in for that validation if you get that story in on time is a great motivator. But this is where the counter-intuitive part comes in: as great as it feels to be the center of your peers' attention and to get close feedback on the work you sweated over, that's not the real value you get from a writing workshop, at least not at the start of your career.
Your peers' critiques can help you fix weaknesses in your story, and even teach you a little about how to avoid those weaknesses in future work. You might get feedback that turns an unpublishable story into a published one. But the point of a writing workshop isn't merely to make your stories better – it's to make you better at writing stories.
That's where critiquing other writers' stories comes in. The process of reading and re-reading someone else's imperfect work and devoting real mental energy to figuring out what's not working in it and how to fix it is how you develop the creative instincts that allow you to automatically and unconsciously avoid pitfalls and make breakthroughs in your own work.
Even if none of the feedback you offer is ever incorporated into the story you're critiquing, the act of preparing and delivering that critique is the most reliable fast-track to becoming a better writer yourself. There's something very valuable in the combination of thinking critically, being exposed to other workshop members' ideas about the story under discussion, and working with source material that you can look at with more objectivity because it didn't come out of your own head.
I bring all this up because I've now heard from a few beginning writers who tell me that they're finding LLMs to be good editorial feedback generators. They value the editorial suggestions they get from a chatbot after they finish their work, and use it to help them with a new draft. Without commenting on whether I think LLM feedback is editorially useful (I certainly wouldn't ever ask a chatbot for that kind of feedback), I want to point out that when it comes to improving your writing, getting editorial notes on your work is distinctly inferior to offering criticism of other writers' work.
The reality is that when you're starting out as a writer, the vast majority of work you produce will be artistically unsalvageable. The much-vaunted "million words of crap" you write on the way to becoming a publishable writer are about learning to marry technique to artistic vision and to sharpen both. Getting editorial feedback that helps you shore up the weakest spots in a story that is ultimately never published and constitutes a learning exercise has value, but it has far less value than applying the things you've learned from making and fixing those mistakes to your next story.
With vanishingly few exceptions, a commercially and artistically successful writer isn't someone who writes one great story or novel: a writing career is defined by a body of work, which means that you have to do more than rewrite. You have to write the next thing, and the next thing, and the next.
Having an editor-on-demand of highly variable (and often dubious) quality might help you improve your writing, but it's no substitute for participating in a peer workshop. The idea that an LLM might be able to stand in for a workshop is grounded in the fallacy that the point of a workshop is to have people tell you how to fix your story, rather than analyzing other people's writing in order to develop your own critical skills.
Look: it's a cliche to say "every writer is different," but I really believe that every writer is different, and that's down to the legibility of the writing process to other writers. If you're a painter or sculptor or other visual artist, you've likely spent many hours in a studio with many other practitioners while all of you work from the same life model or still life. If you're a musician, you've almost certainly played music with other musicians. If you're a dancer, you've definitely danced with other dancers.
But writers get precious little exposure to other writers' process. At best we might look at each other's drafts. A musician can listen to every note another musician produces while riffing or composing a new work or interpreting a work. Writers don't get to watch words emerge from each other's fingertips. Being observed that closely while you write would be ghastly and paralyzingly invasive.
I've taught a lot of writers over the years and I've had many discussions with my peers about their writing process, and I'm here to tell you that pretty much every writer finds every other writer's process baffling. We each of us invent an idiosyncratic process for ourselves that will never fully work for anyone else.
So if you value editorial feedback from a chatbot (ideally, a local one running on your computer and not one of the "foundation models" that are torching the planet and elevating the worst people on earth to positions of political, technical and commercial prominence), that's fine, you do you.
But even if that's the case, I still want you to know that whatever you're getting out of the chatbot is fundamentally different, and (I believe) much less useful than participating in a peer workshop.
That's what I wanted to say today, but I predict that an appreciable number of readers are about to email me to ask how these "peer workshops" work. There's a ton of variability in how these are conducted, but the basic shape of them is that in advance of each session, one or more writers submits a finished work to the other writers, who then read through the manuscript at least twice, making notes that include both minor copyedits and broader, thematic notes. They may write a brief editorial response as well, ranging from a paragraph to a couple of pages.
Then the workshop convenes. Each writer briefly expresses their views about the story under consideration, focusing on those thematic and structural notes on what worked and didn't work in the story, with suggestions for improving the latter. You don't need to point out every typo – they're noted on the manuscript. Critiquers don't need to repeat one another. If another workshop member says the thing you were planning to say, you can just say "Ditto what so-and-so said about whatever." If you have nothing to add when your turn comes about, it's fine to pass.
Those are pretty much universal characteristics of a peer workshop. Here are some variations that I am dogmatically committed to, but which other workshoppers might disagree with:
The subject of each session must not speak during the critiques, except to answer direct questions that are not related to the writing itself (e.g., "I couldn't figure out what word this was supposed to be – can you clarify?"). The subject can speak after all the other writers have spoken.
Each person in the critiquing circle speaks once, in turn, without being interrupted. No cross-talk allowed. It is useful to set a time-limit for critiques.
No partial manuscripts. It's not really possible to critique a story unless you have the complete tale. Novels can be workshopped as three chapters and an outline.
Stories should be distributed in advance and read in advance. Don't have writers read their work aloud for critique, as this can lead to critiquing the delivery rather than the material.
Critique the story, not the writer. It's fine to be offended by something in the story, but not OK to accuse your workshopmates of being bad people for having offended you.
Discourage resubmission of revised stories. Workshopping produces sharply diminishing returns. If you really want feedback on a rewrite, approach people individually and ask if they'll read the new draft.
Any group of three or more writers can start a workshop. You'll need to locate writers who are at about the same stage in their artistic and professional lives as you, and find a physical place (or a videoconference service) where you can meet. Library meeting rooms are a favorite, and so is rotating between workshop members' homes. Set a regular schedule – weekly, fortnightly, monthly, possibly quarterly – and stick to it.
If you write genre fiction and you are interested in attending a peer workshop that also has an instructor to guide the sessions, lecture, set exercises, etc, I can recommend the three workshops I've taught:
https://clarion.ucsd.edu/ (I'm also a 1992 Clarion grad)

Online Privacy for Parents and Youth https://ssd.eff.org/module/online-privacy-for-parents-and-youth
the mirage of Thatcherfuturism https://backofmind.substack.com/p/the-mirage-of-thatcherfuturism
The New Canadian Canon https://macleans.ca/culture/the-new-canadian-canon/
Victory! Court Rules OPM Data Disclosure to DOGE Is Unlawful https://www.eff.org/deeplinks/2026/10/victory-court-rules-opms-disclosure-personal-records-doge-unlawful
#25yrsago UK anti-terror laws could bankrupt ISPs https://web.archive.org/web/20011118143634/http://www.vnunet.com/News/1126338
#25yrsago What's an "iPod?" https://web.archive.org/web/20011024015856/http://www.apple.com/ipod/
#25yrsago Bible, Koran or Mein Kampf? https://web.archive.org/web/20011109123124/http://www.salon.com/people/feature/2001/10/24/book_quiz/index.html
#25yrsago Tongan court jester scam costs king millions https://web.archive.org/web/20011224034152/http://pidp.eastwestcenter.org/pireport/2001/October/10-23-01.htm
#25yrsago USPS irradiating the mail to fight anthrax attacks https://web.archive.org/web/20011109100316/http://www.newscientist.com/news/news.jsp?id=ns99991468
#20yrsago Enron Explorer mines Enron’s emails https://web.archive.org/web/20061106204850/http://enron.trampolinesystems.com/
#20yrsago Investigative journal: “Fair use is not applicable” https://archive.blogs.harvard.edu/shlep/2006/10/23/whaddayaknow-about-fair-use-and-copyright/
#20yrsago Warners stiffs African amputee film extras on prosthetics promise https://web.archive.org/web/20061105004400/http://www.nypost.com/seven/10232006/gossip/pagesix/pagesix.htm
#20yrsago Former FCC Chairman shills against Net Neutrality https://web.archive.org/web/20061028043416/http://www.lessig.org/blog/archives/003577.shtml
#15yrsago Plotting advice for fiction writers http://nielsenhayden.com/makinglight/archives/013243.html
#15yrsago DARPA wants vampire satellites to harvest parts from dead sats prior to decommissioning https://web.archive.org/web/20111022223128/http://www.darpa.mil/NewsEvents/Releases/2011/10/20.aspx
#15yrsago Understanding the hyperrich through the lens of tomorrow’s history http://www.antipope.org/charlie/blog-static/2011/10/a-cultural-experiment.html
#15yrsago Scored: pulse-pounding/thought-provoking YA novel about surveillance https://memex.craphound.com/2011/10/24/scored-pulse-pounding-thought-provoking-ya-novel-about-surveillance/
#10yrsago UAE surveillance contractor is recruiting an army of foreign hackers to break into its citizens’ devices https://web.archive.org/web/20161024141138/https://theintercept.com/2016/10/24/darkmatter-united-arab-emirates-spies-for-hire/
#10yrsago Publicly-funded NZ company sold mass surveillance tech to torturers and GCHQ https://web.archive.org/web/20161023101410/https://theintercept.com/2016/10/23/endace-mass-surveillance-gchq-governments/
#10yrsago RIP, Tom Hayden: Yippie, radical, politician, author https://www.bbc.co.uk/news/world-us-canada-37749127
#10yrsago Audit reveals significant vulnerabilities in Truecrypt and its successors https://www.helpnetsecurity.com/2016/10/18/veracrypt-security-audit/
#5yrsago Cyber-mercenaries helped Saudis hack an NYT reporter https://pluralistic.net/2021/10/24/breaking-the-news/#kingdom
#5yrsago The Traitorous Eight and the Battle of Germanium Valley https://pluralistic.net/2021/10/24/the-traitorous-eight-and-the-battle-of-germanium-valley/
#1yrago Checking in on the state of Amazon's chickenized reverse-centaurs https://pluralistic.net/2025/10/23/traveling-salesman-solution/#pee-bottles

Vienna: TED AI, Oct 28-30
https://tedai-vienna.ted.com/
Kilkenny (Kilkenomics), Nov 6-8
https://kilkenomics.com/
Courtenay: Enshittification (Sid Williams Theatre Society), Nov
10
https://www.sidwilliamstheatre.com/events/cory-doctorow-talks-enshittification/
Vancouver: BC Policy Solutions Gala, Nov 12
https://bcpolicy.ca/gala/
Oxford: Ministry of the Future, Nov 23
https://ministryforthefuture.co.uk/events.html
Sheffield: Reverse Centaur at Juno Books, Nov 25
https://www.outsavvy.com/event/40274/cory-doctorow-in-conversation
Virtual: Enshittification, AI, and the Future of Technology (UBC
Master of Educational Technology), Nov 28
https://met.ubc.ca/2026/09/met-speaker-series-cory-doctorow-enshittification-ai-and-the-future-of-technology/
Oxford: Bennett Oxford Symposium on Open Code in Science, Dec
9
https://www.bennett.ox.ac.uk/events/2026-bennett-institute-symposium/
Montreal: World Science Fiction Convention, Sep 2-6
https://montreal2027.ca/en
Life After AI (Brain Bar)
https://www.youtube.com/watch?v=IPPa43-n0vI
Terms of Service with Clare Duffy (CNN)
https://www.cnn.com/audio/podcasts/terms-of-service-with-clare-duffy/episodes/458ce968-af5d-11f0-b539-13ed2afe25f8
AI, Work, and Power (Software Engineering Daily)
AI, Work, and Power
https://softwareengineeringdaily.com/podcasts/cory-doctorow-on-ai-work-and-power/
AI, Corporate Power, and the Fight for Worker Control
(Plutopia)
https://plutopia.io/cory-doctorow-ai-corporate-power-and-the-fight-for-worker-control/
"Canny Valley": A limited edition collection of the collages I create for Pluralistic, self-published, September 2025 https://pluralistic.net/2025/09/04/illustrious/#chairman-bruce
"Enshittification: Why Everything Suddenly Got Worse and What to
Do About It," Farrar, Straus, Giroux, October 7 2025
https://us.macmillan.com/books/9780374619329/enshittification/
"Picks and Shovels": a sequel to "Red Team Blues," about the heroic era of the PC, Tor Books (US), Head of Zeus (UK), February 2025 (https://us.macmillan.com/books/9781250865908/picksandshovels).
"The Bezzle": a sequel to "Red Team Blues," about prison-tech and other grifts, Tor Books (US), Head of Zeus (UK), February 2024 (thebezzle.org).
"The Lost Cause:" a solarpunk novel of hope in the climate emergency, Tor Books (US), Head of Zeus (UK), November 2023 (http://lost-cause.org).
"The Internet Con": A nonfiction book about interoperability and Big Tech (Verso) September 2023 (http://seizethemeansofcomputation.org). Signed copies at Book Soup (https://www.booksoup.com/book/9781804291245).
"Red Team Blues": "A grabby, compulsive thriller that will leave you knowing more about how the world works than you did before." Tor Books http://redteamblues.com.
"Chokepoint Capitalism: How to Beat Big Tech, Tame Big Content, and Get Artists Paid, with Rebecca Giblin", on how to unrig the markets for creative labor, Beacon Press/Scribe 2022 https://chokepointcapitalism.com
"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
Today's top sources:
Currently writing:
"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.
Blog (no ads, tracking, or data-collection):
Newsletter (no ads, tracking, or data-collection):
https://pluralistic.net/plura-list
Mastodon (no ads, tracking, or data-collection):
Bluesky (no ads, possible tracking and data-collection):
https://bsky.app/profile/doctorow.pluralistic.net
Medium (no ads, paywalled):
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
Friday Squid Blogging: Increasing Squid Populations [Schneier on Security]
This article in Nature argues that it’s due to an overfishing of predators and warming sea temperatures.
As usual, you can also use this squid post to talk about the security stories in the news that I haven’t covered.
If Gabe finished your Call of Duty campaign, it must be pretty fucking good. The last time around was functionally a playable meme that didn't line up with the milspec fantasy they typically offer, i.e., a three-story combat knife might fall out of the sky. He says that he spent way longer than strictly necessary inside of a Korean convenience store, and if they're anything like konbini you can spend a very very long time in one. Comparing a 7-Eleven in Japan to a 7-Eleven in Seattle is like comparing an eight ounce, medium-rare filet mignon to roadkill. Now, Gabriel would like to inoculate you against a specific type of content in the game but beyond that he grants whatever wastrel seal of approval he can muster.
[$] The first part of the 7.4 merge window [LWN.net]
Since the merge window for 7.4 opened, there have been 6,753 non-merge changesets pulled into the mainline repository. Many more are expected, especially given the possibility that this merge window will be extended to three weeks. Still, even this initial set brought in a number of new features, in addition to the continued general cleanups and security fixes that the kernel has seen recently.
Why didn’t we use the COM static store to clean up the unmarshalable delegate? [The Old New Thing]
A third suggestion from Luca Bacci on creating a fake agile wrapper that is technically agile but is not useful outside its home apartment was to use the COM static store.
The COM static store doesn’t help us, because the COM static store runs down when the last thread shuts down COM, whereas we want something that runs down when a single apartment shuts down COM.
There is a per-apartment version of the COM static store, but it
is part of the CoreApplicationView, which
is (1) something that only UWP programs have, and
(2) exists only for apartments that have a core application
view, and those are restricted to single-threaded apartments.
Even if there were a per-apartment static store, putting something into it would require generating a unique name and remembering it for later removal. You could probably use the stringified address of the object, with a fixed GUID prefix as a pseudo-namespace. Since we’re dealing with a dictionary, the insertion and removal operations are going to be O(log n) or O(1), depending on the implementation, but even the constant-time version will have a higher constant than a single index lookup in the Global Interface Table.
The post Why didn’t we use the COM static store to clean up the unmarshalable delegate? appeared first on The Old New Thing.
Why didn’t we use CoRegisterInitializeSpy to clean up the unmarshalable delegate? [The Old New Thing]
Another suggestion from Luca Bacci on
creating a fake agile wrapper that is technically agile but is not
useful outside its home apartment was to
use the IInitializeSpy interface.
Some of the thing that made The
RoRegisterForApartmentShutdown
unsuitable also apply to
CoRegisterInitializeSpy. For
example, you are required to revoke the spy from the same thread
that registered it, which means that we have to remember the
original thread so we can somehow get back to executing code on
it.
Another problem is explicitly noted in the documentation for
CoRevokeInitializeSpy:
It is unpredictable whether a call to CoRevokeInitializeSpy from within an IInitializeSpy method call will have an effect during the current top-level (non-nested) call to CoInitializeEx or CoUninitialize.
This is the same problem we had with
RoUnregisterForApartmentShutdown
function, in the case where the original object’s destruction
in turn triggers an attempt to revoke an initialize spy: It revokes
the spy, thinking that this will stop the callbacks, but in fact,
the callback might still happen.
It also suffers from the same implementation issue regarding the number of initialize spies: Registration is O(1), but unregistration is O(n) because it does a linear search through a linked list. The assumption is that initialize spies are rarely unregistered before they are triggered.
But there’s an even bigger problem that makes this completely unsuitable for using an initialize spy to clean up an object at apartment shutdown, and maybe you noticed it in the earlier discussion.
Initialize spies are registered on a per-thread basis, not per-apartment.
If the original object is in the multi-threaded apartment, then it’s wrong to give up the object once the original thread uninitializes COM, because it might still be kept alive by another thread.
Also, a thread may change apartments over time. For example, if you are not in the neutral apartment and you call into an object that is in the neutral apartment, then there is no thread switch. COM merely removes your thread temporarily from whatever apartment it is in and puts the thread into the neutral apartment for the duration of the call.
Now, if the thread had previously belonged to a single-threaded apartment, and somebody makes a call into an object on that single-threaded apartment, COM may temporarily remove that thread from the neutral apartment and put it back into the original single-threaded apartment for the duration of that call.
A thread may move between apartments during its lifetime, but
the IInitializeSpy is tied to the thread, not to
the apartment.
This means that if the non-marshalable object happens to live
in, say, the neutral apartment, you would be given that object in
the neutral apartment, and you would register your
IInitializeSpy against the thread that is
currently running. When that thread uninitializes COM as a
single-threaded apartment, your PreUninitialize
would be running in that dying single-threaded apartment, but it
can’t clean up the object because the object is in the
neutral apartment, not the single-threaded apartment.
So yeah, IInitializeSpy doesn’t really
help.
The post Why didn’t we use <CODE>CoRegisterInitializeSpy</CODE> to clean up the unmarshalable delegate? appeared first on The Old New Thing.
Two States Can Now Restrict Social Media Access—Here’s What To Do Next [Deeplinks]
Last week, two federal appeals courts issued opinions that will allow Florida and Georgia to start enforcing laws that will age-gate and block young people from accessing social media. The laws do not adequately respect minors’ rights to play, speak, and learn online. More fundamentally, these laws don’t help young people stay safe online—a goal that lawmakers should pursue.
Age-Gated? Email EFF at agegates@eff.org.
Because of the new laws, some young people will lose their ability to access lawful information, find their online communities, and even engage with school board members. Others will need parental permission to stay online. And adults will face increased demands to prove their age, which will put their privacy at increased risk simply to continue to use the services they already use.
We opposed these laws because they threaten the free expression and privacy of both minors and adults. Even though these lawsuits are not over, the injunctions that paused enforcement have been lifted, and the states of Florida and Georgia will now be able to enforce broad restrictions on social media use.
The restrictions that these states will start enforcing are a setback for the rights of all internet users, but they are not written in stone. That’s why EFF is encouraging internet users - and particularly young people – to start keeping a record of how they are affected. If you are a teenager who loses access to an online discussion, can’t participate in a political campaign, or stop seeking information because you don’t want to upload personal information, document what happened. The same is true for adults who may be mistakenly blocked by age checks, and parents who may encounter obstacles to authorizing their children's use of online services. These experiences matter. They can help us show courts, policymakers, and the public what government restrictions on online expression actually cost the people who live under them.
Hopefully, with enough proof of the expressive harms these laws cause, we can push lawmakers to rescind them. That’s why we’re encouraging folks to reach out to EFF once they’ve documented these harms. You can write to us about this issue at the email address agegates@eff.org.
These two opinions, issued by the same panel from the U.S. Court of Appeals for the 11th Circuit, allow Florida and Georgia to enforce restrictions on social media accounts for people under 16 years old. The requirements differ by state.
In Florida, the judges allowed that state’s H.B. 3 to move forward, which requires covered platforms to ban anyone under 14 from opening or keeping accounts—even with parental permission. Teenagers who are 14 or 15 can have accounts only with parental consent. To be covered, a platform has to use algorithms, allow content uploads or the viewing of other peoples’ content, and have at least one feature on a list of features the state considers bad, including livestreaming, engagement metrics, autoplay, infinite scrolling, or push notifications. These requirements effectively apply to every major social media service that young people use.
To the extent there is a silver lining in the ruling on Florida’s law, it’s that the panel recognized that H.B. 3 targets expression protected by the First Amendment. The problem is that the ruling uncritically accepts the idea that a social media service is addictive in a clinical sense, even if just 10% of users under 16 are using the platform for two or more hours per day (the standard set in H.B. 3). The court simply accepts that time spent online is a proxy for harm. The bill doesn’t distinguish doomscrolling or compulsive use from organizing a campaign, making art, or talking with friends.
In Georgia, S.B. 351 can now be enforced. That law requires parental consent for anyone under 16 to hold an account on social media platforms. It also requires platforms to make “commercially reasonable efforts” to check users’ ages, which creates a hurdle for adults as well as under-16s.
The ruling acknowledges that S.B. 351 “overwhelmingly applies to platforms that overwhelmingly host protected speech.” But the ruling faults the plaintiffs for not being able to show that “invalid applications substantially outweigh the valid ones.” That asks the groups challenging the law to meet a virtually impossible standard—to make their case, they would have to measure and evaluate the content hosted by all online services affected by the law.
Both of these cases may be further appealed, and are likely to continue in the lower courts. But people in Georgia and Florida can no longer count on court injunctions to protect their access to the web. What the effects will be going forward depends on how platforms implement these new restrictions, including how they check ages and parental consent, as well as state officials’ views on these efforts.
If you hit an age-gate while online, check out our blog post about how you might want to proceed, and our age-gating resource hub. If you want to speak out about your experience, you can talk to us at agegates@eff.org.
Some youth who lose their social media accounts will lose contact with friends. Others will lose access to a support group, the ability to speak out on current issues, or an audience for their artwork. More young people will be shut out of discussions about what’s going on in their school and their community. U.S. law has long recognized that people under 18 have their own rights to speak and receive information. These new laws interfere with those rights.
The Florida opinion suggests that young people can browse the internet without an account, or use a parent’s account. But that doesn’t help those who might participate in a private group, send a personal message, or speak to an audience they have built up. Nor does it recognize the reality that in many households, young people may not have the ability to use a parent’s device, or even have healthy relationships with their parents. For parents of children under 14, the Florida law also overrides parental autonomy—even if parents wanted to allow their child on these services, they cannot do so by law.
These laws won’t just harm younger kids. Adults and older teens will bear the cost of the new rules. In order to figure out who is young enough to not be able to join, or who needs parental consent to join, services will have to check users’ ages. That likely means asking people to submit ID or other sensitive information. Some people will be mis-classified as too young; others will decide that they’d simply rather stop participating instead of handing over even more personal data.
Between the recent Meta settlement and these 11th Circuit decisions, despite widespread opposition, age-gating is becoming a reality for the American internet. As these laws are enforced, we need to understand what they mean for the people who have to deal with them. And we need to create a record of their effects on everyone’s speech so we can push to repeal them.
If you encounter a restriction due to these laws that affects you, keep a record, ideally while the details are still fresh in your mind. Screenshots, along with notes about the date and time, the service involved, and the task you were trying to accomplish, will all be helpful.
Did you lose an account or can’t participate? Describe what you lost. Were you using a group to organize a club, volunteer in your community, or keep in touch with friends? Did losing your account cut you off from people you wouldn’t otherwise be able to be in touch with? Even if you just used the account to access local news or follow your favorite content creator, that’s still a significant loss of your right to access information online.
Record problems with age checks and parental consent. What information did the service request from you? Were you able to provide it? Did it reject your age proof, or classify you incorrectly? If you’re a parent, were you able to give permission, and what did you have to provide? What promises did the service make about what it did with the data it collected from you? Save explanations given by the platforms or any services they employ to age gate, including any law they cite. If you are to appeal a result and choose to, keep track of those attempts as well.
You can also document choosing to drop out. If you abandon an account or service because you’re unwilling to provide ID or other personal data, write down what you gave up, and why. You don’t need to submit sensitive information to show that you are burdened by new rules.
If these restrictions affect you, we encourage you to reach out to EFF by emailing agegated@eff.org and telling us more about what happened.
EFF will continue to oppose laws that prevent adults and minors from expressing themselves online, or that push people to give up their privacy to participate in the digital world. These recent court decisions are setbacks, but they don’t settle the debate. By keeping track of people who lose access, age-check failures, and the online conversations that can no longer happen, we’ll be in a better position to challenge the worst of these restrictions, in both legislatures and courts.
And in the meantime, EFF will keep fighting for laws that actually make us safer online—like stopping social media companies’ harmful surveillance of all internet users. We’ll continue to push for laws that empower parents, children, and all internet users to have meaningful choice and control over their online services. Those goals can make everyone safer online, while preserving our ability to speak and access information.
Owners, Not Renters: Raffi Krikorian on Open Source AI [Radar]
Raffi Krikorian, Mozilla’s CTO, joined Tim O’Reilly at our recent AI Codecon to talk about open source AI. Mozilla, of course, is the nonprofit that helped to define the open source revolution back in the late 1990s. Though its Firefox web browser was superseded as the market leader by Google Chrome, it played an essential role, along with Apache and the World Wide Web Consortium, in establishing the open standards of the web and keeping it from being dominated and enclosed by Microsoft, the dominant tech platform of that time. Now, Mozilla is one of the leading voices working to build an open, standards-based AI ecosystem.
Tim has long appreciated Raffi’s thoughtful, human-centered approach to technology. Raffi writes a newsletter called Owners Not Renters, whose message can be summed up by his statement that he doesn’t want a future with seven AGIs. He wants one with seven billion. He wants each of us to have an AI that we can trust with our secrets and that will look out for our interests, not an AI that’s optimized for the business model of its creators. In the early days of the web, we called the browser a user agent for a reason, Raffi said. It was on your side. It let you render pages however you wanted, managed your privacy and your cookies, and did its best to protect you from those who wanted to take advantage of web users. We need the same thing in the age of AI.
Raffi cited a paper in which researchers tested whether AI assistants could be trained to favor a company’s commercial interests over user welfare. In simulated flight-booking requests, 18 of 23 models recommended a more expensive sponsored option over a cheaper one more than half the time. It’s a hypothetical choice that we’ve seen play out time and time again, in industry after industry.
Open source AI is a big part of what it will take to get to Raffi’s vision. But sovereign AI loyal to each individual needs more than open source models alone. Raffi’s list of what has to be built around the model starts with memory, a place where your private data can live. It includes tool calling, so an agent can make a purchase or book a doctor’s appointment for you, the runtime environment where all of that runs, and the rules for how his agent talks to those working on behalf of others. It needs a harness. “That’s where evaluations happen. Guardrails happen, execution loops happen, tool calling happens, memory,” he explained. “All of that stuff is an opportunity, in my mind, of things that open source developers can be building.”
People hear the word “harness” and conclude that we need an open source version of whatever the proprietary labs are building. Tim asked Raffi whether a user-centered harness might do different things than those offered by the big labs. He agreed. The whole point of open source is for people to “scratch their own itch.” The ability to innovate without permission is the heart of the open source promise.
As a result, Mozilla wants to build a starting point. It aims to help the community define what an open memory protocol, a storage protocol, or authenticated tool calling with the right guardrails ought to look like. As Raffi noted, “Once we could define what those open standards look like, then a whole plethora of people can start playing and be interoperable. It’s basically. . .the internet all over again. We can build trillions of dollars of market cap on top of open protocols.”
Ease of use is still lacking, though. Mozilla’s 2026 State of Open Source AI report says open models are now within about 3% of the frontier, yet they don’t make it into production at the same rate as closed models. When Tim asked why, Raffi explained that open source is easy to release but hard to deploy. Developers still have to figure out hosting, provisioning, guardrails, and memory. With OpenAI’s or Anthropic’s API, you just hand over a credit card. What’s missing, he said, is the equivalent of a double-click installer for getting open source AI running inside an organization. But the companies that do the work to adopt open source AI are seeing big savings because open models are already good enough for most use cases. As Raffi put it, “You don’t need a Ferrari to manage your calendar.”
Raffi’s own daily agentic helper is Hermes running on GLM. He expects that Apple, Microsoft, or someone else will make this kind of agent into a consumer product in a couple of years, and that his mom will end up using it. For now, he said, we’re on the wrong part of the innovation curve, where you have to know how to code to get any of this working.
Tim disagreed. The industry goes through periods that are exciting for developers, creators, inventors, and companies trying to invent the future, and then it gets boring and a few big companies dominate it. We’re in the exciting part, he argued, before everything shakes out. As Raffi riffed, this is when we get to formalize what that future should look like.
Tim wasn’t sure that we’ll need a commercially supported version of the kind of “roll your own” agentic rigs now favored by independent developers. After all, neither desktop Linux nor OpenOffice turned out to matter anything like as much as open source developers of the time expected. Instead, open source became the foundation layer for a new generation of web-based applications. It’s hidden way down in the guts of Google, Amazon, Meta, and countless other applications we rely on today.
This is already beginning to happen again with AI. The Mozilla report says that as much as a third of real-world usage is already on open models, although only 4% of model-layer revenue made its way to the open source ecosystem. Tim called the discrepancy a feature rather than a bug, and Raffi agreed that the stat is misleading. As Tim pointed out, many of the most important technologies “create more value than they capture,” and he used Steve Baer’s concept “The Clothesline Paradox,” from a 1975 article in Stewart Brand’s CoEvolution Quarterly, to explain why we’re good at measuring value capture but not so good at measuring value creation.
Baer pointed out that if you put your clothes in the dryer, the energy you use is measured and counted, but if you hang them on the clothesline to be dried by the sun, the energy saved disappears from our accounting. This argument resonated with Tim in the early days of his open source advocacy. As he noted, it’s always bothered him that nobody seemed to recognize that open source software didn’t “win” in the same way as proprietary software. It won by becoming the foundation everyone else builds on.
Raffi’s comment that we’ve made a category error by treating AI as a product fits right in with this line of thinking. If an AI company goes out of business, its product disappears. If it changes its business model, it may yank features you depend on. It’s not just individuals who need sovereign AI. Countries are passing laws about where data can be processed and how it moves in and out, and some of those requirements may not be compatible with the way the big labs plan to monetize their technology. What those countries are asking for is infrastructure. A road outlasts the contractor who built it. Raffi thinks open, downloadable models are the only way to provide long-lasting foundational infrastructure.
According to OpenRouter stats, Chinese models now supply more routed tokens than American ones. Tim asked whether we should worry about that. Raffi said the problem isn’t China but market concentration. The leading open models are from China. The leading closed models are all American. Access to either can be cut off by an executive order. We saw a version of that in June, when Anthropic temporarily suspended access to its Fable models to comply with export controls. It’s a problem that both the leading proprietary models and the leading open-weight models are each concentrated in a single country.
Diversity is one foundation of resilience. Raffi argues, for instance, that hospitals should all download a local model as a backup. None of us would run an important computer without an uninterruptible power supply, so why would a hospital doing triage with AI rely on a single intelligence provider? There are a lot of possible rug pulls. The government could restrict open source or restrict the frontier models. Having a backup plan is a good idea.
Safety is also part of the foundation. During the Q&A, an audience member asked about the recent sandbox escapes at OpenAI and Anthropic. Raffi joked that the best part was watching everyone try to one-up each other with accounts of how powerful and hard to control their models are. But he agreed that guardrails are actually a hard problem. Keeping personally identifiable information from leaking out through an LLM call means looking for much more than Social Security numbers. Eventually we’ll have models defending models, but the foundational frameworks for guardrails aren’t good enough yet. (NVIDIA’s safety platform announcement, released after Raffi and Tim’s conversation, suggests that better guardrails need to be implemented outside the model.)
Tim opened AI Codecon by noting that open and closed systems have always coexisted, and that the idea that one of them will win is a mistake. Closed systems, like Apple’s, Google’s, OpenAI’s, and Anthropic’s, can optimize for ordinary people and deliver value to billions. Open systems are better for innovation and sovereignty, and for pushing technology into new countries and new markets.
Raffi closed the conversation by observing that a well-tuned harness can improve model performance by as much as 20% on some coding tasks. You don’t have to be a machine learning engineer to make a difference at that layer.
PSPP 2.1.3 has been released. [Planet GNU]
I'm very pleased to announce the release of a new version of GNU
PSPP. PSPP is a program for statistical analysis of sampled
data. It is a free replacement for the proprietary program
SPSS.
Changes from 2.1.2 to 2.1.3:
Please send PSPP bug reports to bug-gnu-pspp@gnu.org.
Reproducible Builds (diffoscope): diffoscope 335 released [Planet Debian]
The diffoscope maintainers are pleased to announce the release
of diffoscope version 335. This version
includes the following changes:
[ Chris Lamb ]
* Support the dumppdf binary being called dumppdf.py on the host system.
* Update copyright years.
* Fix a silly "prepend" typo.
You find out more by visiting the project homepage.
The web of Markdown, part 3 [Scripting News]
Previous posts on this topic: Oct 6 and Oct 8.
What's new? I've got a browser running, and have been using it for a few weeks. We're not releasing it today because first I want people to think about the format we're using to represent a story, and get feedback, and see if other people can build on the same basis.
Three things to look at today.
And if you have questions or comments.
[$] Seeking smaller kernel stacks [LWN.net]
Memory has always been a scarce resource in computing systems, but the problem seems to have worsened recently. In particular, the worldwide shortage of memory chips has led to a renewed focus by systems developers on reducing memory usage. During the memory-management microconference at the 2026 Linux Plumbers Conference, Will Deacon discussed one specific consumer of memory that is being re-examined: kernel stacks.
Is TOTSCO fit for purpose [RevK®'s ramblings]
I have explained many of the issues with TOTSCO - the company that does "One Touch Switching" for UK broadband and telephone services.
My main gripes have been over the unbelievably poor specifications and stupidly inadequate processes for accrediting CPs to connect to the One Touch Switching system. This is partly why I made a testing system (NOTSCO) free for CPs to use, and have actively helped many CPs as a "buddy CP" for what testing there is. I am trying to make this work for everyone.
But it gets worse.
TOTSCO are actively refusing to pass on a simple message to another CP that is failing to meet the OTS specification.
In this case it is such an egregious failure one has to wonder how even the inadequate TOTSCO process got this CP on the system. No I am not naming the CP. The error is as basic as they come - a residentialSwichMatchRequest getting a residentialSwitchMatchConfirmation but without an actual switchOrderReference (or implicationsSent). This is the most basic function of OTS and is broken beyond belief. The CP should be REMOVED from the platform until they can show they can actually comply with the spec, and more importantly TOTSCO should have always been testing CPs do, in fact, comply with the spec. Failing to do so is unbelievably irresponsible.
They cite "security", but they is ZERO security issue with passing on such a message. And no GDPR issue either. Their refusal is baffling.
What is crazy is they do operate a "CP to CP" communications system, but signing up for this is not mandatory. When CPs do sign up TOTSCO WILL pass on messages. This highlights that passing on messages is not a security issue. So why not pass one based on a simple email when a CP is not signed up to "CP to CP" communications. There is no justification for this.
If TOTSCO are absolving themselves of ANY RESPONSIBILITY for policing ANY compliance with the One Touch Switch specification, whose job is it? It is not my job as a CP.
So who do we turn to - perhaps OFCOM. Maybe OFCOM will decide TOTSCO are ignoring the most basic responsibility for addressing CPs not complying with the OTS specification.
Should OFCOM police this somehow?
Note this is not the first instance of TOSTCO being so stupid - we have another CP failing to meet the OTS specification that is likely a GDPR breach. They REFUSE to tell the other CP. I have now contacted the ICO (no reply yet). But why REFUSE to pass on such a basic message (not personal data in the message and no security issue).
This needs fixing - OFCOM you need to fix this.
Security updates for Friday [LWN.net]
Security updates have been issued by AlmaLinux (buildah, expat, grafana, grafana-pcp, httpd, iperf3, openssh, php, php8.4, php:7.4, php:8.2, and php:8.3), Debian (aide, chromium, clamav, erlang, linux-6.12, roundcube, unbound, and webkit2gtk), Fedora (bind9-next, ca-certificates, clevis-pin-trustee, golang-x-mobile, knot-resolver, maradns, ntpsec, php, socat, and vlc), Mageia (golang, jq, msgpack, open-isns, perl-Mozilla-CA, roundcubemail, and sudo), Oracle (.NET 10.0, .NET 8.0, .NET 9.0, cockpit-files, cockpit-machines, fetchmail, glycin-loaders, golang, jackson-core, librsvg2, mariadb11.8, openexr, openssh, php, php8.4, php:7.4, php:8.2, php:8.3, postgresql:16, qt5-qtbase, rust-sequoia-sq, and xorg-x11-server-Xwayland), Red Hat (ca-certificates and opentelemetry-collector), SUSE (aliyun-cli, amazon-ecs-init, bcel, coreutils, cups-filters, cyrus-sasl, distribution, expat, firefox, go1.26, go1.26-openssl, go1.27, guava, mutt, nvidia-open-driver-G07-signed, p11-kit, php74, php8, podman, python-soupsieve, python313-datamodel-code-generator, python313-Django5, thunderbird, and webkit2gtk3), and Ubuntu (openvpn, python-tornado, and zlib).
The Agentic Software Factory Hierarchy of Needs [Radar]
The following article originally appeared on the Vanishing Gradients Substack and is being republished here with the authors’ permission.
Stripe’s Minions turn engineering requests into candidate pull requests. Ramp’s Inspect puts coding agents to work in the background, with tools to check their changes. Warp Factories takes work from tickets and chat through agents, checks, and human review. Agentic software factories are here.
Are you sick and tired of babysitting Codex, Claude Code, or OpenClaw?
Do you have agents that can build features, but still leave you responsible for remembering where they stopped, explaining how each feature fits the project and deciding what happens next? You make progress in each conversation, then development waits for you to return.
It doesn’t have to be this way. A software factory lets you delegate more of that process!
You agree on an outcome, give the system the context and authority it needs, and let it work while you do something else. When you return, there should be a result you can inspect, with evidence of what was checked, or a specific reason the work could not continue. Your next conversation can then focus on the result and the decisions that remain.
As we’ll show you, your first software factory doesn’t need to be that complex at all: It can begin with a single agent and an automation.

The defining combination is autonomous and asynchronous execution.
A scheduled job can run without you. A coding agent can choose and revise an approach during an interactive session. A factory combines those capabilities, with enough context, tools and feedback to carry out the delegated work.
Software factories have been hypothesized for decades. Now that we have agents, we’re actually able to operate them. The principles apply to software work traditionally carried out by teams of humans, from bespoke tools for teams and individuals to large and complex software systems.
To illustrate these principles, we’ll use an invoice tracker throughout this article, an application we’ve needed for our own businesses. The same approach applies to research tools, publishing systems, and software for teams. Suppose you run a small business and want an invoice tracker that fits how you work.
Build an app that creates invoices from my template and tracks which are unpaid, paid, or overdue. Keep it local for now. Preserve the records when it restarts, and show me checks that the totals and payment statuses are correct.
You can agree on this brief with the agent, leave it to work while you do something else, and return to the app and evidence of what was checked. If a check fails, it can investigate and adjust within its agreed scope. If it encounters a product decision it cannot make, it should bring that question back to you.
You might imagine a clean separation: The factory builds the invoice tracker, then the finished app does its job. That’s one way to run it. But agents can also help operate the software they build, and that combination is useful.
The tracker can store invoices and calculate outstanding balances. An agent can use those records alongside customer correspondence to prepare follow-ups: One customer has promised to pay on Friday; another is disputing a charge. You don’t need to turn every situation into a new software feature before the agent can help. You give it the relevant context, authority, and a way to check its work.
This changes what you need to build! Some behavior belongs in code, such as calculating balances consistently. Other work can be delegated to an agent that responds to the circumstances. If a recurring need emerges, you can ask the factory to build it into the software. The factory builds tools that agents can use, and experience using those tools helps you decide what to build next.
You still decide what is worth building, who it should serve and which trade-offs matter. Agents can help you make those decisions too. The practical change is that implementation can proceed between your conversations, including running checks and responding to failures.
This makes factories relevant to people with product, business or creative expertise as well as engineers. You might know exactly how you invoice clients, record payments, and chase overdue bills while having little interest in writing software. That knowledge lets you direct the factory toward software that fits your business, including the exceptions and connections that general-purpose tools handle poorly.
At every layer: specify what you want and how
success will be checked, then verify the result.Monica Rogati’s original AI hierarchy of needs described the foundations beneath successful AI work. We find that dependency framing helpful for factories too, with four different layers.
Automation needs a harness able to do the work, plus direction about what to do. Continual learning needs runs to inspect and a way to put improvements into use. These capabilities can develop together: A familiar harness, a short brief, and a basic automation are enough to start. You can personalize further as work reveals what is missing.
Two practices run through every layer: specification and verification.
Agents can help you refine the specification and perform the checks. Your role is to decide whether the requirements capture what you need and whether the evidence supports accepting the result. As the factory takes on more work, these practices give you a way to direct it and assess what comes back.
Let’s now see what’s up in each layer.
First, you’ll need an agent harness. If you’re using Codex, Claude Code, Hermes, or OpenClaw, you already have one. It gives the model tools to read and edit files, run your software, and see what happened.
For our invoice tracker, the agent can build the app, create an invoice, record a payment, and restart it to check that the invoice and payment records survived. If a paid invoice still shows as overdue, it can investigate, fix the problem, and try again. You shouldn’t have to narrate every step. But if it needs a decision about how your business handles partial payments, that’s a question for you. If it lacks access or authority, the agent should stop and name the blocker.
You’ll also need somewhere for the harness to run. A cloud machine lets the agent keep working while your laptop is closed or disconnected. You can also run it on your own computer, but the machine needs to stay awake and connected for the work to continue.
Next, give the agent the context it needs to work your way. For our invoice tracker, that means your template, payment terms, and conventions for recording payments. You don’t want to explain all of that again every time you start a new task.
Keep it somewhere future workers can find it:
An instruction file such as AGENTS.md can point to this material. OpenAI’s harness-engineering account describes using a short guide that points into maintained project documentation. Give a new or scheduled worker a small task and check that it actually follows the guidance.
Be specific about when instructions
apply. Eleanor once told an agent to write tests, and it wrote
tests for a README. Enthusiasm wasn’t the problem 
You’ll also need to set permissions and sandboxing to control what the agent can access and execute. Written instructions alone don’t enforce those boundaries.
One agent works in the background; you assess what
comes back.Now let’s give the factory a way to get started without waiting for you. A schedule or event can launch an agent with its brief, project guidance, and tools. You come back to a result, evidence of what was checked, or a specific blocker that needs your attention.
For our invoice tracker, a morning automation could check a saved task list and pick up the next agreed task, such as adding partial payments. You’ve decided what you want and how success will be checked. The agent gets on with it while you do something else.
There are a few practical details to get right. Don’t start the same task twice, leave an empty queue alone, and set limits on time and spending. Save progress so a later session can continue without you having to reconstruct the whole conversation.
One worker may be plenty. But perhaps you have independent tasks that could run in parallel, or you’d like another agent to review a change. That’s where coordination comes in.
Coordinate ready work, then check the combined
result.With several agents, everyone needs somewhere to see what’s ready, what’s underway, and what’s waiting on something else. A shared task list or issue tracker can hold that information. You agree which tasks are ready; a coordinating agent or automation assigns them, supplies the relevant context, and records what happens.
Suppose one task adds partial payments, another overdue follow-up emails, and a third PDF exports. Follow-ups need the correct outstanding balance, so they wait for the payment behavior to be checked. PDF exports might proceed independently if the changes don’t overlap.
You can also split the roles. One agent builds the feature while another prepares payment scenarios to test it. A third might review the completed change.
Assign responsibility for combining the changes and verifying the whole application. Different questions call for different checks. Deterministic tests can establish whether balances are calculated correctly and payments survive a restart. Agent verification can help identify missed requirements or inconsistencies across the changes. Human judgment can assess whether the workflow fits how you actually work. You’ll often want a combination, with more than one kind of check on the same result. Anthropic’s evaluation guide describes these complementary approaches: code-based checks, model-based checks, and human evaluation.
Combine deterministic checks, agent verification,
and human judgment according to what you need to
establish.Once you’ve checked that the combined features work together, you might task your factory with building a phone-friendly interface so you can check invoices and record payments on the move.
The factory can also help run the invoicing workflow as well as improve its software. A scheduled agent could review overdue invoices, consult customer correspondence, and prepare follow-ups for your approval. If that work repeatedly requires information the tracker doesn’t record, you can give the factory a task to add it. Building and operating feed into one another: Agents use the software, and what happens in use informs its next improvement. This brings us to continual learning.
Use run evidence to test and adopt improvements to
future work.Your factory can also get better at how it works. Suppose payments disappear after restarting the invoice tracker, even though the agent reported that its checks passed. You’ll want it to fix the bug, of course. But why did its checks miss the problem?
Keep a record of assignments, checks and difficulties so a review agent can identify recurring problems and propose improvements. Did the worker lack a way to restart the app, or did it simply skip that check?
If it skipped the check, the agent could propose a skill that saves a payment, restarts the app, and verifies the remaining balance whenever a change affects stored records. Test it against the original failure, then on further tasks. Does it catch problems with stored customer details too? Does it avoid unnecessary checks when a task only changes a heading?
The results help you decide whether to adopt, revise, or reject the method. Apply changes within the authority you’ve agreed and keep them reversible. Warp’s self-improving factories illustrate this approach: Failed checks can lead to proposed changes to prompts, skills, or configuration, submitted for human review with evidence from the runs behind them.
Reassess methods as the project and model change. Anthropic’s work on long-running application development describes removing procedures as model capabilities improved and checking the effect.
A saved lesson needs to reach later workers and improve their results. This learning happens through changes to the instructions, tools, and methods around the model, without requiring the model itself to be retrained.
Your factory could build a research tool that collects sources and lets you assemble briefings, a family intranet for shared plans and documents, or a private community space. Start with something useful to you, then give the factory further work as you discover what’s missing. Agents can also help operate what you build, from preparing a research briefing to organizing incoming material.
Hugo uses this combination to run Vanishing Gradients, his media and education business. After a guest prep call, an automation retrieves the transcript and prepares interview topics, questions, titles, and thumbnail options for review. After a live stream, agents can propose clips, cut video, add captions, and prepare upload drafts. Saved editorial guidance and skills shape the work; Hugo chooses what to publish.
He also maintains the system, improving checks when agents miss instructions, and updating skills based on results. More autonomous continual learning remains something he’s exploring. He describes the setup in How I Built a Media Empire With an Agentic Software Factory.
What’s one simple task you do repeatedly for your community, audience, or business that you could start automating?
Look at what keeps bringing you back to the work. If the agent cannot run the app or inspect a failure, improve the harness. If you keep repeating project context and decisions, personalize it. If development waits for you to start each task or manage every handover, add automation. If the same failures recur across runs, build a learning loop that changes how later work is done.
Start with work you care about and inspect what comes back. One agent can use all four layers. Add capabilities where they help you delegate more useful work while keeping specification and verification part of the process throughout.
We would love to help you put these ideas to work in Build Your Agentic Software Factory. You’ll set up a factory that can work while you’re away, build software around something you care about, and learn to verify and improve what it produces. We’ll work with you through live workshops and office hours, alongside a community of fellow builders. Bring your own idea or choose a starter project. No coding experience is required.
Compromised TLS Certificates [Schneier on Security]
The Indian CA eMudhra Limited has eight TLS certificates with laughably weak private keys:
The compromised eMudhra keys were defective at a level that’s challenging the imagination of many of the engineers studying the incident. A normal size for a NIST P-384 elliptic curve cryptography private key contains roughly 384 bits of entropy, a size allowing almost 2384, or a number with 116 digits, different possibilities. The private key sizes of the compromised keys ranged from 3 to 8 bits. Astonishingly, the private keys were 4, 56, 66, 115, 155, 156, 230, 237.
“That is extremely in the ‘this should not be possible’ category,” Valdorda said. “Maybe some horribly dangerous key generation interface has a ‘size’ parameter and they set it to 1 by mistake???”
Ben Cartwright-Cox, director of BGP.tools, said: “My guess is that it’s example code that accidentally leaked to production, but hard to know. But it’s bonkers that no one noticed.”
At this early stage, the most immediate threat appears to be for those using VPNs, especially in countries with governments likely to maliciously intercept traffic. There are likely many other cases for concern. End users largely have no recourse other than to hold off using many non-browser forms of TLS communication until they receive assurances updates are in place.
The whole certificate regime has long been a mess:
The incident is the latest to expose a fatal flaw in the TLS regimen. It’s only as strong as its weakest link, which in this case was eMudhra. Fortunately, transparency logs account for much of that failure, but this measure requires parties to actively monitor massive feeds and works only after unauthorized certificates have been issued. eMudhra representatives weren’t immediately available to answer questions.
One caveat: exploiting compromised certificates requires an active adversary-in-the-middle attack, meaning the attacker must act as a proxy between two TLS parties and receive encrypted traffic, decrypt it, reencrypt it, and send it to the other party. Such capabilities, in some cases, are usually limited to only the most well-resourced attackers. People with control of a local networkat a coffee shop, university, or other organizationface much less of a challenge.
Cleanup of this is going to be another mess—and it’s right on top of the PHP vulnerabilities.
My Super Mid-Life Crisis – Issue 1 – 04 [Comics Archive - Spinnyverse]
The post My Super Mid-Life Crisis – Issue 1 – 04 appeared first on Spinnyverse.
Error'd: It's About Time [The Daily WTF]
Usually I have to save up a few weeks' worth of error'ds to get five of a kind, but this week we got a rash of funky date entries! I guess we were due.
First up Tim R. reminding us here that "Dates are difficult! ...but when the entire purpose of your web site is to convert the time to different time zones, I'm not inclined to give you much slack for being one hour out."
And an anonymous reader who just doesn't trust big tech. "In my calendar I have a monthly reminder to clear my data MS data manually. Now you know why, although I don't expect this will come as a surprise to anyone." Note the date on the lower right of the screenshot.
"June has 30 days, so 31 was not accepted," repeats Daniel D. incredulously. "I needed to calculate day difference between two dates. So I entered June 30 (as shown) only to get this error message. Now - should I trust that calculator to calculate date differences, what you say?"
Daniel D. went on to share with us a couple of images from "A well-known e-commerce website in Central Europe that allows you to filter by battery life! Only it randomly switches to seconds." Yes, randomly. See the second image too.
And finally this week, Marc Würth identified a novel Network Solutions Domain History Date Format(TM) "In other places, they displayed dates formatted as "01/13/2025", for example. I guess, instead of using actual ISO 8601, they just flipped the order and replaced the slashes with dashes."
Plot bunnies needed [Judith Proctor's Journal]
Later this year (or possibly early next year) a friend and I will start GMing a game of Star Kingdoms.
It's a game designed by a couple of friends and a game generally takes about 2 years with a two week turnaround.
It's a space exploration, combat, role playing game. 6-8 players design their own race/cultures, set out to explore space, meet other cultures, interact with them, colonise new worlds, investigate strange anomalies, etc.
Some parts of the game (economy, combat, movement) are highly
automated, but the role-play aspects are hand-moderated.
There are several NPCs
Recent games have tended to have some large/difficult issue that needs several players to work on it at the same time. eg. A large, nasty enemy that is very hostile and needs a large space fleet to defeat. A twin star system where the two stars are about to collide and cause a supernova (they actually found a solution that worked within the laws of real physics and pulled it off with just one turn to spare.).
Some have worked better than others. The problem is to find a problem that is just big enough to be solved, but not too massive to be impossible.
The catch is that we're running out of cool ideas that haven't already been used in previous games.
Any suggestions?
Any physical threat must not tamper too much with the laws of physics (jump gates exist, and their mechanism can be anything we like, as long as it's consistent for the duration of a particular game. Game before last, the jump system was build and maintained by a giant spider who could move a little between dimensions. She was willing to tamper with the system for players who offered apropriate bribery - turned out that what she really wanted was babysitting for large numbers of baby spiders....)
There are game mechanics for manipulating social principles. Societies with radically different beliefs may attempt to convert others both by persuasion and by the sword.
Players tend not to want to fight each other - so it's also useful to have short term threats too. Wandering space monsters, pirates, etc. Ideas also needed here to avoid repetition...
Please feel free to chuck in anything you like, no matter how wild. We've mad players worshipping trans-dimensional demons, pacifists, Babylon 5 style endings, strange minerals with all kinds of effects, mind controlling aliens, diseases, etc.
Take inspiration from anywhere you like - I'm currently considering a bit of Pluribus, features from the Ancilliary Justice series, evil Huttites, Hitchhikers Guide to the Galaxy, etc. But I still need an endgame, and some early nuisances.
I'd also like something that makes the NPC aliens interact - that worked well last game with two largish NPCs at war with each other (and both hoping to encourage players to their side).
The relentless math of bandwagoning [Seth's Blog]
It often seems that everyone is talking about what everyone is talking about.
No one cares about a song or a movie or a political issue–and then they do. Then it’s everywhere.
But of course, that’s precisely why. Most people feel safe when they’re engaging within the expected social norms. It’s easier to fit in and to avoid an error. Or, if that’s your thing, it’s easier to stand out in contrast to everyone else who is trying to fit in. Either way, we’re always on the lookout for a bandwagon to hop on.
The media, in their relentless search for newsstand sales, clicks and likes, seek precisely the same thing. PT Barnum figured out that putting a marching band on a wagon at the front of the parade drew a crowd, and then Dan Rice, an actual clown, realized that politicians would be eager to ride on a wagon that had a crowd, which drew others to the crowd and the cycle continued.
The math is simple: you can’t bandwagon by yourself. The nature of bandwagoning means that it will always be overrepresented in any sampling of the media.
Just because someone organized a parade doesn’t mean you have to be in it.
New Comic: Devil Dogs
Ecological Vengeance [George Monbiot]
Let’s eradicate our life support systems – that’ll teach the liberals!
By George Monbiot, published in the Guardian 22nd October 2026
However grim the trajectory might seem, I’ve always believed that sense will ultimately prevail. As the great perils of dismantling the living world become increasingly obvious, even the most rapacious exploiters must come round. Nobody wants to live on a dead planet, do they?
There are – or were – signs that this wasn’t just wishful thinking. Since 2015, mostly thanks to China, the area of the planet being reforested has increased, while, thanks in large part to Brazil, the global rate of forest destruction has declined. The area of the Brazilian Amazon forest cleared each year is one-sixth of what it was when records began in 1988. In the past four years, as a result of Brazilian government policy, the deforestation rate has fallen by 71%. If Luiz Inácio Lula da Silva is re-elected president on Sunday, the country could reach zero deforestation by 2030. The arc of the moral universe seems to have bent towards justice.
But what my faith in human nature failed to account for was a perverse delight in destruction among a small cohort of the economic elite. There are people who appear to hate life and love death. Donald Trump’s removal of protections on public lands, the small bite – doubtless the first of many – he wants to take out of Yosemite, his assaults on the US National Park Service and the US Forest Service, his trashing of the Endangered Species Act: all are partly a response to lobbying by ranchers, loggers, frackers and miners. But this, I think, is not the primary driver.
More important to him, I’ve come to believe, is a vengeful desire to hurt. I doubt Trump hates the monarch butterfly. I’d be surprised if he knows what it is. But he does appear to hate people who love the monarch butterfly. Destroying the habitats on which this and many other endangered species in the US depend seems to be part of the “retribution” he promised. The New York Times was unable to find evidence that Trump has ever visited a national park. He probably doesn’t hate them either. But anything valued by the enemy – greens, liberals, socialists, feminists, anti-racists, “bureaucrats” and “blockers” – should be attacked on principle.
Wiping ecosystems off the map is an obvious demonstration of power. Extinction leaves a permanent mark, which is every dictator’s dream. It’s also a highly effective means of hurting those who resist him: the Indigenous people and other people of colour so often on the receiving end of environmental destruction; the regulators; the scientists and the rest of the intelligentsia; above all, people who care.
Caring could be seen as the far right’s meta-target. The “suicidal empathy” theme now crops up repeatedly in videos, newspaper columns and speeches: a professed belief that those who care about other people or species should be destroyed by those who don’t. This belief, by definition, is psychopathic. What exhausts my optimism is that, conned by shallow promises such as the use of brutal methods to address crime, people keep electing those who subscribe to it.
Physically and politically, Flávio Bolsonaro is the spitting image of his father, the jailed coup-plotter, Jair. When Jair Bolsonaro was president of Brazil, he appeared to see ecological destruction as a kind of a holy duty. The deforestation rate rose by 59% in his four years, and attacks on Indigenous people and other forest defenders, as well as invasions by illegal ranchers, loggers and goldminers rocketed. The crudest forms of extractivism – regardless of their costs, or how they might hold back all kinds of progress – were a matter of policy.
The ideology of the far right in Brazil has been described as “beef, Bible and bullets”: violence against those who resist the seizure of their resources, an ultra-conservative evangelism and the expansion of cattle ranching, which is both a potent symbol of far-right machismo and the primary driver of deforestation in the Amazon.
Jair Bolsonaro looked back with nostalgia to the military dictatorship of 1964 to 1985 – which was actively supported by the US government – during which local oligarchs could do as they pleased, and those who opposed them were tortured and disappeared. The warnings couldn’t be clearer, but Brazil seems determined to revisit its nightmares. Flávio Bolsonaro won the first round on 4 October, and is likely to become president.
If he wins the second round this week, the gleeful rampage of his supporters, catalysed by government policy, threatens not only the Amazon but the Atlantic forest in the south, the Pantanal wetlands, the Pampa grasslands and the savannah habitats of the Cerrado. This is politics as an orgy of destruction. Let’s eradicate our life support systems – that’ll teach the liberals!
Trump has been using all possible means to help Bolsonaro win. He sees Latin America as the conquistadores did – one big heap of treasure, ready for looting. The region’s far-right demagogues are only too happy to help. Mass deforestation and the sudden ecosystem collapse that is likely to result offers a finality to their politics: there’s no coming back from this. You Indigenous people, you greens, you carers: you’ll have nowhere left to hide. The world will be ours, even if it is a world of ashes.
What might Bolsonarismo teach us? First, it appears there is no limit to the perversity of the ruling class, which would rather there was nothing left to share than cede any fraction of the planet to the poor.
Second, that it possesses all the tools – social and traditional media, the pulpit and the gun – required to make its perversity look like common sense, or at least irresistible, as force is deployed. Third, that the only defence we have against suicidal gullibility is what the Brazilians call conscientizaçao: raising awareness about the relations between exploiters and exploited, and the violence that underpins them. Otherwise all that is good, trusting and hopeful in humanity can be harnessed for a war against everyone and everything.
As for the idea that nobody wants to live on a dead planet, Elon Musk, with his preposterous plans for living on Mars – “Fuck Earth! Who cares about Earth?” – has killed that too. Extending the frontier of destruction, even to the point of human extinction, is a matter of pride. The four horsemen ride again, not in cloaks but in stetsons and denim shirts, driving their cattle before them.
www.monbiot.com
Girl Genius for Friday, October 23, 2026 [Girl Genius]
The Girl Genius comic for Friday, October 23, 2026 has been posted.
Streamlined [Ctrl+Alt+Del Comic]
Not to be outdone by Sony shooting themselves in the foot, Xbox has announced 3200 layoffs as well as the departure or closure of a handful of studios because what they’ve been doing is… not working. If you ask me, things started going south the moment they shelled out such astronomical amounts to acquire Activision […]
The post Streamlined appeared first on Ctrl+Alt+Del Comic.
[Filler] 23rd Anniversary! [Twokinds]
Comic for October 22, 2026
View From a Hotel Window, 10/22/26: Aurora, CO [Whatever]

Parking lots and hospitals! This hotel picture has it all!
I’m in Aurora for MileHiCon, where I am a guest of honor along with TK Kingfisher and others. There will be panels! And signings! And hanging out! As one does. It starts tomorrow. Come on down!
— JS
Ooops, didn't get it done today. Please come back tomorrow. :-)
“I can’t believe PowerShell is actually good” [OSnews]
Earlier this year, I needed to learn PowerShell scripting for one Windows-related project, and I have tried it out a few more times on Mac. It has quickly become one of my favorite tools for automation and scripting—taking on jobs that I would have otherwise tried to do with Node.js, Shortcuts, macOS Automator, or heaven forbid, Bash scripts.
I get it now. PowerShell is great, even if you don’t use it as your shell, and even if you’re on Mac or Linux.
↫ Corbin Davenport
I don’t use the shell often enough on any of my main machines to have much of an idea about the strenghths and weaknesses of PowerShell compared to more traditional shells, but this is definitely not the first time I’ve heard a lot of praise for it from people otherwise knee-deep in the UNIX and traditional shell world.
There really must be something to this, and since PowerShell is also available on Linux and macOS, it’s pretty straightforward to give it a go without having to deal with Windows.
Urgent: Pass the ROBINHOOD act. [Richard Stallman's Political Notes]
US citizens: call on Congress to Pass the ROBINHOOD Act, which would deny use of a tax avoidance scheme by people who are VERY rich.
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: Defeat environmental protection rollbacks [Richard Stallman's Political Notes]
US citizens: call on your senators to defeat environmental protection rollbacks in the Senate permitting bill.
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: Support for workers in unionizing [Richard Stallman's Political Notes]
US citizens: call on your state governor to give workers support in unionizing.
See the instructions for how to sign this letter campaign without running any nonfree JavaScript code--not trivial, but not hard.
Urgent: Investigate prosecution of Broadview Six [Richard Stallman's Political Notes]
US citizens: call on Congress to investigate the DOJ's prosecution of the Broadview Six.
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: Reimbursement of Treasury for corrupter's campaign [Richard Stallman's Political Notes]
US citizens: call on the corrupter to reimburse the Treasury for his $19 million ad campaign.
Note, the reimbursement should be to the Treasury, from which the corrupter took the money, not to the individual taxpayers who paid it to the Treasury.
Urgent: Raid on Ilhan Omar's home [Richard Stallman's Political Notes]
US citizens: Stand with Ilhan Omar: condemn the raid on her home.
Urgent: Stop privatizing of Social Security [Richard Stallman's Political Notes]
US citizens: call on Congress to stop the corrupter from privatizing Social Security.
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.
Deportation thugs attack protesters [Richard Stallman's Political Notes]
Deportation thugs in Frederick, Maryland, attacked protesters and city officials by hitting them with sticks, and by driving cars at them.
Pressure for Australia to stop trade with Israel's colonies [Richard Stallman's Political Notes]
Australia's government is under pressure to stop trade with Israel's colonies in Palestinian territory, and stop selling weapons to Israel, including parts for F-35 fighters destined for Israel.
Australia can and should do the first two. But it can't do the part about the F-35.
Joining with other countries to manufacture an airplane involves a commitment to the joint project. When the deal was made that Australia should build certain parts, that implied a commitment that Australia would do its part of the job as needed. It cannot unilaterally impose a boycott of any country on the whole project.
So if Australia wants to build those parts for some countries only, that might imply renegotiating the whole deal.
If another country builds those parts too, perhaps that renegotiation would be easy: the parts meant for Israel's F-35s could be made elsewhere. Or perhaps the deal could be to wind down Australia's production of those parts and move them to another country, over a couple of years, after which Australia would not produce any F-35 parts for Israel.
To disregard this issue of joint manufacture could lead other countries to refuse to make such deals with Australia in the future.
Australia has other available ways to put increased pressure on Israel to respect the human rights of Palestinians, and on countries generally to respect human rights and international humanitarian law. It doesn't have to use F-35s as the means.
Request to extradite rich American donor from Spain [Richard Stallman's Political Notes]
The persecutor has asked Spain to criminalize leftist political activity with an official request to extradite a rich American donor to various lawful causes including humanitarian aid to people in Gaza.
Three errors that could help magats win [Richard Stallman's Political Notes]
Three errors that could help magats win in November's election: complacency about victory, despair, and cynicism.
Donald Trump Jr's lavish wedding [Richard Stallman's Political Notes]
*Russian oligarch close to Putin reportedly paid for part of Donald Trump Jr’s lavish wedding.*
Carbon pollution standards for coal and gas-fired power plants [Richard Stallman's Political Notes]
* The EPA is poised to formally repeal carbon pollution standards for coal- and gas-fired power plants.*
Homeless man in Queensland [Richard Stallman's Political Notes]
Thugs in Queensland (a state of Australia) ordered a terminally ill homeless man to move his van, which contained all his possessions, or they would confiscate everything. He had lost his driver's license so he could not move it. He decided he would rather die defiantly than meekly comply and be crushed, so he stabbed himself.
The thugs shot him with tasers.
Richard Dawkins mistake about chatbots [Richard Stallman's Political Notes]
Richard Dawkins made the mistake of supposing that chatbots are conscious (and intelligent) because they sound that way.
Referring to chatbots as "AI" has the tendency to lead people to suppose they are as intelligent as they superficially seem, and that suggests they are also conscient. To avoid encouraging that supposition, please join me in refusing to call them "AI". Use your share of influence on the society around you!
Powerful US utilities fund "grassroots" groups [Richard Stallman's Political Notes]
*Powerful US utilities secretly fund "grassroots" groups to sway cities away from switch to public power.*
It documents the example of a supposed "grassroots" opposition campaign in Ann Arbor, Michigan.
Investigating these campaigns and the organizations behind them may help identify the local politicians and "leaders" who hire themselves out as plutocratist tools.
Flesh-eating Vibrio bacteria [Richard Stallman's Political Notes]
Flesh-eating Vibrio bacteria are spreading around the world due to global heating. They can infect a person who eats raw shellfish, but also get into the body through an open cut or puncture in the skin.
An infection can kill the person, or cause loss of a limb.
Canadians Are Running Out Of Time To Oppose The Dangerous C-22 Surveillance Bill [Deeplinks]
Canada’s Parliament is debating a massive expansion of surveillance powers that will threaten the privacy and security of millions of people. Bill C-22, also called the Lawful Access Act, has already passed the House of Commons, and is now before the Canadian Senate.
Canadians still have an opportunity to speak out and stop this dangerous legislation. The Canadian Civil Liberties Association (CCLA) is urging all Canadians to sign its petition opposing the bill. (The petition on CCLA’s website is governed by CCLA’s privacy policy.)
Tell the canadian senate to stop C-22
As we wrote earlier this year, Bill C-22 gives the government new powers to force digital services—including telecom companies, messaging apps, and more—to help with government surveillance. Worse, it allows Canada’s Minister of Public Safety to order companies to create a backdoor to their services for law enforcement, as long as it doesn’t lead to a “systemic vulnerability.” That’s a clear recipe for weakening the encryption we all rely on.
It also requires services to retain metadata for up to a year, which reveals who people communicate with, where they go, and what services they use, even when they are not suspected of any crime.
Researchers at CCLA and Citizen Lab published a detailed analysis of C-22 and its serious constitutional and cybersecurity problems. The analysis points out that the bill needs more than cosmetic changes—it calls for entirely withdrawing Part 2 of Bill C-22, the section that establishes the surveillance and data retention regime.
Bill C-22 could also expand the sharing of Canadians’ personal data with foreign law enforcement, including the United States. Canada has been negotiating a cross-border data-sharing agreement with the U.S. that would allow American police to get information about Canadian internet users with limited safeguards and oversight.
Some Canadian senators have already expressed concerns about the bill, and rightly suggested, as CCLA and Citizen Lab have, that it may not be compatible with privacy protections in the Canadian constitution.
If you’re in Canada, read and sign CCLA’s petition opposing Bill C-22 today. Don’t let the Senate allow this dangerous expansion of government surveillance to become Canada’s new reality.
Canadians: defend your privacy and security
Garmin revamps and opens up Connect developer API program [OSnews]
Earlier this year, Garmin closed its Connect API developer program because it was being flooded with “AI”-generated applications to the point it couldn’t handle them anymore. What made it worse was that half of the applications were never actually used, not even once. It also didn’t help that Garmin treated every single application to the program the same way, whether it was from a hobbyist just wanting access to their own data, to a massive corporation developing a popular service used by god knows how many people.
Today, the company has relaunched the program, and it’s been considerably overhauled. While hobbyist use of the API is going to be free – which is way better than it was before – once you hit a thousand users, you’re going to have to start paying.
Still, Garmin’s shift here towards charging for API access will set a dangerous precedent for the industry. Especially for a company that bills itself as a (or the?) premium sports hardware provider. On the flip side, there’s simply no ignoring the flood of mostly AI apps that take up resources at Garmin and elsewhere to support. Heck, my inbox is flooded with these apps daily requesting reviews. It sounds like when Garmin shut off access to the API last spring, they were seeing inbound API requests at a daily scale that they’d previously only seen over a period of weeks. Simply put, there’s no good answer.
↫ Ray Maker at DC Rainmaker
The excesses of the easy availability of “AI” code generation impacts the entire industry. At least one good thing has come out of this: hobbyists can now access the Connect API developer program much easier than before.
Examining the macOS gcc binary [OSnews]
If you’ve ever written C (or c++) on a mac, you’ll know that the so-called
↫ juliethefoxcoongccis just clang in disguise. Most people (fairly) assume that this is just an alias, but this is not true! It’s a binary! Now, what is this binary? I naively assumed that it would just be shelling out toclangbut it turns out the answer is more interesting than that.
It’s all smoke and mirrors.
Unlike traditional OSs that separate user applications from the kernel, a unikernel bundles everything into a single, isolated image that runs directly on a hypervisor (like KVM, BHyve, or OpenVMM). Because it removes unnecessary drivers and background services, a unikernel is extremely small, fast to boot, and efficient with resources.
Here, we will learn how to develop and deploy unikernels built using the OCaml language and the Solo5 unikernel. These are the two fundamental components that will then enable us to develop our own applications in the form of unikernels, which we can subsequently deploy using Albatross.
↫ Unikernels in OCaml
Some light reading for the weekend.
I just built a page containing many of my books. Click on any one of them and it’ll take you to a directory of where you can get a copy. And the page then re-indexes based on which ones get the most clicks.
Thanks for reading.
Bride of Spooktactular (OoO) from L99 Games [Penny Arcade]
Running ads is essentially broken, which is why so many sites have essentially become unusable especially on mobile. If I even tried to make the site look like that the designers wouild twist my head off like a bottlecap. So, we've been working with friends by and large to get ads up that we feel good about. Bride of Spooktacular fits snugly in that place.
I just really like Brad's designs; his obsession is with asymmetrical strategy games. I could list them for a very long time, but he's the king of fighting games you play with cards, whether you think the best version of that is BatlleCON or EXCEED because he designed both. Spooktacular and its Bride posit that terrors beyond mortal ken have burst through the screens in the theatre, and those are the entities you play as - devouring horrified moviegoers by the gobfull. Every one of the original's twenty monsters or the Bride's ten additional ones is essentially playing a different game while going after the same points, with ramifications for your opponents and even in some cases the way the game plays. Evil cars, a Queen and her Hive, zombified versions of our founding fathers... this is just where it starts. This Gamefound camnpaign also offers the Double Feature as an optional add-on, which are twenty new remixes of the original game's monsters that play completely differently or even invert their mechanics. Anyway, putting up his ads was the easiest decision I made all year. Only about a week left on the campaign... if you dare, etc.
(CW)TB
[$] The end of __get_user() and __put_user() [LWN.net]
Linus Torvalds rarely writes significant amounts of kernel code these days, so the merging of a 48-part patch series from him is an unusual event. This series, destined for the 7.4 kernel release, performs some long-delayed kernel cleanup by removing a couple of the primitives used to access user-space memory from the kernel. What was once a best practice has long been superseded, but it can take time for such changes to work their way through a body of code this large.
I hope to see the The Web of Markdown idea take the next step later today or early tomorrow at the latest. Still diggin!
[$] Rust features in the future [LWN.net]
There are several Rust features that kernel developers have been hoping to stabilize, but Josh Triplett wanted to describe all of the other features that the Rust project is currently working on. He spoke about the topic at Kangrejos 2026, leaving the assembled kernel developers with several ideas about how to use these upcoming Rust features in the kernel. The features included refinements to the type system, small syntax improvements, and a smarter borrow checker.
KeePassXC 2.8.0 released [LWN.net]
Version 2.8.0 of the KeePassXC password-management application has been released.
The new release brings a lot of long-awaited new features, many bugfixes, and several security updates. Among the major features are the migration from Qt5 to Qt6, Auto-Type on Wayland (Linux), configurable keyboard shortcuts, remote database synchronization with external tools, quick unlock with password on macOS, and quick unlock via Polkit on Linux. Version 2.8.0 is also the first version for which we ship native ARM64 builds for Windows and an experimental AArch64 (i.e., ARM64) AppImage for Linux.
See the changelog for a full list of new features, major changes, and bug fixes.
Security updates for Thursday [LWN.net]
Security updates have been issued by AlmaLinux (.NET 10.0, .NET 8.0, .NET 9.0, cockpit-files, cockpit-machines, fetchmail, glycin-loaders, go-toolset:rhel8, golang, hostapd, jackson-core, kernel, kernel-rt, librsvg2, lrzsz, mariadb11.8, openexr, openssh, openssl, perl-DBI:1.641, python-urllib3, python3.12-urllib3, qt5-qtbase, rust-sequoia-sq, and xorg-x11-server-Xwayland), Arch Linux (php and php-legacy), Debian (bind9, firefox-esr, nginx, php8.2, and php8.4), Fedora (ca-certificates, dolphin, gnome-shell-extension-gsconnect, libdigidocpp, linux-firmware, nicotine+, perl-ExtUtils-Typemaps-Default, php, python-cairosvg, qdigidoc, rust-rustls-webpki, rust-webpki-root-certs, and rust-webpki-roots), Gentoo (PHP), Mageia (php8.5, php8.4), Oracle (perl-URI), Red Hat (go-toolset:rhel8, golang, grafana-pcp, kernel, kernel-rt, nodejs-nodemon, nodejs22, nodejs24, nodejs:22, nodejs:24, rhc, and sudo), Slackware (php), SUSE (aliyun-cli, bouncycastle, buildah, ca-certificates-mozilla, chromedriver, cifs-utils, cyrus-sasl, docker, firefox, gimp, git-bug, GraphicsMagick, libheif, libpng16, libraw, libsoup-2_4-1, mutt, onefetch, openexr, openssh, openssl-certs, php7, php8, poppler, python-hpack, python310, python313-Django4, qemu, rootlesskit, tiff, xwayland, and yt-dlp), and Ubuntu (c-ares, ghostscript, libsoup3, libxs-parse-keyword-perl, nss, php5, php7.0, php7.2, php7.4, php8.1, php8.3, php8.5, poppler, pyjwt, u-boot, and unbound).
New Serious PHP Vulnerabilities Released and Patched [Schneier on Security]
PHP maintainers have released fixes for two critical vulnerabilities:
PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35 fix two critical vulnerabilities that can allow unauthenticated remote code execution. All PHP users are strongly encouraged to update immediately.
Who is at risk: all PHP installations serving web requests, including PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed. We consider the risk highest for mod_php, with a demonstrated exploit where an unauthenticated request can trigger the attack before any application code runs.
The vulnerabilities:
- RCE via OOM corruption, CVE-2026-109618 (GHSA-w8hw-w9fx-j79w): out-of-memory handling can interrupt PHP while internal request data is only partially initialized. Request cleanup may then treat the invalid data as valid.
- RCE via stale global state, CVE-2026-109619 (GHSA-6wmf-4rv5-p3rp): request-owned internal state can survive after its backing memory has been freed. A later request handled by the same worker may use that stale state before normal initialization resets it.
Updating PHP is the only way to regain security. Do it now.
More news.
| Feed | RSS | Last fetched | Next fetched after |
|---|---|---|---|
| @ASmartBear | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| a bag of four grapes | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| Ansible | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| Bad Science | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| Black Doggerel | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| Blog - Official site of Stephen Fry | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| Charlie Brooker | The Guardian | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| Charlie's Diary | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| Chasing the Sunset - Comics Only | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| Coding Horror | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| Comics Archive - Spinnyverse | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| Cory Doctorow's craphound.com | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| Cory Doctorow, Author at Boing Boing | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| Ctrl+Alt+Del Comic | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| Cyberunions | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| David Mitchell | The Guardian | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| Deeplinks | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| Diesel Sweeties webcomic by rstevens | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| Dilbert | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| Dork Tower | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| Economics from the Top Down | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| Edmund Finney's Quest to Find the Meaning of Life | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| EFF Action Center | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| Enspiral Tales - Medium | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| Events | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| Falkvinge on Liberty | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| Flipside | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| Flipside | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| Free software jobs | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| Full Frontal Nerdity by Aaron Williams | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| General Protection Fault: Comic Updates | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| George Monbiot | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| Girl Genius | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| Groklaw | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| Grrl Power | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| Hackney Anarchist Group | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| Hackney Solidarity Network | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| http://blog.llvm.org/feeds/posts/default | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| http://calendar.google.com/calendar/feeds/q7s5o02sj8hcam52hutbcofoo4%40group.calendar.google.com/public/basic | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| http://dynamic.boingboing.net/cgi-bin/mt/mt-cp.cgi?__mode=feed&_type=posts&blog_id=1&id=1 | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| http://eng.anarchoblogs.org/feed/atom/ | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| http://feed43.com/3874015735218037.xml | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| http://flatearthnews.net/flatearthnews.net/blogfeed | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| http://fulltextrssfeed.com/ | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| http://london.indymedia.org/articles.rss | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| http://pipes.yahoo.com/pipes/pipe.run?_id=ad0530218c055aa302f7e0e84d5d6515&_render=rss | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| http://planet.gridpp.ac.uk/atom.xml | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| http://shirky.com/weblog/feed/atom/ | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| http://thecommune.co.uk/feed/ | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| http://theness.com/roguesgallery/feed/ | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| http://www.airshipentertainment.com/buck/buckcomic/buck.rss | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| http://www.airshipentertainment.com/growf/growfcomic/growf.rss | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| http://www.airshipentertainment.com/myth/mythcomic/myth.rss | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| http://www.godhatesastronauts.com/feed/ | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| http://www.tinycat.co.uk/feed/ | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| https://anarchism.pageabode.com/blogs/anarcho/feed/ | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| https://broodhollow.krisstraub.comfeed/ | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| https://debian-administration.org/atom.xml | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| https://elitetheatre.org/ | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| https://feeds.feedburner.com/Starslip | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| https://feeds2.feedburner.com/GeekEtiquette?format=xml | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| https://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 | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| https://hackbloc.org/rss.xml | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| https://kajafoglio.livejournal.com/data/atom/ | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| https://philfoglio.livejournal.com/data/atom/ | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| https://pixietrixcomix.com/eerie-cutiescomic.rss | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| https://pixietrixcomix.com/menage-a-3/comic.rss | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| https://propertyistheft.wordpress.com/feed/ | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| https://requiem.seraph-inn.com/updates.rss | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| https://studiofoglio.livejournal.com/data/atom/ | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| https://thecommandline.net/feed/ | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| https://torrentfreak.com/subscriptions/ | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| https://web.randi.org/?format=feed&type=rss | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| https://www.baen.com/baenebooks | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| https://www.dcscience.net/feed/medium.co | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| https://www.DropCatch.com/domain/steampunkmagazine.com | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| https://www.DropCatch.com/domain/ubuntuweblogs.org | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| https://www.DropCatch.com/redirect/?domain=DyingAlone.net | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| https://www.freedompress.org.uk:443/news/feed/ | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| https://www.goblinscomic.com/category/comics/feed/ | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| https://www.loomio.com/blog/feed/ | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| https://www.newstatesman.com/feeds/blogs/laurie-penny.rss | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| https://www.patreon.com/graveyardgreg/posts/comic.rss | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| 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 | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| https://x.com/statuses/user_timeline/22724360.rss | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| Humble Bundle Blog | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| I, Cringely | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| Irregular Webcomic! | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| Joel on Software | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| Judith Proctor's Journal | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| Krebs on Security | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| Lambda the Ultimate - Programming Languages Weblog | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| Looking For Group | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| LWN.net | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| Mimi and Eunice | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| Neil Gaiman's Journal | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| Nina Paley | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| O Abnormal – Scifi/Fantasy Artist | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| Oglaf! -- Comics. Often dirty. | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| Oh Joy Sex Toy | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| Order of the Stick | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| Original Fiction Archives - Reactor | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| OSnews | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| Paul Graham: Unofficial RSS Feed | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| Penny Arcade | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| Penny Red | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| PHD Comics | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| Phil's blog | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| Planet Debian | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| Planet GNU | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| Planet Lisp | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| Pluralistic: Daily links from Cory Doctorow | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| PS238 by Aaron Williams | XML | 21:56, Wednesday, 28 October | 22:44, Wednesday, 28 October |
| QC RSS v2 | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| Radar | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| RevK®'s ramblings | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| Richard Stallman's Political Notes | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| Scenes From A Multiverse | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| Schneier on Security | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| SCHNEWS.ORG.UK | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| Scripting News | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| Seth's Blog | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| Skin Horse | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| Tales From the Riverbank | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| The Adventures of Dr. McNinja | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| The Bumpycat sat on the mat | XML | 22:07, Wednesday, 28 October | 22:47, Wednesday, 28 October |
| The Daily WTF | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| The Monochrome Mob | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| The Non-Adventures of Wonderella | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| The Old New Thing | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| The Open Source Grid Engine Blog | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| The Stranger | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| towerhamletsalarm | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| Twokinds | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| UK Indymedia Features | XML | 22:00, Wednesday, 28 October | 22:42, Wednesday, 28 October |
| Uploads from ne11y | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| Uploads from piasladic | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |
| Use Sword on Monster | XML | 21:56, Wednesday, 28 October | 22:43, Wednesday, 28 October |
| Wayward Sons: Legends - Sci-Fi Full Page Webcomic - Updates Daily | XML | 21:42, Wednesday, 28 October | 22:28, Wednesday, 28 October |
| what if? | XML | 22:14, Wednesday, 28 October | 22:55, Wednesday, 28 October |
| Whatever | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| Whitechapel Anarchist Group | XML | 21:56, Wednesday, 28 October | 22:45, Wednesday, 28 October |
| WIL WHEATON dot NET | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| wish | XML | 21:56, Wednesday, 28 October | 22:41, Wednesday, 28 October |
| Writing the Bright Fantastic | XML | 21:56, Wednesday, 28 October | 22:40, Wednesday, 28 October |
| xkcd.com | XML | 21:56, Wednesday, 28 October | 22:39, Wednesday, 28 October |