Tuesday, 27 October

07:49

Sharing The Garden by ivymug [Oh Joy Sex Toy]

Sharing The Garden by ivymug

A fun sexy end-of-the summer celebration by the incredible talented ivymug. Those emails can wait! We’ve got a a whole lot of sexy comics that need your attention first… Then when your done; go check out ivymugs work! Linktr.ee These comics are only possible with steady, reliable Patreon support! Come and chip in, to ensure […]

05:28

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?

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.

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.

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.*

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.

04:42

Louis-Philippe Véronneau: Fake Cash: The World Trade Game [Planet Debian]

This is a new series1 I'm starting on the tools I have been crafting and buying to play pedagogical games in my Economics classes.

These games, aside from being just plain fun for the students, often aim to teach them a lesson via interactive play. Unsurprisingly, it is much easier for them to grok a particular concept this way. Moreover, many students told me these activities were the best part of the classes I teach.

The World Trade Game

I found out about The World Trade Game in The Handbook of Pluralist Economics Education2, which also contains many other fun pedagogical games. It was first developed by Action Aid, but has since been refined by John Sloman and then by Irene van Staveren, who wrote about her use of the game in the aforementioned book.

The goal of this blog entry is not to describe the game and teach you how to play it. If that interests you, either buy the book I mentioned or read about Sloman's version here.

No, our focus point here is the tools to play this game: fake cash! Fake cash can be used in many economics pedagogical games and in my opinion, is a worthwhile "investment" of your time and energy. You could indeed play with regular printed sheets of paper listing a value (I sure did!), but using Play Money (a more appropriate term, since we're not trying to defraud anyone) will up your game and create a more immersive atmosphere in your classes.

At first, I tried to buy play money. Surely, some commercial offering aiming to create realistic props for movies and TV productions existed? At least in Canada, it turns out the answer was no. The only thing I could find were shady websites and weird expensive listings on AliExpress. Not being tenured yet, I did not try to convince my employer to take a 50-50 chance on supporting criminal endeavours.

As such, the next best thing I found was printable play money designed by the Bank of Canada Museum. Their designs were quite nice and met my needs, but their PDF layout made it overly complicated to print large quantities of bills. As such, I played around with GIMP a little and came out with these files. A commercial printer shouldn't have issues printing them on glossy cardstock paper and cutting them up for you:

Three Canadian 5$ bills
Three Canadian 10$ bills
Three Canadian 20$ bills
Three Canadian 50$ bills
Three Canadian 100$ bills

Once printed and cut, you'll unfortunately have to fold each bill by hand. To secure both halves, I ended up using a strip of transparent tape on each long edge.

Here is the result, with a real Canadian 20$ bill as a comparison:

Stacks of play money bills, with examples of the 5$, 10$, 20$, 50$ and 100$ bills

A real Canadian 20$ bill, side-to-side with the play money version


  1. Don't hold your breath though, as I do not currently have a release schedule. ↩

  2. Reardon, J. (2009). The Handbook of Pluralist Economic Education. New York : Routledge. ↩

Kentaro Hayashi: Building Mozc with dh-bazel, buildsystem support for debhelper [Planet Debian]

Introduction

After bazel-bootstrap 7.7.1 was landed into Debian unstable, I'm working on packaging newer Mozc (Most famous Japanese input method editor) with Bazel.

Here is the blog entry initial efforts to build Mozc with Bazel at that time.

kenhys.hatenablog.jp

Why dh-bazel?

After that, newer Mozc packages are uploaded into experimental and moved to testing phase on experimental now.

mozc - Debian Package Tracker

When started packaging efforts for newer Mozc with Bazel, I'm a newbie to do it. Now I've got a knowledge to do it a bit, I want to know best practice on packaging X on Debian with Bazel furturmore.

Usually there are dh-X for buildsystem X on Debian, but it's not true for Bazel as far as I know. This is why I had started to write dh-bazel.

I've wrote initial dh-bazel prototype and post a mail to debian-bazel ML.

lists.debian.org

dh-bazel supports the following way:

%:
        dh $@ --buildsystem=bazel

override_dh_auto_build:
        dh_auto_build -- //:hello

If you want to build source under src, you could write d/rule like this:

%:
        dh $@

override_dh_auto_build:
        dh_auto_build --buildsystem=bazel --sourcedirectory=src -- //:hello

Conclusion

dh-bazel is in very early stage prototype, but I have succeeded to build newer Mozc with some modifications to Mozc debian/rules on experimental with dh-bazel locally!

dh-bazel is a thin wrapper for Bazel, so it does not reduce packaging glitches dramatically, but it helps some sort of packaging tasks IMHO.

There are some achievement with dh-bazel

  • It helps to do similar building way like other debhelper buildsystem
  • It sets comprehensive Bazel startup options
  • It sets comprehensive Bazel command options
  • If you want to set extra flags, just specify it as additional user options (--override_module=, and so on)

Note that it only simplify dh_auto_build stage, so you must manually install artifacts with .install or something correctly.

I hope that it will help package maintainer using Bazel in the future. (dh-bazel is not uploaded into debian/unstable yet, so stay tuned!)

01:21

Greener Grass Next Door [QC RSS v2]

she's very endearing

00:49

Link [Scripting News]

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.

00:00

The Big Undo [Scripting News]

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.

  1. Karl Anthony Towns, Knicks all-star and world champion center, is called Big Bodega.
  2. It sounds like a title of a Michael Lewis book, like The Big Short.
  3. And for some reason Queen Latifah singing When You're Good to Mama in Chicago.

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.

Monday, 26 October

22:28

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

20:56

Page 8 [Flipside]

Page 8 is done.

19:21

18:42

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.

18:35

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:

  • Runs in a private filesystem, with no access to user's files or system configuration
  • Runs in a filesystem where everything is read-only, except for the git working directory
  • Even the .git directory is readonly, so that changes in the code can be reliably detected via git diff
  • Runs without network unless explicitly requested by the user

Here'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?

17:49

17:14

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.

Chip production can’t match AI demand

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.

Autonomous agents are testing security boundaries

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.

Can AI welfare coexist with human accountability?

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.

What’s next

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

17:00

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.

16:14

[$] 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.

Two stable kernels for Monday [LWN.net]

Greg Kroah-Hartman has announced the release of the 7.2.13 and 6.18.59 stable kernels. Each contains a number of fixes throughout the tree. Users are advised to upgrade.

16:07

Pluralistic: Sovereign citizens, but for news (26 Oct 2026) [Pluralistic: Daily links from Cory Doctorow]

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

Today's links

  • Sovereign citizens, but for news: By reading the LA Times, you agree…
  • Hey look at this: Delights to delectate.
  • Object permanence: Patenting tax dodges; 6-word sf; Newscorp shareholders v Murdoch; Ancient German ophthalmology cult; Trolley problem is stupid; Trump's influence peddling to Chinese millionaire; Al Franken v binding arbitration; Yoga pants spite parade; Dems' secret Congressional committee; RIAA v your PC; "Going Under"; "Machine Man"; Aging goths; "Everfair"; Kremlin will destabilize Ukraine; FCC fronts for Big Cable; Straight Outta Vagina; Remixed TED Talk about remixing; Authoritarian debt.
  • Upcoming appearances: Vienna, Kilkenny, Courtenay, Vancouver, Oxford, Sheffield, Virtual, Oxford, Montreal.
  • Recent appearances: Where I've been.
  • Latest books: You keep readin' em, I'll keep writin' 'em.
  • Upcoming books: Like I said, I'll keep writin' 'em.
  • Colophon: All the rest.



The original Art Deco LA Times building. Draped over it is a fringed naval flag. Superimposed over the building is the text of the LAT's outrageous dickover 'consent' dialog.

Sovereign citizens, but for news (permalink)

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:

https://www.thedailybeast.com/new-york-times-illegally-busted-union-campaign-national-labor-relations-board-alleges/

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):

https://archive.is/hOhpu

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:

https://oag.ca.gov/news/press-releases/attorney-general-bonta-issues-consumer-alert-reminding-california-workers-their

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:

https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:kaagvvv22ki4ccsymevrpfxk/bafkreia4yxewg2chpwgki3ftzq7fnl7s454efx5oev6h6siqlsnenrjpe4

These gambits are infectious, and they're spreading. Time to bend the curve.


Hey look at this (permalink)



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

Object permanence (permalink)

#25yrsago 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


Upcoming appearances (permalink)

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



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

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

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

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

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



Colophon (permalink)

Today's top sources:

Currently writing:

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

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

  • A Little Brother short story about DIY insulin PLANNING


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

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

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


How to get Pluralistic:

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

Pluralistic.net

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

https://pluralistic.net/plura-list

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

https://mamot.fr/@pluralistic

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

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

Medium (no ads, paywalled):

https://doctorow.medium.com/

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

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

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

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

ISSN: 3066-764X

15:42

Link [Scripting News]

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.

15:28

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:

  1. Hash tables and generic function dispatch will be much faster soon
  2. I got inspired to write another blog post pertaining to Common Lisp

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):

cherry-picking.png

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

htable-mixbag.png

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

htable-setrem.png

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

htable-string.png

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.

1. Hashing numbers - warmup

1.1. Recap: hash table tests and hash functions

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.

1.2. Recap: the numeric tower and mathematical equivalence

Common Lisp has a full numeric tower:

numeric-tower.png

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

fixnum
a single word with a few bits chopped to fit the tag
bignum
an array of "limbs", that is parts of the integer (plus sign)
ratio
a pair of two integers
float
a pair of N-bit mantissa and K-bit exponent (plus sign)
(complex rational)
a pair of two rationals
(complex float)
a pair of two floats of the same type

Fixnums, bignums and ratios are disjoint under #'=. That leaves us with questions:

  1. 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.

  2. 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.

  3. When is an integer mathematically equal to a float?

    When the float has no fractional part and integers are equal.

  4. 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.

1.3. Establishing the baseline

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:

  1. Aesthetically it is not pleasing - crude even.
  2. "Relatively few collisions" applies only to toy examples, once we start using bigger integers and more precise ratios, the problem starts to show. For example 260 and 260+1 hash identically and that matters for 64bit IDs and timestamps.
  3. Performance-wise we drop the ball for integers and rationals – we convert numbers between formats even when we could hash only a chunk of memory.

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.

2. Hashing numbers - round one

A harder but more precise way to hash numbers under the predicate #'EQUALP is to introduce canonicalization rules:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. Other ratios are hashed as pairs

    We hash the numerator and denominator separately.

  6. 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)))))))

2.1. Implementation bites

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.

3. Hashing numbers - round two

The approach above is correct and nice, but has a few important flaws:

  • we cons a lot for big integer floats (2KB/float in the worst case)
  • there is a whole class of dyadic ratios that don't fit in long-float
  • long floats lose precision after cast to double, notably very small and very big values collapse to 0 and infinity

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):

  1. Dyadic rationals are hashed as tuples (sign, mantissa, exponent)
  2. Other numbers are hashed depending on their type (they are disjoint)

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:

  • sign is -1, 0 or +1 for finite numbers - that solves normalization of -0.0/+0.0
  • mantissa must be a positive odd integer or zero - that unifies all mantissas
  • exponent is also an integer, so the number is (* sign mantissa (expt 2 exp))
  • to hash unique values (like infinities) we will abuse sign to fit extra values

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.

3.1. Back to earth

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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
case 0
the number underflows long-float exponent precision
case 1
the number is representable as LONG-FLOAT but not as DOUBLE-FLOAT
case a
the number is representable as LONG-FLOAT but not as DOUBLE-FLOAT
case b
the number overflows LONG-FLOAT mantissa precision
case e
the number narrowly fits in LONG-FLOAT
case f
the number overflows LONG-FLOAT (infinity) – may signal a condition

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)))))

3.2. Gravel details

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:

  • the mantissa in a dyadic form (long double mantissa is 64bit on x86-64)
  • a ratio's numerator and denominator when the ratio is not a dyadic number

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:

  1. DOUBLE-FLOAT: the first branch ensures the same hashes for fixnums, bignums, and integer float types, while the second branch ensures the same hashes for ratios and fractional float types.
  2. LONG-FLOAT: the first branch checks whether we can cast to double without losing precision. The second branch ensures same hashes for fixnums. The third branch unconditionally hashes the value in a dyadic form.

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:

integer path
we need to extract the mantissa from it separately because it can store bignums outside of a double float range.
fraction path
DOUBLE-FLOAT is hashed as is, LONG-FLOAT are hashed as a dyad unless it can be represented as DOUBLE-FLOAT, in that case it is cast to it
#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
  • bignum decision cost boils down to counting trailing zeros, the dyadic hash operates in a register and it doesn't cons
  • ratio decision cost is optimized to not perform bignum arithmetic, so the decision cost is negligible and the main cost is in hashing long double
  • float creates an integer from the mantissa - in most cases it is a fixnum, otherwise it operates on a bignum register and it doesn't cons either

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…

4. Benchmarks - knockout

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:

:AVERAGE
we pick randomly rational and float numbers
:TYPICAL
fixnums, fixnum uuids, small floats and bignums in form 2n
:DYADIC
rational and float numbers with overlapping values being =
:COLLIDE
white-box test that exploits casting LONG-FLOAT to DOUBLE-FLOAT
:BEYOND
white-box test that tests dyadic rationals beyond LONG-FLOAT range
:FIXNUM :BIGNUM :RATIO :DOUBLE
basic type-specific benchmark

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:

  • I initially planned to include ABCL and CLASP too, but a smoke test revealed ABCL#763 and CLASP#1876. Both share the same flaw as ECL before changes described in this post, that is they don't hash numbers correctly under EQUALP. Benchmarking them would be beside the point.
  • LispWorks performs badly on profiles any float numbers and other results are dwarfed by it, so I've excluded LW from some plots (but accounted for it in relevant analysis)
  • CCL is the mirror image of LispWorks, and performs badly on profiles with rationals (and it is great with floats), so it is also skipped on some plots
  • The :COLLIDE test does not apply to other implementations because they don't have LONG-FLOAT that is separate from DOUBLE-FLOAT - we use :TYPICAL instead

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.

4.1. ECL vs ECL

First we will compare ECL variants developed in this post. The first chart shows a benchmark for basic types:

equalp-ecl-basic-types.png

Figure 6: (ECL-warmup ECL-round1 ECL-round2) x BASIC-TYPES x (TIME CONS).

A few interesting observations emerge from this chart:

  1. Hashing doubles is fastest on "ECL-warmup", because this implementation is simplest for that particular profile. It also doesn't cons. "ECL-round1" is dominated by memory allocations for large double values that are bignums.
  2. Hashing ratios has progressively better results with each round, both the time and consing.
  3. Hashing bignums is a mirror image to hashing doubles, where "ECL-round1" excels at bignums, "ECL-warmup" must coerce bignums to doubles and memory allocation dominates its time. "ECL-round2" is as performant as "ECL-round1".
  4. Fixnums on all variants are on a relatively fast path and don't need to cons at all.

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:

equalp-ecl-mixed-data.png

Figure 7: (ECL-warmup ECL-round1 ECL-round2) x MIXED-DATA x (TIME CONS).

  1. 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.

  2. The "collide" profile is similar, but numbers can be neatly represented as a long float (binary80) and not as a double float (binary64). That means in particular that both ratios and bignums must be hashed in a compatible manner to floats. Once again "ECL-round2" is very fast (600x faster! 0.2s vs 118s) and doesn't cons, while "ECL-warmup" conses 833MB. "ECL-round2" has much less collisions than "ECL-warmup" thanks to exact bignum hashing.
  3. The "dyadic" profile mixes fixnums, double floats, bignums in double float range and dyadic ratios in double float range. This profile forces the need to bring all numbers to the same canonical representation and does not exhibit any systematic collisions. Since all here boils down to doubles, "ECL-warmup" conses less than "ECL-round1", yet "ECL-round2" is even better thanks to our optimizations. Little consing that is exhibited comes from comparing floats and bignums with EQUALP (not from hashing).
  4. The "average" profile takes rational and float numbers at random. Here we can again see that "ECL-round1" was not a regression over "ECL-warmup" - it was a targeted optimization that tried to balance effort between different types of numbers. Still, "ECL-round2" wins clearly against both variants.

My takeaways here are that:

  • specialized implementations are better for their particular data profile, notably "ECL-warmup" excels at doubles; "ECL-round1" ties "ECL-round2" at bignums and balances other types well
  • "ECL-round1" approach optimizes for typical cases, but it is not very frugal with memory (to the point where allocations dominate the benchmark in doubles)
  • "ECL-round2" also optimizes for typical cases but it is also austere with memory allocations and avoids hash collisions - that is responsible for two orders of magnitude faster and leaner implementation for adverse profiles

4.2. ECL vs the world

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:

equalp-all-basic-types.png

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.

equalp-all-mixed-data.png

Figure 9: (CCL ECL LispWorks SBCL) x MIXED-DATA x (TIME CONS).

Results in these benchmarks are implicit from tests on basic types:

  • BEYOND, DYADIC and AVERAGE involve floats, so LispWorks is too slow to include. SBCL is also underperforming on these tests, because these profiles contain ratios - the cost seems to be dominated by memory allocations.
  • TYPICAL profile is manageable for all implementations, but both CCL and LispWorks underperform because both (small) floats and rationals are in the test set. CCL allocates much more memory than others. SBCL performs well, but is slower than ECL.
  • In all these tests with mixed numbers ECL is the leader and allocates least (as noted earlier, hashing itself doesn't cons at all).

My takeaway is that each implementation could close the gap to the others if:

  • LispWorks adds hashing specialization for floats
  • CCL adds hashing specialization for rationals
  • SBCL adds hashing specialization for ratios

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.

5. Summary

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:

  • a blogpost that discusses new hash table and generic function implementations
  • the next release with all accumulated performance and conformance improvements

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.

14:49

“Use AI to help solve your LWB folding recumbent design challenges,” they said. [Nina Paley]

Prompt 1 (after a detailed discussion of the problem, with references): Can you generate diagrams of the Fold Rush, with tensioners and chainline, folded and unfolded?
Prompt 2: Please generate more accurate diagrams of the Fold Rush unfolded and folded. Remember that the folded versions must remain accurate to the folded one (frame, wheel size)

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.

Share

The post “Use AI to help solve your LWB folding recumbent design challenges,” they said. appeared first on Nina Paley.

13:56

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.

JSON-LD and schema.org

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.

Mailsift

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:

  • Calendar events & reservations: Turned into iCalendar (.ics) events and pushed directly to a CalDAV server (such as Xandikos) or stored in a local directory.
  • Bills & invoices: Extracted as structured JSON records, organized by year, and optionally synced to a personal finance manager like Firefly III.
  • Parcels: Extracted as delivery records keyed by tracking number, merged across status update emails, and optionally registered with tracking APIs like 17track or Karrio.
  • Tickets & boarding passes: Saved as PDFs, Apple Wallet passes (.pkpass), or images, accompanied by JSON metadata sidecars linking them to the booking.
  • Receipts & orders: Filed as JSON records, synced over WebDAV, or forwarded via email.

How extractors work

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:

  • Input: The raw RFC822 message is fed to the extractor on stdin.
  • Execution: The extractor runs in a fresh, temporary working directory, with a strict timeout (typically 10 seconds).
  • Output: The extractor writes zero or more named artifact files into its working directory and exits 0.

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.

Filtering and DKIM verification

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.

Generic vs. vendor extractors

Extractors fall into two categories:

  1. Generic extractors: schema-ld inspects the HTML for any <script type="application/ld+json"> blocks conforming to schema.org reservations. Another extractor, ics-passthrough, extracts standard iCalendar attachments.
  2. Vendor-specific extractors: For vendors that don’t include structured markup, dedicated extractors parse the message text. For instance, the easyjet extractor looks for booking references and flight tables, producing a standard FlightReservation artifact:
 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.

Handling forwarded mail

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:

  • Attachment forwards: If the original email was attached as message/rfc822, mailsift extracts the original message and re-evaluates the vendor’s DKIM signature on the inner message.
  • Inline forwards: Mailsift reconstructs a synthetic RFC822 message from the client’s forwarded quotation header block and quotes, deriving a deterministic Message-ID.

This means hotel confirmations or flight tickets forwarded by a partner still end up in the family calendar automatically.

Running mailsift

Mailsift fits into existing email setups in several ways:

Dovecot Sieve

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.

IMAP watching

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.

Other modes

  • Postfix Milter: mailsift milter runs as an MTA filter, processing messages in real-time as they pass through Postfix.
  • Maildir scan: mailsift maildir-scan walks an on-disk Maildir folder, useful for backfilling historical mail.
  • Replay: mailsift replay message.eml runs extractors on a single saved message file, which is invaluable when writing or testing an extractor.

Web UI and REST API

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.

Status and getting involved

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!

13:28

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.

The bottleneck moved

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

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.

The Copy-Paster

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

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

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

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.

Modes, not personalities

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.

13:14

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).

13:00

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.

Computer network

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.

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

11:35

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.

10:28

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.

09:42

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.

07:28

Back To Back Rap Tracks [Penny Arcade]

New Comic: Back To Back Rap Tracks

04:35

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.

04:21

Our Rock [Ctrl+Alt+Del Comic]

The post Our Rock appeared first on Ctrl+Alt+Del Comic.

01:42

Hanners Lore [QC RSS v2]

Anh's dad would rent one for the summer

01:28

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.

Sunday, 25 October

18:21

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.

Threadmiλ

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.

  • Threads
  • Locks
  • Semaphores
  • Condition Variables
  • Timers
  • Mailboxes
  • Barriers
  • Atomics
  • Timeouts

These are the facilities available in most CL, especially Lispworks.

Current Implementation Status

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).

Where You Can Get your Threadmiλ

The main documentation page can be found https://threadmil.common-lisp.dev.
/ The project page is at https://gitlab.common-lisp.net/mantoniotti/threadmilambda

How Did I Get Here?

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.

Disclaimer

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.

Any Help Appreciated

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

17:07

Link [Scripting News]

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."

Link [Scripting News]

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.

13:49

Russell Coker: Banks and Phones [Planet Debian]

The Problem

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.

Hardware Security Devices

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.

Improving Phone Store Security

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.

How Virtual Telcos Work

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.

Banks as Virtual Telcos or SIM Providers

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.

What Will Happen

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.

09:49

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.

02:42

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.

Saturday, 24 October

18:42

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

16:56

Link [Scripting News]

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.

Link [Scripting News]

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.

16:14

Link [Scripting News]

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."

10:07

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.

01:42

Desert Bus! [Penny Arcade]

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! 

Friday, 23 October

23:56

23:28

Link [Scripting News]

A blog post from Scripting, in Markdown.

22:21

Pluralistic: Critique and writing (23 Oct 2026) [Pluralistic: Daily links from Cory Doctorow]

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

Today's links



A vast field of complicated machinery composed of many-times-overlaid 19th century printing presses. Caught in these gears are several figures who are all writing - a bearded Greek in a loincloth, a severe doge, a grande dame, a lady upon her settee, a recording angel, two drunken clerks at a table, a tormented poet in a wig. Invading the scene is a many-tentacled pulp robot.

Critique and writing (permalink)

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:

  • Every writer should submit regularly to the workshop. There is a serious risk that attending a workshop can become a substitute for actually writing. It is no kindness to your workshopmates to let them stay in the circle if it leads them to stop writing.
  • 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:

  • Clarion (UC San Diego, six weeks):

https://clarion.ucsd.edu/ (I'm also a 1992 Clarion grad)

  • Clarion West (Seattle, six weeks):

https://www.clarionwest.org/

  • Viable Paradise (Martha's Vineyard, one week):

https://viableparadise.com/


Hey look at this (permalink)



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

Object permanence (permalink)

#25yrsago 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


Upcoming appearances (permalink)

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



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

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

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

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

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



Colophon (permalink)

Today's top sources:

Currently writing:

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

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

  • A Little Brother short story about DIY insulin PLANNING


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

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

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


How to get Pluralistic:

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

Pluralistic.net

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

https://pluralistic.net/plura-list

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

https://mamot.fr/@pluralistic

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

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

Medium (no ads, paywalled):

https://doctorow.medium.com/

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

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

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

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

ISSN: 3066-764X

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.

Blog moderation policy.

20:49

Page 7 [Flipside]

Page 7 is done.

20:28

Devil Dogs [Penny Arcade]

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.

20:07

[$] 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.

20:00

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 Core­Application­View, 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 Co­Register­Initialize­Spy 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 IInitialize­Spy interface.

Some of the thing that made The Ro­Register­For­Apartment­Shutdown unsuitable also apply to Co­Register­Initialize­Spy. 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 Co­Revoke­Initialize­Spy:

It is unpredictable whether a call to Co­Revoke­Initialize­Spy from within an IInitialize­Spy method call will have an effect during the current top-level (non-nested) call to Co­InitializeEx or Co­Uninitialize.

This is the same problem we had with Ro­Unregister­For­Apartment­Shutdown 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 IInitialize­Spy 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 IInitialize­Spy against the thread that is currently running. When that thread uninitializes COM as a single-threaded apartment, your Pre­Uninitialize 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, IInitialize­Spy doesn’t really help.

The post Why didn’t we use <CODE>Co­Register­Initialize­Spy</CODE> to clean up the unmarshalable delegate? appeared first on The Old New Thing.

19:00

Owners, Not Renters: Raffi Krikorian on Open Source AI [Radar]

Created by Claude with light editing by Tim O’Reilly

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.

The Clothesline Paradox

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.

AI should be thought of as infrastructure

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.)

In conclusion

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.

18:35

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:

  • Bug fixes.
  • MATRIX: New MEAN and COV extension functions.

Please send PSPP bug reports to bug-gnu-pspp@gnu.org.

16:56

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.

16:42

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.

  • The top level picture.
  • Nine examples.
  • Download the archive. (Chrome will complain about this link not being "secure," but the archive comes from GitHub, so it's plenty secure -- they must be on a campaign to give sites like mine a black eye. I wouldn't put a link to a download that wasn't from a reputable site. People who read my blog know that, why doesn't Google with all their fancy AI servers? Feh.)

And if you have questions or comments.

16:21

[$] 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.

14:07

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).

13:42

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.

What makes it a factory

Factory life

The defining combination is autonomous and asynchronous execution.

  • Autonomous: The agent chooses and carries out steps towards an agreed goal. It can inspect what happened, adjust its approach and continue within its authority.
  • Asynchronous: That work can proceed without your ongoing attention. You can leave and return to its result.

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.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.

  1. Harness is the environment that exists around the model: tools, a workspace for project files, execution, and feedback. It lets an agent read files, change software and run it. If a check fails, the harness must give the agent enough information to investigate what happened.
  2. Personalization is the context and capabilities for your work: project direction, rules, reference material, skills and connections to other systems. The agent needs to know what you are trying to accomplish and which existing decisions it should preserve. Permissions limit access to tools and systems; sandboxing restricts the environment where actions can run.
  3. Automation is a way to start and continue work without a fresh instruction from you each time. A schedule or event can trigger a task or the pickup of ready work. It also needs direction about what qualifies as ready and where to leave the result.
  4. Continual learning is a process for learning from completed and failed runs, improving the factory and carrying those changes into later work. That might change an instruction, a checking procedure, or a tool the agent uses.

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.

  • Specification makes the intended outcome, constraints, and criteria for success explicit. In our invoice brief, that includes preserving records after a restart and calculating payment statuses correctly.
  • Verification checks the software, and the work agents perform against those requirements.

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.

1. Agent harness

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.

2. Personalization

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:

  • Rules: Preserve existing invoice records; ask before changing payment-status calculations
  • References: Your template, payment terms, and example invoices
  • Skills: Repeatable procedures for testing invoice creation, payment updates, and persistence

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.

3. Automation

One agent works in the background; you assess what comes back.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.

One agent working in the background

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.Coordinate ready work, then check the combined result.

Coordinated work

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.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.

4. Continual learning

Use run evidence to test and adopt improvements to future work.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.

What would you build?

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?

Decide what your factory needs next

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.

Come build your factory with us

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.

12:35

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 network­at a coffee shop, university, or other organization­face much less of a challenge.

Cleanup of this is going to be another mess—and it’s right on top of the PHP vulnerabilities.

Some more information.

12:07

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."

1371abe9676f46debf688bd7e7a51928

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.

581cebc83c5a49669bd71ee42aa7951d

"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?"

8ff882cd2a8d4e1cb7e324865a0ee168

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.

868c6bd8600c455bb651cc31ad15c221

b98573628e504e25aa2702abc7c99bb7

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."

d3d75a1823cb4692b2e15092845bce93

[Advertisement] Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.Learn more.

11:07

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).



comment count unavailable comments

10:21

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.

09:14

Devil Dogs [Penny Arcade]

New Comic: Devil Dogs

07:35

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

06:00

Girl Genius for Friday, October 23, 2026 [Girl Genius]

The Girl Genius comic for Friday, October 23, 2026 has been posted.

05:35

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.

04:35

[Filler] 23rd Anniversary! [Twokinds]

Comic for October 22, 2026

03:56

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

01:28

Link [Scripting News]

Ooops, didn't get it done today. Please come back tomorrow. :-)

00:35

“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.

00:28

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: 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.

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.*

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.

Thursday, 22 October

23:49

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.

23:00

Examining the macOS gcc binary [OSnews]

If you’ve ever written C (or c++) on a mac, you’ll know that the so-called gcc is 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 to clang but it turns out the answer is more interesting than that.

↫ juliethefoxcoon

It’s all smoke and mirrors.

Unikernels in OCaml [OSnews]

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.

22:00

The hotlist [Seth's Blog]

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.

https://hotlist.sethgodin.com

Thanks for reading.

20:49

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   

17:49

[$] 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.

17:42

Link [Scripting News]

I hope to see the The Web of Markdown idea take the next step later today or early tomorrow at the latest. Still diggin!

14:49

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.

[$] 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.

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.

Good explanations.

14:42

That’s Not A Bug, It’s A Feature [Nina Paley]

The Jackalope, unlike the Stiletto, permits its handlebars to rotate 180°. Past a certain angle, the front wheel rotates the opposite direction.

In practice, this would never happen while riding; the steering angle doesn’t come close. But it could be good news for V2’s folding, allowing the handlebar to fold inward rather than forward, without overstretching the front brake cable.

Jackalope handlebars folded inward rather than forward. This could be useful on V2.

The handlebar can also drop to the side.

GlidefFlex handlebar dropped to the side.

Either way, I need to add cam levers to the handlebar clamp bolts so they can fold in further.

Share

The post That’s Not A Bug, It’s A Feature appeared first on Nina Paley.

13:56

Representative Line: Readable Formats [The Daily WTF]

We all love format strings for generating human readable text. Certainly, they're a better choice than string concatenation. Even if I have a blind spot that keeps me from remembering the printf format tokens, I still prefer to use format strings.

Jasmine has a co-worker that does use format strings, but they also miss using string concatenation. So they've found a way to combine them, and avoid the perils of making readable code that describes the format of their text.

myField.DataFormatString = "{0:#,##0." + new string('0', 2) + ";(#,##0." + new string('0', 2) + ")}";

Now, in their defense, I can see how this code started its life. At some point, they wanted to make the number of decimal places a parameter. And sure, this is an easy way to do that and retain the intent, though this whole thing could be cleaned up with just a simple decimalPlaces = new string('0', 2), which would make the concatenation less confusing to read.

Related, while I was checking the documentation on the .NET formatting strings, I learned that they have a per-mille format specifier which requires writing a unicode sigil on most keyboards.

I'm sorry, but seeing string perMilleFmt = "#0.## " + '\u2030'; in my code would be TRWTF.

[Advertisement] Picking up NuGet is easy. Getting good at it takes time. Download our guide to learn the best practice of NuGet for the Enterprise.

13:14

The Latest Anthropic Claude Models Contain AI Text Watermarks: What Does This Mean for You? [Radar]

If you’re an instructor for the O’Reilly live training platform, you’ve got to be prepared for the unexpected. As a developer I think we all can understand the situation when a demo (you know, the one that you’ve tested a thousand times on your machine) easily decides on its own to go wrong while being demonstrated to a live audience. We’ve all been there. And of course, the biggest variable in the equation is the live Q&A portion of any course, because we actively encourage course participants to ask any question that’s on their mind.

Shortly after Anthropic announced that they were going to include AI watermarking in all text-based outputs from their latest models, I was flooded with questions during a Q&A session in a completely unrelated course about Claude Agents. Nearly everyone who posted a question in the Q&A box wanted to know more about how AI watermarking worked, and how it would affect them.

In light of that interest, I am taking this opportunity to help explain what watermarking means for you.

What did Anthropic officially announce?

I don’t want to put words in anyone’s mouth, so I’ll just quote Anthropic verbatim from its announcement in August 2026:

Future Claude models will generate text that contains a watermark. This is a way of determining the likelihood that Claude was involved in writing the text, and we, along with several other major AI providers, are implementing this change to comply with the EU AI Act.

Here’s another quote from the same announcement:

Watermarking won’t be specific to Claude. As of August 2, the EU requires AI providers serving its market to mark AI-generated content. Other major model developers have signed the same Code of Practice and will be implementing their own watermarks.

The list of Claude models (at the time of this writing) that include AI text watermarks in all generated outputs are:

  • Claude Mythos 5.1
  • Claude Fable 5.1
  • Claude Fable 5
  • Claude Opus 5.5
  • Claude Opus 5
  • Claude Opus 4.8
  • Claude Sonnet 5.5
  • Claude Sonnet 5
  • Claude Haiku 5.5

It won’t matter if you use Claude Desktop, Claude Code, or the API, because all of Claude’s outputs will contain the AI watermark. As a result, any code, email, blog, article, newsletter, or white paper that you write using Claude will contain a watermark, and anyone who has an AI watermark detector can easily determine if that content was AI generated.

What’s the difference between cryptography and steganography?

Now let’s talk about two related terms that apply to what we’re dealing with when it comes to the AI watermarks: cryptography and steganography. Cryptography is something you encounter every day when you visit a website that uses HTTPS instead of HTTP. Your web browser automatically handles the encrypting and the decrypting for you, but what it simply does is make the content of anything that you send or receive unintelligible unless you have the key to decrypt the message. As a result, you can (for example) securely type in your credit card to sign up for an O’Reilly subscription, because we (like every other major website on the internet) use HTTPS on our website to ensure that no outsider can obtain your credit card information. Therefore, if an unscrupulous person intercepts something you send over an HTTPS connection, the contents will be encrypted and meaningless.

Steganography is completely different, and it’s what the Claude AI watermarking technology uses. Steganography is about hiding something in the right place for someone who knows where to look for it. Steganography is not cryptography, because everything about the message is in plain sight. However, you have to look deeper at the message itself to find the contents that have been hidden or obscured. The most common example would be any paper currency of a large denomination (like the $100 dollar bill). If you hold the bill up to a light, then you’ll see a “security thread” as well as a watermark of Benjamin Franklin’s face.

So, technically, how does the AI watermark actually work?

The Claude AI watermark uses a type of steganography based upon SynthID-Text, an open source project by Google DeepMind. SynthID-Text is a form of steganography because the signal (the information that you are looking for) hides inside the word choices of an ordinary-looking paragraph. Consequently, you can copy/paste the AI-generated code in your favorite code editor, or put an AI-generated paragraph into a Word document, an email, or a Slack message, and the AI watermark comes along for the ride.

According to Anthropic, the watermark changes only the source of randomness that the model uses when it picks among near-equivalent words, so nothing is added to the text. There are no hidden characters placed inside the AI generated text, and no extra tokens are consumed. Also, the watermark carries no information about you. This means simply that the AI watermark detector can determine if text is AI-generated, but it cannot determine whose Claude account was used to generate the text.

SynthID-Text uses a technique called tournament sampling. At each position, the model draws several candidate tokens and runs them through essentially what is a knockout bracket. The winner of each round is decided by a pseudorandom score (g-values) that comes from hashing the previous handful of tokens together with a secret key. In a body of text with hundreds of words, the text ends up slightly favoring tokens with high g-values in a pattern that only the key holder can see, and that you would never spot by reading.

“Slightly favoring” is the key phrase here. For example, the choice between the words “big” and “large” doesn’t change the meaning of most sentences, so nudging that choice to one of the two doesn’t change your text in any way you’d notice. Google tested this on roughly 20 million Gemini responses, and the thumbs-up rate differed by 0.01% (with the watermarked model slightly ahead).

Who else is watermarking their AI-generated content?

As previously stated, Anthropic’s decision to put AI watermarking on its content is mandated by EU laws and regulations that took effect in 2026. Anthropic is not the only company that has complied with this regulation and, according to the EU Commission website, hundreds of companies have agreed to comply with the regulations that require AI watermarks.

For example, OpenAI has recently announced their support for watermarking AI-generated outputs. Here’s a quote from their announcement:

Over the coming weeks, we will add an invisible watermark to eligible ChatGPT and Codex text output in the European Union.

OpenAI’s text watermarking technology is called “textGrain,” and it’s inspired by the art of writing text on a grain of rice. Now, you may be asking yourself, “How much AI text is needed in order to place the watermark itself?” The good news is that OpenAI has published statistics from their own tests for AI text watermark detection. Their AI text watermark detector has 95% accuracy for passages that contain 400-tokens of text. This gives you an idea that only a few paragraphs of text is all that’s needed in order to embed the watermark.

However, since the EU mandate applies to AI-generated content (not just text), OpenAI has gone even further and released a website to let anyone know if their models have generated non-textual media, such as images and audio. I’ve tried the website myself and it correctly identifies a watermark within a few seconds.

The regulation dictating AI watermarks is not just an EU thing. The SB-942 California AI Transparency Act also requires watermarks on AI-generated content. These regulations, combined, not only apply to AI-generated text but also to images, audio, and video.

Google’s model outputs also contain AI-watermarks

Google complied with the EU AI Act years ago, so their models have included the SynthID Text Watermark since 2024. However, they’ve followed suit with OpenAI and released a public website, SynthID.com, to allow anyone to check if any non-text media (such as images, audio, and video) contains the SynthID AI watermark. Google’s AI watermark detector allows you to check for a watermark from multiple AI providers such as OpenAI, Nvidia, Kakao, and of course, Google themselves.

Watermarking all AI-generated content is not necessarily a bad thing

In my most recent experience, I worked as a consultant for a company that was undergoing a VC-backed funding round. After the funding was publicly announced, certain people at the company were being contacted by the “CEO,” who asked them to perform a bank transfer from their personal accounts because of some made-up situation. In reality, it was a group of scammers that used LinkedIn to find the names of employees of the company, and then posed as the CEO so that employees would send money into the scammer’s bank account. Most of us were tech-savvy enough to understand that this was an obvious ploy driven by unscrupulous people. The scammers gave themselves away because they were using email domains that were not owned by the startup, so in this case, the fraud attempt was easily detectable.

However, the technology exists today where voice cloning can be easily accomplished with only a few samples of a person’s voice. So what if a more sophisticated “spear phishing” attempt was done where the attacker decided to use AI in order to clone the CEO’s voice? And what if the fake CEO started calling people (instead of sending emails)? This could lead to a much worse situation where employees think they’re interacting with (and obeying) the CEO and feel compelled to do something that could have grave financial consequences.

What this means for you

All the major LLMs are including watermarking in their AI-generated content, and due to recent regulations, that’s not going away. Bad actors can use AI today to perform serious attacks on the public, so having an AI watermark on any AI-generated content (text, images, audio, or video) is a very useful tool to determine authenticity.

If you want to see a live demonstration on how AI watermarks can be applied and detected on your own, be sure to attend the course Understanding AI Text Watermarking, only on O’Reilly.

11:42

Grrl Power #1506 – Let the (not 1980’s arcade) games begin [Grrl Power]

Trying something new here. I do the vertical double pages when I need to fit more to a page or do bigger panels, but that limits the layout options, so let’s see if this works. Obviously the comic as posted is going to be too small, as I only have 750px of horizontal space allotted in the web page layout (yeah, I know, the page is very Web 1.0), and clicking on the comic page just takes you to the next comic, assuming there is one. It’s not an elegant solution, but if you click on the thumbnail, it should show you the page at full size.

And just in case this doesn’t work for your particular browsing situation, here’s a free link to the Patreon version of this page, which as usual, is double res.

I don’t know what made me think of Sinistar, but I thought it’d be a fun goof to have his cousin show up. Or… his manufacturing branch Mk 1.2 or however that works with sapient evil spaceships.

And, uh… not sure what else to say about this page. Enjoy the fight!


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.

11:07

GNU nano 9.3 was released [Planet GNU]

Version 6.0 brought option --zero, for hiding all interface elements.  Version 7.0 brought braced function names, to make string binds more readable and stable and versatile.  Version 8.0 changed Ctrl+F to mean "forward search", like in most other programs, and added option --modernbindings for making most bindings like in other programs.  Version 9.0 brought horizontal scrolling of the viewport.  Along the way many small issues were fixed and little improvements made.

10:28

The age of initiative [Seth's Blog]

We’re unprepared.

In high school, the quarterback isn’t allowed to call the plays, the actor isn’t allowed to write the lines and the math whiz isn’t allowed to choose what to prove.

We all grew up in the age of compliance (and indoctrination).

The long tail of the internet and the astonishing leverage of AI has made this training much less valuable.

No matter what you do for a living, there’s a machine standing by, waiting for instructions. Instructions from you, if you choose, or from your overlords if you don’t.

And following the playbook isn’t much help, because the world is changing so fast, a playbook is obsolete by the time someone hands it to you.

One reason AI got such a fast start is that it gave people seeking compliance a chance to wait for the AI to tell them what to do next. Quick, cheap answers.

AI gives bosses a cheaper (and often more compliant) alternative to hiring humans to do some tasks.

For those indoctrinated to comply, this is stressful. The stress is due to a desire to get things back to normal, to give them a chance to comply again, but right here, right now, is as normal as things are ever going to get. “Good jobs” are no longer sinecures where success comes from following instructions.

It’s an abrupt change, and winging it is insufficient. Handling this sudden transition alone is too difficult. But we have a chance to find the others, to connect and be part of a cohort that challenges, educates and encourages each other on the path to find a way forward.

We accepted that it was required to spend years being trained to handle a life of compliance. Now we have the chance to lean into the hard work we’ll need to do to thrive in an age of initiative.

08:14

How to install an app on your Commodore 64 [OSnews]

Graybeards like me remember trying to painstakingly type source code from a magazine. This is a very accurate account of what a young computer user in 1986 needed to do to get a new game for the Commodore 64, complete with an immersive emulation.

It’s time to install an app! But here in 1986, we still call them “programs,” not apps. So, you’ll want to set aside some time to get started installing a program.

02:28

Lollygagging [QC RSS v2]

gaggylolling

02:07

[$] LWN.net Weekly Edition for October 22, 2026 [LWN.net]

Inside this week's LWN.net Weekly Edition:

  • Front: Android vendor hooks; Reproducible builds and kernel integrity; Rust data structures; NFS server changes; Setting no_new_privs for PID 1; Rust XArray; Rust cross-crate declarations; 7.3 statistics; Nix flakes.
  • Briefs: eMudhra CA compromise; PHP RCEs; Node.js and musl vulnerabilities; GNOME OS; OpenBSD 8.0; Ubuntu 26.10; TAB results; Quotes; ...
  • Announcements: Newsletters, conferences, security updates, patches, and more.

01:07

Link [Scripting News]

Perfect autumn day in the mountains spent mostly away from the computer. Still, some interesting new stuff to show tomorrow.

00:28

Wednesday, 21 October

23:42

22:56

Steinar H. Gunderson: Decompilation patterns, part 18: Signed division [Planet Debian]

As promised, the last one (for now?), and this one blew my mind the first time I saw it:

    var_v0 = sp4014;
    if ((s32) sp4014 < 0) {
        var_v0 = sp4014 + 0x7FF;
    }
    temp_s1 = 0x800 - (sp4014 - (((s32) var_v0 >> 0xB) << 0xB));

There's actually two things going on here. First, the compiler is faking a signed division using shifting (which rounds down) as a building block: If the value is negative, then you add a bias to make shift into round-up. (The right-shift by 0xB, or 11, is exactly a division by 0x800.)

So this means what we're looking at is:

    var_v0 = (s32) sp4014 / 0x800;
    temp_s1 = 0x800 - (sp4014 - var_v0 * 0x800);

which reduces further to:

    temp_s1 = 0x800 - ((s32) sp4014 % 0x800);

Tada. That's it. Now you know all the tricks, except those that I don't know or that I forgot. You don't need the LLM. Have fun. :-)

Edit: Corrected a thinko; of course, MIPS has signed division. This is for power-of-two optimizations only.

22:49

The Tri-Fold Augur [Penny Arcade]

Bungie is between Scylla and Charybdis, two words I spelled correctly on my first try. What are these two things? We don't need to go into all that - just know that they're both unwelcome, and you don't want to be there. Bungie's thing is to make its own weird and peerless shit, they've been doing it since the Mac, and maybe on some level there might be a perceived loss of face or identity associated with hauling somebody else's rope. Fuck allat. This is Live To Fight Another Day shit. Get the skunkworks popping while Lucasfilm keeps the stove warm and fends off Sony with a chair and a whip. The deal is bigger than paper, as choosing to slot work with the leading console manufacturer is just a good thing to have in your back pocket. And we already know Bungie would crush it: Renegades, their collab/crossover/Star Wars fic, was sick to death. Indeed, I propose that this is so cosmic, powerful, and correct that it represents an auspicious stellar configuration - something as good as Scylla and Charybdis, whatever they may be, are bad.

22:07

The Big Idea: A. T. Sayre [Whatever]

Everyone remembers Scrooge as a mean, cold-hearted man, even though his entire arc is that he becomes a better, kinder man and develops empathy. Author A. T. Sayre’s main character in The Asterist is quite the Scrooge, too, but maybe we’ll end up remembering him in the better light he deserves by the end.

A. T. SAYRE:

Asterist, noun /ass ter ist/  – someone who lives on an asteroid. Often used as a pejorative for people posted on solitary observation or research stations in remote areas of space. 

The Asterist is my second novel. Which, just like my first one, was only supposed to be a novella, but just kinda kept going. Seems to be the way it works for me—aim for a novella and miss. Not the most orderly ways to operate, I know, and I suppose one of these days I have to guestimate how long something I plan to write is going to be correctly. Small goals…

It has been a wild turnaround on it, too. I finished the rough draft of this one less than a year and a half ago, in March ‘25. Then came the beta readers, rewrites, reworkings, more rewrites, etc., the whole process, which was concluded sometime late last summer. And here it is already out in the world. It’s actually been less than a year since The Asterist was even sent out to publishers. For those of you reading this who don’t take part in the sausage making part of literature, that is amazingly fast, especially for a nobody doofus like me.

I have many talented friends with marvelous books they have put their everything into that have been out on submission for years with no luck yet. Which is how it’s supposed to work normally. Big name authors can turn things around quickly, of course, because they have names built on track records of proven quality and success, but I have nothing like that. Yet The Asterist took just barely over a year and a half from the first typing of THE END to in your local bookstore. I like to think that reflects something about the book, about just how good it actually is. Because I think it’s fantastic, far better than something a doofus should be able to write.

The big idea of The Asterist is about empathy. Specifically, about the expansion of empathy out to embrace the other. It’s easy to feel for someone who you see as in your ‘tribe’ already, people do that all the time. For your family, for your friends, for your neighbors. They’re like you, they look like you, they share a lot of your same values, so you can easily grasp where they are coming from and can feel their pain and want to help. There’s nothing whatsoever wrong with that; in fact it is glorious. After all, in the grand scheme of things, why are we here if not for each other?

But the farther we get from these commonalities, the easier it can be to feel nothing real for someone and what they might go through. Even to be somewhat hostile. I don’t think I need to give any examples of this kind of thing today for all of you to know exactly what I am talking about. Suffice to say, the fear of the other is alive and well in our world. It was an important instinct to have a hundred thousand plus years ago, when a stranger showing up in your valley might stretch the limited resources you could utilize too far and put you and your loved ones at risk of starvation.

But apart from some extremely isolated patches of this planet, no human has lived in that kind of world for eons. The instinct remains, though. And it’s continued existence in our psyche might be one of the biggest obstacles left to our advancement as a society. One I firmly believe we must, if not extinguish from our minds, at least learn to go beyond.

This is what William Jeffries, the hero of this book, the titular asterist himself, is doing. At first blush he is not the type of person you would expect to get life lessons about empathy from. He’s a bitter, foul-mouthed, even somewhat mean-spirited man, beaten down by a life that did not turn out as well as he had hoped, which he responds metaphorically to with a perpetual middle finger. It’s a life of grievances, excuses, and petty snark. If there is any type of person who would embrace his fear of the other, it would be him.

Then he is confronted quite suddenly with the existence of something that is most definitely an other, a whole new and very different alien species, one that he has nothing remotely in common with. And despite his cantankerous, misanthropic character, he learns to get past that sense of otherness, and to grow and evolve his feelings toward them, to see them as a being worth love and care. And he doesn’t do it because the fate of the universe depends on it, or humanity’s, or even just his own life; he’ll be just fine no matter what, so will humankind, and the universe like always barely notices anything any of us ever do.

There is nothing bigger at stake here. He could very easily wash his hands of the whole situation at any time and he knows it. But he doesn’t—he stays involved, he fights, he struggles for this other thrust into his presence, puts himself at great risk in various different ways for them. And no matter what rationale he may give at any given moment as to why, in truth he does it all for no other reason than because deep down he knows that is what he should do.

It is a level of character that I wish I felt certain I had myself. I have the same antiquated fear of other instinct in me as everyone else does. I try to move beyond it, to ignore it, sometimes more successfully than others. 

Would that we all would do the same, and try to be more like the bitter, foul mouthed, and mean-spirited William Jeffries.


The Asterist: Amazon|Barnes & Noble|Bookshop|Powell’s

Author socials: Website|Bluesky

21:35

Today's PHP Security Release, and How We're Strengthening PHP Security (PHP Foundation) [LWN.net]

The PHP Foundation has put out a blog entry explaining how the vulnerabilities disclosed today came about and why they took so long to fix.

To fix the OOM problem, the PHP security team developed several competing approaches, but each came with its own trade-offs: backward compatibility breaks, new denial-of-service potential, or requiring changes to many third-party extensions which seemed impossible to coordinate. The PHP security team, operating on consensus, struggled to choose between these and feared the repercussions of shipping the wrong choice. Combined with the lack of a known path to remote code execution and the small team of core developers with the necessary deep knowledge of the engine occupied with many responsibilities, this decision process caused work on a fix to stall and restart repeatedly over months. We won't pretend otherwise: the delay was a structural failure, caused by both the security team's decision process and its lack of resources.

Pluralistic: Adversarial interoperability is a team sport (21 Oct 2026) [Pluralistic: Daily links from Cory Doctorow]

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

Today's links



A medieval engraving of an Italianate city; floating in the middle is a giant skull (anterior view). Surrounding the skull is a series of 17th C European machine parts, being worked by tiny engravings of 17th C rude mechanicals. A strangely erotic, massive flower looms out of the right; standing amid its proudly thrusting stamen is a 17th C swordsman.

Adversarial interoperability is a team sport (permalink)

Enshittification is particularly galling because (in theory, at least), digital technology should be really hard to enshittify.

That's because the only digital computer we know how to build is the "Turing-complete, universal von Neumann machine," which is to say, a calculating engine capable of computing every valid program. In some deep, important, foundational sense, every computer is the same as every other computer. Sure, they vary in terms of speed, storage and RAM, but given enough time and electricity, every computer can run every program.

This has profound implications for enshittification. Say a tech boss takes away a feature you value (as when Sonos pushed an update that removed nearly all the functionality from its "smart" speakers), or adds a feature you hate (like when Chamberlain blocked third-party apps from controlling its garage doors so it could force its customers to view seven ads before they could open or close their garages). At that point, a programmer can write an "interoperable" program that restores the good feature or blocks the bad one.

This program can be costlessly and instantaneously distributed to every affected technology user, and those users will likely pay something for it. After all, enshittification is a way to shift value away from technology users to tech companies, which makes the case for you paying for disenshittification technology that wrestles that value back.

All of that means that, in a state of nature, companies that are contemplating enshittification need to worry that their greed will tempt new companies to enter the market and poach their customers and suppliers. This alone might be enough to frighten companies off from enshittificatory gambits, and if companies press ahead regardless, then they open market opportunities for better companies that can costlessly, instantaneously usurp the original manufacturer's relationship with their entire affected customer base.

That's how it should work. But in 1998, Bill Clinton signed the Digital Millennium Copyright Act, and Section 1201 of the DMCA establishes a felony (punishable by a five-year prison sentence and a $500,000 fine) for reverse-engineering and modifying technology without the manufacturer's permission. Then, the US Trade Rep spent the next 25 years making sure that every US trading partner had an identical (or even worse!) "anticircumvention" law:

https://pluralistic.net/2025/05/26/babyish-radical-extremists/#cancon

The result is a grotesquely asymmetrical digital world, in which companies are free to use the flexibility of digital computers to downgrade or brick your digital devices, but where you commit a crime if you avail yourself of a countermeasure to get more out of something you own. This is the core technological factor at play in enshittification.

Enter AI. Thanks to vibe-coding, everyday people are rolling their own software for their devices and building the tools to shatter the digital locks that manufacturers use to block disenshittification. An excellent article by 404 Media's Jason Koebler runs down some of these hacks, including drop-in replacements for smart TV software that blocks the endless ads and surveillance that have made TVs all but unusable:

https://www.404media.co/reverse-engineer-anything-is-the-new-wild-west-of-ai/

These AI tools mix several techniques to disenshittify users' devices. One major component is automating the installation of existing alternative firmware for these devices that have been (possibly illegally) created by hobbyists and uploaded to various code repositories. Installing these alternative OSes is typically a gnarly task, requiring the user to do a lot of complex, fiddly, highly technical work to bypass their devices' digital locks.

In a world without anticircumvention law, a company that sold alternative OSes could hire a ton of programmers and UX developers to smooth over this process, but this is beyond the reach of a typical hobbyist or even a community of hobbyists, especially if they must operate in the shadows, under the threat of civil and criminal liability.

There's a useful analogy here to the trajectory of desktop versions of GNU/Linux. The first time I tried to install Linux (on an original iMac, in the late 1990s), the installation process included a multi-week post-installation wrangle that saw me (often unsuccessfully) compiling key modules from source code and then painstakingly configuring them to get the computer's graphics and I/O working reliably.

Fast forward 30+ years and installing Linux is trivial, thanks to highly capitalized companies like Canonical (makers of Ubuntu, the flavor of Linux I've used for nearly 20 years now). Installing Ubuntu today merely requires that you download the OS to a thumbdrive, reboot your computer using the drive as a startup disk, and click "install." Canonical's installer automatically hunts down the correct software for your hardware and configures it. Canonical writes and contributes to a lot of parts of the Linux OS, but the most important work it does is the fiddly, painstaking, labor- and capital-intensive work of perfecting that installer so it Just Works.

Much of what a vibe-coded jailbreaking tool does is stand in for Canonical, but for hobbyist OSes for smart TVs and speakers and many other devices. These LLMs patiently research every weird error and peccadillo and parse through message boards and logfiles detailing other hobbyists' struggles to get the code working and methodically apply and adapt those solutions until your device Just Works.

Some of these vibe-coded interop tools go farther than that. According to Koebler's coverage, some device owners had their coding assistants scratch-build entirely new, heavily customized OSes for their devices, complete with bypasses that allow this new code to be installed despite the manufacturer's countermeasures which are designed to prevent this. Delightfully, many of these users have created software that revives their bricked, discontinued devices. This poses the possibility of a world in which manufacturers no longer have the last word in your use of your own property: the mere fact that the manufacturer lost interest in a device and killswitched it does not mean that you must consign that valuable device to a landfill to become immortal, toxic e-waste.

All of this is good news. Some of the most sophisticated jailbreaking tools (such as those on the super viral "Reverse Engineer Anything" Github page) run locally, on your own computer, without invoking the "frontier models" that the big, awful AI companies have created:

https://github.com/morluto/rea

This is good even if you're just modifying your own devices to get them to more closely conform to your own use-case. LLMs are genuinely good at coming up with the abstruse and obscure configuration lines and other incantations to get your technology working. Recently, I used a local model to fine-tune the power-management on my new laptop in ways that go beyond the options that are exposed through user-friendly graphic interfaces. The LLM spat out a grub "GRUB_CMDLINE_LINUX_DEFAULT" line that (again) Just Worked.

The last time I had to do this, I spent days painstakingly trouble-shooting options by trial-and-error. Using a chatbot to fill in the gaps left by decisions about which configuration options to place within reach of regular users and which to reserve for power-users has made my computer much more useful to me for the things I want to do, like writing and making collages.

The reality is that it's just not practical for technology developers to turn every conceivable function of your computer into a simple-to-use, accessible tool. A large part of technology design is about leaving things out (or, as my favorite Eno Oblique Strategy goes, "Be the first person to not do something that no one else has ever thought of not doing before"). No matter how thoughtful and diligent a technology designer is, they will never fully anticipate the needs and exigencies of their users. That's why the motto of the disability rights movement is "Nothing about us without us."

The users of technology know more about their use-cases than can ever be captured through a requirements gathering exercise and user testing. One of the best and proudest legacies of technology is the lineage of "user-friendly" programming tools that let nontechnical people design their own applications that exactly met their needs, from Hypercard to Visual Basic to Scratch, a lineage that vibe-coding tools are arguably part of:

https://pluralistic.net/2026/09/25/other-people/#right-there

But these tools are not perfect (nothing is). For all that Hypercard lets you do many things that would otherwise require a skilled programmer, it was also always limited relative to, say, writing MacOS code in Objective C. Your Hypercard program might do exactly what you needed it to, but slowly, and sometimes unreliably, and with serious limitations, such as a relatively low ceiling for the number of records you could add to a database.

Vibe-coded personal apps aren't necessarily subject to these limitations, but they come with some significant risks. Vibe-code can have serious security vulnerabilities that expose the user to things like identity theft or sextortion. It's conceivable that a vibe-coded garage-door opener app might make it possible for attackers to open your garage door when you're not home (or worse, when you are!). Depending on your risk-tolerance and expertise, these might be acceptable prices, or they might be too high.

But it's important to clearly identify the problem here: if the alternative OS you install on your smart TV exposes you to privacy-invading hack attacks, the problem is the defect in that software. The problem isn't that you had the temerity to rip out the manufacturer's own software and replace it with code of your choosing. You bought that TV, it's yours, and you don't owe the manufacturer an obligation to expose yourself to its own, built-in, intentional surveillance and invasive ads.

Here's a parallel: you have the right to put any shoelaces in your running shoes. Sure, Nike might prefer you to lace up your Jordans with its expensive OEM laces, but that's Nike's problem, not yours. Now, Nike might argue that by using no-name laces, you run the risk of having a lace break while you're running, which could also break your ankle. That's certainly a possibility: shoelaces do break, and Nike might be justifiably proud of the quality of its laces. But if your generic laces snap (and so does your ankle), the problem is that the shoelaces you chose were defective. The problem is not that you chose someone else's laces.

Your stuff is yours. You can put anyone's milk on your cereal, not just the milk that Kellogg's endorses. If the milk you choose is sour and you have to pour your cereal down the toilet, that's too bad, but it doesn't mean that Kellogg's should have the right to shame you for having the temerity to choose the milk you preferred, and it certainly doesn't militate for DMCA-style enforcement to coerce you into using Kellogg's official milk in the name of protecting you from food wastage.

I raise this because there's a live debate over this subject, which is well represented in the latest 404 Media podcast:

https://www.youtube.com/watch?v=UbG1qwxMtU0

In the podcast, Koebler and his 404 co-founder Joseph Cox express misgivings about various possible uses of "slop interop." Koebler discusses the fact that John Deere sells the same physical tractor at many different price-points, depending on which software a farmer chooses, and raises the possibility that a farmer might vibe-code software that replicates the high-end functionality without paying for it. Koebler discusses two possible downsides to this: first, that the vibe-coded software might be defective and expose the farmer to risk; and second, a question about whether it's fair or just for a farmer to get those additional functions of their tractor without paying for them.

I think the first objection is entirely legitimate. The software you run on your expensive tractor should be secure, both for your own benefit and for the security of our food supply. That's actually a pretty good reason to ditch John Deere's own software, which is very insecure:

https://pluralistic.net/2022/05/08/about-those-kill-switched-ukrainian-tractors/

But I think the second question – whether it's legit to get this functionality without paying John Deere for it – is spurious. Sure, if John Deere provides you with that functionality, then they can send you the bill for it. But if you provide yourself with that functionality, using software you procured independently of John Deere, then John Deere has no right to get paid for it, and they certainly shouldn't have the right to stop you.

That tractor is yours. The fact that John Deere manufactured it is irrelevant. If you pay a contractor to build a house for you and later on pay a different contractor to add another bathroom to it, you don't owe the first contractor anything. It's your house (and if that bathroom has a leaky toilet, that's a matter between you and the second contractor, and not a reason to force you to only use your original contractor).

The law defines a narrow slice of functions that manufacturers get to control: those ideas that a patent examiner deems "novel, useful and nonobvious." It's legit (and good) for commercial operators to copy and improve the ideas of their rivals and competitors. It's why skilled tradespeople cluster together in the same geographic area.

Take Clerkenwell, the neighborhood in London where precision machining was invented by the jewelers and machinists who clustered there during the Longitude rewards. The reason all those competitors sought such close promixity to one another was because they wanted to copy the new techniques their rivals were developing (even if that meant that their rivals would be able to copy them):

https://en.wikipedia.org/wiki/Longitude_rewards

If you're old enough to remember the advent of spreadsheets and the rollout of Visicalc, Lotus 1-2-3 and Excel, you'll know that every time a software vendor invented a new spreadsheet feature, all the other ones immediately copied it. This wasn't bad for spreadsheets: it was good for spreadsheets, just as copying your competitors was good for precision machining in Clerkenwell.

Everything from GNU/Linux (a feature-for-feature clone of AT&T Unix) to SAMBA (a plug-compatible clone of Microsoft's SMB) to iWork (file-compatible, feature compatible clones of MS Office's apps) came about through this "adversarial interoperability." What's more, the heyday of this kind of adversarial interop was also the heyday of disenshittification, the era in which any anti-feature installed by your existing vendor could be countered by a disenshittifying patch from a new one:

https://www.eff.org/deeplinks/2019/06/adversarial-interoperability-reviving-elegant-weapon-more-civilized-age-slay

The question of whether vibe-coded software is any good is separate from the question of whether it's good to replace the software in your devices, even if you replace it with software that has features that the manufacturer would normally charge a premium for. You are under no obligation to arrange your commercial affairs to the financial benefit of manufacturers, and anyone who claims to be surprised that someone they sold a device to used it to benefit themselves at the manufacturer's expenses is either disingenuous…or unserious. You bought it, it's yours.

But just as this vibe-coded adversarial interop has drawn both valid and spurious criticism, it's also drawn excitement that is partially justified and partially overblown.

When it comes to reviving bricked devices or rooting out the surveillance and ads from your smart TV, vibe-coded interop tools are genuinely exciting. These are the kinds of enshittification that can truly be remediated with individual jailbreaks.

But the real, meaty examples of enshittification can't be addressed on an individual level – they require systemic fixes. If you jailbreak your iPhone so that it can use alternative app stores, that fact is not sufficient to cause those alternative app stores to come into existence. If we want to stop Apple from levying a $100b "app tax" on the digital economy, it's not enough for individuals to vibe-code their own iPhone patches. We need to repeal the law that bans jailbreaking iPhones, so that a would-be alternative app store can raise capital and pay programmers and tech support staff and salespeople to assemble rival catalogs of software and help customers figure out how to get up their phones to use it.

The same goes for jailbreaking your printer so it accepts generic ink. Sure, this may work for you if you're up for refilling your own cartridges, and I'm sure that you can find someone on Alibaba who will sell you ink by the gallon. But the mere fact that a few users have secretly and privately jailbroken their inkjets won't conjure up a generic inkjet cartridge manufacturing sector. For that to happen, we need to make jailbreaking printers legal, not just possible.

Indeed, if we want to improve the quality of all that jailbreaking code the chatbots are writing and circulating, we need to be able to put those jailbreaks in public repositories for public inspection and public critique. It's possible for some of the code produced by an LLM to be slop, and for other code to be fine, and for yet a third tranche of code to be remediable slop that can be made robust and reliable through auditing and refactoring. You can't figure out which is which if you have to keep that vibe code a secret on pain of a long prison-sentence.

I think there's good cause to be excited at the prospect of getting your devices working better, or just working at all. I think that even if the code stops working after a while, that's still fine – either you got more use out of your device than you would have without the new code, or maybe you just make more code that runs for a while for you, and then you do it again.

These individual improvements to your devices and technology are worth celebrating. But they are no substitute for systemic intervention. If we're going to have a new, good internet, a post-American internet that truly disenshittifies America's defective tech exports and replaces them with robust, transparent digital public goods, we need to make reverse-engineering legal again. Once we fix our policy, then we can fix our code:

https://pluralistic.net/2026/01/01/39c3/#the-new-coalition


Hey look at this (permalink)



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

Object permanence (permalink)

#25yrsago Secret recording of Labour Whip demanding support for Iraq invasion https://www.theguardian.com/politics/2001/oct/22/uk.september11

#25yrsago LoC launches emulator-based digital file preservation https://web.archive.org/web/20011217002337/http://www.techreview.com/magazine/oct01/innovation5.asp

#25yrsago Kevin Mitnick to play CIA lackey https://web.archive.org/web/20011111105016/http://www.theregister.co.uk/content/55/22395.html

#15yrsago ACLU Tennessee brings suit against ICE officers who broke into house and said, “We don’t need a warrant, we’re ICE, the warrant is coming out of my balls.” https://web.archive.org/web/20111025092605/http://www.aclu.org/blog/immigrants-rights/we-dont-need-warrant-were-ice/

#15yrsago WIPO’s secret, corporate-run trademark enforcement meeting https://web.archive.org/web/20220121054715/https://craphound.com/PROGRAMManilaEdited10212011-FINAL.pdf

#15yrsago Canada’s Supreme Court: Linking isn’t libel https://web.archive.org/web/20111026134334/http://www.bbc.co.uk/news/world-us-canada-15374238

#15yrsago HOWTO recreate the Haunted Mansion’s singing busts https://www.youtube.com/watch?v=zRtiiMW47i4

#10yrsago Facebook’s crackdown on publishers feeds has sites paying celebs to repost https://digiday.com/media/facebook-thirsty-publishers-turn-celebrities-worm-news-feed/

#10yrsago Internet-destroying outages were caused by “amateurish” IoT malware https://krebsonsecurity.com/2016/10/hacked-cameras-dvrs-powered-todays-massive-internet-outage/

#10yrsago Tory minister’s filibuster kills Turing’s law and pardons for 65,000 persecuted gay men https://www.theguardian.com/law/2016/oct/21/chris-bryant-commons-plea-gay-pardon-law

#10yrsago Trump hotels, faced with massive declines in bookings, rebrand as “Scion Hotels” https://web.archive.org/web/20161023182616/http://www.travelandleisure.com/hotels-resorts/trump-scion-hotels


Upcoming appearances (permalink)

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



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

Recent appearances (permalink)



A grid of my books with Will Stahle covers..

Latest books (permalink)



A cardboard book box with the Macmillan logo.

Upcoming books (permalink)

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

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

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



Colophon (permalink)

Today's top sources:

Currently writing:

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

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

  • A Little Brother short story about DIY insulin PLANNING


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

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

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


How to get Pluralistic:

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

Pluralistic.net

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

https://pluralistic.net/plura-list

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

https://mamot.fr/@pluralistic

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

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

Medium (no ads, paywalled):

https://doctorow.medium.com/

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

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

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

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

ISSN: 3066-764X

20:28

[1303] Threatening Family [Twokinds]

Comic for October 21, 2026

19:49

Why didn’t we use Ro­Register­For­Apartment­Shutdown to clean up the unmarshalable delegate? [The Old New Thing]

In my attempt to create a fake agile wrapper that is technically agile but is not useful outside its home apartment, Luca Bacci suggested, among other things, using the Ro­Register­For­Apartment­Shutdown function.

The Ro­Register­For­Apartment­Shutdown function is nice, but it doesn’t suit our needs.

One problem is that the object registered for apartment shutdown must be agile. (If you pass a non-agile object, the call fails.) That means that our wrapper must be agile. If we put the non-marshalable non-agile object inside our wrapper, we now have an agile object (the wrapper) that holds a non-agile object (the original object) as a member, which creates the risk that the wrapper will run down in the wrong apartment. The normal way of fixing that is to use Ro­Get­Agile­Reference to create an agile wrapper around the non-agile object, and store that agile wrapper in our container object.

This puts us back where we started: We are trying to implement that agile wrapper!

Even if we got past that problem, we have another problem: At apartment shutdown, COM calls the wrapper object’s UnInitialize method, and there’s a warning on the using the Ro­Unregister­For­Apartment­Shutdown function:

Warning: Don’t call the Ro­Unregister­For­Apartment­Shutdown function from the OnUninitialize callback.

But wait, what if the destructor of the object we are wrapping wants to call Ro­Unregister­For­Apartment­Shutdown? It might happen indirectly because it has its own reference to another object, that in turn tries to call Ro­Unregister­For­Apartment­Shutdown.

For example, it might hold another fake agile wrapper whose UnInitialize method has already been called! (We can work around that in our agile wrapper by nulling out the non-agile pointer so we don’t double-release, but maybe there’s some other object that uses Ro­Unregister­For­Apartment­Shutdown that is less resilient to this scenario.)

Another requirement of Ro­Unregister­For­Apartment­Shutdown is that it must be called from the same apartment that registered. This doesn’t quite put us back where we started, but it makes things more complicated because the whole point of the exercise is to find a way to release the object without having to try to switch to the apartment. I guess what we could do is use IContext­Callback to try to switch back to the apartment to release the original object and unregister the apartment shutdown callback. If the apartment switch fails, then we assume it’s because the apartment has already run down, so we assume that the IApartment­Shutdown::On­Uninitialize method was called, and it released the object for us. (Of course, that still creates the problem that we are cleaning up inside the On­Uninitialize callback, which meas that nobody else can unregister their apartment shutdown callback.)

The last note on this is that the implementation is written on the assumption that apartment shutdown callbacks are rarely unregistered. Registration is O(1), but unregistration is O(n) because it does a linear search through a linked list. By comparison, the Global Interface Table is designed on the assumption that objects are frequently registered, unregistered, and looked up, so it can look up its cookies in O(1) time. The proposed alternate design would unregister a lot of apartment shutdown callbacks, so it’s pushing the apartment shutdown callback list into a usage pattern it wasn’t optimized for.

The post Why didn’t we use <CODE>Ro­Register­For­Apartment­Shutdown</CODE> to clean up the unmarshalable delegate? appeared first on The Old New Thing.

Microspeak: Drain the slide, back-up slides [The Old New Thing]

Recall that Microspeak is not merely for jargon exclusive to Microsoft, but it’s jargon that you need to know to survive at Microsoft. Even if you don’t use it yourself, you need to know what it means when others say it.

To drain the slide is, as Mark Myers explains it, reading the contents of a slide to the audience when giving a presentation. At least at Microsoft, the term is frequently used by a speaker in the negative, such as “I don’t want to drain the slide here…”

My theory is that the phenomenon of draining the slide has multiple sources.

One is simply the result of inexperience on the part of the presenter. They don’t know what to say when giving a presentation, so they end up just reading out the text that they wrote on the slide.

A more insidious source is the result of tension between the multiple reason for creating a slide deck.

One reason to create a slide deck is to accompany a presentation. The focus of the presentation is the speaker, and the slide deck is there merely as a visual aid.

Another reason to create a slide deck is to provide a lasting record of the presentation and to serve as a reference for the future. If the topic is “How to perform process X”, then you want to make sure that all of the necessary steps are spelled out on the slides, so that you can share a link to the slide deck in the invitation for others to refer to both during the presentation but mostly for reference afterwards. People will refer back to the slides the next time they need to do process X, and they probably don’t want to have to scrub through a one-hour recording just to extract the five steps they need to follow.

Yet another reason for creating a slide deck is when presenting to a senior executive, such as for use in a placemat review. There is probably a standard template for the meeting, such as an “Accomplishments since the last meeting”, perhaps broken into “What’s going well”, “What’s not going well”, and followed by an “Items of future concern”. The meeting may run into a time crunch (because they always run over), and you may not get enough time to get through all your slides, so you want to be able to say, “You can read the rest of the slides after the meeting.” (An extreme case of this is where other teams in the placemat meeting run long and leave you with no time at all!)

A related reason for creating a slide deck is as a “proof of work”. Going into the placement review, you don’t have much to report, but you have to fill the slide. If you don’t, it looks like you haven’t done anything.

I was reminded of this last reason when I worked with a colleague to prepare our team’s weekly placemat report. My colleague would fill the slide with information, and I would recommend replacing most of the bullet points with a much more succicient summary, or just removing the items outright.

Partner Team X is considering the possibility of deploying a version that uses widgets before all of the widget features are fully implemented and rolled out to customers. They understand the consequences, such as impaired reverse widget flow. Some of these missing features will light up when the implementation is ready, but others will be stuck in a broken state unless explicit remediations are performed after the implementation rolls out, and a small number of features will be irreparably broken, with the only recourse being to destroy all the affected widgets and recreate them. Partner Team X has been advised of the various failure modes and how they can recover from the ones that are recoverable, and they are assessing whether they want to proceed with early deployment.

I simplified it to

Partner Team X understands the consequences of and limited recovery from using widgets in production before our work is fully implemented and deployed.

The people who are receiving this slide deck are not interested in the fine details. They want the 25-word summary of how things are going so that they can either decide that our feature is not a point of concern, or decide to ask follow-up questions to understand the issue better. In that case, we can present a so-called back-up slide with the details.

A back-up slide is a slide in a slide deck that you hope that you won’t need to use, but which you create just in case it is needed. You mark it as hidden or put it in an appendix so that it doesn’t show up in the normal presentation flow. But if the audience you are presenting to (usually someone higher up the executive chain) asks a follow-up question about one of your slides, you can reach into your deck and pull out your back-up slide to answer it. “I was ready for that question, so I already have a slide with the data you are asking for.”

Bonus PowerPoint jargon: PowerPoint Karaoke and the eye chart.

The post Microspeak: Drain the slide, back-up slides appeared first on The Old New Thing.

18:56

The State of AI Security: Threats, Tools, and Skills Gaps [Radar]

Artificial intelligence has changed cybersecurity permanently. While OpenAI’s inadvertent attack on Hugging Face brought AI-generated attacks to everyone’s attention, AI has been on security professionals’ radar for a long time. AI makes attacks possible at a scale that was hard to imagine a few years ago. Newly discovered zero-days can be exploited almost immediately. Deepfakes and their implications for phishing, vishing, and other attacks were nightmares that we knew were real; we just hoped we’d have a few more years before we needed to defend against them. And of course, inattention to security at OpenAI, Anthropic, Google, and other labs that we don’t yet know about has resulted in AI agents that attack other systems in an attempt to solve a problem.

While the headlines have been shouting about AI killing humanity, doomsday AI is more likely a smokescreen to divert attention away from real harms that are happening now. We don’t need panic. We need an assessment of where we are: What are the threats? Where are the skills gaps? Where is the budget? It’s hard to overstate the importance of these questions; Tomasz Tunguz, writing about the Theory 2026 AI Survey, reports that security is the biggest barrier to AI adoption. To start answering these questions, in September we ran a survey that asked infosec professionals about the intersection between artificial intelligence and security. 351 respondents completed the full survey, 209 of whom self-identified as being involved with security as part of their job. This report focuses on those 209 respondents.

Chart showing "rarely" (34%), "weekly" (22%), "never" (18%), "daily" (13%), and "monthly" (13%)How often work involves AI-generated malicious content

Attacks, risks, and responses

52% of respondents said their work rarely (34%) or never (18%) involves AI-generated attacks. This seems unlikely. The most likely explanation is that the security profession includes a broad range of job responsibilities; many security professionals don’t deal directly with defense. That group includes auditors, security experts on software development teams, strategists, architects, and others. It’s also possible that most phishes are either blocked by an automated filter (itself an instance of AI) or deleted immediately by the recipient; many companies require their staff to take training courses that cover topics like recognizing phishes. Still, it’s surprising. Much simpler versions of AI have been used to generate spam and phishing email for years. AI’s ability to generate phishes was demonstrated at BlackHat in 2021 with GPT-3. It’s been part of the security picture for a long time.

The most commonly observed attacks are AI-generated phishing (55%), vulnerability scanning and exploitation (30%), and AI-assisted malware generation (26%). Respondents who frequently encountered AI attacks also reported more types of attacks. There’s no surprise here: If you see attacks more frequently, you are more likely to observe specific attacks. The strongest relationship was with AI-generated phishing, which was seen by 55% of all respondents and 86% of those who observed AI-generated attacks weekly. Among respondents who observed attacks daily, slightly fewer (78%) reported phishing. Given the small sample, the difference may not be meaningful. It’s also likely that respondents who observe attacks daily are seeing a much broader range of attacks and that phishing is genuinely less important to them.

Respondents reported seeing deepfake audio and video, which can be used for vishing and other impersonation attacks, less often than phishing, though it was far from nonexistent (25%). More respondents than we expected reported fully automated attacks, like OpenAI’s attack on Hugging Face, though the percentage was still low (16%). The percentage of respondents who observed adversarial inputs against models including prompt injection was similarly low (only 13%), but that’s high enough to indicate that prompt injection and other attacks directed against models are a real concern.

Chart showing AI-generated phishing (55%), vulnerability scanning and exploitation (30%), AI-assisted malware generation (26%), deepfake audio/video (25%), AI-generated attacks (16%), I don't have visibility into this data (15%), adversarial inputs against ML models (13%), none observed (14%), and other (8%)AI-related attacks observed in the last 12 months

When we asked respondents what AI-related risks concerned them most, we got a different set of answers. The two most common concerns were overreliance on AI tools without human verification and leaking sensitive data via AI tools; 49% of respondents selected each answer. (The number of respondents selecting those answers happened to be the same, though there was little relationship between the two groups.) 

Chart showing overreliance on AI outputs without human verification (49%), employees leaking sensitive data via commercial AI tools (49%), attackers using AI to find vulnerabilities faster than we can patch (35%), AI-generated phishing/social engineering (25%), prompt injection or LLM manipulation (11%), poisoning of training data or model supply chains (4%), and other (4%)Most concerning AI-related risks

Although the quality of AI output has gotten a lot better in the past year, relying on unverified AI outputs remains problematic. However, AI can easily generate more output than humans are capable of reviewing, and software teams are now overwhelmed by the volume of AI-generated pull requests that need human review before they can be merged. This overload is causing many to rethink the review process and others to reject AI-generated PRs. Code review was never very good at finding bugs; it was better at familiarizing a team with developments in the codebase. It may be enough to rely on exhaustive testing.

Understanding how your software works when much of it is written by AI is a deeper problem. While AI is good at answering questions about a codebase, it usually doesn’t have access to the reasoning behind the code, which is often hidden in institutional knowledge—and institutional knowledge often means “Oh, yeah, that guy who retired three years ago.” In addition, software developers may lose their programming skills if writing code becomes a smaller part of their job. Security professionals themselves might wonder whether relying on AI for red-teaming, log analysis, and vulnerability detection leads to a degradation in their own skills. 

Companies also fear losing sensitive data via AI. Most AI providers offer enterprise accounts that promise that they won’t train models on data in prompts or attached documents, but it’s not clear that these terms of service can be trusted. The frontier laboratories are getting increasingly desperate for training data, even going to lengths such as buying failing startups for their data. Read OpenAI’s description of its Zero Data Retention and Private Safety Processing cynically, and ask if this really protects corporate data or if it allows using data in ways that aren’t directly observable by humans—for example, automatically generating synthetic data. Security professionals are paid to be cynical; thinking about how software, protocols, and policies can be abused is part of the job.

Roughly a third (35%) of the respondents are concerned about attackers using AI to discover vulnerabilities faster than they can mitigate those vulnerabilities and apply patches. Updating software is usually a good practice, but it comes with its own risks: Software updates may introduce new bugs and can lead to incompatibilities with established tools and practices. And defenders can’t yet delegate vulnerability detection, patching, and updating to AI. So overall, is AI more of a help to defenders or attackers? Andrew Ng, Bruce Schneier, and others have argued that the attackers are ahead right now. It’s easier to find a vulnerability, use it to create a payload, and launch an attack than it is to stop one. But the balance will eventually shift to the defenders, as AI becomes more capable of finding and patching vulnerabilities before they can become a problem.

It’s surprising that only a quarter (25%) of the respondents listed AI-generated phishing as a top concern, especially since phishing is the attack most frequently seen in the wild. Perhaps we’ve become too used to phishing; we’ve all been to the security trainings, we’ve all experienced it directly, and some of us have even fallen victim. Phishing is also an attack that, in many cases, is handled automatically. Familiarity may not always breed contempt, but something you see almost daily usually isn’t your biggest worry. 

More exotic attacks are even less of a concern. Only 11% listed prompt injection as one of their top concerns, for instance. However, real-world examples of prompt injection are appearing with increasing frequency. A recent study observed that roughly 1% of résumés contained hidden text to trick an AI system. Google has noticed many kinds of prompt injection, ranging from benign to overtly hostile. And in 2025, OWASP recognized prompt injection as the greatest security risk for users of AI. It’s surprising and unfortunate that it doesn’t appear to be a greater concern for security professionals, especially since prompt injection is a vulnerability that might be lessened by careful filtering but can’t be eliminated.

Even fewer security professionals are concerned about data poisoning (4%). Data poisoning is a serious problem for organizations that train their own models, but today frontier labs conduct much of the most resource-intensive model training. However, this is changing as post-training on corporate data becomes more common. We believe the trend toward locally specialized models will continue, and that data poisoning, as distinct from data theft, will become more of a concern. 

We asked specifically about the use of agents, which exploded this year with the launch of OpenClaw and Gas Town in January 2026. Agents create another set of security concerns. We’ve all heard horror stories: agents that deleted production databases, handled data improperly, generated email that should never have been sent, and the like. Using an agent properly requires a lot of attention to detail, and many users aren’t used to that responsibility, nor do they understand security well enough to exercise responsibility.

The biggest concern among our respondents is excessive permissions or unclear ownership (28%). That’s hardly a surprise; many security problems trace back to permissions. Unclear ownership makes permissions issues more dangerous. When an agent is making many calls to a model, using tools, and delegating to other agents and models, it quickly becomes unclear who (or what) is the authority responsible for any action. This situation isn’t handled well by our current authentication and authorization systems, which assume that identities and authorizations are long-term, stable entities.

Chart showing excessive permissions or unclear ownership (28%), lack of monitoring or auditability (19%), inability to verify an agent’s role (18%), data leakage (15%), prompt injection (9%), no agentic systems (5%), and unsure (6%).Most-concerning risks of AI agents

Lack of monitoring or auditability was the second highest concern (19%), followed by inability to verify whether the agent stayed within its role (18%). These concerns are closely related: Ownership is often unclear when agents are in use, and lack of monitoring makes the situation worse. Likewise, when you can’t monitor, it’s difficult, if not impossible, to verify whether the agents stayed in their lane—and we’ve seen all too many examples recently of agents that abandoned their authorized roles in inappropriate ways.

Data leakage appears again, though it’s surprisingly low on the list (15%) given that 49% of the respondents indicated that data leakage was one of their top concerns. It’s possible that we’re seeing the difference between single and multiple selection questions; many respondents are concerned about data leakage, but it’s not their top concern. 

Prompt injection doesn’t rank highly for either question: 9% selected it as their top concern about AI agents, and 11% selected it as one of their top concerns. 

Policies and funding

Although nearly three-quarters of the respondents reported that their companies have an AI use policy in place (72%), less than half (44%) reported that the security policy is “comprehensive,” while 28% said that the policy is basic and needs updating. Another 9% said that their employer doesn’t have a policy but is actively developing one. 19% said that there was no policy, or that they “didn’t know,” an answer we consider equivalent to “there is no policy.”

Chart showing comprehensive AI policy in place (44%), basic policy needing updates (28%), no official policy (10%), policy in development (9%), and unsure (10%)Does your organization have a documented AI policy?

Organizations need clear AI policies that tell employees what AI tools they can use and how they should (and shouldn’t) use them. It’s important for employees to understand whether their company is sensitive to sending data offsite, whether the company’s chosen AI providers guarantee their data won’t be used for training, which practices for attribution are acceptable, and much more. We have some sympathy with organizations that have a basic policy that needs updating. AI’s capabilities are advancing at unprecedented speed; a policy that was adequate in 2023 certainly needs updating now, and a policy that’s only a year old still predates the widespread use of agents like OpenClaw, Claude Code, and Codex, along with the widespread use of skills and tools to extend an agent’s capabilities. Keeping a policy up-to-date with the current state of AI is an imposing task.

The existence of a policy appears to be related to whether employees use AI safely. We asked about “shadow AI” (the use of AI outside of any definitive policy) and found that 36% of the respondents thought that their teammates occasionally use “shadow AI” and 23% thought that the practice is widespread. About a quarter (24%) thought that shadow AI use is rare; and 16% were unsure. 

Chart showing shadow AI use: occasional (36%), rare or never (24%), widespread (23%), and unsure or lacking monitoring tools (16%)Shadow AI use with sensitive data

The relationship between shadow AI and the existence of an AI policy tells us a lot about whether policies are effective. Respondents with a comprehensive AI policy were more likely to say that shadow AI use is rare (37%) or that it’s only used occasionally (36%); only 17% said that shadow AI is widespread at their company. In contrast, 35% of the respondents who reported a basic policy said that shadow AI is widespread—almost the same percentage as those who reported that there was no policy at all (37%) and only slightly worse than those who said that a policy is in development but doesn’t exist yet (28%). Those who had a basic policy, a policy under development, or no policy were less likely to report that shadow AI was used “rarely or never” (13%, 6%, and 21%, respectively).

Chart showing shadow AI use by policy status: comprehensive policy (37% rare or never, 36% occasional, 17% widespread, 10% unsure); basic policy (13%, 35%, 35%, 18%); policy in development (6%, 56%, 28%, 11%); no policy (21%, 37%, 37%, 6%); and unsure whether a policy exists (18%, 24%, 58%, 0%)Shadow AI use in relation to AI policy

Granted that shadow AI is probably underreported across the board, our data clearly shows that a comprehensive AI policy is a powerful tool in limiting it. If the policy is poor, or it doesn’t exist, employees will use whatever tools they can to get their job done, which leads to AI use that’s inconsistent, insecure, and possibly counterproductive; it may even lead to legal, contractual, and reputational risks. When there’s no policy, it’s also likely that AI isn’t used as widely as it could be. Telling employees what is expected helps them to act responsibly. A good AI policy doesn’t just tell staff what not to do; it also communicates how to use AI in ways that are appropriate, and may even provide for training. 

When we asked whether organizations are adequately funding AI security, the picture was better than we expected. The largest group (32%) said that AI security is sufficiently funded, and 28% said it’s partially funded. Only 16% said it is severely underfunded, and 23% are unsure. I admit to being surprised by this result. Security is often underfunded, partly because a successful year is one in which “nothing bad happened,” and “we need to spend more so that nothing bad will continue to happen” isn’t a story that plays well at budget time. But executives have been catching on over the last few decades; high-profile attacks and data thefts lead to CIOs and CISOs losing their jobs, and that’s enough to get anyone’s attention. 

Chart showing AI security funding: sufficiently funded and staffed (32%), partially funded but needing resources (28%), severely underfunded or without a dedicated budget (16%), and unsure (23%)12-month budget for securing AI 

We saw a strong link between a comprehensive AI policy and adequate funding for security. Nearly half (49%) of the respondents who said their company has a comprehensive AI policy also said that AI security is sufficiently funded, and another 29% said that it’s partially funded. Only 3% of this group said that AI security is severely underfunded. That means nearly 80% (78%) are at least partially satisfied with funding.

Chart showing AI security funding by policy status: comprehensive policy (49% sufficiently funded, 29% partially funded, 3% severely underfunded, 19% unsure); basic policy (16%, 42%, 24%, 18%); policy in development (22%, 17%, 39%, 22%); no policy (21%, 21%, 42%, 16%); and unsure whether a policy exists (11%, 11%, 4%, 74%)12-month budget for securing AI in relation to AI policy

Once again, the answers given by respondents who said that their organizations have a basic policy, a policy under development, or no policy were surprisingly similar. 16%, 22%, and 21%, respectively, said that AI security is sufficiently funded. That’s certainly not a vote of confidence, though we might be able to draw two more bits of information from it. Developing a policy looks like it’s slightly better than having an out-of-date policy; the company is putting in the effort and making an investment. That makes some intuitive sense, though it might also be wishful thinking. Among respondents whose organizations have a basic policy, the largest subgroup said that AI security is partially funded (42%). A middle-of-the-road policy is associated with middle-of-the-road funding. Is that fair, or is that what reality looks like?

Tools and skills

While AI gives security professionals powerful new tools, they aren’t yet fully taking advantage of them. Two-thirds of the respondents (68%) reported that they use a chat, copilot, or similar tool for research or documentation. But only slightly over a third use AI to scan for vulnerabilities (38%), just over a quarter use it for threat detection (27%), and a quarter use AI for incident response (25%). Security professionals widely use general-purpose AI. However, those using specialized tools like vulnerability scanners remain the minority.

Chart showing AI chat or copilots for research or documentation (68%), AI code or vulnerability scanning (38%), AI-assisted threat detection or SIEM (27%), AI-assisted incident response or triage (25%), and other (11%)AI-powered tool use

To probe further, we asked where AI improved respondents’ workflows. More than half said that AI improved their workflows for research or documentation (61%) and that it reduced repetitive work (57%). But only 29% said that AI improved their workflow for triage, and 17% said that it improved detection accuracy. These results confirm what we saw for tool use.

Chart showing improved research or documentation speed (61%), reduced repetitive work (57%), faster alert triage or investigation (29%), better detection accuracy (17%), no noticeable positive impact (11%), and other (6%)Biggest positive impact of AI

The relationship between tool use and impact shows up even more clearly when we look at who’s benefiting most from AI. Those who are only using chat or a copilot see the greatest improvement in the speed of research or documentation. Chatbots and copilots save time, particularly when writing reports with a lot of boilerplate text, but they aren’t as helpful when actively defending against or recovering from attacks. Without specialized tools, that work has to be manual.

Respondents using security-specific AI tools were more likely to report improvements in alert triage (42% versus 18%) and detection accuracy (27% versus 5%) than those using only general-purpose chatbots or copilots. 

Chart showing AI-tool impact by tool type: improved research or documentation speed (22% no AI tool, 78% copilot only, 67% any security-specific AI tool); reduced repetitive work (29% no AI tool, 56% copilot only, 67% any security-specific AI tool); faster triage (10% no AI tool, 18% copilot only, 42% any security-specific AI tool); better detection accuracy (5% no AI tool, 5% copilot only, 27% any security-specific AI tool); and no positive impact (34% no AI tool, 9% copilot only, 4% any security-specific AI tool)Benefits reported by AI tools used

It’s far from surprising that respondents who didn’t use any AI tools were most likely to say that they saw no noticeable positive impact. The bigger question is why they saw any impact at all. 

Finally, we looked at the “skills gap” to determine what skills and tools would make respondents more effective. Only 7% of the respondents said that they don’t feel like they have a skills gap; that group was also the most likely to say that they aren’t using any AI tools. It’s clear that most of our respondents see AI as a necessary part of the future and want to be part of it. 

34% of the respondents want to use AI tools more effectively. That desire was evenly spread across all AI users, both chat/copilot only (36%) and users of security-specific tools (37%). 24% want to learn how to use AI to secure systems (including the use of AI for red-teaming); 19% want to learn AI-specific attack techniques; and 12% want to learn how to detect AI-generated attacks. 

AI skills gaps

The future of security

We started by claiming that AI has changed computer security forever. In addition to the many reports of research projects that inadvertently attacked other sites, AI has become a tool for attackers. They aren’t distracted by arguments about whether or not AI is taking jobs; their goal is to exploit their victims, and it’s clear that AI will help them. And as Ben Lorica points out in his newsletter, the economics of attack are changing: AI is infinitely patient, can try multiple attack vectors, can abandon failures, and can work at a scale that’s difficult for humans to match.

AI is also a tool for defenders. We saw more security professionals using AI than we expected, though not as many as we had hoped. Many defenders are taking advantage of chatbots and copilots but haven’t yet adopted more specialized tools, which are associated with improvements in workflows for triage and threat detection. 

The tools for defenders undoubtedly need to mature, but tools aren’t the entire answer. Organizations that adopt AI successfully will have appropriate budgets and policies for AI use; they will understand the risks that come with AI adoption; they will proactively fill skills gaps; and they will recognize processes that are no longer productive and “turn scar tissue into infrastructure.” AI is, in the end, a “normal technology” that takes years to penetrate organizations, as Arvind Narayanan and Sayash Kapoor have argued. Tools, budgets, and thought processes all need to change, and that takes time. Getting ahead of the curve on AI won’t happen if individuals work in isolation, adopting tools and ideas as they see fit. It’s an effort that requires the entire organization.

Child's Play Auction Item [Penny Arcade]

I love all of the incredible handmade items we get donated for the Child’s Play auction. We are less than a month away from this year’s dinner and I wanted to share a couple pictures of one of our awesome live auction items.

 

18:35

More vulnerabilities in widely deployed software [LWN.net]

The Node.js project has released a number of security updates to fix, among other vulnerabilities, a remote-code-execution bug affecting programs that use Brotli compression. And, in case any programmers who use compiled languages thought they could relax, the musl libc project has also announced a new vulnerability: an out-of-bounds write that could potentially lead to remote code execution, although that has not been demonstrated.

When the Moon Hits Your Eye a 2027 Semi-Finalist for the Thurber Prize for American Humor [Whatever]

You may or may not know this about me, but humorist James Thurber is a formative writer for me, along with other of his Algonquin Round Table pals like Dorothy Parker and Robert Benchley. The delightful play of his humor, both in writing and in cartooning, was something I took to right away, speaking to me across decades. He was pretty great!

Also, and independently, The Thurber House, the non-profit literary arts center and museum located in Thurber’s Columbus, Ohio home, annually gives out the Thurber Prize for American Humor, in the categories of writing and cartooning. It’s considered one of the premier prizes for literary humor in the United States, and has been given to folks like Jon Stewart, Trevor Noah, Calvin Trillian, Alexandra Petri and Patricia Lockwood among others. John Hodgman, Sloane Crossley and Dave Barry (among many others) have been finalists.

As of this moment, I am neither a winner nor a finalist for the Thurber Prize for American Humor. But I am, officially, a semi-finalist for the 2027 award, for When the Moon Hits Your Eye. I’m a semifinalist along with Harry Bliss, Andy Corren, Annie Hartnett, Richard Osman and Kate Sidley (and their respective books). Among our number, three will be selected early in 2027 as finalists, and the winner will be announced at an event at the Thurber House next May.

The statement that follows absolutely has the pun intended: I am entirely over the moon about this. To say this is unexpected is underselling it; I was not aware the book was in the mix at all. There have been other books that have been finalists that have had speculative elements to them (most notably Hollow Kingdom, by Kira Jane Buxton), but it’s safe to say that straight-up science fiction is a rare bird in terms of Thurber Prize consideration. I didn’t even think to imagine that something I’d written might be considered for the prize at all.

But it was, and now it’s a semi-finalist and I’m thrilled, not just because hey look I’m on the longlist for a very cool award but also because it’s Moon, which, I don’t mind telling you, is actually a weird damn book. Oh, you’re going to turn the moon to cheese and then you’re going to tell that tale, with no clear protagonist, across a whole lunar cycle in a series of only-very-loosely-connected short stories? Yes, well, good luck with that.

And yet! Now it’s a Thurber Prize semi-finalist (and it did win a different award earlier in the year, so there’s that). It’s done all right, this weird little book of mine. And while I would be delighted to see it make it into the finalist list — I could actually drive to the award ceremony next May! — even getting to this level has made my day, week and month. I’m thrilled to be here, and I am in good company.

— JS

18:14

18:07

CodeSOD: Doing the Assignment [The Daily WTF]

Today's code maybe isn't much of a WTF, but it does point in the general direction of, "Damn, you live like this?" Poor Nancy unfortunately does.

int x = 3;
int y = 4;
int z = 4;
x = y = z;

Each variable is declared and initialized, and then they're set equal to each other. It just raises the question though, why do it this way? Why not declare them and then x = y = z = 4, if we want that? Or maybe, for more clarity, int x = DEFAULT_VALUE; would be more legible, and we can skip the multiple assignments on one line. Why does x get set to 3 but then overwritten?

[Advertisement] ProGet’s got you covered with security and access controls on your NuGet feeds. Learn more.

17:49

[$] Hash-based module integrity for reproducible distributions [LWN.net]

We last looked in on hash-based integrity checking for kernel modules just over a year and half ago. Since that time, the patch set has undergone multiple revisions. At the 2026 Linux Plumbers Conference (LPC), Thomas Weißschuh described the need for kernel-module integrity guarantees while still providing reproducible builds, how his patches implement that, and some ideas for possible further work.

17:28

16:21

Upstreaming Tyr: Rust, DRM, and the Linux Kernel (Collabora) [LWN.net]

The Collabora blog provides an update on Tyr, a driver for Arm Mali GPUs.

One of our biggest challenges has been developing Tyr while the Rust kernel abstractions and driver interfaces are also being developed. As the driver interfaces are naturally revised and improved, we have rewritten Tyr several times to adapt to the larger Rust ecosystem. This not only makes progress much slower than it would be with a mature API, but also stalls progress for capabilities, such as job scheduling, while the abstraction is properly designed, reviewed, tested, and merged upstream.

But working in this evolving environment is also precisely where Tyr is able to provide the most value. As a user of these new Rust abstractions, Tyr helps to expose their requirements and limitations.

15:35

[$] Understanding Nix flakes [LWN.net]

Nix flakes are an experimental feature of the Nix package-management tool designed to build projects in a more self-contained and reproducible way. Despite the feature's experimental status, it has become increasingly popular for open-source projects to publish flake.nix files that offer predefined development environments and build automation even when those repositories may not offer an upstream package or module for the NixOS Linux distribution. Although Nix flakes have a complicated history, and the path for stabilization is uncertain, flakes can provide useful capabilities for projects that choose to include them.

PHP patches released for two critical RCEs [LWN.net]

The PHP project has published PHP versions 8.5.12, 8.4.27, 8.3.36 and 8.2.35 to address two critical vulnerabilities that could allow unauthenticated remote code execution.

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.

PHP versions older than 8.1 will not receive updates from the project, though the project has provided some patches for PHP 7.4, PHP 8.0, and PHP 8.1 to assist in creating backports. According to the announcement, Linux distributions and vendors received patches in advance, so updated packages should be coming soon.

14:49

Security updates for Wednesday [LWN.net]

Security updates have been issued by AlmaLinux (bubblewrap, emacs, gimp:2.8, glibc, jackson-databind, kernel, kernel-rt, librabbitmq, openexr, openssh, postgresql:16, postgresql:18, python3, resteasy, wireshark, xorg-x11-server, and xorg-x11-server-Xwayland), Debian (ca-certificates, firefox-esr, git-lfs, and libssh), Fedora (aom, assimp, bind, bind-dyndb-ldap, freerdp, ghostscript, gopass, gopass-jsonapi, ImageMagick, libpng12, libpng15, nebula, perl-GD-SecurityImage, perl-Net-IDN-Encode, perl-Net-Whois-Raw, rust-backtrace, rust-object, rust-object0.37, rust-object0.38, rust-object0.39, rust-ruzstd, and xen), Gentoo (ca-certificates), Mageia (x11-server, x11-server-wayland, tigervnc), Oracle (bubblewrap, ca-certificates, emacs, fetchmail, gimp:2.8, hostapd, jackson-databind, librabbitmq, lrzsz, openexr, openssh, openssl, postgresql:18, python-urllib3, python3, python3.12-urllib3, resteasy, webkit2gtk3, wireshark, and xorg-x11-server-Xwayland), Red Hat (.NET 8.0, dogtag-pki, flatpak-builder, ghostscript, glycin-loaders, go-toolset:rhel8, golang, gvfs, jackson-core, jackson-databind, librsvg2, multiple packages, pki-core, pki-core:10.6, sudo, xorg-x11-server, and xorg-x11-server-Xwayland), Slackware (c-ares, ca-certificates, mozilla-firefox, mozilla-nss, mozilla-thunderbird, and python-certifi), SUSE (agama, aspell, bcel, bind, bouncycastle, busybox, chromium, containerd, coredns, cosign, cpp15, cups-filters, cyrus-sasl, fetchmail, firefox, gcc13, gh, ghostscript, gitoxide, glibc, go1.26, go1.27, google-osconfig-agent, grafana, grok-build, hashcat, hawk2, helm, ImageMagick, inspektor-gadget, iperf, jupyter-jupyterlab-templates, kernel, kernel-devel, libheif, libpng16, librsvg, libX11, libXi, libxls, libXpm, libxreaderdocument3, mutt, ntfs-3g_ntfsprogs, openssl-1_0_0, openssl-3, openvpn, pacemaker, perl-DBI, perl-XS-Parse-Keyword, pgvector, podman, putty, python-anyio, python-hpack, python-joserfc, python-jwcrypto, python-oauthlib, python-PyJWT, python-tornado6, python-urllib3, python-virtualenv, python-WebOb, python3, python311, rekor, squid, strongswan, stunnel, suseconnect-ng, tinyproxy, traefik, unbound, varnish, virtiofsd, webkit2gtk3, and xwayland), and Ubuntu (ca-certificates, dotnet8, dotnet10, dotnet11, protobuf, rust-sudo-rs, squid, squid3, and xz-utils).

Four stable kernels for Wednesday [LWN.net]

Greg Kroah-Hartman has announced the release of the 7.2.12, 6.18.58, 6.12.114, and 6.6.160 stable kernels. Each contains a number of important fixes; users are advised to upgrade.

14:14

Jack Shaft Alternative? [Nina Paley]

You would think I’d have looked up the efficiency loss of a jack shaft before starting the Jackalope project. Oops!

Thanks to Google’s unpredictable AI results, my first search today said 5-10% efficiency loss. Yikes! My second said 1-5%, which seems more realistic.

Could a Fold Rush be modified so its chain doesn’t become a disaster when folded? A jack shaft provides a clean, perfect fold, but at a cost.

Fold Rush. Single chainline, no jack shaft. Fold Rush folded. Once you actually move the bike, the loose chain twists and folds onto itself and is a bear to get untangled. It easily falls off the crank chainring This here is just asking for trouble The chain is contained at the hinge, but that’s not enough. If you’re lucky, it all sproings back into place when unfolded. But luck doesn’t happen when you actually transport the bike. You WILL be putting your hands on dirty chain trying to untangle it.

Is there a non-jack shaft solution? Extra idlers? Chain hooks on the frame?

Share

The post Jack Shaft Alternative? appeared first on Nina Paley.

12:35

Workshop on Economics and Information Security (WEIS) Archive [Schneier on Security]

There’s a new archive of all the papers from twenty-five years of the Workshop on Economics and Information Security (WEIS).

Really nice resource. It’s fun to reread my 2002 essay on the economics of information security.

10:35

Toward depth [Seth's Blog]

Juan Tamariz and Wendell Berry recently passed away. Between them, they had more than 170 years of generous contribution.

Juan was a card magician. His students are generally considered the best working in the world today.

Wendell was a farmer and a writer. His essays on non-industrial farming and community-building will resonate for generations.

What each had in common was the patience and commitment to choose depth. To seek out the inconvenient path because it mattered.

Neither traded for easily measured metrics or convenience. Instead, they chose a path and followed it, leaving things better than they found them.

Looking back a century, it’s easy to appreciate this. And yet, each and every day, it requires a recommitment. “Under the circumstances,” it’s tempting to justify the small compromises that corrode our work. The hard part is to realize that we’re not under the circumstances; we are them. We can start today.

08:14

The Tri-Fold Augur [Penny Arcade]

New Comic: The Tri-Fold Augur

05:49

Girl Genius for Wednesday, October 21, 2026 [Girl Genius]

The Girl Genius comic for Wednesday, October 21, 2026 has been posted.

02:49

Honest To A Fault [QC RSS v2]

please do not give willow anxiety

00:14

Yes, You Should Absolutely See “Resident Evil” Before It Leaves The Theater [Whatever]

I have been dying (ha) to write this post, and definitely meant to do it sooner considering I first saw the newest and greatest Resident Evil (2026) in theaters the 25th of September. But, better late than never, as they say.

If you don’t feel like reading this whole post, I’ll just come right out and say that you should absolutely go see this movie ASAP and definitely catch it on the big screen if you can! Whether you’ve never seen a Resident Evil movie before, hate all of the ones you’ve seen, or love them all, you gotta see this one.

Without getting into spoilers, I’ll just give you a quick list of the best things about this movie. Which, admittedly, is everything, but I’ll keep it short so you can go to the theater’s website and book your ticket already.

First of all, the cinematography and atmosphere. My goodness. The way this movie is shot, the camerawork, the lighting, the framing, the use of color, the use of darkness, all works so beautifully to create a visually immersive and interesting film. They clearly had a vision, and it was a good one.

Complimenting the amazing visuals is the unnerving, spine-chilling soundtrack that makes your heart beat just a little bit faster. They work together in perfect harmony to create the most eerie, unsettling vibe that will have you looking over your shoulder on the walk back to your car.

Fear not, it isn’t all anxiety-inducing jump scares, there’s humor! And it’s not the cringe bad kind that I can’t stand! There’s no “he’s right behind me isn’t he?” or “well that just happened!” It’s actually funny, which was a very welcome surprise. But not overly! It is funny when there is room for it to be, but scary all the other times. It does not overstay its welcome.

Finally, the acting is really great. It’s mainly just one guy with intermittent side characters, but that one guy is a fantastic main character. Austin Abrams was not a name I recognized, but funny enough I just watched Weapons for the first time like a month or two ago, and I’m going to see Whalefall on Saturday, so I certainly recognize him now, at least. And he is truly the perfect man for this role. Bryan is such a relatable character where you can’t help but feel bad for him and also laugh at his misfortune.

With all that being said, I’d like to talk about some of the things I really loved that require spoilers, so here is the OFFICIAL SPOILER WARNING!

Clearly, the most absolutely wild part of this movie is the monster design. An unstoppable rolling ball of harmonized limbs, all outstretched to integrate you into them. Starting with the unbelievably freaky farm woman was such a strong, memorable introduction of the monsters. Her unyielding pursuit, despite being beyond fucked up physically, is truly terrifying. And even when she gets her dome blown off, she finds a way to continue being, continuing chasing.

The dog was such a fun addition, it really felt like a good callback to the original Resident Evil movies. And the jump scare was well done instead of being cringe.

I love a non-happy ending. Bryan getting bit was inevitable, and him getting that cure was never gonna happen. It only makes sense there wasn’t a sunshine-and-rainbows ending. How else would all the following films happen if they had successfully made and distributed a cure that early on?

Also, everyone loves talking about how realistic and relatable Bryan is, but can we talk about how brave he is? He could’ve stopped trying to get that bag to the hospital at any point. He could’ve fucked off at any moment, declaring enough is enough or that it wasn’t his problem. But he didn’t. He kept marching on. He risked life and limb and encountered dozens of horrifying, unkillable monsters. He climbed twenty-eight flights of stairs! All for the greater good! All for the possibility of saving humanity.

I can’t say I’d have done the same. I think I would’ve been done after that first scary lady. I think I would’ve called it quits, but Bryan never did. He did his best. It meant nothing in the end, but it could’ve meant everything, and that counts for something, doesn’t it?

I really loved this movie. I think it’s something very special, and I’d love for you to give it a watch. This is definitely a new favorite, and I highly recommend it.

Have you seen it already (I would not be surprised since this post was quite late)? Did you love it as much as I did? Let me know in the comments, and have a great day!

-AMS

Tuesday, 20 October

23:35

i’m … proud? … of me? okay, that’s new. [WIL WHEATON dot NET]

For years I have slept like absolute garbage. I struggle to fall asleep every night, and it’s not uncommon for me to wake up five or more times, for no obvious reason. I’ve done all the things, and nothing seems to really help that much. The most effective thing, surprisingly, is listening to a sleep story from Calm, so I’ve been doing that. Every night, LeVar reads me to sleep, which is pretty great.

I’ve been sleeping in the guest room for a week or so, so Anne doesn’t have to deal with me tossing and turning and all the rest, so instead of rolling over and saying good morning, I stagger into the living room and say good morning.

Over the weekend, I walked out, saw Anne, and before I could say anything she said, “Did you see it?”

Friends, there is only one “it” I want to see when I wake up, and it’s the same thing we all want.

“What? Why didn’t you wake me up?”

“No, no, not that,” she said. “Sorry. It’s not that.”

“Dude, you can’t do that to me. My heart can’t take it.” I weighed out my coffee beans. While I poured them into the grinder, she said, “Stephen King posted on Threads that he and Simon and Schuster are putting your narration of The Body up for Grammy consideration!”

That just about knocked me off my feet. “What?”

She repeated herself. “Open up Threads and look.”

“I can’t! I’m not looking at the Internet for 30 minutes after I wake up.” I reached into the cabinet and pulled out a coffee mug.

She tapped on her phone a few times and hurried over to me while I dumped the ground coffee into my Aeropress, and poured some water over it to start a bloom.

“Look!”

For your GRAMMY® consideration: @itswilwheaton’s narration of The Body. Submitted in the Best Audio Book, Narration, and Storytelling Recording category.
recordingacademy simonaudio 🏆 #GRAMMYs #FYC #WilWheaton #TheBody #RecordingAcademy SimonAudio AudiobooksOfInstagram

“Okay, that is pretty awesome,” I said. I stirred the damp grounds, then saturated them and let bloom finish. I filled the tube the rest of the way and put the plunger in with a satisfying hiss.

“I’m so proud of you!” Anne said. I pushed the plunger down, silently cursed that I always get some out of the sides and onto the counter, and was quiet until I was done. I set it aside and sipped my coffee.

I thought for a moment. I never cared about awards, and the few times I won, I always felt like a fraud, like someone felt sorry for me, or it was just about publicity, or a dumb popularity contest. It wasn’t about acknowledging and honoring art that I made1. “I want the work to speak for itself,” I always said, and I meant it. But I never let anyone know that there was a very small part of me, tucked safely away from everyone (including me, sometimes) who held out some hope that, maybe, if it were an Oscar … but that voice was always drowned out by another that said since that is never going to happen, just fucking forget it, man.

So I did. What initially started out as caring so much I had to insist I didn’t care, actually became sincerely not caring. Just do the work and don’t expect any external validation for it. It’s the work, itself, that matters2.

“Is everything okay?”

I realized that I had been quiet, staring at my reflection in the black liquid.

“Yeah, yeah, everything’s fine. I was just thinking … all those times I was nominated for stuff when I was younger, none of that work was mine, right? I wasn’t being recognized for art I created because that art was important to me; I was desperately trying to earn a place in my family by doing what I was told I had to do. I guess I felt like any attention or accolade was negative reinforcement for my mom, you know?

“All that time, whenever I worked really hard and earned literally anything, my mother jumped in to claim as much of it as she could for herself. When something cool happened because I worked really hard to make it happen, my dad never cared. I always felt stupid for caring, so I stopped caring. You can’t be disappointed that you didn’t win, or that your parents are still dogshit when you did win, if you don’t care.” I did that tapping the head meme thing.

“Yeah, I get that. I’m still really proud of you, though.”

I sipped more coffee.

“Thank you.” I closed my eyes, furrowed my brow, and rubbed my free hand across my forehead, into my bedhead. I noticed something unexpected.

“I think … I think that I am proud of me, too,” I ventured.

“Good! You should be!”

I rubbed sleep out of the corner of my left eye. “I think that this feels different because –” I held up a hand, “wait. First of all, I’m not going to win this. And I’m probably not even going to be nominated,”

“Dude, why ar–” she looked disappointed.

“Hang on. I hear you. I’m getting there, but that’s just part of why I think I feel this way.

“This time is different, and I feel genuinely happy and proud of myself, because I know that I did good work when I narrated The Body. Gabrielle and I both knew it when we were recording. It’s like the way I knew Stand By Me was going to be special when we were making it.” I blew across the top of my mug.

“The narration feels like that work, that art, is mine in a way that most of my other work is not. I feel like my performance in this narration is special, that it’s something only I could do, and I absolutely own that. That’s really enough.”

Anne smiled and I took a deep breath.

“It’s so unlikely I receive a nomination, just because of math and all the tremendously talented narrators who have probably been nominated before, who will also be considered. But I’m not minimizing this very cool thing that Stephen King posted, at all. That post means that the publisher, and Stephen King himself, feel the same way about my narration as I do. They at least feel like nobody is going to laugh at us because I’m clearly not qualified to be White House Press Secretary, like and such as.”

We giggled together.

“Five days!” She sad.

“It’s the funniest thing, ever,” I agreed. “These fucking dorks, I swear.”

More giggles.

“Anyway,” I continued, “I’ve known about this for all of five minutes, so I’m going to take the day to process it. No matter what, I’m going to allow myself to feel good about this, because it is a genuinely cool thing on its own. I am sincerely proud of myself.”

She hugged me. “You totally deserve this. I’m so proud of you.”

“Thank you. I am proud of me too. I just need some time to get used to that, and not feel weird about it.”

A few hours later, I was out for a walk, thinking about all of this, and I had a moment that was similar to the first time I heard the birds singing. I noticed that I felt genuinely and safely proud of myself, excited to do more work like this, confident and secure in myself as an artist.

There is this thing happening in me that has been slowly going on for a few months. I feel like I’m getting to really know myself, especially my artistic self, in a way I never tried to before. All my therapy and CPTSD recovery work has helped me set aside and walk away from all these ways I made myself small so my parents and brother could feel big, all the choices I made to deny who I truly was, not only as an artist but as a person, in a futile effort to earn the kind of affection, support, stability, and love that all kids should get from our parents because we exist3.

As I’ve gotten to know myself, as I have recovered from so much pain and complex trauma, just working so hard to get from always feeling angry to just feeling sad, I have embraced the weird theater kid, who loves to tell stories, I have always been. I found the courage to retire from on-camera acting, which I never wanted to do in the first place, without throwing out the skills I developed when I was doing it. I’m a good narrator because I understand story, I understand character arcs, I know how to break down a whole story, how to break down a scene, how to create and maintain unique and interesting characters for 24 hours of narration. I did that. I put in the hours and the energy and worked as hard as I could to do the best performances possible, to get to this place where I can actually feel proud of myself. It’s a new thing to feel confident, to feel like I can hold my own with the people who earn nominations and get awards, because this is what I want to do with my creative life, this is my art, this is something I made for myself that makes my heart sing4.

When I got home, I found Anne and wrapped my arms around her. We hugged tightly and I told her what I’d thought about during my walk.

“I get all of that,” she said, “and I’m really happy for you.”

“Thanks, I’m happy for me, too!”

It was so weird to say that, and know that it was the truth.


Hi, I’m Wil. I narrate audiobooks (you probably figured that out) and I write this blog. I’m on Threads and Instagram as @itswilwheaton. I host a podcast, It’s Storytime With Wil Wheaton, where I narrate short, speculative fiction. New episodes drop Wednesdays. If you’d like to get my posts to your inbox, here is the thingy:

One last thing before I go:

This is a teaser.
  1. I think, after decades of space between then and now, that I can allow myself to accept that, maybe, I did deserve whatever accolades I got, because it was given to me for my work. I wish I’d been able to feel that, back then. ↩︎
  2. Some of that work was good, none of it was great. I spend twenty years trying to figure out why, and recently came to understand, like, almost everything. That’s its own post in the future. ↩︎
  3. It is so fucked up that both of my parents, and my father’s entire family, made us feel like we had to earn love and support, like we were constantly being graded. I was in my 30s before I found out how incredibly not normal that is. My sister and I talk all the time about how we unconditionally love our children, and how aware we both are of the ways our parents withheld their very conditional affection. God, it’s so gross. ↩︎
  4. Man, it’s taking everything I have to not go back and delete that, conditioned as I have always been to downplay my accomplishments and abilities, lest I be accused of being “too big for your britches” by my dad. Well, fuck you, dude. I feel really good about myself, and super proud of the work I did. And I guess Stephen King agrees with me, and he knows a hell of a lot more about art and storytelling than you do. ↩︎

23:07

Taler Operations AG is getting ready to operate Taler in Germany [Planet GNU]

For the past three years, the NGI Taler project has worked towards the goal of making Taler legally available in the EU as an online payment system for everyday use. Today we can share that Taler Operations AG is being founded in Bochum. The new German company is going to operate Taler in Euro, enabling payments with Taler first in Germany, then in the Euro-zone. The next steps towards that goal are to apply to BaFin, Germany's financial supervisory authority, for a licence as an e-money issuer.

Feeds

FeedRSSLast fetchedNext fetched after
@ASmartBear XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
a bag of four grapes XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
Ansible XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
Bad Science XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
Black Doggerel XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
Blog - Official site of Stephen Fry XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
Charlie Brooker | The Guardian XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
Charlie's Diary XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
Chasing the Sunset - Comics Only XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
Coding Horror XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
Comics Archive - Spinnyverse XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
Cory Doctorow's craphound.com XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
Cory Doctorow, Author at Boing Boing XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
Ctrl+Alt+Del Comic XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
Cyberunions XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
David Mitchell | The Guardian XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
Deeplinks XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
Diesel Sweeties webcomic by rstevens XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
Dilbert XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
Dork Tower XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
Economics from the Top Down XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
Edmund Finney's Quest to Find the Meaning of Life XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
EFF Action Center XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
Enspiral Tales - Medium XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
Events XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
Falkvinge on Liberty XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
Flipside XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
Flipside XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
Free software jobs XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
Full Frontal Nerdity by Aaron Williams XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
General Protection Fault: Comic Updates XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
George Monbiot XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
Girl Genius XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
Groklaw XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
Grrl Power XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
Hackney Anarchist Group XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
Hackney Solidarity Network XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
http://blog.llvm.org/feeds/posts/default XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
http://calendar.google.com/calendar/feeds/q7s5o02sj8hcam52hutbcofoo4%40group.calendar.google.com/public/basic XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
http://dynamic.boingboing.net/cgi-bin/mt/mt-cp.cgi?__mode=feed&_type=posts&blog_id=1&id=1 XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
http://eng.anarchoblogs.org/feed/atom/ XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
http://feed43.com/3874015735218037.xml XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
http://flatearthnews.net/flatearthnews.net/blogfeed XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
http://fulltextrssfeed.com/ XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
http://london.indymedia.org/articles.rss XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
http://pipes.yahoo.com/pipes/pipe.run?_id=ad0530218c055aa302f7e0e84d5d6515&amp;_render=rss XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
http://planet.gridpp.ac.uk/atom.xml XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
http://shirky.com/weblog/feed/atom/ XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
http://thecommune.co.uk/feed/ XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
http://theness.com/roguesgallery/feed/ XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
http://www.airshipentertainment.com/buck/buckcomic/buck.rss XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
http://www.airshipentertainment.com/growf/growfcomic/growf.rss XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
http://www.airshipentertainment.com/myth/mythcomic/myth.rss XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
http://www.godhatesastronauts.com/feed/ XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
http://www.tinycat.co.uk/feed/ XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
https://anarchism.pageabode.com/blogs/anarcho/feed/ XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
https://broodhollow.krisstraub.comfeed/ XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
https://debian-administration.org/atom.xml XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
https://elitetheatre.org/ XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
https://feeds.feedburner.com/Starslip XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
https://feeds2.feedburner.com/GeekEtiquette?format=xml XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 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 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
https://hackbloc.org/rss.xml XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
https://kajafoglio.livejournal.com/data/atom/ XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
https://philfoglio.livejournal.com/data/atom/ XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
https://pixietrixcomix.com/eerie-cutiescomic.rss XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
https://pixietrixcomix.com/menage-a-3/comic.rss XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
https://propertyistheft.wordpress.com/feed/ XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
https://requiem.seraph-inn.com/updates.rss XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
https://studiofoglio.livejournal.com/data/atom/ XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
https://thecommandline.net/feed/ XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
https://torrentfreak.com/subscriptions/ XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
https://web.randi.org/?format=feed&type=rss XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
https://www.baen.com/baenebooks XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
https://www.dcscience.net/feed/medium.co XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
https://www.DropCatch.com/domain/steampunkmagazine.com XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
https://www.DropCatch.com/domain/ubuntuweblogs.org XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
https://www.DropCatch.com/redirect/?domain=DyingAlone.net XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
https://www.freedompress.org.uk:443/news/feed/ XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
https://www.goblinscomic.com/category/comics/feed/ XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
https://www.loomio.com/blog/feed/ XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
https://www.newstatesman.com/feeds/blogs/laurie-penny.rss XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
https://www.patreon.com/graveyardgreg/posts/comic.rss XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 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 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
https://x.com/statuses/user_timeline/22724360.rss XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
Humble Bundle Blog XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
I, Cringely XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
Irregular Webcomic! XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
Joel on Software XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
Judith Proctor's Journal XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
Krebs on Security XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
Lambda the Ultimate - Programming Languages Weblog XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
Looking For Group XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
LWN.net XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
Mimi and Eunice XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
Neil Gaiman's Journal XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
Nina Paley XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
O Abnormal – Scifi/Fantasy Artist XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
Oglaf! -- Comics. Often dirty. XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
Oh Joy Sex Toy XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
Order of the Stick XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
Original Fiction Archives - Reactor XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
OSnews XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
Paul Graham: Unofficial RSS Feed XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
Penny Arcade XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
Penny Red XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
PHD Comics XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
Phil's blog XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
Planet Debian XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
Planet GNU XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
Planet Lisp XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
Pluralistic: Daily links from Cory Doctorow XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
PS238 by Aaron Williams XML 07:28, Tuesday, 27 October 08:16, Tuesday, 27 October
QC RSS v2 XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
Radar XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
RevK®'s ramblings XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
Richard Stallman's Political Notes XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
Scenes From A Multiverse XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
Schneier on Security XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
SCHNEWS.ORG.UK XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
Scripting News XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
Seth's Blog XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
Skin Horse XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
Tales From the Riverbank XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
The Adventures of Dr. McNinja XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
The Bumpycat sat on the mat XML 07:49, Tuesday, 27 October 08:29, Tuesday, 27 October
The Daily WTF XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
The Monochrome Mob XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
The Non-Adventures of Wonderella XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
The Old New Thing XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
The Open Source Grid Engine Blog XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
The Stranger XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
towerhamletsalarm XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
Twokinds XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
UK Indymedia Features XML 07:42, Tuesday, 27 October 08:24, Tuesday, 27 October
Uploads from ne11y XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
Uploads from piasladic XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October
Use Sword on Monster XML 07:28, Tuesday, 27 October 08:15, Tuesday, 27 October
Wayward Sons: Legends - Sci-Fi Full Page Webcomic - Updates Daily XML 07:14, Tuesday, 27 October 08:00, Tuesday, 27 October
what if? XML 07:14, Tuesday, 27 October 07:55, Tuesday, 27 October
Whatever XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
Whitechapel Anarchist Group XML 07:14, Tuesday, 27 October 08:03, Tuesday, 27 October
WIL WHEATON dot NET XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
wish XML 07:49, Tuesday, 27 October 08:34, Tuesday, 27 October
Writing the Bright Fantastic XML 07:49, Tuesday, 27 October 08:33, Tuesday, 27 October
xkcd.com XML 07:49, Tuesday, 27 October 08:32, Tuesday, 27 October